o
    &zhE>                     @   sT  d dl mZmZmZmZ d dlmZ d dlmZ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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" d dl#mZm$Z$m%Z% d d
l&mZ d dl'm(Z( d dl)m*Z* ej+s}edG dd dej,Z-G dd dej.Z/G dd dej.Z0G dd dej.Z1G dd dZ2dS )    )AnyDictListOptional)settings)authenticateget_user_model)get_current_site)ImproperlyConfiguredPermissionDenied)models)gettext_lazyN)app_settings)get_adapter)EmailAddress)filter_users_by_emailget_next_redirect_urlsetup_user_emailcontext)r   	providerssignals)statekit)get_request_paramzAallauth.socialaccount not installed, yet its models are imported.c                   @   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$   W/var/www/html/kangema/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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_lengthzprovider ID   T)r.   r/   blankname(   z	client id   zApp ID, or consumer key)r.   r/   	help_textz
secret keyz-API secret, client secret, or consumer secret)r.   r/   r1   r5   keyKey)defaultr1   z
sites.Site)r1   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%   MetaQ   s    r;   c                 C   s   | j S N)r2   r!   r$   r$   r%   __str__U   s   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_providerX   s   zSocialApp.get_providerN)r'   r(   r)   r   objectsr   	CharFieldr9   r+   provider_idr2   	client_idsecretr6   	JSONFielddictr   r   r   r   ManyToManyFieldsitesr;   r>   rC   r$   r$   r$   r%   r*   (   s@    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+   r0   r-   uidz
last loginT)r.   auto_nowzdate joined)r.   auto_now_addz
extra data)r.   r8   c                   @       e Zd ZdZedZedZdS )zSocialAccount.Metar+   rP   zsocial accountzsocial accountsNr'   r(   r)   unique_togetherr9   r.   r:   r$   r$   r$   r%   r;   |       r;   c                 C   s
   t | dS )N)account)r   r=   r$   r$   r%   r      s   
