U
    Z!c9                     @   s~  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
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 d dlmZmZ d dlmZ d dlmZ d dlmZmZm Z m!Z! dd Z"d;ddZ#d<ddZ$da%dd Z&dd Z'dd Z(dd Z)dd  Z*d!d" Z+d=d#d$Z,d>d%d&Z-d?d'd(Z.d)d* Z/d+d, Z0d@d-d.Z1d/d0 Z2d1d2 Z3dAd3d4Z4d5d6 Z5d7d8 Z6d9d: Z7dS )B    N)OrderedDict)settings)messages)update_session_auth_hash)FieldDoesNotExistValidationError)models)Q)	force_str)base36_to_intint_to_base36	urlencode)app_settingssignals)get_adapter)ImmediateHttpResponse)get_request_paramget_user_modelimport_callablevalid_email_or_nonec                 C   s(   t d|  }t d| }||kS )z
    Perform case-insensitive comparison of two identifiers, using the
    recommended algorithm from Unicode Technical Report 36, section
    2.11.2(B)(2).
    NFKC)unicodedata	normalizecasefold)s1s2Znorm_s1Znorm_s2 r   Y/var/www/html/crackeverytest/cet_env/lib/python3.8/site-packages/allauth/account/utils.py_unicode_ci_compare   s    r   nextc                 C   s    t | |}t| |sd}|S )z_
    Returns the next URL to redirect to, if it was explicitly passed
    via the request.
    N)r   r   Zis_safe_url)requestredirect_field_nameZredirect_tor   r   r   get_next_redirect_url#   s    
r"   Fc                 C   sP   |}|rt |r| }|s&t| |d}|sL|r>t| | }nt| | }|S )N)r!   )callabler"   r   Zget_signup_redirect_urlget_login_redirect_url)r    urlr!   signupretr   r   r   r$   .   s    r$   c                 C   s   t jst| | d S N)r   ZLOGOUT_ON_PASSWORD_CHANGEr   )r    userr   r   r   logout_on_password_changeA   s    r*   c                 C   s   t jrt| t jS t| S d S r(   )r   USER_MODEL_USERNAME_FIELDgetattrr
   r)   r   r   r   default_user_displayI   s    r.   c                 C   s    t sttdt}t|a t | S )NZACCOUNT_USER_DISPLAY)_user_display_callabler,   r   r.   r   )r)   fr   r   r   user_displayP   s    r1   c                 G   s   |sdS t  }z|j|}|j}W n( tk
rL   t| |sDY dS d}Y nX |rx|d }|rj|d| }t| || n
t| |S dS )zR
    Gets or sets (optional) user model fields. No-op if fields do not exist.
    Nr   )r   _meta	get_field
max_lengthr   hasattrsetattrr,   )r)   fieldargsUserZ
field_metar4   vr   r   r   
user_fieldX   s     


r;   c                 G   s2   |r t js |d r |d  g}t| t jf| S )Nr   )r   PRESERVE_USERNAME_CASINGlowerr;   r+   r)   r8   r   r   r   user_usernameq   s    r?   c                 G   s   t | tjf| S r(   )r;   r   USER_MODEL_EMAIL_FIELDr>   r   r   r   
user_emailw   s    rA   c                 C   sb   ddl m} d }|rJd}z|j| |}|j}W q^ |jk
rF   Y q^X n|jj| dd }|S )N   EmailAddressFT)r)   verified)r   rD   objectsget_for_userrE   DoesNotExistfilterexists)r)   emailrD   Zemailaddressr'   r   r   r   has_verified_email{   s    
rL   c              
   C   s   t | }zVt|||||d}|j| |f|}	|	r6|	W S || | |j| |f|}	|	r\|	W S W n( tk
r }
 z
|
j}	W 5 d}
~
X Y nX |	S )z
    Keyword arguments:

    signup -- Indicates whether or not sending the
    email is essential (during signup), or if it can be skipped (e.g. in
    case email verification is optional and we are only logging in).
    )email_verificationredirect_urlsignal_kwargsr&   rK   N)r   dictZ	pre_loginZloginZ
post_loginr   response)r    r)   rM   rN   rO   r&   rK   adapterZhook_kwargsrQ   er   r   r   perform_login   s&    
rT   c                 C   s<   |d kri }t jjf |j| |d| t| ||d||dS )N)Zsenderr    r)   T)rM   r&   rN   rO   )r   Zuser_signed_upsend	__class__rT   )r    r)   rM   Zsuccess_urlrO   r   r   r   complete_signup   s"      rW   c                 C   sZ  ddl m} t| }t }g }g }g }|D ]}t|j}	|	s>q*tjrX|jj	|	d
 rXq*||	 }
|
r|
jpt|j|
_|
jp|j|
_n&|}
|
jp|| |
j|
_|
||	 < |
jr||
 |
jr||
 |
jr*||
 q*|r|d }n6|r|d }n(|r|d }n|r | d }nd}| D ]}
|j |
j k|
_q,t| |fS )a  
    Takes a list of EmailAddress instances and cleans it up, making
    sure only valid ones remain, without multiple primaries etc.

    Order is important: e.g. if multiple primary e-mail addresses
    exist, the first one encountered will be kept as primary.
    rB   rC   email__iexactr   N)r   rD   r   r   r   rK   r   UNIQUE_EMAILrF   rI   rJ   getr=   primaryrE   Zis_email_verifiedappendkeysvalueslist)r    	addressesrD   rR   Ze2aZprimary_addressesZverified_addressesZprimary_verified_addressesaddressrK   aZprimary_addressr   r   r   cleanup_email_addresses   sP    





