o
    "4gA                     @   s0  d dl Z d dlZd dlZd dlZd dlZd dlZd dl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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%m&Z&m'Z' dd Z(G dd dZ)dd Z*G dd dZ+G dd de+Z,dS )    N)parse_qsurlparse)settings)get_user_model)RequestFactory)override_settings)reverse)	urlencode)EmailAddress)
user_emailuser_username)app_settings)get_adapter)SocialAccount	SocialApp)MockedResponseTestCasemocked_responsec                 C   sf   t  d}t || }|r|d S tjj| | d| dd}tjj	r1ddl
m} |j|j  |S )N/r   app123iddummy)providername	client_idkeysecret)Site)r   getr   	list_appsr   objectscreateallauthr   SITES_ENABLEDdjango.contrib.sites.modelsr   sitesaddget_current)provider_idrequestappsappr    r+   m/var/www/html/authentication-server/venv/lib/python3.10/site-packages/allauth/socialaccount/tests/__init__.py	setup_app   s   r-   c                       sx   e Zd ZU eed< dd Zdd Z fddZedd	d
d Z	edddddd Z
dddZdd Zdd Z  ZS )OAuthTestsMixinr'   c                 C      d S Nr+   selfr+   r+   r,   get_mocked_response1      z#OAuthTestsMixin.get_mocked_responsec                 C      t r0   NotImplementedErrorr1   r+   r+   r,   get_expected_to_str4   r4   z#OAuthTestsMixin.get_expected_to_strc                    s8   t t|   t| j| _t d}| j|| _	d S Nr   )
superr.   setUpr-   r'   r*   r   r   get_providerr   )r2   r(   	__class__r+   r,   r;   7   s   zOAuthTestsMixin.setUpFSOCIALACCOUNT_AUTO_SIGNUPc                 C   s  |   }|d u rtd| jj  d S | |}| |td | j	td}|j
d j}tt|jttddd}| jjtd|d}| j|dd	d
 |j
d }| |  tjj	|| jjd}| }| | |   |  |  |  d S )N&Cannot test provider %s, no oauth mocksocialaccount_signupformi  i )emailusername)data/accounts/profile/Ffetch_redirect_responseuserrJ   r   )r3   warningswarnr   idloginassertRedirectsr   clientr   contextsociallogindictr   rJ   strrandom	randrangepostassertFalsehas_usable_passwordr   r   get_provider_accountassertEqualto_strr8   get_avatar_urlget_profile_url	get_brand)r2   
resp_mocksresprS   rF   rJ   accountprovider_accountr+   r+   r,   
test_login=   s,   

zOAuthTestsMixin.test_loginT)r@   SOCIALACCOUNT_EMAIL_REQUIREDACCOUNT_EMAIL_REQUIREDc                 C   sT   |   }|std| jj  d S | |}| j|ddd | |jd 	  d S )NrA   rG   FrH   rJ   )
r3   rL   rM   r   rN   rO   rP   rY   rR   rZ   )r2   ra   rb   r+   r+   r,   test_auto_signupX   s   
z OAuthTestsMixin.test_auto_signuprO   c                 C   s   t tddddi | jt| jjd d tt|d }W d    n1 s*w   Y  t	|d }t
|j}t| jjd	 }| |d
 d |d t |  g|R   | j|}W d    |S 1 skw   Y  |S )N   )oauth_token=token&oauth_token_secret=psstcontent-type	text/html_login?processlocation	_callbackoauth_callbackr   )r   r   rQ   rX   r   r   rN   r	   rT   r   r   queryassertGreaterfindget_access_token_responser   )r2   ra   rp   rb   pqcomplete_urlr+   r+   r,   rO   f   s2   

zOAuthTestsMixin.loginc                 C   s   t ddddiS )Nri   rj   rk   rl   )r   r1   r+   r+   r,   rw   {   s
   z)OAuthTestsMixin.get_access_token_responsec                 C   s4   | j t| jjd }| |dttdd  d S )Nrr   %socialaccount/authentication_error.%sACCOUNT_TEMPLATE_EXTENSIONhtml)rQ   r   r   r   rN   assertTemplateUsedgetattrr   r2   rb   r+   r+   r,   test_authentication_error   s   
z)OAuthTestsMixin.test_authentication_error)rO   )__name__
__module____qualname__rU   __annotations__r3   r8   r;   r   re   rh   rO   rw   r   __classcell__r+   r+   r=   r,   r.   .   s    
 


	r.   c                    s&   G  fdddt t}d j |_|S )Nc                       s   e Zd Z jZdS )z!create_oauth_tests.<locals>.ClassN)r   r   r   rN   r'   r+   r   r+   r,   Class   s    
