[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)
This commit is contained in:
		
							parent
							
								
									69eea35f81
								
							
						
					
					
						commit
						4838fc9e11
					
				
					 4 changed files with 34 additions and 4 deletions
				
			
		| 
						 | 
					@ -197,13 +197,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) {
 | 
				
			||||||
| 
						 | 
					@ -212,7 +219,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
									
									
									
								
							| 
						 | 
					@ -22888,7 +22888,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