@@ -303,26 +303,26 @@ func (a *API) challengePhoneFactor(w http.ResponseWriter, r *http.Request) error
303
303
if ! sms_provider .IsValidMessageChannel (channel , config ) {
304
304
return badRequestError (ErrorCodeValidationFailed , InvalidChannelError )
305
305
}
306
- latestValidChallenge , err := factor . FindLatestUnexpiredChallenge ( a . db , config . MFA . ChallengeExpiryDuration )
307
- if err != nil {
308
- if ! models . IsNotFoundError ( err ) {
309
- return internalServerError ( "error finding latest unexpired challenge" )
306
+
307
+ if factor . IsPhoneFactor () && factor . LastChallengedAt != nil {
308
+ if ! factor . LastChallengedAt . Add ( config . MFA . Phone . MaxFrequency ). Before ( time . Now () ) {
309
+ return tooManyRequestsError ( ErrorCodeOverSMSSendRateLimit , generateFrequencyLimitErrorMessage ( factor . LastChallengedAt , config . MFA . Phone . MaxFrequency ) )
310
310
}
311
- } else if latestValidChallenge != nil && ! latestValidChallenge .SentAt .Add (config .MFA .Phone .MaxFrequency ).Before (time .Now ()) {
312
- return tooManyRequestsError (ErrorCodeOverSMSSendRateLimit , generateFrequencyLimitErrorMessage (latestValidChallenge .SentAt , config .MFA .Phone .MaxFrequency ))
313
311
}
314
312
otp , err := crypto .GenerateOtp (config .MFA .Phone .OtpLength )
315
313
if err != nil {
316
314
panic (err )
317
315
}
318
- message , err := generateSMSFromTemplate (config .MFA .Phone .SMSTemplate , otp )
319
- if err != nil {
320
- return internalServerError ("error generating sms template" ).WithInternalError (err )
321
- }
322
316
challenge , err := factor .CreatePhoneChallenge (ipAddress , otp , config .Security .DBEncryption .Encrypt , config .Security .DBEncryption .EncryptionKeyID , config .Security .DBEncryption .EncryptionKey )
323
317
if err != nil {
324
318
return internalServerError ("error creating SMS Challenge" )
325
319
}
320
+
321
+ message , err := generateSMSFromTemplate (config .MFA .Phone .SMSTemplate , otp )
322
+ if err != nil {
323
+ return internalServerError ("error generating sms template" ).WithInternalError (err )
324
+ }
325
+
326
326
if config .Hook .SendSMS .Enabled {
327
327
input := hooks.SendSMSInput {
328
328
User : user ,
@@ -347,9 +347,10 @@ func (a *API) challengePhoneFactor(w http.ResponseWriter, r *http.Request) error
347
347
}
348
348
}
349
349
if err := db .Transaction (func (tx * storage.Connection ) error {
350
- if terr := tx . Create ( challenge ); terr != nil {
350
+ if terr := factor . WriteChallengeToDatabase ( tx , challenge ); terr != nil {
351
351
return terr
352
352
}
353
+
353
354
if terr := models .NewAuditLogEntry (r , tx , user , models .CreateChallengeAction , r .RemoteAddr , map [string ]interface {}{
354
355
"factor_id" : factor .ID ,
355
356
"factor_status" : factor .Status ,
@@ -376,8 +377,9 @@ func (a *API) challengeTOTPFactor(w http.ResponseWriter, r *http.Request) error
376
377
ipAddress := utilities .GetIPAddress (r )
377
378
378
379
challenge := factor .CreateChallenge (ipAddress )
380
+
379
381
if err := db .Transaction (func (tx * storage.Connection ) error {
380
- if terr := tx . Create ( challenge ); terr != nil {
382
+ if terr := factor . WriteChallengeToDatabase ( tx , challenge ); terr != nil {
381
383
return terr
382
384
}
383
385
if terr := models .NewAuditLogEntry (r , tx , user , models .CreateChallengeAction , r .RemoteAddr , map [string ]interface {}{
0 commit comments