
    )Jf5l                        d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZmZmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZ d dl m!Z!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z3 d dl4m5Z6 d dl7m8Z8 d dl9m:Z:m;Z; d dl<m=Z=m>Z> d dl?m@Z@mAZAmBZB ddlCm5Z5  G d deD          ZEddZFdS )     N)	timedelta)urlparse)forms)settings)messages)authenticateget_backendsget_user_modelloginlogout)AbstractUser)validate_password)get_current_site)FieldDoesNotExist)EmailMessageEmailMultiAlternatives)HttpResponseHttpResponseRedirect)resolve_url)TemplateDoesNotExist)render_to_stringreverse)timezone)get_random_string	force_str)gettext_lazy)app_settings)signals)AuthenticationMethodEmailVerificationMethod)context	ratelimit)build_absolute_urigenerate_unique_usernameimport_attribute   c            
       :   e Zd Z ed          ej                            d          j        d          ed           ed           ed           ed           ed           ed	          d
ZdDdZd Z	d Z
d Zd Zd Zd Zd Zd ZdDdZd Zd Zd Zd Zd Zd Zd Zd Zd ZdDdZdEd!ZdFd#Zd$ ZdDd%Zd& Z 	 	 dGd(Z!dHd)Z"d* Z#d+ Z$d, Z%d- Z&d. Z'd/ Z(d0 Z)d1 Z*d2 Z+d3 Z,d4 Z-d5 Z.d6 Z/d7 Z0d8 Z1d9 Z2d: Z3d; Z4d< Z5d= Z6d> Z7d? Z8d@ Z9dA Z:dB Z;dC Z<dS )IDefaultAccountAdapterz4Username can not be used. Please use other username.usernameuniquez0Too many failed login attempts. Try again later.z5A user is already registered with this email address.z"Please type your current password.zIncorrect password.z-Password must be a minimum of {0} characters.z5The email address is not assigned to any user account)username_blacklistedusername_takentoo_many_login_attemptsemail_takenenter_current_passwordincorrect_passwordpassword_min_lengthunknown_emailNc                 (    t           j        | _        d S N)r#   requestselfr7   s     Z/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/allauth/account/adapter.py__init__zDefaultAccountAdapter.__init__B   s         c                     ||j         d<   d S Naccount_verified_emailsession)r9   r7   emails      r:   stash_verified_emailz*DefaultAccountAdapter.stash_verified_emailG   s    490111r<   c                 N    |j                             d          }d |j         d<   |S r>   )rA   get)r9   r7   rets      r:   unstash_verified_emailz,DefaultAccountAdapter.unstash_verified_emailJ   s*    o!!":;;4801
r<   c                     ||j         d<   d S Naccount_userr@   r9   r7   users      r:   
stash_userz DefaultAccountAdapter.stash_userO   s    *.'''r<   c                 8    |j                             dd           S rI   )rA   popr8   s     r:   unstash_userz"DefaultAccountAdapter.unstash_userR   s    "">4888r<   c                     d}|j                             d          }|r*|                                |                                k    }|S )z
        Checks whether or not the email address is already verified
        beyond allauth scope, for example, by having accepted an
        invitation before signing up.
        Fr?   )rA   rE   lower)r9   r7   rB   rF   verified_emails        r:   is_email_verifiedz'DefaultAccountAdapter.is_email_verifiedU   sJ      ,,-EFF 	: &&((EKKMM9C
r<   c                    ddl m} |j                            |j                                      |j                                                  }t          j	        t          j        k    }|j        r
|rdS |rdS dS |rdS |rdS dS )Nr   EmailAddressuser_idpkFT)allauth.account.modelsrW   objectsfilterrY   excluder[   existsr   AUTHENTICATION_METHODr!   EMAILprimary)r9   email_addressrW   	has_otherlogin_by_emails        r:   can_delete_emailz&DefaultAccountAdapter.can_delete_emaila   s    777777  ''0E'FFW(W))VXX 	 .2F2LL 	   	  u u4 	4 	54r<   c                     t           j        }|4t          t          j                  }d                    |j                  }|t          |          z   S )Nz	[{name}] )name)r   EMAIL_SUBJECT_PREFIXr   r#   r7   formatri   r   )r9   subjectprefixsites       r:   format_email_subjectz*DefaultAccountAdapter.format_email_subject~   sI    2>#GO44D ''TY'77F	'****r<   c                     t           j        S )z
        This is a hook that can be overridden to programmatically
        set the 'from' email address for sending emails
        )r   DEFAULT_FROM_EMAIL)r9   s    r:   get_from_emailz$DefaultAccountAdapter.get_from_email   s    
 **r<   c                    t          |t                    r|gn|}t          d                    |          |          }d                    |                                                                          }|                     |          }|                                 }i }t          j
        }	|	dfD ]o}
	 d                    ||
          }t          ||t                      d         j                                                  ||
<   W# t          $ r |
dk    r|s Y lw xY wd|v r;t          ||d         |||          }|	|v r|                    ||	         d           n!t!          |||	         |||          }d|_        |S )	z
        Renders an email to `email`.  `template_prefix` identifies the
        email that is to be sent, e.g. "account/email/email_confirmation"
        z{0}_subject.txt txtz{0}_message.{1}r#   )headersz	text/htmlhtml)
isinstancestrr   rk   join
splitlinesstripro   rr   r   TEMPLATE_EXTENSIONglobalsr7   r   r   attach_alternativer   content_subtype)r9   template_prefixrB   r#   rv   torl   
from_emailbodieshtml_extexttemplate_namemsgs                r:   render_mailz!DefaultAccountAdapter.render_mail   s   
 #5#..9eWWE"#4#;#;O#L#LgVV((7--//006688++G44((**
2e$ 	 	C
 1 8 8# N N.!IIi(0  %''	 s
 (   %<<< F??(
B  C 6!!&&vh'7EEE):r7  C #)C
s   5AD		DDc                     |t          t                      d         j                  d}|                    |           |                     |||          }|                                 d S )Nr#   )rB   current_site)r   r~   r7   updater   send)r9   r   rB   r#   ctxr   s         r:   	send_mailzDefaultAccountAdapter.send_mail   sd    ,WYYy-A-IJJ
 
 	

7s;;




r<   c                 4    t          t          j                  S r6   )r   r   SIGNUP_REDIRECT_URLr8   s     r:   get_signup_redirect_urlz-DefaultAccountAdapter.get_signup_redirect_url   s    <;<<<r<   c                     |j         j        sJ t          t          dd          }|rt	          j        dt                     nt          j        }t          |          S )z
        Returns the default URL to redirect to after logging in.  Note
        that URLs passed explicitly (e.g. by passing along a `next`
        GET parameter) take precedence over the value returned here.
        LOGIN_REDIRECT_URLNAMENzSLOGIN_REDIRECT_URLNAME is deprecated, simply use LOGIN_REDIRECT_URL with a URL name)	rL   is_authenticatedgetattrr   warningswarnDeprecationWarningLOGIN_REDIRECT_URLr   )r9   r7   urls      r:   get_login_redirect_urlz,DefaultAccountAdapter.get_login_redirect_url   sh     |,,,,h 8$?? 	.M:"    -C3r<   c                 4    t          t          j                  S )a  
        Returns the URL to redirect to after the user logs out. Note that
        this method is also invoked if you attempt to log out while no users
        is logged in. Therefore, request.user is not guaranteed to be an
        authenticated user.
        )r   r   LOGOUT_REDIRECT_URLr8   s     r:   get_logout_redirect_urlz-DefaultAccountAdapter.get_logout_redirect_url   s     <;<<<r<   c                     |j         j        r-t          j        rt          j        S |                     |          S t          j        S )zK
        The URL to return to after successful email confirmation.
        )rL   r   r   -EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URLr   )EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URLr8   s     r:   #get_email_confirmation_redirect_urlz9DefaultAccountAdapter.get_email_confirmation_redirect_url   sC     <( 	JI <#QQ227;;;IIr<   c                      t          d          S )z
        The URL to redirect to after a successful password change/set.

        NOTE: Not called during the password reset flow.
        account_change_passwordr   r8   s     r:    get_password_change_redirect_urlz6DefaultAccountAdapter.get_password_change_redirect_url   s     0111r<   c                     dS )z
        Checks whether or not the site is open for signups.

        Next to simply returning True/False you can also intervene the
        regular flow by raising an ImmediateHttpResponse
        T r8   s     r:   is_open_for_signupz(DefaultAccountAdapter.is_open_for_signup   s	     tr<   c                 2     t                                  }|S )z3
        Instantiates a new User instance.
        )r
   rK   s      r:   new_userzDefaultAccountAdapter.new_user   s      ~!!r<   c           
          ddl m}m}m}  ||d          } ||d          } ||          } ||          }	t          j        r( |||	p|                     ||||	dg                     dS dS )z
        Fills in a valid username, if required and missing.  If the
        username is already present it is assumed to be valid
        (unique).
        r(   
user_email
user_fielduser_username
first_name	last_namerL   N)utilsr   r   r   r   USER_MODEL_USERNAME_FIELDr&   )
r9   r7   rL   r   r   r   r   r   rB   r+   s
             r:   populate_usernamez'DefaultAccountAdapter.populate_username   s     	A@@@@@@@@@Zl33
Jt[11	
4   =&&1 	M 00E8VD     	 	r<   c                 "    t          ||          S r6   )r&   )r9   txtsregexs      r:   r&   z.DefaultAccountAdapter.generate_unique_username  s    'e444r<   Tc                    ddl m}m}m} |j        }|                    d          }	|                    d          }
|                    d          }|                    d          } |||            |||           |	r ||d|	           |
r ||d|
           d|v r|                    |d                    n|                                 |                     ||           |r|	                                 |S )zd
        Saves a new `User` instance using information provided in the
        signup form.
        r(   r   r   r   rB   r+   	password1)
r   r   r   r   cleaned_datarE   set_passwordset_unusable_passwordr   save)r9   r7   rL   formcommitr   r   r   datar   r   rB   r+   s                r:   	save_userzDefaultAccountAdapter.save_user  s6   
 	A@@@@@@@@@ XXl++
HH[))	!!88J''
4dH%%% 	7Jt\:666 	5Jt[)444$d;/0000&&(((w--- 	 IIKKKr<   Fc                    t           j        D ]} ||           d t           j        D             }|                                |v rt	          j        | j        d                   |sddlm}  ||          	                                ryt                      }t           j        }|j                            |          j                            d          }|s| j        d         }t	          j        ||j        |d          |S )	z
        Validates the username. You can hook into this if you want to
        (dynamically) restrict what usernames can be chosen.
        c                 6    g | ]}|                                 S r   )rR   ).0ubs     r:   
<listcomp>z8DefaultAccountAdapter.clean_username.<locals>.<listcomp>=  s-     $
 $
 $
BHHJJ$
 $
 $
r<   r-   r(   )filter_users_by_usernamer,   r.   )
model_namefield_label)params)r   USERNAME_VALIDATORSUSERNAME_BLACKLISTrR   r   ValidationErrorerror_messagesr   r   r`   r
   r   _meta	get_fieldrE   __name__)	r9   r+   shallow	validatorusername_blacklist_lowerr   
user_modelusername_fielderror_messages	            r:   clean_usernamez$DefaultAccountAdapter.clean_username4  sF   
 &9 	  	 IIh$
 $
!-!@$
 $
 $
  >>777'(;<R(STTT  	777777''1188:: +--
!-!G * 0 : :"! ! X  % J$($78H$IM+!&0&9'5     r<   c                     |S )z
        Validates an email value. You can hook into this if you want to
        (dynamically) restrict what email addresses can be chosen.
        r   r9   rB   s     r:   clean_emailz!DefaultAccountAdapter.clean_emailX  s	    
 r<   c                     t           j        }|rEt          |          |k     r2t          j        | j        d                             |                    t          ||           |S )z{
        Validates a password. You can hook into this if you want to
        restric the allowed password choices.
        r3   )r   PASSWORD_MIN_LENGTHlenr   r   r   rk   r   )r9   passwordrL   
min_lengths       r:   clean_passwordz$DefaultAccountAdapter.clean_password_  sj    
 "5
 	#h--*44'"#89@@LL   	(D)))r<   c                     |S r6   r   r   s     r:   validate_unique_emailz+DefaultAccountAdapter.validate_unique_emaill  s    r<    c                    dt           j        v ru	 |i }t          ||t          j                                                  }|r.t          j        |          }t          j	        ||||           dS dS # t          $ r Y dS w xY wdS )zx
        Wrapper of `django.contrib.messages.add_message`, that reads
        the message text from a template.
        zdjango.contrib.messagesN)
extra_tags)r   INSTALLED_APPSr   r#   r7   r|   rw   unescaper   add_messager   )r9   r7   levelmessage_templatemessage_contextr   escaped_messagemessages           r:   r   z!DefaultAccountAdapter.add_messageo  s     %(???"*&(O"2$#O# # %''	  
 # Y"mO<<G(%ZXXXXXXY Y (    @?s   AA3 3
B Bc                    i }|j         }|rd}||d<   |r|j        dk    r|                                rd}nd}nd}|                     |          |d<   t	          |d          r|                                 |j                            d          |d<   |||d	<   t          t          j
        |          |d
          S )N   locationPOSTi  r   renderutf8rw   r   application/json)statuscontent_type)status_codemethodis_validajax_response_formhasattrr   contentdecoder   jsondumps)r9   r7   responseredirect_tor   r   respr   s           r:   ajax_responsez#DefaultAccountAdapter.ajax_response  s    % 	+F*D 	;~''==?? ! FF FF22488DLx** "!!!#+226::DLDLJtV:L
 
 
 	
r<   c           	         i g |                                 d}|D ]}t          |j                  |                                t          |j                  d |j        D             dd |j        j        j        	                                D             id}||d         |j
        <   |d                             |j
                   |S )N)fieldsfield_ordererrorsc                 ,    g | ]}t          |          S r   r   )r   es     r:   r   z<DefaultAccountAdapter.ajax_response_form.<locals>.<listcomp>  s    >>>A9Q<<>>>r<   attrsc                 4    i | ]\  }}|t          |          S r   r   )r   kvs      r:   
<dictcomp>z<DefaultAccountAdapter.ajax_response_form.<locals>.<dictcomp>  s1       ,0Aq9Q<<  r<   )labelvalue	help_textr	  widgetr  r  )non_field_errorsr   r  r  r  r	  fieldr  r  items	html_nameappend)r9   r   	form_specr  
field_specs        r:   r   z(DefaultAccountAdapter.ajax_response_form  s    ++--
 
	
  	= 	=E"5;//&u77>>>>>  49K4F4L4R4R4T4T  
 
J 4>Ih0m$++EO<<<<r<   c                `   ddl m}m}	 |j        s|                     ||          S |t
          j        k    rd S |t
          j        k    r# |||          s|r |	||||           d S d S d S |t
          j        k    r1 |||          s' |	||||           | 	                    ||          S d S d S )Nr(   )has_verified_emailsend_email_confirmation)signuprB   )
r   r  r  	is_activerespond_user_inactiver"   NONEOPTIONAL	MANDATORYrespond_email_verification_sent)
r9   r7   rL   email_verificationsignal_kwargsrB   r  redirect_urlr  r  s
             r:   	pre_loginzDefaultAccountAdapter.pre_login  s     	GFFFFFFF~ 	=--gt<<<!8!===D#:#CCC%%dE22 Sv S''fERRRRRRS S S S#:#DDD%%dE22 K''fERRRR;;GTJJJ EDK Kr<   c                    ddl m} t           ||||                    }	|i }t          j        j        d|j        ||	|d| |                     |t          j	        dd|i           |	S )Nr(   )r   )r  )senderr7   r  rL   zaccount/messages/logged_in.txtrL   r   )
r   r   r   r    user_logged_inr   	__class__r   r   SUCCESS)
r9   r7   rL   r&  r'  rB   r  r(  r   r  s
             r:   
post_loginz DefaultAccountAdapter.post_login  s     	211111'""7LHHH
 
  M# 	
>		
 	

 	
 	
 	
 	,TN		
 	
 	
 r<   c                 J   ddl m} t          |d          spddlm} t                      }d }|D ]*}t          ||          r|} n|st          |d          r|}+d                    |j        |j	        j
        g          }||_        t          ||            |||           d S )Nr   )record_authenticationbackendr(   AuthenticationBackendget_user.) allauth.account.reauthenticationr1  r   auth_backendsr4  r	   rx   rz   
__module__r-  r   r2  django_login)	r9   r7   rL   r1  r4  backendsr2  bbackend_paths	            r:   r   zDefaultAccountAdapter.login  s    JJJJJJ tY'' 	(<<<<<<#~~HG    a!677  GE   WQ
%;%;  G88W%79J9S$TUUL'DLWd###gt,,,,,r<   c                 $    t          |           d S r6   )django_logoutr8   s     r:   r   zDefaultAccountAdapter.logout  s    gr<   c                 l   ddl m} |j                            |j                                      |j                                                  }|                    d          sdS |	                    t          j                    |                    dd	g
           t          j        r|j                            |j                                      |j                  D ]}|                                 t          j                            t#                      ||j        ||           dS )z@
        Marks the email address as confirmed on the db
        r   rV   rX   rZ   F)r   )conditionalverifiedrc   )update_fields)r+  r7   rL   from_email_addressto_email_addressT)r\   rW   r]   r^   rY   r_   r[   firstset_verifiedset_as_primaryr   CHANGE_EMAILr   remover    email_changedr   r
   rL   )r9   r7   rd   rW   rD  instances         r:   confirm_emailz#DefaultAccountAdapter.confirm_email  sI    	877777  ''0E'FFW(W))UWW 	
 )))77 	5$$l6O2O$QQQ*i)@AAA$ 	(077%- 8  g)g**" " !!!!!&&%''"'#5!. '    tr<   c                 X    |                     |           |                                 d S r6   )r   r   )r9   rL   r   s      r:   r   z"DefaultAccountAdapter.set_password-  s'    (###		r<   c                     g }t                      }t          j        dddg}|D ]B}	 |j                            |           |                    |           3# t          $ r Y ?w xY w|S )Nr   r   rB   )r
   r   r   r   r   r  r   )r9   rF   User
candidates	candidates        r:   get_user_search_fieldsz,DefaultAccountAdapter.get_user_search_fields1  s    2	

 $ 	 	I
$$Y///

9%%%%$   
s   /A
A#"A#c                     ddl m} t          j                                        ht          t          j                  z  }d|v r(t          |          j	        }|r|hnd } |||          S  |||          S )Nr   )url_has_allowed_host_and_scheme*)allowed_hosts)
django.utils.httprU  r#   r7   get_hostsetr   ALLOWED_HOSTSr   netloc)r9   r   rU  rW  parsed_hostallowed_hosts         r:   is_safe_urlz!DefaultAccountAdapter.is_safe_urlB  s    EEEEEE !11334s8;Q7R7RR-"3--.K,7AK==TL223lSSSS..s-PPPPr<   c                 T    t          d|j        g          }t          ||          }|S )zConstructs the email confirmation (activation) url.

        Note that if you have architected your system such that email
        confirmations are sent outside of the request context `request`
        can be `None` here.
        account_confirm_email)args)r   keyr%   )r9   r7   emailconfirmationr   rF   s        r:   get_email_confirmation_urlz0DefaultAccountAdapter.get_email_confirmation_urlO  s2     -5F5J4KLLL #..
r<   c                 j   ddl m} t          t          j                  }t          j        rCt          j        |d|j        	                                d|
                                          }nC|j                            t          j                    |z
  |                                           }|S )Nr   )EmailConfirmation)secondsrM  r(   actionrc  amountduration)sent__gtrd   )r\   rg  r   r   EMAIL_CONFIRMATION_COOLDOWNEMAIL_CONFIRMATION_HMACr$   consumerB   rR   total_secondsr]   r^   r   nowr`   )r9   r7   rd   r  rg  cooldown_period
send_emails          r:   should_send_confirmation_mailz3DefaultAccountAdapter.should_send_confirmation_mailZ  s    <<<<<<#L,TUUU/ 	"*&!'--//(6688  JJ /6==!/9+ >   fhhJ r<   c                     t          t          j        t          d                    }t          t          j        t          d                    }t          j        ||d}|                     d||           d S )Naccount_signupaccount_reset_password)r7   
signup_urlpassword_reset_urlz$account/email/account_already_exists)r%   r#   r7   r   r   )r9   rB   ry  rz  r   s        r:    send_account_already_exists_mailz6DefaultAccountAdapter.send_account_already_exists_mailm  st    'AQ9R9RSS
/OW%=>>
 
 $"4
 

 	=ucJJJJJr<   c                     |                      ||          }|j        j        ||j        d}|rd}nd}|                     ||j        j        |           d S )N)rL   activate_urlrc  z'account/email/email_confirmation_signupz account/email/email_confirmation)re  rd   rL   rc  r   rB   )r9   r7   rd  r  r}  r   email_templates          r:   send_confirmation_mailz,DefaultAccountAdapter.send_confirmation_maily  sp    66w@QRR%38($(
 

  	@FNN?N~'8'F'LcRRRRRr<   c                 :    t          t          d                    S )Naccount_inactiver   r   rK   s      r:   r!  z+DefaultAccountAdapter.respond_user_inactive  s    #G,>$?$?@@@r<   c                 :    t          t          d                    S )Naccount_email_verification_sentr  rK   s      r:   r%  z5DefaultAccountAdapter.respond_email_verification_sent  s    #G,M$N$NOOOr<   c                     t          |          }|                    d|                    dd                                                    }d                    |j        |          S )NrB   r+   r   z{site}:{login})rn   r   )r   rE   rR   rk   domain)r9   r7   credentialsrn   r   s        r:   _get_login_attempts_cache_keyz3DefaultAccountAdapter._get_login_attempts_cache_key  sW    ((R)H)HIIOOQQ&&DKu&EEEr<   c                 l    t           j        r' | j        |fi |}t          j        |d|           d S d S )Nlogin_failed)rj  rc  )r   LOGIN_ATTEMPTS_LIMITr  r$   clearr9   r7   r  	cache_keys       r:   #_delete_login_attempts_cached_emailz9DefaultAccountAdapter._delete_login_attempts_cached_email  sQ    , 	K::7RRkRRIOGN	JJJJJJ	K 	Kr<   c                     t           j        rZ | j        |fi |}t          j        |d|t           j        t           j                  s!t          j        | j        d                   d S d S )Nr  ri  r/   )	r   r  r  r$   rp  LOGIN_ATTEMPTS_TIMEOUTr   r   r   r  s       r:   pre_authenticatez&DefaultAccountAdapter.pre_authenticate  s    , 	::7RRkRRI$%#8%<   	 +'(AB  	 		 	r<   c                     ddl m}  | j        |fi | |                                 t	          |fi |}|                                }|p|}|rt
          j        r | j        |fi | n | j        |fi | |S )z8Only authenticates, does not actually login. See `login`r   r3  )	allauth.account.auth_backendsr4  r  unstash_authenticated_userr   r   r  r  authentication_failed)r9   r7   r  r4  rL   alt_users         r:   r   z"DefaultAccountAdapter.authenticate  s    GGGGGGg5555588:::G33{33(CCEEx 	?L5 	?4D4WLLLLLL&D&w>>+>>>r<   c                     d S r6   r   )r9   r7   r  s      r:   r  z+DefaultAccountAdapter.authentication_failed  s    r<   c                     ddl m} ddlm} d|i} ||          }|r||d<   |j                            |          }|r||d<    | j        t          j        fi |}|d uo|j	        |j	        k    S )Nr   rV   )r   r   r+   rB   )
r\   rW   allauth.account.utilsr   r]   get_primary_emailr   r#   r7   r[   )	r9   rL   r   rW   r   r  r+   rB   reauth_users	            r:   reauthenticatez$DefaultAccountAdapter.reauthenticate  s    777777777777!8, =&& 	/&.K
#$66t<< 	)#(K 'd'GG;GG$&D;>TW+DDr<   c                     t          |j                            d          dk    |j        dk    |j                            d          dk    g          S )NHTTP_X_REQUESTED_WITHXMLHttpRequestr   HTTP_ACCEPT)anyMETArE   r   r8   s     r:   is_ajaxzDefaultAccountAdapter.is_ajax  sX      !899=MM$(::  //3EE
 
 	
r<   c                     |j                             d          }|r|                    d          d         }n|j                             d          }|S )NHTTP_X_FORWARDED_FOR,r   REMOTE_ADDR)r  rE   split)r9   r7   x_forwarded_forips       r:   get_client_ipz#DefaultAccountAdapter.get_client_ip  sT    !,**+ABB 	1 &&s++A.BB!!-00B	r<   c                 H    t          d                                          }|S )N@   )r   rR   )r9   rB   rc  s      r:   generate_emailconfirmation_keyz4DefaultAccountAdapter.generate_emailconfirmation_key  s     ##))++
r<   c                 L    g }t           j        r|                    d           |S )Nz$allauth.mfa.stages.AuthenticateStage)allauth_app_settingsMFA_ENABLEDr  )r9   rF   s     r:   get_login_stagesz&DefaultAccountAdapter.get_login_stages  s*    + 	?JJ=>>>
r<   c                 F   g }|j         s|S |                                r2|                    t          d          t	          d          d           t
          j        rCddlm}  ||          r2|                    t          d          t	          d          d           |S )zThe order of the methods returned matters. The first method is the
        default when using the `@reauthentication_required` decorator.
        zUse your passwordaccount_reauthenticate)descriptionr   r   )is_mfa_enabledzUse your authenticator appmfa_reauthenticate)	r   has_usable_passwordr  _r   r  r  allauth.mfa.utilsr  )r9   rL   rF   r  s       r:   get_reauthentication_methodsz2DefaultAccountAdapter.get_reauthentication_methods  s     $ 	J##%% 	JJ#$%8#9#9"#;<<     + 		888888~d## 

'()E'F'F&';<<    
r<   r6   )T)F)Nr   )NNN)=r   r9  __qualname__r  r   r   r   r   r;   rC   rG   rM   rP   rT   rg   ro   rr   r   r   r   r   r   r   r   r   r   r   r&   r   r   r   r   r   r   r  r   r)  r/  r   r   rM  r   rS  r_  re  ru  r{  r  r!  r%  r  r  r  r   r  r  r  r  r  r  r  r   r<   r:   r*   r*   0   s        !B!
 !
 ',66zBBQ
 $%1>$
 $
 qPQQ"#!$H"I"Ia 566 q!PQQRSS N"' ' ' '
: : :  
/ / /9 9 9
 
 
  :+ + ++ + +& & & &P  = = =     $= = =
J 
J 
J2 2 2      *5 5 5 5   :" " " "H           6
 
 
 
2  ,K K K6     D- - -.    :    "Q Q Q	 	 	  &
K 
K 
KS S SA A AP P PF F F
K K K
      E E E
 
 
          r<   r*   c                 F     t          t          j                  |           S r6   )r'   r   ADAPTER)r7   s    r:   get_adapterr    s    1L011':::r<   r6   )Grw   r   r   datetimer   urllib.parser   djangor   django.confr   django.contribr   django.contrib.authr   r	   r
   r   r:  r   r?  django.contrib.auth.modelsr   'django.contrib.auth.password_validationr   django.contrib.sites.shortcutsr   django.core.exceptionsr   django.core.mailr   r   django.httpr   r   django.shortcutsr   django.templater   django.template.loaderr   django.urlsr   django.utilsr   django.utils.cryptor   django.utils.encodingr   django.utils.translationr   r  allauthr   r  allauth.accountr    allauth.account.app_settingsr!   r"   allauth.corer#   r$   allauth.utilsr%   r&   r'   r   objectr*   r  r   r<   r:   <module>r     s            ! ! ! ! ! !                   # # # # # #              4 3 3 3 3 3 E E E E E E ; ; ; ; ; ; 4 4 4 4 4 4 A A A A A A A A : : : : : : : : ( ( ( ( ( ( 0 0 0 0 0 0 3 3 3 3 3 3       ! ! ! ! ! ! 1 1 1 1 1 1 + + + + + + 6 6 6 6 6 6 8 8 8 8 8 8 # # # # # #        , + + + + + + +               G G G G GF G G GT; ; ; ; ; ;r<   