@@ -1227,12 +1227,12 @@ def update_guessed_names(self):
1227
1227
self .family_name = parsed ['family' ]
1228
1228
self .suffix = parsed ['suffix' ]
1229
1229
1230
- def add_unconfirmed_email (self , email , expiration = None , external_identity = None ):
1230
+ def add_unconfirmed_email (self , email , expiration = None , external_identity = None , force = False ):
1231
1231
"""
1232
1232
Add an email verification token for a given email.
1233
1233
1234
1234
:param email: the email to confirm
1235
- :param email : overwrite default expiration time
1235
+ :param expiration : overwrite default expiration time
1236
1236
:param external_identity: the user's external identity
1237
1237
:return: a token
1238
1238
:raises: ValueError if email already confirmed, except for login through external idp.
@@ -1249,7 +1249,8 @@ def add_unconfirmed_email(self, email, expiration=None, external_identity=None):
1249
1249
validate_email (email )
1250
1250
1251
1251
if not external_identity and self .emails .filter (address = email ).exists ():
1252
- raise ValueError ('Email already confirmed to this user.' )
1252
+ if not force or self .is_confirmed :
1253
+ raise ValueError ('Email already confirmed to this user.' )
1253
1254
1254
1255
# If the unconfirmed email is already present, refresh the token
1255
1256
if email in self .unconfirmed_emails :
@@ -1304,14 +1305,14 @@ def get_confirmation_token(self, email, force=False, renew=False):
1304
1305
# assume the token is expired
1305
1306
expiration = info .get ('expiration' )
1306
1307
if renew :
1307
- new_token = self .add_unconfirmed_email (email )
1308
+ new_token = self .add_unconfirmed_email (email , force = force )
1308
1309
self .save ()
1309
1310
return new_token
1310
1311
if not expiration or (expiration and expiration < timezone .now ()):
1311
1312
if not force :
1312
1313
raise ExpiredTokenError (f'Token for email "{ email } " is expired' )
1313
1314
else :
1314
- new_token = self .add_unconfirmed_email (email )
1315
+ new_token = self .add_unconfirmed_email (email , force = force )
1315
1316
self .save ()
1316
1317
return new_token
1317
1318
return token
@@ -1355,7 +1356,7 @@ def get_or_create_confirmation_url(self, email, force=False, renew=False):
1355
1356
try :
1356
1357
self .get_confirmation_token (email , force = force , renew = renew )
1357
1358
except KeyError :
1358
- self .add_unconfirmed_email (email )
1359
+ self .add_unconfirmed_email (email , force = force )
1359
1360
self .save ()
1360
1361
return self .get_confirmation_url (email )
1361
1362
0 commit comments