mirror of
https://github.com/go-gitea/gitea.git
synced 2026-10-03 12:00:51 +00:00
873efed5a6
The `gitea.com/go-chi/captcha` package only exists for Gitea, so it moves into `modules/imagecaptcha`. - Reloading an expired challenge shows a new image instead of a broken one - Every answer is consumed on its first check - OpenID registration stops after a failed captcha --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
204 lines
2.3 KiB
Go
204 lines
2.3 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package imagecaptcha
|
|
|
|
import (
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
var fontData = sync.OnceValue(func() []string {
|
|
return strings.Fields(`
|
|
...#####...
|
|
..#######..
|
|
.###...###.
|
|
.##.....##.
|
|
###.....##.
|
|
##.......##
|
|
##.......##
|
|
##.......##
|
|
##.......##
|
|
##.......##
|
|
##.......##
|
|
##.......##
|
|
##.......##
|
|
##......###
|
|
.##.....##.
|
|
.###...###.
|
|
..#######..
|
|
...#####...
|
|
|
|
.....##....
|
|
....###....
|
|
...####....
|
|
..#####....
|
|
..##.##....
|
|
..#..##....
|
|
.....##....
|
|
.....##....
|
|
.....##....
|
|
.....##....
|
|
.....##....
|
|
.....##....
|
|
.....##....
|
|
.....##....
|
|
.....##....
|
|
.....##....
|
|
.##########
|
|
.##########
|
|
|
|
...####....
|
|
.########..
|
|
###....###.
|
|
.#......##.
|
|
........##.
|
|
........##.
|
|
........##.
|
|
.......##..
|
|
.......##..
|
|
......##...
|
|
.....##....
|
|
....###....
|
|
...###.....
|
|
..###......
|
|
.###.......
|
|
.##........
|
|
###########
|
|
###########
|
|
|
|
..######...
|
|
#########..
|
|
##.....###.
|
|
........##.
|
|
........##.
|
|
........##.
|
|
......###..
|
|
..#####....
|
|
..#######..
|
|
.......###.
|
|
........###
|
|
.........##
|
|
.........##
|
|
.........##
|
|
........###
|
|
#......###.
|
|
#########..
|
|
.#######...
|
|
|
|
.......##..
|
|
......###..
|
|
.....####..
|
|
.....#.##..
|
|
....##.##..
|
|
...##..##..
|
|
...##..##..
|
|
..##...##..
|
|
.##....##..
|
|
.##....##..
|
|
##.....##..
|
|
#......##..
|
|
###########
|
|
###########
|
|
.......##..
|
|
.......##..
|
|
.......##..
|
|
.......##..
|
|
|
|
.#########.
|
|
.#########.
|
|
.##........
|
|
.##........
|
|
.##........
|
|
.##........
|
|
.#######...
|
|
.########..
|
|
.......###.
|
|
........###
|
|
.........##
|
|
.........##
|
|
.........##
|
|
.........##
|
|
........###
|
|
##.....###.
|
|
#########..
|
|
..######...
|
|
|
|
.....#####.
|
|
...#######.
|
|
..###......
|
|
.##........
|
|
.##........
|
|
.#.........
|
|
##..####...
|
|
##.#######.
|
|
####....##.
|
|
###.....###
|
|
##.......##
|
|
##.......##
|
|
##.......##
|
|
##.......##
|
|
.##.....###
|
|
.###...###.
|
|
..#######..
|
|
...#####...
|
|
|
|
###########
|
|
###########
|
|
###......##
|
|
##......##.
|
|
........##.
|
|
.......###.
|
|
.......##..
|
|
.......##..
|
|
......##...
|
|
......##...
|
|
.....###...
|
|
.....##....
|
|
....###....
|
|
....##.....
|
|
....##.....
|
|
...###.....
|
|
...##......
|
|
..###......
|
|
|
|
...#####...
|
|
..########.
|
|
.###....###
|
|
.##......##
|
|
.##......##
|
|
.##......##
|
|
..##....##.
|
|
..#######..
|
|
....####...
|
|
..###.###..
|
|
.###...###.
|
|
###.....###
|
|
##.......##
|
|
##.......##
|
|
##.......##
|
|
###.....##.
|
|
.#########.
|
|
...#####...
|
|
|
|
...#####...
|
|
.########..
|
|
.##....###.
|
|
##......##.
|
|
##.......##
|
|
##.......##
|
|
##.......##
|
|
##......###
|
|
.##....####
|
|
.#######.##
|
|
...####..##
|
|
.........##
|
|
........##.
|
|
........##.
|
|
.......###.
|
|
......###..
|
|
.#######...
|
|
.#####.....
|
|
`)
|
|
})
|