2020UserModel = get_user_model ()
2121
2222
23+ def _unicode_ci_compare (s1 , s2 ):
24+ """
25+ Perform case-insensitive comparison of two identifiers, using the
26+ recommended algorithm from Unicode Technical Report 36, section
27+ 2.11.2(B)(2).
28+ """
29+ return unicodedata .normalize ('NFKC' , s1 ).casefold () == unicodedata .normalize ('NFKC' , s2 ).casefold ()
30+
31+
2332class ReadOnlyPasswordHashWidget (forms .Widget ):
2433 template_name = 'auth/widgets/read_only_password_hash.html'
2534 read_only = True
@@ -256,11 +265,16 @@ def get_users(self, email):
256265 that prevent inactive users and users with unusable passwords from
257266 resetting their password.
258267 """
268+ email_field_name = UserModel .get_email_field_name ()
259269 active_users = UserModel ._default_manager .filter (** {
260- '%s__iexact' % UserModel . get_email_field_name () : email ,
270+ '%s__iexact' % email_field_name : email ,
261271 'is_active' : True ,
262272 })
263- return (u for u in active_users if u .has_usable_password ())
273+ return (
274+ u for u in active_users
275+ if u .has_usable_password () and
276+ _unicode_ci_compare (email , getattr (u , email_field_name ))
277+ )
264278
265279 def save (self , domain_override = None ,
266280 subject_template_name = 'registration/password_reset_subject.txt' ,
@@ -273,15 +287,17 @@ def save(self, domain_override=None,
273287 user.
274288 """
275289 email = self .cleaned_data ["email" ]
290+ email_field_name = UserModel .get_email_field_name ()
276291 for user in self .get_users (email ):
277292 if not domain_override :
278293 current_site = get_current_site (request )
279294 site_name = current_site .name
280295 domain = current_site .domain
281296 else :
282297 site_name = domain = domain_override
298+ user_email = getattr (user , email_field_name )
283299 context = {
284- 'email' : email ,
300+ 'email' : user_email ,
285301 'domain' : domain ,
286302 'site_name' : site_name ,
287303 'uid' : urlsafe_base64_encode (force_bytes (user .pk )),
@@ -292,7 +308,7 @@ def save(self, domain_override=None,
292308 }
293309 self .send_mail (
294310 subject_template_name , email_template_name , context , from_email ,
295- email , html_email_template_name = html_email_template_name ,
311+ user_email , html_email_template_name = html_email_template_name ,
296312 )
297313
298314
0 commit comments