Skip to content

Commit c39801d

Browse files
committed
improvement: update return responses
- for 2FA setup, activation, deactivation, where password is required and user-provided password is wrong, return 400 - return same response message for the same cause (keep consistency throughout the codebase)
1 parent 7201cce commit c39801d

File tree

3 files changed

+42
-28
lines changed

3 files changed

+42
-28
lines changed

handler/passwordReset.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ func PasswordUpdate(claims middleware.MyCustomClaims, authPayload model.AuthPayl
401401
// check auth validity
402402
ok := service.ValidateAuthID(claims.AuthID)
403403
if !ok {
404-
httpResponse.Message = "validation failed - access denied"
404+
httpResponse.Message = "access denied"
405405
httpStatusCode = http.StatusUnauthorized
406406
return
407407
}

handler/twoFA.go

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,18 @@ func Setup2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload) (
3333

3434
// 2FA already enabled
3535
configSecurity := config.GetConfig().Security
36-
if claims.TwoFA == configSecurity.TwoFA.Status.Verified || claims.TwoFA == configSecurity.TwoFA.Status.On {
37-
httpResponse.Message = "2-fa activated already"
36+
if claims.TwoFA == configSecurity.TwoFA.Status.Verified {
37+
// JWT: 2FA verified, abort setup
38+
httpResponse.Message = "twoFA: " + configSecurity.TwoFA.Status.Verified
3839
httpStatusCode = http.StatusOK
3940
return
4041
}
42+
if claims.TwoFA == configSecurity.TwoFA.Status.On {
43+
// JWT: 2FA ON, abort setup
44+
httpResponse.Message = "twoFA: " + configSecurity.TwoFA.Status.On
45+
httpStatusCode = http.StatusBadRequest
46+
return
47+
}
4148

4249
// is 2FA disabled/never configured before
4350
db := database.GetDB()
@@ -56,8 +63,8 @@ func Setup2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload) (
5663
}
5764
if err == nil {
5865
if twoFA.Status == configSecurity.TwoFA.Status.On {
59-
// 2FA ON
60-
httpResponse.Message = "2-fa activated already, log in again"
66+
// DB: 2FA ON, abort setup
67+
httpResponse.Message = "twoFA: " + configSecurity.TwoFA.Status.On
6168
httpStatusCode = http.StatusBadRequest
6269
return
6370
}
@@ -92,7 +99,7 @@ func Setup2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload) (
9299
}
93100
if !verifyPass {
94101
httpResponse.Message = "wrong credentials"
95-
httpStatusCode = http.StatusUnauthorized
102+
httpStatusCode = http.StatusBadRequest
96103
return
97104
}
98105
// get user email
@@ -198,19 +205,21 @@ func Activate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload
198205
// check auth validity
199206
ok := service.ValidateAuthID(claims.AuthID)
200207
if !ok {
201-
httpResponse.Message = "validation failed - access denied"
208+
httpResponse.Message = "access denied"
202209
httpStatusCode = http.StatusUnauthorized
203210
return
204211
}
205212

206213
configSecurity := config.GetConfig().Security
207-
if claims.TwoFA == configSecurity.TwoFA.Status.On {
208-
httpResponse.Message = "2-fa activated already, log in again"
214+
if claims.TwoFA == configSecurity.TwoFA.Status.Verified {
215+
// JWT: 2FA verified, abort setup
216+
httpResponse.Message = "twoFA: " + configSecurity.TwoFA.Status.Verified
209217
httpStatusCode = http.StatusBadRequest
210218
return
211219
}
212-
if claims.TwoFA == configSecurity.TwoFA.Status.Verified {
213-
httpResponse.Message = "2-fa activated already"
220+
if claims.TwoFA == configSecurity.TwoFA.Status.On {
221+
// JWT: 2FA ON, abort setup
222+
httpResponse.Message = "twoFA: " + configSecurity.TwoFA.Status.On
214223
httpStatusCode = http.StatusBadRequest
215224
return
216225
}
@@ -220,6 +229,7 @@ func Activate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload
220229
// step 1: check if client secret is available in memory
221230
data2FA, ok := model.InMemorySecret2FA[claims.AuthID]
222231
if !ok {
232+
// request user to visit setup endpoint first
223233
httpResponse.Message = "request for a new 2-fa secret"
224234
httpStatusCode = http.StatusBadRequest
225235
return
@@ -229,7 +239,7 @@ func Activate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload
229239
authPayload.OTP = lib.RemoveAllSpace(authPayload.OTP)
230240
if len(authPayload.OTP) != configSecurity.TwoFA.Digits {
231241
httpResponse.Message = "wrong one-time password"
232-
httpStatusCode = http.StatusUnauthorized
242+
httpStatusCode = http.StatusBadRequest
233243
return
234244
}
235245

@@ -247,7 +257,7 @@ func Activate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload
247257
model.InMemorySecret2FA[claims.AuthID] = data2FA
248258

249259
httpResponse.Message = "wrong one-time password"
250-
httpStatusCode = http.StatusUnauthorized
260+
httpStatusCode = http.StatusBadRequest
251261
return
252262
}
253263

@@ -289,7 +299,8 @@ func Activate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload
289299
// delete secrets from memory
290300
service.DelMem2FA(claims.AuthID)
291301

292-
httpResponse.Message = "2-fa activated already, log in again"
302+
// DB: 2FA ON, abort setup
303+
httpResponse.Message = "twoFA: " + configSecurity.TwoFA.Status.On
293304
httpStatusCode = http.StatusBadRequest
294305
return
295306
}
@@ -433,7 +444,7 @@ func Validate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload
433444
// check auth validity
434445
ok := service.ValidateAuthID(claims.AuthID)
435446
if !ok {
436-
httpResponse.Message = "validation failed - access denied"
447+
httpResponse.Message = "access denied"
437448
httpStatusCode = http.StatusUnauthorized
438449
return
439450
}
@@ -460,15 +471,15 @@ func Validate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload
460471
data2FA, ok := model.InMemorySecret2FA[claims.AuthID]
461472
if !ok {
462473
httpResponse.Message = "log in again"
463-
httpStatusCode = http.StatusUnauthorized
474+
httpStatusCode = http.StatusBadRequest
464475
return
465476
}
466477

467478
// step 2: check otp length
468479
authPayload.OTP = lib.RemoveAllSpace(authPayload.OTP)
469480
if len(authPayload.OTP) != configSecurity.TwoFA.Digits {
470481
httpResponse.Message = "wrong one-time password"
471-
httpStatusCode = http.StatusUnauthorized
482+
httpStatusCode = http.StatusBadRequest
472483
return
473484
}
474485

@@ -494,12 +505,14 @@ func Validate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload
494505
return
495506
}
496507

508+
// 2FA never configured before for this account
497509
httpResponse.Message = "unexpected request (2): 2-fa is OFF / log in again"
498510
httpStatusCode = http.StatusBadRequest
499511
return
500512
}
501513
// if 2FA is not ON
502514
if twoFA.Status != configSecurity.TwoFA.Status.On {
515+
// 2FA is disabled for this account
503516
httpResponse.Message = "unexpected request (3): 2-fa is OFF / log in again"
504517
httpStatusCode = http.StatusBadRequest
505518
return
@@ -563,7 +576,7 @@ func Validate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPayload
563576

564577
// response to the client
565578
httpResponse.Message = "wrong one-time password"
566-
httpStatusCode = http.StatusUnauthorized
579+
httpStatusCode = http.StatusBadRequest
567580
return
568581
}
569582

