Skip to content

Commit e8b99f7

Browse files
committed
fix: phone number verification
1 parent 3fa8924 commit e8b99f7

File tree

6 files changed

+61
-20
lines changed

6 files changed

+61
-20
lines changed

server/handlers/verify_email.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,13 @@ func VerifyEmailHandler() gin.HandlerFunc {
7474
now := time.Now().Unix()
7575
user.EmailVerifiedAt = &now
7676
isSignUp = true
77-
db.Provider.UpdateUser(c, user)
77+
user, err = db.Provider.UpdateUser(c, user)
78+
if err != nil {
79+
log.Debug("Error updating user: ", err)
80+
errorRes["error"] = err.Error()
81+
utils.HandleRedirectORJsonResponse(c, http.StatusBadRequest, errorRes, generateRedirectURL(redirectURL, errorRes))
82+
return
83+
}
7884
}
7985
// delete from verification table
8086
db.Provider.DeleteVerificationRequest(c, verificationRequest)

server/resolvers/login.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes
7878
}
7979
if err != nil {
8080
log.Debug("Failed to get user: ", err)
81-
return res, fmt.Errorf(`bad user credentials`)
81+
return res, fmt.Errorf(`user not found`)
8282
}
8383
if user.RevokedTimestamp != nil {
8484
log.Debug("User access is revoked")

server/resolvers/signup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func SignupResolver(ctx context.Context, params model.SignUpInput) (*model.AuthR
7373
}
7474
isEmailSignup := email != ""
7575
isMobileSignup := phoneNumber != ""
76-
if isBasicAuthDisabled {
76+
if isBasicAuthDisabled && isEmailSignup {
7777
log.Debug("Basic authentication is disabled")
7878
return res, fmt.Errorf(`basic authentication is disabled for this instance`)
7979
}

server/resolvers/verify_otp.go

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,29 @@ func VerifyOtpResolver(ctx context.Context, params model.VerifyOTPRequest) (*mod
3636
return res, fmt.Errorf(`invalid session: %s`, err.Error())
3737
}
3838

39-
if refs.StringValue(params.Email) == "" && refs.StringValue(params.PhoneNumber) == "" {
39+
email := strings.TrimSpace(refs.StringValue(params.Email))
40+
phoneNumber := strings.TrimSpace(refs.StringValue(params.PhoneNumber))
41+
if email == "" && phoneNumber == "" {
4042
log.Debug("Email or phone number is required")
41-
return res, fmt.Errorf(`email or phone_number is required`)
42-
}
43-
currentField := models.FieldNameEmail
44-
if refs.StringValue(params.Email) == "" {
45-
currentField = models.FieldNamePhoneNumber
43+
return res, fmt.Errorf(`email or phone number is required`)
4644
}
45+
isEmailVerification := email != ""
46+
isMobileVerification := phoneNumber != ""
4747
// Get user by email or phone number
4848
var user *models.User
49-
if currentField == models.FieldNameEmail {
49+
if isEmailVerification {
5050
user, err = db.Provider.GetUserByEmail(ctx, refs.StringValue(params.Email))
51+
if err != nil {
52+
log.Debug("Failed to get user by email: ", err)
53+
}
5154
} else {
5255
user, err = db.Provider.GetUserByPhoneNumber(ctx, refs.StringValue(params.PhoneNumber))
56+
if err != nil {
57+
log.Debug("Failed to get user by phone number: ", err)
58+
}
5359
}
5460
if user == nil || err != nil {
55-
log.Debug("Failed to get user by email or phone number: ", err)
56-
return res, err
61+
return res, fmt.Errorf(`user not found`)
5762
}
5863
// Verify OTP based on TOPT or OTP
5964
if refs.BoolValue(params.IsTotp) {
@@ -78,14 +83,19 @@ func VerifyOtpResolver(ctx context.Context, params model.VerifyOTPRequest) (*mod
7883
}
7984
} else {
8085
var otp *models.OTP
81-
if currentField == models.FieldNameEmail {
86+
if isEmailVerification {
8287
otp, err = db.Provider.GetOTPByEmail(ctx, refs.StringValue(params.Email))
88+
if err != nil {
89+
log.Debug(`Failed to get otp request for email: `, err.Error())
90+
}
8391
} else {
8492
otp, err = db.Provider.GetOTPByPhoneNumber(ctx, refs.StringValue(params.PhoneNumber))
93+
if err != nil {
94+
log.Debug(`Failed to get otp request for phone number: `, err.Error())
95+
}
8596
}
8697
if otp == nil && err != nil {
87-
log.Debugf("Failed to get otp request for %s: %s", currentField, err.Error())
88-
return res, fmt.Errorf(`invalid %s: %s`, currentField, err.Error())
98+
return res, fmt.Errorf(`OTP not found`)
8999
}
90100
if params.Otp != otp.Otp {
91101
log.Debug("Failed to verify otp request: Incorrect value")
@@ -104,10 +114,26 @@ func VerifyOtpResolver(ctx context.Context, params model.VerifyOTPRequest) (*mod
104114
return res, fmt.Errorf(`invalid session: %s`, err.Error())
105115
}
106116

107-
isSignUp := user.EmailVerifiedAt == nil && user.PhoneNumberVerifiedAt == nil
108-
// TODO - Add Login method in DB when we introduce OTP for social media login
117+
isSignUp := false
118+
if user.EmailVerifiedAt == nil && isEmailVerification {
119+
isSignUp = true
120+
now := time.Now().Unix()
121+
user.EmailVerifiedAt = &now
122+
}
123+
if user.PhoneNumberVerifiedAt == nil && isMobileVerification {
124+
isSignUp = true
125+
now := time.Now().Unix()
126+
user.PhoneNumberVerifiedAt = &now
127+
}
128+
if isSignUp {
129+
user, err = db.Provider.UpdateUser(ctx, user)
130+
if err != nil {
131+
log.Debug("Failed to update user: ", err)
132+
return res, err
133+
}
134+
}
109135
loginMethod := constants.AuthRecipeMethodBasicAuth
110-
if currentField == models.FieldNamePhoneNumber {
136+
if isMobileVerification {
111137
loginMethod = constants.AuthRecipeMethodMobileOTP
112138
}
113139
roles := strings.Split(user.Roles, ",")

server/test/mobile_signup_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,17 @@ func mobileSingupTest(t *testing.T, s TestSetup) {
9898
})
9999
assert.Nil(t, err)
100100
assert.NotEmpty(t, otpRes.Message)
101+
// Check if phone number is verified
102+
user, err = db.Provider.GetUserByPhoneNumber(ctx, phoneNumber)
103+
assert.NoError(t, err)
104+
assert.NotNil(t, user)
105+
assert.NotNil(t, user.PhoneNumberVerifiedAt)
101106
res, err = resolvers.SignupResolver(ctx, model.SignUpInput{
102107
PhoneNumber: refs.NewStringRef(phoneNumber),
103108
Password: s.TestInfo.Password,
104109
ConfirmPassword: s.TestInfo.Password,
105110
})
106-
assert.Error(t, err)
111+
assert.Error(t, err, "should throw duplicate error")
107112
assert.Nil(t, res)
108113
cleanData("[email protected]")
109114
})

server/test/verify_email_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ func verifyEmailTest(t *testing.T, s TestSetup) {
3535
})
3636
assert.Nil(t, err)
3737
assert.NotEqual(t, verifyRes.AccessToken, "", "access token should not be empty")
38-
38+
// Check if phone number is verified
39+
user1, err := db.Provider.GetUserByEmail(ctx, email)
40+
assert.NoError(t, err)
41+
assert.NotNil(t, user1)
42+
assert.NotNil(t, user1.EmailVerifiedAt)
3943
cleanData(email)
4044
})
4145
}

0 commit comments

Comments
 (0)