o
    LfD6                     @   s  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 d dlmZ d dlZd d	lmZ d d
l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m Z  ddl!m"Z" G dd de
j#Z$G dd de
j%Z&G dd de
j%Z'G dd de
j%Z(G dd de)Z*dS )    )settings)authenticateget_user_model)get_current_site)PermissionDenied)models)get_random_string)gettext_lazyN)EmailAddress)filter_users_by_emailget_next_redirect_urlsetup_user_emailcontext)signals   )get_request_param   )app_settings	providers)get_adapterc                   @   s   e Zd Zdd ZdS )SocialAppManagerc                 C   s&   t jjrt|}| j|jdS |  S )N)	sites__id)allauthr   SITES_ENABLEDr   filteridall)selfrequestsite r!   ]/var/www/html/humari/django-venv/lib/python3.10/site-packages/allauth/socialaccount/models.pyon_site   s   zSocialAppManager.on_siteN)__name__
__module____qualname__r#   r!   r!   r!   r"   r      s    r   c                   @   s   e Zd Ze Zejeddej	
 dZejeddddZejedd	d
ZejeddeddZejedddeddZejedddeddZejeddZejjr_ejdddZG dd dZdd Zdd ZdS )	SocialAppprovider   )verbose_name
max_lengthchoiceszprovider ID   T)r*   r+   blankname(   r*   r+   z	client id   zApp ID, or consumer key)r*   r+   	help_textz
secret keyz-API secret, client secret, or consumer secret)r*   r+   r.   r3   keyKey)defaultr.   z
sites.Site)r.   c                   @   s   e Zd ZedZedZdS )zSocialApp.Metazsocial applicationzsocial applicationsN)r$   r%   r&   _r*   verbose_name_pluralr!   r!   r!   r"   MetaJ   s    r9   c                 C      | j S N)r/   r   r!   r!   r"   __str__N      zSocialApp.__str__c                 C   s   t j| j}||| dS )N)r   app)r   registry	get_classr(   )r   r   provider_classr!   r!   r"   get_providerQ   s   zSocialApp.get_providerN)r$   r%   r&   r   objectsr   	CharFieldr7   r   r@   
as_choicesr(   provider_idr/   	client_idsecretr4   	JSONFielddictr   r   r   r   ManyToManyFieldsitesr9   r=   rC   r!   r!   r!   r"   r'       sB    	r'   c                   @   s   e Zd ZejejejdZej	e
dddZej	e
dejdZeje
dddZeje
d	dd
Zeje
dedZG dd dZdd Zdd Zdd Zdd ZdddZdd ZdS )SocialAccount	on_deleter(   r-   r1   uidz
last loginT)r*   auto_nowzdate joined)r*   auto_now_addz
extra data)r*   r6   c                   @       e Zd ZdZedZedZdS )zSocialAccount.Metar(   rQ   zsocial accountzsocial accountsNr$   r%   r&   unique_togetherr7   r*   r8   r!   r!   r!   r"   r9   u       r9   c                 C   s
   t | dS )N)account)r   r<   r!   r!   r"   r   z   s   
