From b84a251fca78784682d49e3699eaae51203f8ffd Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 10 Jul 2019 13:26:42 +0800 Subject: [PATCH] upgrade macaron/captcha to fix random error problem (#7407) --- go.mod | 2 +- go.sum | 4 +-- .../github.com/go-macaron/captcha/.travis.yml | 14 ++++------ .../github.com/go-macaron/captcha/captcha.go | 26 ++++++++++++++----- vendor/github.com/go-macaron/captcha/image.go | 25 +++++++++++------- vendor/modules.txt | 2 +- 6 files changed, 44 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 0820c0a8e9..8fdf57b3fc 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/glycerine/goconvey v0.0.0-20190315024820-982ee783a72e // indirect github.com/go-macaron/binding v0.0.0-20160711225916-9440f336b443 github.com/go-macaron/cache v0.0.0-20151013081102-561735312776 - github.com/go-macaron/captcha v0.0.0-20151123225153-8aa5919789ab + github.com/go-macaron/captcha v0.0.0-20190710000913-8dc5911259df github.com/go-macaron/cors v0.0.0-20190309005821-6fd6a9bfe14e9 github.com/go-macaron/csrf v0.0.0-20180426211211-503617c6b372 github.com/go-macaron/i18n v0.0.0-20160612092837-ef57533c3b0f diff --git a/go.sum b/go.sum index 47d096be50..8a617be49c 100644 --- a/go.sum +++ b/go.sum @@ -113,8 +113,8 @@ github.com/go-macaron/binding v0.0.0-20160711225916-9440f336b443 h1:i801KPR7j76u github.com/go-macaron/binding v0.0.0-20160711225916-9440f336b443/go.mod h1:u+H6rwW+HQwUL+w5uaEJSpIlVZDye1o9MB4Su0JfRfM= github.com/go-macaron/cache v0.0.0-20151013081102-561735312776 h1:UYIHS1r0WotqB5cIa0PAiV0m6GzD9rDBcn4alp5JgCw= github.com/go-macaron/cache v0.0.0-20151013081102-561735312776/go.mod h1:hHAsZm/oBZVcY+S7qdQL6Vbg5VrXF6RuKGuqsszt3Ok= -github.com/go-macaron/captcha v0.0.0-20151123225153-8aa5919789ab h1:4VFhsA3GE5Wwq1Ymr8KWCmrOWi1wRLEgdj48LPfQjxI= -github.com/go-macaron/captcha v0.0.0-20151123225153-8aa5919789ab/go.mod h1:j9TJ+0nwUOWBvNnm0bheHIPFf3cC62EQo7n7O6PbjZA= +github.com/go-macaron/captcha v0.0.0-20190710000913-8dc5911259df h1:MdgvtI3Y1u/DHNj7xUGOqAv+KGoTikjy8xQtCm12L78= +github.com/go-macaron/captcha v0.0.0-20190710000913-8dc5911259df/go.mod h1:j9TJ+0nwUOWBvNnm0bheHIPFf3cC62EQo7n7O6PbjZA= github.com/go-macaron/cors v0.0.0-20190309005821-6fd6a9bfe14e9 h1:A0QGzY6UHHEil0I2e7C21JenNNG0mmrj5d9SFWTlgr8= github.com/go-macaron/cors v0.0.0-20190309005821-6fd6a9bfe14e9/go.mod h1:utmMRnVIrXPSfA9MFcpIYKEpKawjKxf62vv62k4707E= github.com/go-macaron/csrf v0.0.0-20180426211211-503617c6b372 h1:acrx8CnDmlKl+BPoOOLEK9Ko+SrWFB5pxRuGkKj4iqo= diff --git a/vendor/github.com/go-macaron/captcha/.travis.yml b/vendor/github.com/go-macaron/captcha/.travis.yml index 2774fb35d5..81680f0f02 100644 --- a/vendor/github.com/go-macaron/captcha/.travis.yml +++ b/vendor/github.com/go-macaron/captcha/.travis.yml @@ -1,14 +1,10 @@ sudo: false language: go - go: - - 1.3 - - 1.4 - - 1.5 - - tip + - 1.6.x + - 1.7.x + - 1.8.x + - 1.9.x + - 1.10.x script: go test -v -cover -race - -notifications: - email: - - u@gogs.io diff --git a/vendor/github.com/go-macaron/captcha/captcha.go b/vendor/github.com/go-macaron/captcha/captcha.go index dc97f0fddd..91e6386651 100644 --- a/vendor/github.com/go-macaron/captcha/captcha.go +++ b/vendor/github.com/go-macaron/captcha/captcha.go @@ -19,6 +19,7 @@ package captcha import ( "fmt" "html/template" + "image/color" "path" "strings" @@ -49,6 +50,7 @@ type Captcha struct { ChallengeNums int Expiration int64 CachePrefix string + ColorPalette color.Palette } // generate key string @@ -61,16 +63,21 @@ func (c *Captcha) genRandChars() string { return string(com.RandomCreateBytes(c.ChallengeNums, defaultChars...)) } -// tempalte func for output html -func (c *Captcha) CreateHtml() template.HTML { +// CreateHTML outputs HTML for display and fetch new captcha images. +func (c *Captcha) CreateHTML() template.HTML { value, err := c.CreateCaptcha() if err != nil { panic(fmt.Errorf("fail to create captcha: %v", err)) } - return template.HTML(fmt.Sprintf(` - - - `, c.FieldIdName, value, c.SubURL, c.URLPrefix, value, c.SubURL, c.URLPrefix, value)) + return template.HTML(fmt.Sprintf(` + + + `, c.FieldIdName, value, c.SubURL, c.URLPrefix)) +} + +// DEPRECATED +func (c *Captcha) CreateHtml() template.HTML { + return c.CreateHTML() } // create a new captcha id @@ -139,6 +146,9 @@ type Options struct { Expiration int64 // Cache key prefix captcha characters. Default is "captcha_". CachePrefix string + // ColorPalette holds a collection of primary colors used for + // the captcha's text. If not defined, a random color will be generated. + ColorPalette color.Palette } func prepareOptions(options []Options) Options { @@ -192,6 +202,7 @@ func NewCaptcha(opt Options) *Captcha { ChallengeNums: opt.ChallengeNums, Expiration: opt.Expiration, CachePrefix: opt.CachePrefix, + ColorPalette: opt.ColorPalette, } } @@ -229,9 +240,10 @@ func Captchaer(options ...Options) macaron.Handler { } } - if _, err := NewImage([]byte(chars), cpt.StdWidth, cpt.StdHeight).WriteTo(ctx.Resp); err != nil { + if _, err := NewImage([]byte(chars), cpt.StdWidth, cpt.StdHeight, cpt.ColorPalette).WriteTo(ctx.Resp); err != nil { panic(fmt.Errorf("write captcha: %v", err)) } + ctx.Status(200) return } diff --git a/vendor/github.com/go-macaron/captcha/image.go b/vendor/github.com/go-macaron/captcha/image.go index 0bd5cb536f..abe087437a 100644 --- a/vendor/github.com/go-macaron/captcha/image.go +++ b/vendor/github.com/go-macaron/captcha/image.go @@ -265,16 +265,22 @@ func randFloat(from, to float64) float64 { return (to-from)*prng.Float64() + from } -func randomPalette() color.Palette { +func randomPalette(primary color.Palette) color.Palette { p := make([]color.Color, circleCount+1) // Transparent color. p[0] = color.RGBA{0xFF, 0xFF, 0xFF, 0x00} // Primary color. - prim := color.RGBA{ - uint8(randIntn(129)), - uint8(randIntn(129)), - uint8(randIntn(129)), - 0xFF, + var prim color.RGBA + if len(primary) == 0 { + prim = color.RGBA{ + uint8(randIntn(129)), + uint8(randIntn(129)), + uint8(randIntn(129)), + 0xFF, + } + } else { + r, g, b, a := primary[randIntn(len(primary)-1)].RGBA() + prim = color.RGBA{uint8(r), uint8(g), uint8(b), uint8(a)} } p[1] = prim // Circle colors. @@ -285,10 +291,11 @@ func randomPalette() color.Palette { } // NewImage returns a new captcha image of the given width and height with the -// given digits, where each digit must be in range 0-9. -func NewImage(digits []byte, width, height int) *Image { +// given digits, where each digit must be in range 0-9. The digit's color is +// chosen by random from the colorPalette. +func NewImage(digits []byte, width, height int, colorPalette color.Palette) *Image { m := new(Image) - m.Paletted = image.NewPaletted(image.Rect(0, 0, width, height), randomPalette()) + m.Paletted = image.NewPaletted(image.Rect(0, 0, width, height), randomPalette(colorPalette)) m.calculateSizes(width, height, len(digits)) // Randomly position captcha inside the image. maxx := width - (m.numWidth+m.dotSize)*len(digits) - m.dotSize diff --git a/vendor/modules.txt b/vendor/modules.txt index f19057e8ac..0e9d3c3163 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -124,7 +124,7 @@ github.com/go-macaron/binding github.com/go-macaron/cache github.com/go-macaron/cache/memcache github.com/go-macaron/cache/redis -# github.com/go-macaron/captcha v0.0.0-20151123225153-8aa5919789ab +# github.com/go-macaron/captcha v0.0.0-20190710000913-8dc5911259df github.com/go-macaron/captcha # github.com/go-macaron/cors v0.0.0-20190309005821-6fd6a9bfe14e9 github.com/go-macaron/cors