r   OAuthTests_)r.   r   rN   r   )r   r   r+   r   r,   create_oauth_tests   s   r   c                       s   e Zd ZU eed< dd Zdd ZdefddZdefd	d
Zd-ddZ	dd Z
 fddZdd Zdd Zdd Zedddd Zedddd Zedddd Zedd d.d!d"Zedd d#d$ Zd/d'd(Zd)d* Zd+d, Z  ZS )0OAuth2TestsMixinr'   c                 C   r/   r0   r+   r1   r+   r+   r,   r3      r4   z$OAuth2TestsMixin.get_mocked_responsec                 C   r5   r0   r6   r1   r+   r+   r,   r8      r4   z$OAuth2TestsMixin.get_expected_to_strreturnc                 C      dS )Ntestacr+   r1   r+   r+   r,   get_access_token   r4   z!OAuth2TestsMixin.get_access_tokenc                 C   r   )Ntestrfr+   r1   r+   r+   r,   get_refresh_token   r4   z"OAuth2TestsMixin.get_refresh_tokenTc                 C   s.   t  j|  d}|r|  |d< t|S )N)uidaccess_tokenrefresh_token)uuiduuid4hexr   r   jsondumps)r2   with_refresh_tokenresponser+   r+   r,   get_login_response_json   s   
z(OAuth2TestsMixin.get_login_response_jsonc                 G   s   t | S r0   )r   r2   	responsesr+   r+   r,   r      s   z OAuth2TestsMixin.mocked_responsec                    s   t t|   |   d S r0   )r:   r   r;   setup_providerr1   r=   r+   r,   r;      s   zOAuth2TestsMixin.setUpc                 C   s.   t | j| _t d| _| j| j| _d S r9   )r-   r'   r*   r   r   r(   r<   r   r1   r+   r+   r,   r      s   zOAuth2TestsMixin.setup_providerc                 C   sn   t j| jji }| }d|d< | j| jj|id | | j i  W d    d S 1 s0w   Y  d S )NFOAUTH_PKCE_ENABLEDSOCIALACCOUNT_PROVIDERS)	r   	PROVIDERSr   r*   r   copyr   r\   get_pkce_params)r2   provider_settingsprovider_settings_with_pkce_setr+   r+   r,    test_provider_has_no_pkce_params   s   
"z1OAuth2TestsMixin.test_provider_has_no_pkce_paramsc                 C   s   t j| jji }| }d|d< | j| jj|id8 | j }| t	|
 h d t|d d}t| }|d}|d |ksKJ W d    d S 1 sVw   Y  d S )	NTr   r   >   code_verifiercode_challengecode_challenge_methodr   ascii   =r   )r   r   r   r*   r   r   r   r   r\   setkeyshashlibsha256encodebase64urlsafe_b64encodedigestrstrip)r2   r   r   pkce_paramshashed_verifierr   code_challenge_without_paddingr+   r+   r,   test_provider_has_pkce_params   s$   



"z.OAuth2TestsMixin.test_provider_has_pkce_paramsFr?   c                 C   s@   |   }|std| jj  d S | |}| |td d S )NrA   rB   )r3   rL   rM   r   rN   rO   rP   r   )r2   	resp_mockrb   r+   r+   r,   re      s   zOAuth2TestsMixin.test_loginc                 C      t j| jji }| }d|d< | j| jj|id. |  }|s4t	d| jj
  	 W d    d S | |}| |td W d    d S 1 sLw   Y  d S )NFr   r   rA   rB   r   r   r   r*   r   r   r   r3   rL   rM   rN   rO   rP   r   )r2   r   $provider_settings_with_pkce_disabledr   rb   r+   r+   r,   test_login_with_pkce_disabled   s&   
"z.OAuth2TestsMixin.test_login_with_pkce_disabledc                 C   r   )NTr   r   rA   rB   r   )r2   r   #provider_settings_with_pkce_enabledr   rb   r+   r+   r,   test_login_with_pkce_enabled   s&   
"z-OAuth2TestsMixin.test_login_with_pkce_enabled)SOCIALACCOUNT_STORE_TOKENSc           	      C   sR  d}t  dd}t|| t|d |d |  tjj||ddd | jj	|j
dd | j	|  dd	 |rC| j	|  d
dd tjj|| jjjpO| jjd }| }| | |   |  |  |  | jr|j }| |  |j t| jdd}d|v r|d}nd|v r|d}nd}| |j | d S d S )Nzuser@example.comT)	is_activerJ   test)rJ   rD   primaryverified)rE   passwordconnectro   F)r   rp   rK   r   r   refreshToken )!r   r   r   set_passwordsaver
   r   r    rQ   rO   rE   r3   r   filterr   r*   r'   rN   r   r[   r\   r]   r8   r^   r_   r`   socialtoken_setr   tokenr   loadsr   token_secret)	r2   multiple_loginrD   rJ   sard   trb   r   r+   r+   r,   test_account_tokens  sH   



