o
    Lf$@                     @   s,  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e(Z)dd Z*G dd de(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+   e/var/www/html/humari/django-venv/lib/python3.10/site-packages/allauth/socialaccount/tests/__init__.py	setup_app   s   r-   c                       sj   e Zd Z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 )OAuthTestsMixinNc                 C      d S Nr+   selfr+   r+   r,   get_mocked_response0      z#OAuthTestsMixin.get_mocked_responsec                    s8   t t|   t| j| _t d}| j|| _	d S Nr   )
superr.   setUpr-   r'   r*   r   r   get_providerr   )r2   r(   	__class__r+   r,   r7   3   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}| }|  |  |  |  |S )N&Cannot test provider %s, no oauth mocksocialaccount_signupformi  i )emailusername)data/accounts/profile/Ffetch_redirect_responseuserrF   r   )r3   warningswarnr   idloginassertRedirectsr   clientr   contextsociallogindictr   rF   strrandom	randrangepostassertFalsehas_usable_passwordr   r   get_provider_accountget_avatar_urlget_profile_url	get_brandto_str)r2   
resp_mocksresprO   rB   rF   accountprovider_accountr+   r+   r,   
test_login9   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 )Nr=   rC   FrD   rF   )
r3   rH   rI   r   rJ   rK   rL   rU   rN   rV   )r2   r\   r]   r+   r+   r,   test_auto_signupU   s   
z OAuthTestsMixin.test_auto_signuprK   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   rM   rT   r   r   rJ   r	   rP   r   r   queryassertGreaterfindget_access_token_responser   )r2   r\   rk   r]   pqcomplete_urlr+   r+   r,   rK   c   s2   

zOAuthTestsMixin.loginc                 C   s   t ddddiS )Nrd   re   rf   rg   )r   r1   r+   r+   r,   rr   x   s
   z)OAuthTestsMixin.get_access_token_responsec                 C   s4   | j t| jjd }| |dttdd  d S )Nrm   %socialaccount/authentication_error.%sACCOUNT_TEMPLATE_EXTENSIONhtml)rM   r   r   r   rJ   assertTemplateUsedgetattrr   r2   r]   r+   r+   r,   test_authentication_error   s   
z)OAuthTestsMixin.test_authentication_error)rK   )__name__
__module____qualname__r'   r3   r7   r   r`   rc   rK   rr   r|   __classcell__r+   r+   r9   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   rJ   r'   r+   r   r+   r,   Class   s    
r   OAuthTests_)r.   r   rJ   r}   )r   r   r+   r   r,   create_oauth_tests   s   r   c                       s   e Zd ZdZ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 )(OAuth2TestsMixinNc                 C   r/   r0   r+   r1   r+   r+   r,   r3      r4   z$OAuth2TestsMixin.get_mocked_responseTc                 C   s   d}|rd}d| S )N z,"refresh_token": "testrf"zQ{
            "uid":"weibo",
            "access_token":"testac"
            %s }r+   )r2   with_refresh_tokenrtr+   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   )r6   r   r7   setup_providerr1   r9   r+   r,   r7      s   zOAuth2TestsMixin.setUpc                 C   s.   t | j| _t d| _| j| j| _d S r5   )r-   r'   r*   r   r   r(   r8   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   assertEqual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 )Nr=   r>   )r3   rH   rI   r   rJ   rK   rL   r   )r2   	resp_mockr]   r+   r+   r,   r`      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   r=   r>   r   r   r   r*   r   r   r   r3   rH   rI   rJ   rK   rL   r   )r2   r   $provider_settings_with_pkce_disabledr   r]   r+   r+   r,   test_login_with_pkce_disabled   s&   
"z.OAuth2TestsMixin.test_login_with_pkce_disabledc                 C   r   )NTr   r   r=   r>   r   )r2   r   #provider_settings_with_pkce_enabledr   r]   r+   r+   r,   test_login_with_pkce_enabled   s&   
"z-OAuth2TestsMixin.test_login_with_pkce_enabled)SOCIALACCOUNT_STORE_TOKENSc           	      C   sB  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 }| d|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_activerF   test)rF   r@   primaryverified)rA   passwordconnectrj   F)r   rk   rG   testacr   refresh_tokenrefreshTokenr   )r   r   r   set_passwordsaver
   r   r    rM   rK   rA   r3   r   filterr   r*   r'   rJ   r   rW   rX   rY   rZ   r[   socialtoken_setr   tokenjsonloadsr   token_secret)	r2   multiple_loginr@   rF   sar_   tr]   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_login/  s   z<OAuth2TestsMixin.test_account_refresh_token_saved_next_loginrK   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 )Nrj   rl   r   r   r   r   S256redirect_urir   rd   rf   zapplication/jsonrB   POSTr   r   r   r   )$r   rM   rT   r   get_login_urlr(   r   r   ro   r   r   r   r*   pkce_enabled_defaultr   get_callback_urlrp   rq   r   
isinstancelistr   get_complete_parametersrequestsSessioncall_args_listrP   endswithr   r   r   r   r   r   r   decode)r2   r   rk   r   r]   rs   rt   pkce_enabledr   ru   response_jsonr\   request_callsargskwargsrB   hashed_code_verifierexpected_code_challenger+   r+   r,   rK   8  sn   






zOAuth2TestsMixin.loginc                 C   s   d|d d dS )Nr   stater   )coder   r+   )r2   rt   r+   r+   r,   r   v  s   z(OAuth2TestsMixin.get_complete_parametersc                 C   s.   | j | j }| |dttdd  d S )Nrv   rw   rx   )rM   r   r   r   ry   rz   r   r{   r+   r+   r,   r|   y  s   
z*OAuth2TestsMixin.test_authentication_error)T)F)NrK   T)r}   r~   r   r'   r3   r   r   r7   r   r   r   r   r`   r   r   r   r   rK   r   r|   r   r+   r+   r9   r,   r      s,    





)

>r   c                   @   sj   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	e
dddd ZdS )OpenIDConnectTestsz/login	/userinfoz/token)authorization_endpointuserinfo_endpointtoken_endpointz&https://secure.gravatar.com/avatar/123z#ness@some.oidc.server.onett.examplei  Ness)picturer@   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   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(   r8   r1   r+   r+   r,   r     s   

z!OpenIDConnectTests.setup_providerc                 C   s   dS )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-configurationrd   r   )r   r   r   dumps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 )NrC   FrD   r   )	rK   rL   r   r   r   r*   r'   assertDictEqual
extra_data)r2   r]   r   r+   r+   r,   test_login_auto_signup  s   z)OpenIDConnectTests.test_login_auto_signupN)r}   r~   r   r   r   r   r   r   r3   r   r   r   r+   r+   r+   r,   r     s.    r   )-r   r   r   rR   r   rH   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-   objectr.   r   r   r   r+   r+   r+   r,   <module>   s4    ] q