rd   c           
      C   s   ddl m} |jj|d r"tg }t| }|| }|rR||||ddd t	|}|rt||||ddd t
| || \}}|D ]}	||	_|	  q|j|| |r|r| |j krt	||j |  |S )z
    Creates proper EmailAddress for the user that was just signed
    up. Only sets up, doesn't do any other handling such as sending
    out email confirmation mails etc.
    rB   rC   r-   T)r)   rK   r\   rE   F)r   rD   rF   rI   rJ   AssertionErrorr   Zunstash_verified_emailr]   rA   rd   r)   saveZfill_cache_for_userr=   rK   )
r    r)   ra   rD   Zpriority_addressesrR   Zstashed_emailrK   r\   rc   r   r   r   setup_user_email  s4    
 
rg   c              
   C   s   ddl m} t| }|s t|}|rz<|j||}|jsZ|| |}|r^|j| |d nd}W n8 |j	k
r   d}|jj
| |||dd}|stY nX |r|| tjdd|i |r|| t| d	S )
a  
    E-mail verification mails are sent:
    a) Explicitly: when a user signs up
    b) Implicitly: when a user attempts to log in using an unverified
    e-mail while EMAIL_VERIFICATION is mandatory.

    Especially in case of b), we want to limit the number of mails
    sent (consider a user retrying a few times), which is why there is
    a cooldown period before sending a new mail. This cooldown period
    can be configured in ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN setting.
    rB   rC   )r&   FT)r&   Zconfirmz,account/messages/email_confirmation_sent.txtrK   N)r   rD   r   rA   rF   rG   rE   Zshould_send_confirmation_mailZsend_confirmationrH   Z	add_emailre   Zadd_messager   INFOZ
stash_useruser_pk_to_url_str)r    r)   r&   rK   rD   rR   Zemail_addressZ
send_emailr   r   r   send_email_confirmation%  sD         rj   c                 C   sd   ddl m} t| }|r`|jj| |d s`tjrH|jj|d rHdS |jj| |dddd dS )	z
    Keep user.email in sync with user.emailaddress_set.

    Under some circumstances the user.email may not have ended up as
    an EmailAddress record, e.g. in the case of manually created admin
    users.
    rB   rC   )r)   rY   rX   NF)r\   rE   )r)   rK   defaults)	r   rD   rA   rF   rI   rJ   r   rZ   Zget_or_create)r)   rD   rK   r   r   r   sync_user_email_addressesT  s       rl   c                  G   sn   t jrFdd | D }|d }|dd  D ]}||B }q(t j|}n$t jjf t jd dd | D i}|S )Nc                 S   s    g | ]}t f tjd  |iqS )__iexact)r	   r   r+   .0ur   r   r   
<listcomp>q  s   z,filter_users_by_username.<locals>.<listcomp>r   rB   Z__inc                 S   s   g | ]}|  qS r   )r=   rn   r   r   r   rq   }  s     )r   r<   r   Z_default_managerrI   r+   )usernameZqlistqZq2r'   r   r   r   filter_users_by_usernameo  s     

rt   c                 C   s   ddl m} t }|jj| d}|dk	r4|j|d}g }|dD ]}t|j| rB||j	 qBt
jrt
jd | i}|jjf |}|dk	r|j|d}| D ]$}	t|	t
j}
t|
| r||	 qtt|S )	zReturn list of users by email address

    Typically one, at most just a few in length.  First we look through
    EmailAddress table, than customisable User model table. Add results
    together avoiding SQL joins and deduplicate.
    rB   rC   rX   N)Zuser__is_activer)   rm   )	is_active)r   rD   r   rF   rI   Zprefetch_relatedr   rK   r]   r)   r   r@   iteratorr,   r`   set)rK   ru   rD   r9   ZmailsZusersrS   Zq_dictZuser_qsr)   rA   r   r   r   filter_users_by_email  s&    
rx   c                 C   s8   | ddk stt| |}|r4|d t||i }|S )N?r   )findre   r"   r   )r    r%   r!   Znext_urlr   r   r   passthrough_next_redirect_url  s
    
r{   c                 C   sV   t  }tt|jjtjr4t| jtr,| jS | jj	S | j}t|t
rNt| j}t|S )z&
    This should return a string.
    )r   
issubclasstyper2   pkr   	UUIDField
isinstancestrhexintr   )r)   r9   r'   r   r   r   ri     s    

ri   c                 C   s   t  }t|jjdd }|r8t|dd r8|jjjjjj}n|jj}tt|tj	rZ|
| S z|
d | }W n tk
r   t| }Y nX |S )Nremote_fieldtorc   )r   r,   r2   r~   r   r   r|   r}   r   r   Z	to_pythonr   r   )sr9   r   Zpk_fieldr~   r   r   r   url_str_to_user_pk  s    

r   )r   )Nr   F)N)NNFN)N)FN)N)8r   collectionsr   Zdjango.confr   Zdjango.contribr   Zdjango.contrib.authr   Zdjango.core.exceptionsr   r   Z	django.dbr   Zdjango.db.modelsr	   Zdjango.utils.encodingr
   Zdjango.utils.httpr   r   r   Zallauth.accountr   r   Zallauth.account.adapterr   Zallauth.exceptionsr   Zallauth.utilsr   r   r   r   r   r"   r$   r/   r*   r.   r1   r;   r?   rA   rL   rT   rW   rd   rg   rj   rl   rt   rx   r{   ri   r   r   r   r   r   <module>   sN   


    
)
>#
/
