mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Fix captcha (#14488)
Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
		
							
								
								
									
										20
									
								
								modules/cache/cache.go
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								modules/cache/cache.go
									
									
									
									
										vendored
									
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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,7 +557,6 @@ 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),
 | 
			
		||||
@@ -581,7 +566,6 @@ func Contexter() func(next http.Handler) http.Handler {
 | 
			
		||||
					)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				ctx.SetCookie("macaron_flash", "", -1,
 | 
			
		||||
					setting.SessionConfig.CookiePath,
 | 
			
		||||
 
 | 
			
		||||
@@ -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")
 | 
			
		||||
 
 | 
			
		||||
@@ -161,7 +161,9 @@ func WebRoutes() *web.Route {
 | 
			
		||||
 | 
			
		||||
	mailer.InitMailRender(templates.Mailer())
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user