2023-11-06 11:22:39 +03:00
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"net/http"
"testing"
"time"
auth_model "code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/tests"
"github.com/pquerna/otp/totp"
2024-10-29 20:01:42 +03:00
"github.com/stretchr/testify/assert"
2024-07-30 22:41:10 +03:00
"github.com/stretchr/testify/require"
2023-11-06 11:22:39 +03:00
)
func TestAPITwoFactor ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 16 } )
2023-12-22 02:59:59 +03:00
req := NewRequest ( t , "GET" , "/api/v1/user" ) .
AddBasicAuth ( user . Name )
2023-11-06 11:22:39 +03:00
MakeRequest ( t , req , http . StatusOK )
otpKey , err := totp . Generate ( totp . GenerateOpts {
SecretSize : 40 ,
Issuer : "gitea-test" ,
AccountName : user . Name ,
} )
2024-07-30 22:41:10 +03:00
require . NoError ( t , err )
2023-11-06 11:22:39 +03:00
tfa := & auth_model . TwoFactor {
UID : user . ID ,
}
2024-11-26 04:31:26 +03:00
require . NoError ( t , auth_model . NewTwoFactor ( db . DefaultContext , tfa , otpKey . Secret ( ) ) )
2023-11-06 11:22:39 +03:00
2023-12-22 02:59:59 +03:00
req = NewRequest ( t , "GET" , "/api/v1/user" ) .
AddBasicAuth ( user . Name )
2023-11-06 11:22:39 +03:00
MakeRequest ( t , req , http . StatusUnauthorized )
passcode , err := totp . GenerateCode ( otpKey . Secret ( ) , time . Now ( ) )
2024-07-30 22:41:10 +03:00
require . NoError ( t , err )
2023-11-06 11:22:39 +03:00
2023-12-22 02:59:59 +03:00
req = NewRequest ( t , "GET" , "/api/v1/user" ) .
AddBasicAuth ( user . Name )
2023-11-06 11:22:39 +03:00
req . Header . Set ( "X-Gitea-OTP" , passcode )
MakeRequest ( t , req , http . StatusOK )
2023-02-24 16:24:29 +03:00
req = NewRequestf ( t , "GET" , "/api/v1/user" ) .
AddBasicAuth ( user . Name )
req . Header . Set ( "X-Forgejo-OTP" , passcode )
MakeRequest ( t , req , http . StatusOK )
2023-11-06 11:22:39 +03:00
}
2024-10-29 20:01:42 +03:00
func TestAPIWebAuthn ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 32 } )
unittest . AssertExistsAndLoadBean ( t , & auth_model . WebAuthnCredential { UserID : user . ID } )
req := NewRequest ( t , "GET" , "/api/v1/user" )
req . SetBasicAuth ( user . Name , "notpassword" )
resp := MakeRequest ( t , req , http . StatusUnauthorized )
type userResponse struct {
Message string ` json:"message" `
}
var userParsed userResponse
DecodeJSON ( t , resp , & userParsed )
assert . EqualValues ( t , "Basic authorization is not allowed while having security keys enrolled" , userParsed . Message )
}