o
    ˷eS/                     @   s  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mZ d dl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mZ ddl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 )    )absolute_importauthenticate)get_current_site)PermissionDenied)models)get_random_string)gettext_lazyN)EmailAddress)get_next_redirect_urlsetup_user_email)get_user_model   )get_request_param   )app_settings	providers)get_adapter)	JSONFieldc                   @   s   e Zd ZdddZdS )SocialAppManagerNc                 C   sb   i }|rt |di }||_||}|s/tjjr%t|}| j|j|d}n| j|d}|||< |S )N_socialapp_cache)	sites__idprovider)r   )getattrr   getallauthr   SITES_ENABLEDr   id)selfr   requestcacheappsite r#   S/var/www/ideatree/venv/lib/python3.10/site-packages/allauth/socialaccount/models.pyget_current   s   
zSocialAppManager.get_currentN)__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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jrNejdddZdZG dd dZdd ZdS )	SocialAppr      verbose_name
max_lengthchoicesname(   r-   r.   z	client id   zApp ID, or consumer key)r-   r.   	help_textz
secret keyTz-API secret, client secret, or consumer secret)r-   r.   blankr4   keyKeyz
sites.Site)r5   Nc                   @   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$   MetaK   s    r:   c                 C      | j S r&   )r0   r   r#   r#   r$   __str__O      zSocialApp.__str__)r'   r(   r)   r   objectsr   	CharFieldr8   r   registry
as_choicesr   r0   	client_idsecretr6   r   r   r   ManyToManyFieldsitescertificate_keyr:   r=   r#   r#   r#   r$   r*   &   s6    r*   c                   @   s   e Zd ZejejjejdZ	ej
eddej 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ededZG dd dZdd Zdd Zdd Zdd Zdd Zdd ZdS )SocialAccount	on_deleter   r+   r,   uidr2   z
last loginT)r-   auto_nowzdate joined)r-   auto_now_addz
extra data)r-   defaultc                   @       e Zd ZdZedZedZdS )zSocialAccount.Metar   rK   zsocial accountzsocial accountsNr'   r(   r)   unique_togetherr8   r-   r9   r#   r#   r#   r$   r:   q       r:   c                 C   s
   t | dS )N)accountr   r<   r#   r#   r$   r   v   s   
zSocialAccount.authenticatec                 C   s   ddl m} || S )Nr   )socialaccount_user_display)helpersrU   )r   rU   r#   r#   r$   r=   y   s   zSocialAccount.__str__c                 C      |    S r&   )get_provider_accountget_profile_urlr<   r#   r#   r$   rY   ~      zSocialAccount.get_profile_urlc                 C   rW   r&   )rX   get_avatar_urlr<   r#   r#   r$   r[      rZ   zSocialAccount.get_avatar_urlc                 C   s   t j| jS r&   )r   rA   by_idr   r<   r#   r#   r$   get_provider      zSocialAccount.get_providerc                 C   s   |   | S r&   )r]   wrap_accountr<   r#   r#   r$   rX      r^   z"SocialAccount.get_provider_accountN)r'   r(   r)   r   
ForeignKeyr   r   
USER_MODELCASCADEuserr@   r8   r   rA   rB   r   UID_MAX_LENGTHrK   DateTimeField
last_logindate_joinedr   dict
extra_datar:   r   r=   rY   r[   r]   rX   r#   r#   r#   r$   rH   S   s(    
rH   c                   @   s   e Zd Zejeej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 )SocialTokenrI   tokenz/"oauth_token" (OAuth1) or access token (OAuth2))r-   r4   Tztoken secretz7"oauth_token_secret" (OAuth1) or refresh token (OAuth2))r5   r-   r4   z
expires at)r5   nullr-   c                   @   rO   )zSocialToken.Meta)r!   rT   zsocial application tokenzsocial application tokensNrQ   r#   r#   r#   r$   r:      rS   r:   c                 C   r;   r&   )rk   r<   r#   r#   r$   r=      r>   zSocialToken.__str__N)r'   r(   r)   r   r`   r*   rb   r!   rH   rT   	TextFieldr8   rk   token_secretre   
expires_atr:   r=   r#   r#   r#   r$   rj      s"    
rj   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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
    e-mail addresses retrieved from the provider.
    Nc                 C   s>   |r|j d u s|j |ksJ || _|| _|| _ || _i | _d S r&   )rT   rk   rc   email_addressesstate)r   rc   rT   rk   rq   r#   r#   r$   __init__   s   
zSocialLogin.__init__c                 C   s   || _ | j|dd d S )NT)connect)rc   save)r   r   rc   r#   r#   r$   rt      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>)rT   rc   rr   rq   rk   )r   ry   rh   rT   rc   rr   rq   rk   )r   retr#   rx   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 )NrT   rc   rk   rq   rr   )r   deserialize_instancerH   r   rj   r
   appendrk   rT   rc   rq   rr   )
clsdatar}   rT   rc   rk   rq   rw   email_addressr{   r#   r#   r$   deserialize   s"   

zSocialLogin.deserializeFc                 C   sl   | j rJ | j}|  || j_| j  tjr)| jr)| j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)
is_existingrc   ru   rT   r   STORE_TOKENSrk   app_idr   rq   )r   r   rt   rc   r#   r#   r$   ru      s   



zSocialLogin.savec                 C   s   | j jduS )zL
        Account is temporary, not yet backed by a database record.
        N)rT   pkr<   r#   r#   r$   r      s   zSocialLogin.is_existingc                 C   s  | j rJ zvtjj| jj| jjd}| jj|_|| _| jj| _|	  t
jrs| jrv| jjjry| jjr4J z)tjj| j| jjd}| jj|_| jjrN| jj|_| jj|_|	  || _W W dS  tjyr   || j_| j	  Y W dS w W dS W dS W dS  tjy   Y dS w )z2
        Lookup existing account, if any.
        rP   )rT   r!   N)r   rH   r?   r   rT   r   rK   ri   rc   ru   r   r   rk   r!   r   rj   rn   ro   DoesNotExist)r   atr#   r#   r$   lookup  s:   






zSocialLogin.lookupc                 C   s   | j d}|S )Nnext)rr   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   rr   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   rr   verifierr#   r#   r$   stash_state8  s   
zSocialLogin.stash_statec                 C   s$   d|j vrt |j d\}}|S Nr   r   r   popr   r#   r#   r$   unstash_state?  s   
zSocialLogin.unstash_statec                 C   s2   d|j vrt |j d\}}||krt |S r   r   )r   r   r   rr   	verifier2r#   r#   r$   verify_and_unstash_stateF  s   
z$SocialLogin.verify_and_unstash_state)F)r'   r(   r)   __doc__rs   rt   r|   classmethodr   ru   propertyr   r   r   r   r   r   r   r#   r#   r#   r$   rp      s(    	


#



rp   ))
__future__r   django.contrib.authr   django.contrib.sites.shortcutsr   django.core.exceptionsr   	django.dbr   django.utils.cryptor   django.utils.translationr	   r8   allauth.app_settingsr   allauth.account.modelsr
   allauth.account.utilsr   r   allauth.utilsr   utilsr   r   r   r   adapterr   fieldsr   Managerr   Modelr*   rH   rj   objectrp   r#   r#   r#   r$   <module>   s(    -8