mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-10-26 03:52:24 +00:00
[BRANDING] X-Forgejo-OTP can be used instead of X-Gitea-OTP
(cherry picked from commit7b0549cd70) (cherry picked from commit13e10a65d9) (cherry picked from commit65bdd73cf2) (cherry picked from commit64eba8bb92) (cherry picked from commit4c49b1a759) (cherry picked from commit93b4d06406) (cherry picked from commite2bc5f36d9) (cherry picked from commit2bee76f9df) (cherry picked from commit3d8a1b4a9f) (cherry picked from commit99dd092cd0) (cherry picked from commit0fdbd02204) (cherry picked from commit70b277a183) (cherry picked from commit3eece7fbb4) (cherry picked from commit4838fc9e11) (cherry picked from commitb76ed541cf) (cherry picked from commitdcdfb5b65c) (cherry picked from commit377dc48cdc) (cherry picked from commitacc862f411) (cherry picked from commitac75ef101f) (cherry picked from commit08f2d9f7c5) (cherry picked from commite4096f0b64) (cherry picked from commitbf5876f062) (cherry picked from commit7dc60637e5) (cherry picked from commitef3101774b)
This commit is contained in:
parent
f5977a43e5
commit
ecb9e8867c
4 changed files with 34 additions and 4 deletions
|
|
@ -205,13 +205,20 @@ func (ctx *APIContext) SetLinkHeader(total, pageSize int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getOtpHeader(header http.Header) string {
|
||||||
|
otpHeader := header.Get("X-Gitea-OTP")
|
||||||
|
if forgejoHeader := header.Get("X-Forgejo-OTP"); forgejoHeader != "" {
|
||||||
|
otpHeader = forgejoHeader
|
||||||
|
}
|
||||||
|
return otpHeader
|
||||||
|
}
|
||||||
|
|
||||||
// CheckForOTP validates OTP
|
// CheckForOTP validates OTP
|
||||||
func (ctx *APIContext) CheckForOTP() {
|
func (ctx *APIContext) CheckForOTP() {
|
||||||
if skip, ok := ctx.Data["SkipLocalTwoFA"]; ok && skip.(bool) {
|
if skip, ok := ctx.Data["SkipLocalTwoFA"]; ok && skip.(bool) {
|
||||||
return // Skip 2FA
|
return // Skip 2FA
|
||||||
}
|
}
|
||||||
|
|
||||||
otpHeader := ctx.Req.Header.Get("X-Gitea-OTP")
|
|
||||||
twofa, err := auth.GetTwoFactorByUID(ctx.Doer.ID)
|
twofa, err := auth.GetTwoFactorByUID(ctx.Doer.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if auth.IsErrTwoFactorNotEnrolled(err) {
|
if auth.IsErrTwoFactorNotEnrolled(err) {
|
||||||
|
|
@ -220,7 +227,7 @@ func (ctx *APIContext) CheckForOTP() {
|
||||||
ctx.Error(http.StatusInternalServerError, "GetTwoFactorByUID", err)
|
ctx.Error(http.StatusInternalServerError, "GetTwoFactorByUID", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ok, err := twofa.ValidateTOTP(otpHeader)
|
ok, err := twofa.ValidateTOTP(getOtpHeader(ctx.Req.Header))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Error(http.StatusInternalServerError, "ValidateTOTP", err)
|
ctx.Error(http.StatusInternalServerError, "ValidateTOTP", err)
|
||||||
return
|
return
|
||||||
|
|
|
||||||
23
modules/context/api_forgejo_test.go
Normal file
23
modules/context/api_forgejo_test.go
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package context
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGetOtpHeader(t *testing.T) {
|
||||||
|
header := http.Header{}
|
||||||
|
assert.EqualValues(t, "", getOtpHeader(header))
|
||||||
|
// Gitea
|
||||||
|
giteaOtp := "123456"
|
||||||
|
header.Set("X-Gitea-OTP", giteaOtp)
|
||||||
|
assert.EqualValues(t, giteaOtp, getOtpHeader(header))
|
||||||
|
// Forgejo has precedence
|
||||||
|
forgejoOtp := "abcdef"
|
||||||
|
header.Set("X-Forgejo-OTP", forgejoOtp)
|
||||||
|
assert.EqualValues(t, forgejoOtp, getOtpHeader(header))
|
||||||
|
}
|
||||||
|
|
@ -56,7 +56,7 @@
|
||||||
// description: Sudo API request as the user provided as the key. Admin privileges are required.
|
// description: Sudo API request as the user provided as the key. Admin privileges are required.
|
||||||
// TOTPHeader:
|
// TOTPHeader:
|
||||||
// type: apiKey
|
// type: apiKey
|
||||||
// name: X-GITEA-OTP
|
// name: X-FORGEJO-OTP
|
||||||
// in: header
|
// in: header
|
||||||
// description: Must be used in combination with BasicAuth if two-factor authentication is enabled.
|
// description: Must be used in combination with BasicAuth if two-factor authentication is enabled.
|
||||||
//
|
//
|
||||||
|
|
|
||||||
2
templates/swagger/v1_json.tmpl
generated
2
templates/swagger/v1_json.tmpl
generated
|
|
@ -23262,7 +23262,7 @@
|
||||||
"TOTPHeader": {
|
"TOTPHeader": {
|
||||||
"description": "Must be used in combination with BasicAuth if two-factor authentication is enabled.",
|
"description": "Must be used in combination with BasicAuth if two-factor authentication is enabled.",
|
||||||
"type": "apiKey",
|
"type": "apiKey",
|
||||||
"name": "X-GITEA-OTP",
|
"name": "X-FORGEJO-OTP",
|
||||||
"in": "header"
|
"in": "header"
|
||||||
},
|
},
|
||||||
"Token": {
|
"Token": {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue