aboutsummaryrefslogtreecommitdiffstats
path: root/modules/setting/security.go
diff options
context:
space:
mode:
authorwxiaoguang <wxiaoguang@gmail.com>2025-04-29 06:31:59 +0800
committerGitHub <noreply@github.com>2025-04-28 15:31:59 -0700
commit0148d03f216731d7e16eeafb09bde2976228b297 (patch)
tree352cd52ad566b9eb640da25379b4c8a39cabe68d /modules/setting/security.go
parent4ed07244b9dc6fab939f9c2e277475d9d7f7ac2f (diff)
downloadgitea-0148d03f216731d7e16eeafb09bde2976228b297.tar.gz
gitea-0148d03f216731d7e16eeafb09bde2976228b297.zip
Enforce two-factor auth (2FA: TOTP or WebAuthn) (#34187)
Fix #880 Design: 1. A global setting `security.TWO_FACTOR_AUTH`. * To support org-level config, we need to introduce a better "owner setting" system first (in the future) 2. A user without 2FA can login and may explore, but can NOT read or write to any repositories via API/web. 3. Keep things as simple as possible. * This option only aggressively suggest users to enable their 2FA at the moment, it does NOT guarantee that users must have 2FA before all other operations, it should be good enough for real world use cases. * Some details and tests could be improved in the future since this change only adds a check and seems won't affect too much. --------- Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Diffstat (limited to 'modules/setting/security.go')
-rw-r--r--modules/setting/security.go10
1 files changed, 10 insertions, 0 deletions
diff --git a/modules/setting/security.go b/modules/setting/security.go
index 2f798b75c7..3ae4c005c7 100644
--- a/modules/setting/security.go
+++ b/modules/setting/security.go
@@ -39,6 +39,7 @@ var (
CSRFCookieName = "_csrf"
CSRFCookieHTTPOnly = true
RecordUserSignupMetadata = false
+ TwoFactorAuthEnforced = false
)
// loadSecret load the secret from ini by uriKey or verbatimKey, only one of them could be set
@@ -142,6 +143,15 @@ func loadSecurityFrom(rootCfg ConfigProvider) {
PasswordCheckPwn = sec.Key("PASSWORD_CHECK_PWN").MustBool(false)
SuccessfulTokensCacheSize = sec.Key("SUCCESSFUL_TOKENS_CACHE_SIZE").MustInt(20)
+ twoFactorAuth := sec.Key("TWO_FACTOR_AUTH").String()
+ switch twoFactorAuth {
+ case "":
+ case "enforced":
+ TwoFactorAuthEnforced = true
+ default:
+ log.Fatal("Invalid two-factor auth option: %s", twoFactorAuth)
+ }
+
InternalToken = loadSecret(sec, "INTERNAL_TOKEN_URI", "INTERNAL_TOKEN")
if InstallLock && InternalToken == "" {
// if Gitea has been installed but the InternalToken hasn't been generated (upgrade from an old release), we should generate