zSocialAccount.authenticatec                 C   s   ddl m} || S )Nr   )socialaccount_user_display)helpersrZ   )r   rZ   r!   r!   r"   r=   }   s   zSocialAccount.__str__c                 C      |    S r;   )get_provider_accountget_profile_urlr<   r!   r!   r"   r^         zSocialAccount.get_profile_urlc                 C   r\   r;   )r]   get_avatar_urlr<   r!   r!   r"   r`      r_   zSocialAccount.get_avatar_urlNc                 C   s:   t | dd }|r
|S t }|j|ptj| jd }| _|S )N	_provider)r(   )getattrr   rC   r   r   r(   ra   )r   r   r(   adapterr!   r!   r"   rC      s   zSocialAccount.get_providerc                 C   s   |   | S r;   )rC   wrap_accountr<   r!   r!   r"   r]      s   z"SocialAccount.get_provider_accountr;   )r$   r%   r&   r   
ForeignKeyr   AUTH_USER_MODELCASCADEuserrE   r7   r(   r   UID_MAX_LENGTHrQ   DateTimeField
last_logindate_joinedrJ   rK   
extra_datar9   r   r=   r^   r`   rC   r]   r!   r!   r!   r"   rN   V   s&    


rN   c                   @   s   e Zd ZejeejdddZejeej	dZ
ejededdZejdededd	Zejdded
dZG dd dZdd ZdS )SocialTokenT)rP   r.   nullrO   tokenz/"oauth_token" (OAuth1) or access token (OAuth2))r*   r3   ztoken secretz7"oauth_token_secret" (OAuth1) or refresh token (OAuth2))r.   r*   r3   z
expires at)r.   ro   r*   c                   @   rT   )zSocialToken.Meta)r?   rY   zsocial application tokenzsocial application tokensNrV   r!   r!   r!   r"   r9      rX   r9   c                 C   r:   r;   )rp   r<   r!   r!   r"   r=      r>   zSocialToken.__str__N)r$   r%   r&   r   re   r'   SET_NULLr?   rN   rg   rY   	TextFieldr7   rp   token_secretrj   
expires_atr9   r=   r!   r!   r!   r"   rn      s"    
rn   c                   @   s   e Zd ZdZdddg fddZdd Zdd Zed	d
 Zd"ddZ	e
dd Zdd Zdd Zdd Zdd Zdd Zedd Zedd Zedd Zed d! ZdS )#SocialLogina&  
    Represents a social user that is in the process of being logged
    in. This consists of the following information:

    `account` (`SocialAccount` instance): The social account being
    logged in. Providers are not responsible for checking whether or
    not an account already exists or not. Therefore, a provider
    typically creates a new (unsaved) `SocialAccount` instance. The
    `User` instance pointed to by the account (`account.user`) may be
    prefilled by the provider for use as a starting point later on
    during the signup process.

    `token` (`SocialToken` instance): An optional access token token
    that results from performing a successful authentication
    handshake.

    `state` (`dict`): The state to be preserved during the
    authentication handshake. Note that this state may end up in the
    url -- do not put any secrets in here. It currently only contains
    the url to redirect to after login.

    `email_addresses` (list of `EmailAddress`): Optional list of
    email addresses retrieved from the provider.
    Nc                 C   s>   |r|j d u s|j |ksJ || _|| _|| _ || _i | _d S r;   )rY   rp   rh   email_addressesstate)r   rh   rY   rp   rv   r!   r!   r"   __init__   s   
zSocialLogin.__init__c                 C   sL   || _ | j|dd tjjt|| d t jd| j | j| j	 dd d S )NT)connectsenderr   socialloginz%socialaccount/email/account_connected)rY   r(   r   )
rh   saver   social_account_addedsendru   r   send_notification_mailrY   rC   )r   r   rh   r!   r!   r"   ry      s   
zSocialLogin.connectc                    sN   t  j t | j | j| j fdd| jD d}| jr% | j|d< |S )Nc                    s   g | ]} |qS r!   r!   ).0easerialize_instancer!   r"   
<listcomp>   s    z)SocialLogin.serialize.<locals>.<listcomp>)rY   rh   rw   rv   rp   )r   r   rK   rY   rh   rw   rv   rp   )r   retr!   r   r"   	serialize   s   zSocialLogin.serializec           
      C   s   t  j}|t|d }|t |d }d|v r|t|d }nd }g }|d D ]}|t|}|| q'|  }	||	_||	_||	_	||	_
|d |	_|	S )NrY   rh   rp   rv   rw   )r   deserialize_instancerN   r   rn   r
   appendrp   rY   rh   rv   rw   )
clsdatar   rY   rh   rp   rv   r   email_addressr   r!   r!   r"   deserialize   s"   

zSocialLogin.deserializeFc                 C   sZ   | j }|  || j_ | j  tjr | jr | j| j_| j  |r$dS t||| j dS )z
        Saves a new account. Note that while the account is new,
        the user may be an existing one (when connecting accounts)
        N)rh   r}   rY   r   STORE_TOKENSrp   r   rv   )r   r   ry   rh   r!   r!   r"   r}     s   


zSocialLogin.savec                 C   s(   | j jdu rdS t jj| j jd S )zuWhen `False`, this social login represents a temporary account, not
        yet backed by a database record.
        NF)pk)rh   r   r   rD   r   existsr<   r!   r!   r"   is_existing  s   zSocialLogin.is_existingc                 C   s   |   s
|   dS dS )zcLook up the existing local user account to which this social login
        points, if any.
        N)_lookup_by_socialaccount_lookup_by_emailr<   r!   r!   r"   lookup  s   zSocialLogin.lookupc                 C   s~   | j rJ z.tjj| jj| jjd}| jj|_|| _| jj| _|	  t
jjttj| d |   W dS  tjy>   Y d S w )NrU   rz   T)r   rN   rD   getrY   r(   rQ   rm   rh   r}   r   social_account_updatedr   ru   r   r   _store_tokenDoesNotExist)r   ar!   r!   r"   r   %  s"   


z$SocialLogin._lookup_by_socialaccountc                 C   s   t jr| jsd S | jjrJ | jj}|r|jsd }z&tjj| j|d}| jj|_| jj	r1| jj	|_	| jj
|_
|  || _W d S  tjyX   | j| j_|| j_| j  Y d S w )N)rY   r?   )r   r   rp   r   r?   rn   rD   r   rY   rs   rt   r}   r   )r   r?   tr!   r!   r"   r   8  s&   




zSocialLogin._store_tokenc                 C   sd   dd | j D }|D ]%}t | |sq
t|dd}|r/|d | _tjr,| tj	| j  d S q
d S )Nc                 S   s   g | ]}|j r|jqS r!   )verifiedemail)r   er!   r!   r"   r   Q  s    z0SocialLogin._lookup_by_email.<locals>.<listcomp>T)prefer_verifiedr   )
rv   r   can_authenticate_by_emailr   rh   r   !EMAIL_AUTHENTICATION_AUTO_CONNECTry   r   r   )r   emailsr   usersr!   r!   r"   r   P  s   
zSocialLogin._lookup_by_emailc                 C   s   | j d}|S )Nnext)rw   r   )r   r   urlr!   r!   r"   get_redirect_url\  s   zSocialLogin.get_redirect_urlc                 C   sL   i }t |}|r||d< t|dd|d< t|dd|d< t|dd|d< |S )Nr   processloginscope auth_params)r   r   )r   r   rw   next_urlr!   r!   r"   state_from_request`  s   zSocialLogin.state_from_requestc                 C   s$   |  |}td}||f|jd< |S )N   socialaccount_state)r   r   sessionr   r   rw   verifierr!   r!   r"   stash_statek  s   
zSocialLogin.stash_statec                 C   s$   d|j vrt |j d\}}|S Nr   r   r   popr   r!   r!   r"   unstash_stater  s   
zSocialLogin.unstash_statec                 C   s2   d|j vrt |j d\}}||krt |S r   r   )r   r   r   rw   	verifier2r!   r!   r"   verify_and_unstash_statey  s   
z$SocialLogin.verify_and_unstash_state)F)r$   r%   r&   __doc__rx   ry   r   classmethodr   r}   propertyr   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   ru      s.    	






ru   )+django.confr   django.contrib.authr   r   django.contrib.sites.shortcutsr   django.core.exceptionsr   	django.dbr   django.utils.cryptor   django.utils.translationr	   r7   allauth.app_settingsr   allauth.account.modelsr
   allauth.account.utilsr   r   r   allauth.corer   allauth.socialaccountr   utilsr   r   r   r   rc   r   Managerr   Modelr'   rN   rn   objectru   r!   r!   r!   r"   <module>   s(    6@