z$OAuth2TestsMixin.test_account_tokensc                 C   s   | j dd dS )z
        fails if a login missing a refresh token, deletes the previously
        saved refresh token. Systems such as google's oauth only send
        a refresh token on first login.
        T)r   N)r   r1   r+   r+   r,   +test_account_refresh_token_saved_next_login8  s   z<OAuth2TestsMixin.test_account_refresh_token_saved_next_loginNrO   c                 C   s  |    | j| jj| j|d}W d    n1 sw   Y  t|d }t|j}t	j
| jji d| jj}| d|v | | d|v | |r]|d d }| |d d d | j }	| |d d |	d | j|d	}
t|tr}|}n
|d u rg }n|g}| j td
|
ddig|R  _ | j|	| |}tjjj}|D ]D\}}|di }|d dkrt|tr|dd|	r| d|v | |rt|d d}t |! "d# }| || qW d    |S 1 sw   Y  |S )Nro   rq   r   r   r   r   S256redirect_urir   ri   rk   zapplication/jsonrF   POSTr   r   r   r   )$r   rQ   rX   r   get_login_urlr(   r   r   rt   r   r   r   r*   pkce_enabled_defaultr\   get_callback_urlru   rv   r   
isinstancelistr   get_complete_parametersrequestsSessioncall_args_listrT   endswithr   r   r   r   r   r   r   decode)r2   r   rp   r   rb   rx   ry   pkce_enabledr   rz   response_jsonra   request_callsargskwargsrF   hashed_code_verifierexpected_code_challenger+   r+   r,   rO   A  sn   






zOAuth2TestsMixin.loginc                 C   s   d|d d dS )Nr   stater   )coder   r+   )r2   ry   r+   r+   r,   r     s   z(OAuth2TestsMixin.get_complete_parametersc                 C   s.   | j | j }| |dttdd  d S )Nr{   r|   r}   )rQ   r   r   r   r~   r   r   r   r+   r+   r,   r     s   
z*OAuth2TestsMixin.test_authentication_error)T)F)NrO   T)r   r   r   rU   r   r3   r8   r   r   r   r   r;   r   r   r   r   re   r   r   r   r   rO   r   r   r   r+   r+   r=   r,   r      s2   
 
	




)

>r   c                   @   sr   e Zd ZddddZdddg dd	Zdddg dd	Zd
d Zdd Zdd Zdd Z	dd Z
edddd ZdS )OpenIDConnectTestsz/login	/userinfoz/token)authorization_endpointuserinfo_endpointtoken_endpointz&https://secure.gravatar.com/avatar/123#ness@some.oidc.server.onett.examplei  Ness)picturerD   sub
identitiesr   c                 G   s   t |d| jiS )Ncallback)r   _mocked_responsesr   r+   r+   r,   r     s   z"OpenIDConnectTests.mocked_responsec                 C   r   )Nr   r+   r1   r+   r+   r,   r8     r4   z&OpenIDConnectTests.get_expected_to_strc                 C   sV   t | j| _| j| j_d| j_ddi| j_| j  t d| _| j	| j| _d S )Nopenid_connect
server_urlzhttps://unittest.example.comr   )
r-   r'   r*   r   r   r   r   r   r(   r<   r1   r+   r+   r,   r     s   

z!OpenIDConnectTests.setup_providerc                 C   r   )NTr+   r1   r+   r+   r,   r3     s   z&OpenIDConnectTests.get_mocked_responsec                 O   s<   | drtdt| jS | drtdt| jS d S )Nz!/.well-known/openid-configurationri   r   )r   r   r   r   oidc_info_contentuserinfo_content)r2   urlr   r   r+   r+   r,   r     s
   

z$OpenIDConnectTests._mocked_responsesTr?   c                 C   s>   |   }| j|ddd tjj| jjd}| |j| j d S )NrG   FrH   r   )	rO   rP   r   r   r   r*   r'   assertDictEqual
extra_data)r2   rb   r   r+   r+   r,   test_login_auto_signup  s   z)OpenIDConnectTests.test_login_auto_signupN)r   r   r   r   r   r  r   r8   r   r3   r   r   r  r+   r+   r+   r,   r     s0    r   )-r   r   r   rV   r   r   rL   urllib.parser   r   django.confr   django.contrib.authr   django.testr   django.test.utilsr   django.urlsr   django.utils.httpr	   allauth.app_settingsr!   allauth.account.modelsr
   allauth.account.utilsr   r   allauth.socialaccountr   allauth.socialaccount.adapterr   allauth.socialaccount.modelsr   r   allauth.testsr   r   r   r-   r.   r   r   r   r+   r+   r+   r,   <module>   s6    _ w