o
    &zh                     @   sN  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 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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*m+Z+ d dl,m-Z-m.Z. G dd dZ/G dd dZ0G dd de0e(Z1G dd de0Z2dS )    )	timedelta)RequestException)DictOptional)settings)PermissionDenied)render)reverse)timezone)app_settingslogin_not_required)ImmediateHttpResponse)add_query_params)get_adapter)complete_social_loginrender_authentication_error)statekit)SocialToken)ProviderException)	AuthError)BaseLoginView)OAuth2ClientOAuth2Error)build_absolute_uriget_request_paramc                   @   s   e Zd ZU dZeZdZdZee	 e
d< dZdZdZdZdZeee	e	f  e
d	< d
d Zdd ZdefddZdd Zdd ZdddZdd ZdS )OAuth2Adapter
expires_inTNredirect_uri_protocolPOSTaccess_denied Fheadersc                 C   s   || _ d| _d S )NF)requestdid_fetch_access_token)selfr#    r&   g/var/www/html/kangema/venv/lib/python3.10/site-packages/allauth/socialaccount/providers/oauth2/views.py__init__(   s   
zOAuth2Adapter.__init__c                 C   s   t | jj| j| jdS )N)provider)r   r#   get_providerprovider_idr%   r&   r&   r'   r*   ,   s   
zOAuth2Adapter.get_providertokenc                 K   s   t )z0
        Returns a SocialLogin instance
        )NotImplementedError)r%   r#   appr-   kwargsr&   r&   r'   complete_login1   s   zOAuth2Adapter.complete_loginc                 C   s    t | jd }| j}t|||S )N	_callback)r	   r+   r   r   )r%   r#   r/   callback_urlprotocolr&   r&   r'   get_callback_url7   s   zOAuth2Adapter.get_callback_urlc                 C   sJ   t |d d}|dd|_|| jd }|r#t tt|d |_|S )Naccess_token)r-   refresh_token )seconds)	r   gettoken_secretexpires_in_keyr
   nowr   int
expires_at)r%   datar-   r   r&   r&   r'   parse_token<   s   zOAuth2Adapter.parse_tokenc                 C   s$   t | jd}|j||d}d| _|S )Ncodepkce_code_verifierT)r   r#   get_access_tokenr$   )r%   r#   r/   clientrD   rB   r@   r&   r&   r'   get_access_token_dataD   s   z#OAuth2Adapter.get_access_token_datac                 C   s<   |  ||}| j| j|j|j| j| j|| j| j| j	d	}|S )N)scope_delimiterr"   
basic_auth)
r5   client_classr#   	client_idsecretaccess_token_methodaccess_token_urlrH   r"   rI   )r%   r#   r/   r3   rF   r&   r&   r'   
get_clientJ   s   zOAuth2Adapter.get_clientN)__name__
__module____qualname__r<   r   rJ   supports_stater   r   str__annotations__rM   login_cancelled_errorrH   rI   r"   r   r(   r*   r   r1   r5   rA   rG   rO   r&   r&   r&   r'   r      s"   
 
r   c                   @   s   e Zd Zedd ZdS )
OAuth2Viewc                    s   t  fdd}|S )Nc              
      sn    }| |_ t ts | |_n |_z|j| g|R i |W S  ty6 } z	|jW  Y d }~S d }~ww rP   )r#   
isinstancer   adapterdispatchr   response)r#   argsr0   r%   erZ   clsr&   r'   view]   s   
z%OAuth2View.adapter_view.<locals>.viewr   )r`   rZ   ra   r&   r_   r'   adapter_view[   s   zOAuth2View.adapter_viewN)rQ   rR   rS   classmethodrb   r&   r&   r&   r'   rX   Z   s    rX   c                   @   s   e Zd Zdd ZdS )OAuth2LoginViewc                 C   s
   | j  S rP   )rZ   r*   r,   r&   r&   r'   r*   n   s   
zOAuth2LoginView.get_providerN)rQ   rR   rS   r*   r&   r&   r&   r'   rd   m   s    rd   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )OAuth2CallbackViewc                 O   s*  | j  }| ||\}}|r|S d|jv sd|jvr:|jdd }|| j jkr,tj}ntj}t	||||| ddS |j
}	| j | j|	}
z/| j j||	|
|dd}| j |}|	jr_|	|_
| j j||	||d}||_||_t||W S  ttttfy } zt	|||d|id	W  Y d }~S d }~ww )
NerrorrB   )statecallback_view)rf   extra_contextrD   rC   )r\   rg   )	exceptionri   )rZ   r*   
_get_stateGETr:   rW   r   	CANCELLEDUNKNOWNr   r/   rO   r#   rG   rA   pkr1   r-   rg   r   r   r   r   r   )r%   r#   r]   r0   r)   rg   resp
auth_errorrf   r/   rF   r6   r-   loginr^   r&   r&   r'   r[   s   sV   
	zOAuth2CallbackView.dispatchc                 C   sT   d|j v stj dks|jdkrd S | }t|ddi}t|dtj	 ||dS )N_redirstrictrl   r8   zsocialaccount/login_redirect.)r)   redirect_to)
rl   r   SESSION_COOKIE_SAMESITElowermethodget_full_pathr   r   account_settingsTEMPLATE_EXTENSION)r%   r#   r)   ru   r&   r&   r'   _redirect_strict_samesite   s   

z,OAuth2CallbackView._redirect_strict_samesitec                 C   sr   d }t |d}| jjr|rt||}nt|}|d u r5| ||}|r)d |fS d t|||| ddfS |d fS )Nrg   )state_idrh   )ri   )r   rZ   rT   r   unstash_stateunstash_last_stater|   r   )r%   r#   r)   rg   r}   rp   r&   r&   r'   rk      s&   

zOAuth2CallbackView._get_stateN)rQ   rR   rS   r[   r|   rk   r&   r&   r&   r'   re   r   s    /re   N)3datetimer   requestsr   typingr   r   django.confr   django.core.exceptionsr   django.shortcutsr   django.urlsr	   django.utilsr
   allauth.accountr   rz   #allauth.account.internal.decoratorsr   allauth.core.exceptionsr   allauth.core.internal.httpkitr   allauth.socialaccount.adapterr   allauth.socialaccount.helpersr   r   allauth.socialaccount.internalr   allauth.socialaccount.modelsr   $allauth.socialaccount.providers.baser   .allauth.socialaccount.providers.base.constantsr   *allauth.socialaccount.providers.base.viewsr   -allauth.socialaccount.providers.oauth2.clientr   r   allauth.utilsr   r   r   rX   rd   re   r&   r&   r&   r'   <module>   s2    =