2021-07-21 08:06:26 +00:00
package resolvers
import (
"context"
"fmt"
2021-08-04 10:25:13 +00:00
"strings"
2022-01-08 17:31:06 +00:00
"time"
2021-07-21 08:06:26 +00:00
2022-05-24 07:12:29 +00:00
log "github.com/sirupsen/logrus"
2021-07-28 09:52:11 +00:00
"github.com/authorizerdev/authorizer/server/constants"
2022-02-28 15:56:49 +00:00
"github.com/authorizerdev/authorizer/server/crypto"
2021-07-23 16:27:44 +00:00
"github.com/authorizerdev/authorizer/server/db"
2022-01-17 06:02:13 +00:00
"github.com/authorizerdev/authorizer/server/envstore"
2021-07-23 16:27:44 +00:00
"github.com/authorizerdev/authorizer/server/graph/model"
2022-01-22 19:54:41 +00:00
"github.com/authorizerdev/authorizer/server/token"
2022-03-02 12:12:31 +00:00
"github.com/authorizerdev/authorizer/server/utils"
2021-07-21 08:06:26 +00:00
)
2022-01-17 06:02:13 +00:00
// ResetPasswordResolver is a resolver for reset password mutation
func ResetPasswordResolver ( ctx context . Context , params model . ResetPasswordInput ) ( * model . Response , error ) {
2021-07-21 08:06:26 +00:00
var res * model . Response
2022-05-24 07:12:29 +00:00
2022-03-02 12:12:31 +00:00
gc , err := utils . GinContextFromContext ( ctx )
if err != nil {
2022-05-24 07:12:29 +00:00
log . Debug ( "Failed to get GinContext" , err )
2022-03-02 12:12:31 +00:00
return res , err
}
2022-02-28 02:25:01 +00:00
if envstore . EnvStoreObj . GetBoolStoreEnvVariable ( constants . EnvKeyDisableBasicAuthentication ) {
2022-05-24 07:12:29 +00:00
log . Debug ( "Basic authentication is disabled" )
2021-07-28 09:52:11 +00:00
return res , fmt . Errorf ( ` basic authentication is disabled for this instance ` )
}
2021-07-21 08:06:26 +00:00
2022-01-21 08:04:04 +00:00
verificationRequest , err := db . Provider . GetVerificationRequestByToken ( params . Token )
2021-07-21 08:06:26 +00:00
if err != nil {
2022-05-24 07:12:29 +00:00
log . Debug ( "Failed to get verification request" , err )
2021-07-21 08:06:26 +00:00
return res , fmt . Errorf ( ` invalid token ` )
}
2021-08-10 16:50:24 +00:00
if params . Password != params . ConfirmPassword {
2022-05-24 07:12:29 +00:00
log . Debug ( "Passwords do not match" )
2021-08-10 16:50:24 +00:00
return res , fmt . Errorf ( ` passwords don't match ` )
}
2022-03-17 10:05:07 +00:00
if ! utils . IsValidPassword ( params . Password ) {
2022-05-24 07:12:29 +00:00
log . Debug ( "Invalid password" )
2022-03-17 10:05:07 +00:00
return res , fmt . Errorf ( ` password is not valid. It needs to be at least 6 characters long and contain at least one number, one uppercase letter, one lowercase letter and one special character ` )
}
2021-07-21 08:06:26 +00:00
// verify if token exists in db
2022-03-02 12:12:31 +00:00
hostname := utils . GetHost ( gc )
2022-03-08 07:06:26 +00:00
claim , err := token . ParseJWTToken ( params . Token , hostname , verificationRequest . Nonce , verificationRequest . Email )
2021-07-21 08:06:26 +00:00
if err != nil {
2022-05-24 07:12:29 +00:00
log . Debug ( "Failed to parse token" , err )
2021-07-21 08:06:26 +00:00
return res , fmt . Errorf ( ` invalid token ` )
}
2022-05-24 07:12:29 +00:00
email := claim [ "sub" ] . ( string )
log := log . WithFields ( log . Fields {
"email" : email ,
} )
user , err := db . Provider . GetUserByEmail ( email )
2021-07-21 08:06:26 +00:00
if err != nil {
2022-05-24 07:12:29 +00:00
log . Debug ( "Failed to get user" , err )
2021-07-21 08:06:26 +00:00
return res , err
}
2022-02-28 15:56:49 +00:00
password , _ := crypto . EncryptPassword ( params . Password )
2021-12-22 10:01:45 +00:00
user . Password = & password
2021-07-21 08:06:26 +00:00
2021-12-22 05:21:12 +00:00
signupMethod := user . SignupMethods
2022-01-17 06:02:13 +00:00
if ! strings . Contains ( signupMethod , constants . SignupMethodBasicAuth ) {
signupMethod = signupMethod + "," + constants . SignupMethodBasicAuth
2021-08-04 10:25:13 +00:00
}
2021-12-22 05:21:12 +00:00
user . SignupMethods = signupMethod
2021-08-04 10:25:13 +00:00
2022-01-08 17:31:06 +00:00
// helpful if user has not signed up with basic auth
if user . EmailVerifiedAt == nil {
now := time . Now ( ) . Unix ( )
user . EmailVerifiedAt = & now
}
2021-07-21 08:06:26 +00:00
// delete from verification table
2022-05-24 07:12:29 +00:00
err = db . Provider . DeleteVerificationRequest ( verificationRequest )
if err != nil {
log . Debug ( "Failed to delete verification request" , err )
return res , err
}
_ , err = db . Provider . UpdateUser ( user )
if err != nil {
log . Debug ( "Failed to update user" , err )
return res , err
}
2021-07-21 08:06:26 +00:00
res = & model . Response {
Message : ` Password updated successfully. ` ,
}
return res , nil
}