2021-07-21 13:36:26 +05:30
package resolvers
import (
"context"
"fmt"
2021-08-04 15:55:13 +05:30
"strings"
2022-01-08 23:01:06 +05:30
"time"
2021-07-21 13:36:26 +05:30
2021-07-28 15:22:11 +05:30
"github.com/authorizerdev/authorizer/server/constants"
2022-02-28 21:26:49 +05:30
"github.com/authorizerdev/authorizer/server/crypto"
2021-07-23 21:57:44 +05:30
"github.com/authorizerdev/authorizer/server/db"
2022-01-17 11:32:13 +05:30
"github.com/authorizerdev/authorizer/server/envstore"
2021-07-23 21:57:44 +05:30
"github.com/authorizerdev/authorizer/server/graph/model"
2022-01-23 01:24:41 +05:30
"github.com/authorizerdev/authorizer/server/token"
2022-03-02 17:42:31 +05:30
"github.com/authorizerdev/authorizer/server/utils"
2021-07-21 13:36:26 +05:30
)
2022-01-17 11:32:13 +05:30
// ResetPasswordResolver is a resolver for reset password mutation
func ResetPasswordResolver ( ctx context . Context , params model . ResetPasswordInput ) ( * model . Response , error ) {
2021-07-21 13:36:26 +05:30
var res * model . Response
2022-03-02 17:42:31 +05:30
gc , err := utils . GinContextFromContext ( ctx )
if err != nil {
return res , err
}
2022-02-28 07:55:01 +05:30
if envstore . EnvStoreObj . GetBoolStoreEnvVariable ( constants . EnvKeyDisableBasicAuthentication ) {
2021-07-28 15:22:11 +05:30
return res , fmt . Errorf ( ` basic authentication is disabled for this instance ` )
}
2021-07-21 13:36:26 +05:30
2022-01-21 13:34:04 +05:30
verificationRequest , err := db . Provider . GetVerificationRequestByToken ( params . Token )
2021-07-21 13:36:26 +05:30
if err != nil {
return res , fmt . Errorf ( ` invalid token ` )
}
2021-08-10 22:20:24 +05:30
if params . Password != params . ConfirmPassword {
return res , fmt . Errorf ( ` passwords don't match ` )
}
2022-03-17 15:35:07 +05:30
if ! utils . IsValidPassword ( params . Password ) {
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 13:36:26 +05:30
// verify if token exists in db
2022-03-02 17:42:31 +05:30
hostname := utils . GetHost ( gc )
2022-03-08 12:36:26 +05:30
claim , err := token . ParseJWTToken ( params . Token , hostname , verificationRequest . Nonce , verificationRequest . Email )
2021-07-21 13:36:26 +05:30
if err != nil {
return res , fmt . Errorf ( ` invalid token ` )
}
2022-03-02 17:42:31 +05:30
user , err := db . Provider . GetUserByEmail ( claim [ "sub" ] . ( string ) )
2021-07-21 13:36:26 +05:30
if err != nil {
return res , err
}
2022-02-28 21:26:49 +05:30
password , _ := crypto . EncryptPassword ( params . Password )
2021-12-22 15:31:45 +05:30
user . Password = & password
2021-07-21 13:36:26 +05:30
2021-12-22 10:51:12 +05:30
signupMethod := user . SignupMethods
2022-01-17 11:32:13 +05:30
if ! strings . Contains ( signupMethod , constants . SignupMethodBasicAuth ) {
signupMethod = signupMethod + "," + constants . SignupMethodBasicAuth
2021-08-04 15:55:13 +05:30
}
2021-12-22 10:51:12 +05:30
user . SignupMethods = signupMethod
2021-08-04 15:55:13 +05:30
2022-01-08 23:01:06 +05:30
// helpful if user has not signed up with basic auth
if user . EmailVerifiedAt == nil {
now := time . Now ( ) . Unix ( )
user . EmailVerifiedAt = & now
}
2021-07-21 13:36:26 +05:30
// delete from verification table
2022-01-21 13:34:04 +05:30
db . Provider . DeleteVerificationRequest ( verificationRequest )
db . Provider . UpdateUser ( user )
2021-07-21 13:36:26 +05:30
res = & model . Response {
Message : ` Password updated successfully. ` ,
}
return res , nil
}