]> source.dussan.org Git - gitea.git/commitdiff
Fix captcha (#14488)
authorLunny Xiao <xiaolunwen@gmail.com>
Wed, 27 Jan 2021 14:56:54 +0000 (22:56 +0800)
committerGitHub <noreply@github.com>
Wed, 27 Jan 2021 14:56:54 +0000 (22:56 +0800)
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: Lauris BH <lauris@nix.lv>
modules/cache/cache.go
modules/context/captcha.go
modules/context/context.go
modules/setting/cache.go
routers/routes/web.go
routers/user/auth.go
routers/user/auth_openid.go
templates/user/auth/signup_inner.tmpl
templates/user/auth/signup_openid_register.tmpl

index 3f8885ee306edd3d6011d73cbad6dc5cd41804fa..609f5a242b8df66b6fa9bb0ad48e42053f6fa0e0 100644 (file)
@@ -27,24 +27,6 @@ func newCache(cacheConfig setting.Cache) (mc.Cache, error) {
        })
 }
 
-// Cache is the interface that operates the cache data.
-type Cache interface {
-       // Put puts value into cache with key and expire time.
-       Put(key string, val interface{}, timeout int64) error
-       // Get gets cached value by given key.
-       Get(key string) interface{}
-       // Delete deletes cached value by given key.
-       Delete(key string) error
-       // Incr increases cached int-type value by given key as a counter.
-       Incr(key string) error
-       // Decr decreases cached int-type value by given key as a counter.
-       Decr(key string) error
-       // IsExist returns true if cached value exists.
-       IsExist(key string) bool
-       // Flush deletes all cached data.
-       Flush() error
-}
-
 // NewContext start cache service
 func NewContext() error {
        var err error
@@ -59,7 +41,7 @@ func NewContext() error {
 }
 
 // GetCache returns the currently configured cache
-func GetCache() Cache {
+func GetCache() mc.Cache {
        return conn
 }
 
index 956380ed731d89f24af3db9da71db837ee69bdfa..b8540136a186d5af20421ba9b41f749098740988 100644 (file)
@@ -7,6 +7,7 @@ package context
 import (
        "sync"
 
+       "code.gitea.io/gitea/modules/cache"
        "code.gitea.io/gitea/modules/setting"
 
        "gitea.com/go-chi/captcha"
@@ -21,6 +22,7 @@ func GetImageCaptcha() *captcha.Captcha {
                cpt = captcha.NewCaptcha(captcha.Options{
                        SubURL: setting.AppSubURL,
                })
+               cpt.Store = cache.GetCache()
        })
        return cpt
 }
index 630129b8c12fc208a5ca3ebedbcb179386ffd19a..e5025205c9fd06fb2e578e3b4bba2617933c7997 100644 (file)
@@ -23,6 +23,7 @@ import (
        "code.gitea.io/gitea/models"
        "code.gitea.io/gitea/modules/auth/sso"
        "code.gitea.io/gitea/modules/base"
+       mc "code.gitea.io/gitea/modules/cache"
        "code.gitea.io/gitea/modules/log"
        "code.gitea.io/gitea/modules/middlewares"
        "code.gitea.io/gitea/modules/setting"
@@ -499,23 +500,8 @@ func getCsrfOpts() CsrfOptions {
 
 // Contexter initializes a classic context for a request.
 func Contexter() func(next http.Handler) http.Handler {
-       rnd := templates.HTMLRenderer()
-
-       var c cache.Cache
-       var err error
-       if setting.CacheService.Enabled {
-               c, err = cache.NewCacher(cache.Options{
-                       Adapter:       setting.CacheService.Adapter,
-                       AdapterConfig: setting.CacheService.Conn,
-                       Interval:      setting.CacheService.Interval,
-               })
-               if err != nil {
-                       panic(err)
-               }
-       }
-
+       var rnd = templates.HTMLRenderer()
        var csrfOpts = getCsrfOpts()
-       //var flashEncryptionKey, _ = NewSecret()
 
        return func(next http.Handler) http.Handler {
                return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
@@ -524,7 +510,7 @@ func Contexter() func(next http.Handler) http.Handler {
                        var link = setting.AppSubURL + strings.TrimSuffix(req.URL.EscapedPath(), "/")
                        var ctx = Context{
                                Resp:    NewResponse(resp),
-                               Cache:   c,
+                               Cache:   mc.GetCache(),
                                Locale:  locale,
                                Link:    link,
                                Render:  rnd,
@@ -571,16 +557,14 @@ func Contexter() func(next http.Handler) http.Handler {
                        }
                        ctx.Resp.Before(func(resp ResponseWriter) {
                                if flash := f.Encode(); len(flash) > 0 {
-                                       if err == nil {
-                                               middlewares.SetCookie(resp, "macaron_flash", flash, 0,
-                                                       setting.SessionConfig.CookiePath,
-                                                       middlewares.Domain(setting.SessionConfig.Domain),
-                                                       middlewares.HTTPOnly(true),
-                                                       middlewares.Secure(setting.SessionConfig.Secure),
-                                                       //middlewares.SameSite(opt.SameSite), FIXME: we need a samesite config
-                                               )
-                                               return
-                                       }
+                                       middlewares.SetCookie(resp, "macaron_flash", flash, 0,
+                                               setting.SessionConfig.CookiePath,
+                                               middlewares.Domain(setting.SessionConfig.Domain),
+                                               middlewares.HTTPOnly(true),
+                                               middlewares.Secure(setting.SessionConfig.Secure),
+                                               //middlewares.SameSite(opt.SameSite), FIXME: we need a samesite config
+                                       )
+                                       return
                                }
 
                                ctx.SetCookie("macaron_flash", "", -1,
index af47bd085ab81df551a0ac991dfeb855a50aff40..618be2482a7b2fdbfd4eceb4b6122c9bcc5a25b9 100644 (file)
@@ -68,6 +68,10 @@ func newCacheService() {
 
        if CacheService.Enabled {
                log.Info("Cache Service Enabled")
+       } else {
+               log.Warn("Cache Service Disabled so that captcha disabled too")
+               // captcha depends on cache service
+               Service.EnableCaptcha = false
        }
 
        sec = Cfg.Section("cache.last_commit")
index 6b6322f048fc7dfe594eb7e3c4b59ce706a963bb..cbd7c0b7ca6f364ac1c0e71bdeec569e245e7bdd 100644 (file)
@@ -161,7 +161,9 @@ func WebRoutes() *web.Route {
 
        mailer.InitMailRender(templates.Mailer())
 
-       r.Use(captcha.Captchaer(context.GetImageCaptcha()))
+       if setting.Service.EnableCaptcha {
+               r.Use(captcha.Captchaer(context.GetImageCaptcha()))
+       }
        // Removed: toolbox.Toolboxer middleware will provide debug informations which seems unnecessary
        r.Use(context.Contexter())
        // Removed: SetAutoHead allow a get request redirect to head if get method is not exist
index 909d0a2ee5918723e163193713671b6a74b10e9f..bb877767aef8acfd9b0b9becb4c80480992f8ce5 100644 (file)
@@ -747,6 +747,7 @@ func LinkAccount(ctx *context.Context) {
        ctx.Data["Title"] = ctx.Tr("link_account")
        ctx.Data["LinkAccountMode"] = true
        ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha && setting.Service.RequireExternalRegistrationCaptcha
+       ctx.Data["Captcha"] = context.GetImageCaptcha()
        ctx.Data["CaptchaType"] = setting.Service.CaptchaType
        ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL
        ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey
@@ -800,6 +801,7 @@ func LinkAccountPostSignIn(ctx *context.Context) {
        ctx.Data["LinkAccountModeSignIn"] = true
        ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha && setting.Service.RequireExternalRegistrationCaptcha
        ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL
+       ctx.Data["Captcha"] = context.GetImageCaptcha()
        ctx.Data["CaptchaType"] = setting.Service.CaptchaType
        ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey
        ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration
@@ -885,6 +887,7 @@ func LinkAccountPostRegister(ctx *context.Context) {
        ctx.Data["LinkAccountModeRegister"] = true
        ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha && setting.Service.RequireExternalRegistrationCaptcha
        ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL
+       ctx.Data["Captcha"] = context.GetImageCaptcha()
        ctx.Data["CaptchaType"] = setting.Service.CaptchaType
        ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey
        ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration
@@ -1063,6 +1066,7 @@ func SignUp(ctx *context.Context) {
 
        ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha
        ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL
+       ctx.Data["Captcha"] = context.GetImageCaptcha()
        ctx.Data["CaptchaType"] = setting.Service.CaptchaType
        ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey
        ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey
@@ -1083,6 +1087,7 @@ func SignUpPost(ctx *context.Context) {
 
        ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha
        ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL
+       ctx.Data["Captcha"] = context.GetImageCaptcha()
        ctx.Data["CaptchaType"] = setting.Service.CaptchaType
        ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey
        ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey
index 1efcc7eda82c117f0e4f765e12f7795556eb4230..3f5c9f7248ce09cf15f2557179da93c266e3bafe 100644 (file)
@@ -329,6 +329,7 @@ func RegisterOpenID(ctx *context.Context) {
        ctx.Data["PageIsOpenIDRegister"] = true
        ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp
        ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha
+       ctx.Data["Captcha"] = context.GetImageCaptcha()
        ctx.Data["CaptchaType"] = setting.Service.CaptchaType
        ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey
        ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey
@@ -360,6 +361,7 @@ func RegisterOpenIDPost(ctx *context.Context) {
        ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp
        ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha
        ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL
+       ctx.Data["Captcha"] = context.GetImageCaptcha()
        ctx.Data["CaptchaType"] = setting.Service.CaptchaType
        ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey
        ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey
index 70fc2947c3233042ec78ae930b7a3ca427d5d126..4e8c0adb4f6231f70beb8d7d182d0c216e9fb76a 100644 (file)
@@ -37,7 +37,7 @@
                                {{if and .EnableCaptcha (eq .CaptchaType "image")}}
                                        <div class="inline field">
                                                <label></label>
-                                               {{.Captcha.CreateHtml}}
+                                               {{.Captcha.CreateHTML}}
                                        </div>
                                        <div class="required inline field {{if .Err_Captcha}}error{{end}}">
                                                <label for="captcha">{{.i18n.Tr "captcha"}}</label>
index 3138cfe13b5099b283554234c26388d1c6a63a2f..90af77476b568b4b2241a4e7855c6ce0e14dc75a 100644 (file)
@@ -23,7 +23,7 @@
                                        {{if and .EnableCaptcha (eq .CaptchaType "image")}}
                                                <div class="inline field">
                                                        <label></label>
-                                                       {{.Captcha.CreateHtml}}
+                                                       {{.Captcha.CreateHTML}}
                                                </div>
                                                <div class="required inline field {{if .Err_Captcha}}error{{end}}">
                                                        <label for="captcha">{{.i18n.Tr "captcha"}}</label>