@@ -652,8 +665,8 @@ func Deactivate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPaylo
652665
return
653666
}
654667

655-
httpResponse.Message = "unknown user"
656-
httpStatusCode = http.StatusNotFound
668+
httpResponse.Message = "user not found"
669+
httpStatusCode = http.StatusUnauthorized
657670
return
658671
}
659672

@@ -667,7 +680,7 @@ func Deactivate2FA(claims middleware.MyCustomClaims, authPayload model.AuthPaylo
667680
}
668681
if !verifyPass {
669682
httpResponse.Message = "wrong credentials"
670-
httpStatusCode = http.StatusUnauthorized
683+
httpStatusCode = http.StatusBadRequest
671684
return
672685
}
673686

@@ -815,7 +828,7 @@ func CreateBackup2FA(claims middleware.MyCustomClaims, authPayload model.AuthPay
815828
}
816829
if !verifyPass {
817830
httpResponse.Message = "wrong credentials"
818-
httpStatusCode = http.StatusUnauthorized
831+
httpStatusCode = http.StatusBadRequest
819832
return
820833
}
821834

@@ -907,7 +920,7 @@ func ValidateBackup2FA(claims middleware.MyCustomClaims, authPayload model.AuthP
907920
// check auth validity
908921
ok := service.ValidateAuthID(claims.AuthID)
909922
if !ok {
910-
httpResponse.Message = "validation failed - access denied"
923+
httpResponse.Message = "access denied"
911924
httpStatusCode = http.StatusUnauthorized
912925
return
913926
}
@@ -917,6 +930,7 @@ func ValidateBackup2FA(claims middleware.MyCustomClaims, authPayload model.AuthP
917930
// already verified!
918931
configSecurity := config.GetConfig().Security
919932
if claims.TwoFA == configSecurity.TwoFA.Status.Verified {
933+
// JWT: 2FA verified
920934
httpResponse.Message = "twoFA: " + configSecurity.TwoFA.Status.Verified
921935
httpStatusCode = http.StatusOK
922936
return
@@ -931,7 +945,7 @@ func ValidateBackup2FA(claims middleware.MyCustomClaims, authPayload model.AuthP
931945
authPayload.OTP = strings.TrimSpace(authPayload.OTP)
932946
if authPayload.OTP == "" {
933947
httpResponse.Message = "required 2-fa backup code"
934-
httpStatusCode = http.StatusUnauthorized
948+
httpStatusCode = http.StatusBadRequest
935949
return
936950
}
937951

@@ -947,7 +961,7 @@ func ValidateBackup2FA(claims middleware.MyCustomClaims, authPayload model.AuthP
947961
}
948962
if len(twoFABackup) == 0 {
949963
httpResponse.Message = "user has no unused valid backup code"
950-
httpStatusCode = http.StatusUnauthorized
964+
httpStatusCode = http.StatusBadRequest
951965
return
952966
}
953967

@@ -977,7 +991,7 @@ func ValidateBackup2FA(claims middleware.MyCustomClaims, authPayload model.AuthP
977991

978992
if !isOtpValid {
979993
httpResponse.Message = "invalid 2-fa backup code"
980-
httpStatusCode = http.StatusUnauthorized
994+
httpStatusCode = http.StatusBadRequest
981995
return
982996
}
983997

handler/verification.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ func GetUnverifiedEmail(claims middleware.MyCustomClaims) (httpResponse model.HT
415415
// check auth validity
416416
ok := service.ValidateAuthID(claims.AuthID)
417417
if !ok {
418-
httpResponse.Message = "validation failed - access denied"
418+
httpResponse.Message = "access denied"
419419
httpStatusCode = http.StatusUnauthorized
420420
return
421421
}
@@ -476,7 +476,7 @@ func ResendVerificationCodeToModifyActiveEmail(claims middleware.MyCustomClaims)
476476
// check auth validity
477477
ok := service.ValidateAuthID(claims.AuthID)
478478
if !ok {
479-
httpResponse.Message = "validation failed - access denied"
479+
httpResponse.Message = "access denied"
480480
httpStatusCode = http.StatusUnauthorized
481481
return
482482
}

0 commit comments

Comments
 (0)