zSocialAccount.authenticatec                 C   s   ddl m} || S )N   )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   r9   r+   r   UID_MAX_LENGTHrP   DateTimeField
last_logindate_joinedrI   rJ   
extra_datar;   r   r>   r^   r`   rC   r]   r$   r$   r$   r%   rM   ]   s&    


rM   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)rO   r1   nullrN   tokenz/"oauth_token" (OAuth1) or access token (OAuth2))r.   r5   ztoken secretz7"oauth_token_secret" (OAuth1) or refresh token (OAuth2))r1   r.   r5   z
expires at)r1   ro   r.   c                   @   rS   )zSocialToken.Meta)r?   rX   zsocial application tokenzsocial application tokensNrU   r$   r$   r$   r%   r;      rW   r;   c                 C   s   d| j j| jf S )Nz%s (%s))_metar.   pkr=   r$   r$   r%   r>      s   zSocialToken.__str__N)r'   r(   r)   r   re   r*   SET_NULLr?   rM   rg   rX   	TextFieldr9   rp   token_secretrj   
expires_atr;   r>   r$   r$   r$   r%   rn      s"    
rn   c                   @   s  e Zd ZU dZeed< ee ed< ee	 ed< e
ed< ee ed< ee ed< eed< 													
d.dee dee deee	  dee def
ddZd/ddZedefddZde
eef fddZede
eef dd fddZd0dedd	fddZedefddZd/ddZdefddZd/d d!Zd/d"d#Zd/d$d%Zdee fd&d'Zede
eef fd(d)Zed1dee
eef  defd*d+Zedee
eef  fd,d-Zd	S )2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.
    rX   rp   email_addressesstate_did_authenticate_by_emailphonephone_verifiedNFc                 C   s\   || _ |r|jd u s|j|ksJ || _|| _|r|| _|r |ng | _i | _|| _|| _d S r<   )r+   rX   rp   rh   rx   ry   r{   r|   )r!   rh   rX   rp   rx   r+   r{   r|   r$   r$   r%   __init__   s   

zSocialLogin.__init__returnc                 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)rX   r+   r   )
rh   saver   social_account_addedsendrw   r   send_notification_mailrX   rC   )r!   r"   rh   r$   r$   r%   r      s   
zSocialLogin.connectc                 C   s   t | jdS )Nheadless)boolry   getr=   r$   r$   r%   is_headless   s   zSocialLogin.is_headlessc              	      s^   t  j t| j  | j | j| j fdd| jD | j	| j
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>)r+   rX   rh   ry   rx   r{   r|   rp   )r   r   rJ   r+   	serializerX   rh   ry   rx   r{   r|   rp   )r!   retr$   r   r%   r     s   	zSocialLogin.serializedatac                 C   s   ddl m} t j}||d }|t|d }|t |d }d|v r,|t|d }nd }g }|d D ]}	|t|	}
|	|
 q4|  }||_
||_||_||_||_|d |_|d	|_|d
d|_|S )Nr   )Providerr+   rX   rh   rp   rx   ry   r{   r|   F)-allauth.socialaccount.providers.base.providerr   r   deserialize_instancedeserializerM   r   rn   r   appendr+   rp   rX   rh   rx   ry   r   r{   r|   )clsr   r   r   r+   rX   rh   rp   rx   r   email_addressr   r$   r$   r%   r     s,   

zSocialLogin.deserializer   c                 C   s   | j }|  || j_ | j  tjr | jr | j| j_| j  |r#nt||| j | jr>t	 }|j
r@||| j| j dS dS 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   rX   r   STORE_TOKENSrp   r   rx   r{   get_account_adapter_has_phone_impl	set_phoner|   )r!   r"   r   rh   account_adapterr$   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)rr   )rh   rr   r   rD   r   existsr=   r$   r$   r%   is_existingB  s   zSocialLogin.is_existingc                 C   s   d| _ |  s|   dS dS )zcLook up the existing local user account to which this social login
        points, if any.
        N)rz   _lookup_by_socialaccount_lookup_by_emailr=   r$   r$   r%   lookupK  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 )NrT   r   TF)r   rM   rD   r   rX   r+   rP   rm   rh   r   r   social_account_updatedr   rw   r   r"   _store_tokenDoesNotExist)r!   ar$   r$   r%   r   S  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)rX   r?   )r   r   rp   rr   r?   rn   rD   r   rX   ru   rv   r   r   )r!   r?   tr$   r$   r%   r   f  s&   




zSocialLogin._store_tokenc                 C   sT   dd | j D }|D ]}t | |sq
t|dd}|r'|d | _|| _ d S q
d S )Nc                 S   s   g | ]}|j r|jqS r$   )verifiedemail)r   er$   r$   r%   r     s    z0SocialLogin._lookup_by_email.<locals>.<listcomp>T)prefer_verifiedr   )rx   r   can_authenticate_by_emailr   rh   rz   )r!   emailsr   usersr$   r$   r%   r   ~  s   
zSocialLogin._lookup_by_emailc                 C   sD   ddl m} | jr||| j| j tjr | tj| j d S d S d S )Nr   )wipe_password)	9allauth.socialaccount.internal.flows.email_authenticationr   rz   rh   r   !EMAIL_AUTHENTICATION_AUTO_CONNECTr   r   r"   )r!   r"   r   r$   r$   r%   _accept_login  s   zSocialLogin._accept_loginc                 C   s   | j d}|S )Nnext)ry   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 )zM
        TODO: Deprecated! To be integrated with provider.redirect()
        r   processloginscope auth_params)r   r   )r   r"   ry   next_urlr$   r$   r%   state_from_request  s   zSocialLogin.state_from_requestc                 C   s   |d u r	|  |}t||S r<   )r   r   stash_stater   r"   ry   r$   r$   r%   r     s   
zSocialLogin.stash_statec                 C   s   t |}|d u rt |S r<   )r   unstash_last_stater   r   r$   r$   r%   unstash_state  s   
zSocialLogin.unstash_state)NNNNNNF)r~   N)Fr<   ) r'   r(   r)   __doc__rM   __annotations__r   rn   r   r   r   strr   r}   r   propertyr   r   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   rw      s`   
 







" rw   )3typingr   r   r   r   django.confr   django.contrib.authr   r   django.contrib.sites.shortcutsr	   django.core.exceptionsr
   r   	django.dbr   django.utils.translationr   r9   allauth.app_settingsr   r   allauth_settingsallauth.account.adapterr   r   allauth.account.modelsr   allauth.account.utilsr   r   r   allauth.corer   allauth.socialaccountr   r   allauth.socialaccount.adapterallauth.socialaccount.internalr   allauth.utilsr   SOCIALACCOUNT_ENABLEDManagerr   Modelr*   rM   rn   rw   r$   r$   r$   r%   <module>   s4    5@