U
    uc4|                     @   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	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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'm(Z(m)Z) ddl*m+Z+ ddl,mZm-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3 ddl4m5Z5 dd Z6G dd de7Z8dd Z9G dd de7Z:dd Z;G d d! d!e:Z<G d"d# d#e'Z=dS )$    N)parse_qsurlparse)settings)AnonymousUser)MessageMiddleware)SessionMiddleware)RequestFactory)override_settings)reverse)	urlencode   )app_settings)EmailAddress)
user_emailuser_username)MockMockedResponseTestCasemocked_responsepatch)get_user_model   )r   	providers)complete_social_login)SocialAccount	SocialAppSocialLogin)signupc                 C   s`   d }t j| ji ds\tjj| j| jd| jdd}tj jr\ddl	m
} |j|j  |S )NZAPPapp123iddummyprovidernameZ	client_idkeyZsecretr   Site)r   	PROVIDERSgetidr   objectscreateallauthSITES_ENABLEDdjango.contrib.sites.modelsr%   sitesaddget_current)r!   appr%    r2   _/var/www/html/crackeverytest/cet_env/lib/python3.8/site-packages/allauth/socialaccount/tests.py	setup_app    s    r4   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   s   d S Nr2   selfr2   r2   r3   get_mocked_response4   s    z#OAuthTestsMixin.get_mocked_responsec                    s.   t t|   tj| j| _t| j| _	d S r6   )
superr5   setUpr   registryby_idprovider_idr!   r4   r1   r7   	__class__r2   r3   r;   7   s    zOAuthTestsMixin.setUpFSOCIALACCOUNT_AUTO_SIGNUPc                 C   s   |   }|d k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Zfetch_redirect_responseuserrL   r!   )r9   warningswarnr!   r(   loginassertRedirectsr
   clientr'   contextsociallogindictr   rL   strrandom	randrangepostassertFalsehas_usable_passwordr   r)   get_provider_accountget_avatar_urlget_profile_url	get_brandto_str)r8   
resp_mocksresprT   rI   rL   accountprovider_accountr2   r2   r3   
test_login<   s.    

zOAuthTestsMixin.test_loginT)rB   ZSOCIALACCOUNT_EMAIL_REQUIREDACCOUNT_EMAIL_REQUIREDc                 C   sT   |   }|s"td| jj  d S | |}| j|ddd | |jd 	  d S )NrC   rJ   FrK   rL   )
r9   rN   rO   r!   r(   rP   rQ   rZ   rS   r[   )r8   ra   rb   r2   r2   r3   test_auto_signupX   s    
z OAuthTestsMixin.test_auto_signuprP   c              	   C   s   t tddddi0 | jt| jjd d tt|d }W 5 Q R X t	|d }t
|j}t| jjd	 }| |d
 d |d t |  f|  | j|}W 5 Q R X |S )N   )oauth_token=token&oauth_token_secret=psstcontent-type	text/html_login?processlocation	_callbackZoauth_callbackr   )r   r   rR   rY   r
   r!   r(   r   rU   r   r   queryassertGreaterfindget_access_token_responser'   )r8   ra   ro   rb   pqcomplete_urlr2   r2   r3   rP   f   s*    
zOAuthTestsMixin.loginc                 C   s   t ddddiS )Nrh   ri   rj   rk   )r   r7   r2   r2   r3   ru   {   s
    z)OAuthTestsMixin.get_access_token_responsec                 C   s4   | j t| jjd }| |dttdd  d S Nrq   z%socialaccount/authentication_error.%sZACCOUNT_TEMPLATE_EXTENSIONhtmlrR   r'   r
   r!   r(   assertTemplateUsedgetattrr   r8   rb   r2   r2   r3   test_authentication_error   s    
z)OAuthTestsMixin.test_authentication_error)rP   )__name__
__module____qualname__r>   r9   r;   r	   re   rg   rP   ru   r   __classcell__r2   r2   r?   r3   r5   1   s   

	
r5   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   r(   r>   r2   r!   r2   r3   Class   s   r   ZOAuthTests_)r5   r   r(   r   r!   r   r2   r   r3   create_oauth_tests   s    r   c                       s   e Zd ZdZdd Zd ddZ f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d!ddZdd Zd"ddZdd Zdd Z  ZS )#OAuth2TestsMixinNc                 C   s   d S r6   r2   r7   r2   r2   r3   r9      s    z$OAuth2TestsMixin.get_mocked_responseTc                 C   s   d}|rd}d| S )N z,"refresh_token": "testrf"zQ{
            "uid":"weibo",
            "access_token":"testac"
            %s }r2   )r8   with_refresh_tokenrtr2   r2   r3   get_login_response_json   s    z(OAuth2TestsMixin.get_login_response_jsonc                    s.   t t|   tj| j| _t| j| _	d S r6   )
r:   r   r;   r   r<   r=   r>   r!   r4   r1   r7   r?   r2   r3   r;      s    zOAuth2TestsMixin.setUpc              	   C   sT   t j| ji }| }d|d< | j| j|id | | j i  W 5 Q R X d S )NFOAUTH_PKCE_ENABLEDZSOCIALACCOUNT_PROVIDERS)	r   r&   r'   r>   copyr   assertEqualr!   get_pkce_params)r8   provider_settingsprovider_settings_with_pkce_setr2   r2   r3    test_provider_has_no_pkce_params   s    z1OAuth2TestsMixin.test_provider_has_no_pkce_paramsc              	   C   s   t j| ji }| }d|d< | j| j|idf | j }| t	|
 dddh t|d d}t| }|d}|d |kstW 5 Q R X d S )	NTr   r   code_challengecode_challenge_methodcode_verifierascii   =)r   r&   r'   r>   r   r   r!   r   r   setkeyshashlibsha256encodebase64urlsafe_b64encodedigestrstripAssertionError)r8   r   r   Zpkce_paramsZhashed_verifierr   Zcode_challenge_without_paddingr2   r2   r3   test_provider_has_pkce_params   s"    


z.OAuth2TestsMixin.test_provider_has_pkce_paramsFrA   c                 C   s@   |   }|s"td| jj  d S | |}| |td d S )NrC   rD   )r9   rN   rO   r!   r(   rP   rQ   r
   )r8   	resp_mockrb   r2   r2   r3   re      s    zOAuth2TestsMixin.test_loginc              	   C   s   t j| ji }| }d|d< | j| j|idL |  }|s`td| j	j
  W 5 Q R  d S | |}| |td W 5 Q R X d S )NFr   r   rC   rD   r   r&   r'   r>   r   r   r9   rN   rO   r!   r(   rP   rQ   r
   )r8   r   Z$provider_settings_with_pkce_disabledr   rb   r2   r2   r3   test_login_with_pkce_disabled   s$     
z.OAuth2TestsMixin.test_login_with_pkce_disabledc              	   C   s   t j| ji }| }d|d< | j| j|idL |  }|s`td| j	j
  W 5 Q R  d S | |}| |td W 5 Q R X d S )NTr   r   rC   rD   r   )r8   r   Z#provider_settings_with_pkce_enabledr   rb   r2   r2   r3   test_login_with_pkce_enabled   s$     
z-OAuth2TestsMixin.test_login_with_pkce_enabledc                 C   s  t js
d S d}t dd}t|| t|d |d |  tjj	||ddd | j
j|jdd | j|  dd	 |r| j|  d
dd tjj|| jjd }| }|  |  |  |  | jr|j }| d|j | |jt| jdddd d S )Nzuser@example.comT)Z	is_activerL   test)rL   rF   primaryverifiedrG   passwordconnectrn   F)r   ro   rM   Ztestacr   Zrefresh_tokenr   ) r   ZSTORE_TOKENSr   r   r   set_passwordsaver   r)   r*   rR   rP   rG   r9   r   filterr!   r(   r'   r\   r]   r^   r_   r`   r1   Zsocialtoken_setr   tokenZtoken_secretjsonloadsr   )r8   multiple_loginrF   rL   sard   tr2   r2   r3   test_account_tokens  sB    



 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   r7   r2   r2   r3   +test_account_refresh_token_saved_next_login(  s    z<OAuth2TestsMixin.test_account_refresh_token_saved_next_loginrP   c              	   C   s  | j t| jjd d tt|d }t|d }t|j	}t
j| ji d| jj}| d|k| | d|k| |r|d d }| |d d d	 t| jjd
 }	| |d d |	d | j|d}
t|tr|}n|d krg }n|g}ttd|
ddif|  | j |	| |}tjj}|D ]\}}|di }|d dkr6t|tr6|dd|	r6| d|k| |r6t|d d}t |! "d# }| || q6W 5 Q R X |S )Nrl   rm   rn   rp   r   r   r   r   ZS256rq   Zredirect_urir   rh   rj   zapplication/jsonrI   POSTr   r   r   r   )$rR   rY   r
   r!   r(   r   rU   r   r   rr   r   r&   r'   r>   Zpkce_enabled_defaultr   rs   rt   r   
isinstancelistr   r   get_complete_parametersrequestsrequestZcall_args_listendswithr   r   r   r   r   r   r   decode)r8   r   ro   r   rb   rv   rw   Zpkce_enabledr   rx   Zresponse_jsonra   Zrequest_callsargskwargsrI   Zhashed_code_verifierZexpected_code_challenger2   r2   r3   rP   0  sl    
 

zOAuth2TestsMixin.loginc                 C   s   d|d d dS )Nr   stater   )coder   r2   )r8   rw   r2   r2   r3   r   p  s    z(OAuth2TestsMixin.get_complete_parametersc                 C   s4   | j t| jjd }| |dttdd  d S ry   r{   r~   r2   r2   r3   r   s  s    
z*OAuth2TestsMixin.test_authentication_error)T)F)NrP   T)r   r   r   r>   r9   r   r;   r   r   r	   re   r   r   r   r   rP   r   r   r   r2   r2   r?   r3   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_oauth2_tests.<locals>.ClassNr   r2   r   r2   r3   r     s   r   ZOAuth2Tests_)r   r   r(   r   r   r2   r   r3   create_oauth2_tests~  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 fd
dZdd Zdd Ze	dddd Z
  ZS )OpenIDConnectTestsz/login	/userinfoz/token)Zauthorization_endpointZuserinfo_endpointZtoken_endpointz&https://secure.gravatar.com/avatar/123z#ness@some.oidc.server.onett.examplei  ZNess)ZpicturerF   subZ
identitiesr"   c                    s<   t t|   tdt| jdd}| | _| |j	 d S )Nz=allauth.socialaccount.providers.openid_connect.views.requests)Zside_effect)r'   )
r:   r   r;   r   r   _mocked_responsesstartZmock_requestsZ
addCleanupstop)r8   Zpatcherr?   r2   r3   r;     s    

zOpenIDConnectTests.setUpc                 C   s   dS )NTr2   r7   r2   r2   r3   r9     s    z&OpenIDConnectTests.get_mocked_responsec                 O   s<   | drtdt| jS | dr8tdt| jS d S )Nz!/.well-known/openid-configurationrh   r   )r   r   r   dumpsoidc_info_contentuserinfo_content)r8   urlr   r   r2   r2   r3   r     s    

z$OpenIDConnectTests._mocked_responsesTrA   c                 C   s>   |   }| j|ddd tjj| jjd}| |j| j d S )NrJ   FrK   r   )	rP   rQ   r   r)   r'   r!   r(   ZassertDictEqual
extra_data)r8   rb   r   r2   r2   r3   test_login_auto_signup  s    z)OpenIDConnectTests.test_login_auto_signup)r   r   r   r   r   r   r;   r9   r   r	   r   r   r2   r2   r?   r3   r     s*   	r   c                	       sJ  e Zd Z fddZeddejjddd Zedddddd	d
d Z	edddddd	dd Z
edddddd	dd Zeddddgddddddd Zdd Zdd Zeddddddddd Zeddddddddd  Zedddddddd!d"d# Zedddddddd$d% Zd&d' Zd(d) Zeed*d+d, Z  ZS )-SocialAccountTestsc                    sf   t t|   tj D ]H}tjj|j	|j	dddd}t
jjrddlm} |j }|j| qd S )Nr   123r   r    r   r$   )r:   r   r;   r   r<   Zget_listr   r)   r*   r(   r+   r   r,   r-   r%   r0   r.   r/   )r8   r!   r1   r%   siter?   r2   r3   r;     s    
zSocialAccountTests.setUpTN)rB   ZACCOUNT_SIGNUP_FORM_CLASSACCOUNT_EMAIL_VERIFICATIONc                 C   s   t  }|d}t |_tdd | tdd | t }| }t|t	j
d t|t	jd tddd	}t||d
}t|| |jjf t	j
di}| tjj||jd  | tjj|t|d  d S )Nz/accounts/login/callback/c                 S   s   d S r6   r2   r   r2   r2   r3   <lambda>      z?SocialAccountTests.test_email_address_created.<locals>.<lambda>c                 S   s   d S r6   r2   r   r2   r2   r3   r     r   r   test@example.comZopenidr   r!   uidrL   rc   )rL   r   )rL   rF   )r   r'   r   rL   r   process_requestr   r   setattraccount_settingsUSER_MODEL_USERNAME_FIELDUSER_MODEL_EMAIL_FIELDr   r   r   r)   
assertTruer   r   existsr   r   r8   factoryr   UserrL   rc   rT   r2   r2   r3   test_email_address_created  s&    

z-SocialAccountTests.test_email_address_createdrF   )rf   ACCOUNT_UNIQUE_EMAILACCOUNT_USERNAME_REQUIREDACCOUNT_AUTHENTICATION_METHODrB   c                 C   sx   |  dd\}}| |d td d|_ddd|_t|}| |d d	 t jjf t	j
di}| t|d d
S )z%Test clash on both username and emailr   r   rp   rD   r   otherother@example.comrG   rF   rJ   N)_email_address_clashr   r
   methodr   r   r   r)   r'   r   r   r   r8   r   rb   rL   r2   r2   r3   *test_email_address_clash_username_required  s    	
z=SocialAccountTests.test_email_address_clash_username_requiredFc                 C   sv   |  dd\}}| |d td d|_ddi|_t|}| |d d t jjf t	j
di}| t|d d	S )
z)Test clash while username is not requiredr   r   rp   rD   r   rF   r   rJ   N)r   r   r
   r   r   r   r   r)   r'   r   r   assertNotEqualr   r   r2   r2   r3   .test_email_address_clash_username_not_required  s    	

zASocialAccountTests.test_email_address_clash_username_not_requiredc                 C   sJ   |  dd\}}| |d d t jjf tjdi}| t|d d S )Nr   r   rp   rJ   )	r   r   r   r)   r'   r   r   r   r   r   r2   r2   r3   -test_email_address_clash_username_auto_signup  s    	
z@SocialAccountTests.test_email_address_clash_username_auto_signuprG   Z	username1Z	username2)rf   ZACCOUNT_USERNAME_BLACKLISTr   r   r   rB   c                 C   s   t  }|d}t |_tdd | tdd | t }| }t|t	j
d t|t	jd tddd	}t||d
}t|| | |jjt	j d S )N!/accounts/twitter/login/callback/c                 S   s   d S r6   r2   r   r2   r2   r3   r   ,  r   zHSocialAccountTests.test_populate_username_in_blacklist.<locals>.<lambda>c                 S   s   d S r6   r2   r   r2   r2   r3   r   -  r   rG   zusername@example.comtwitterr   r   r   )r   r'   r   rL   r   r   r   r   r   r   r   r   r   r   r   ZassertNotInrG   ZUSERNAME_BLACKLISTr   r2   r2   r3   #test_populate_username_in_blacklist   s"    	

z6SocialAccountTests.test_populate_username_in_blacklistc                 C   s   t  }| }t|d t|d |  tddd}| }t|| t|| t||d}t }|d}	t |	_	t
dd	 |	 td
d	 |	 t|	|}
|	|
fS )Nr   r   r   r   r   r   r   c                 S   s   d S r6   r2   r   r2   r2   r3   r   Q  r   z9SocialAccountTests._email_address_clash.<locals>.<lambda>c                 S   s   d S r6   r2   r   r2   r2   r3   r   R  r   )r   r   r   r   r   r   r   r'   r   rL   r   r   r   r   )r8   rG   rF   r   Zexi_userrc   rL   rT   r   r   rb   r2   r2   r3   r   >  s"    





z'SocialAccountTests._email_address_clashc                 C   s   t  }| }t|d t|d |d |  tjjdd|d}| jj	|j
|j
d | jtd}| |d | jtdd	|ji}| tjj|jd
  d S )Nr   r   r   r   )r   r!   rL   r   Zsocialaccount_connectionszsocialaccount/connections.htmlrc   )pk)r   r   r   r   r   r   r)   r*   rR   rP   rG   r'   r
   r|   rY   r   rZ   r   r   )r8   r   rL   rc   rb   r2   r2   r3   test_disconnectV  s    


 z"SocialAccountTests.test_disconnect	mandatory)rf   r   r   r   r   rB   c                 C   s   | j j}t }t|ddtddtddddgd}| |d< |  | j t	d	}|j
d
 }| |d  d | j jt	d	ddid}| j|ddd |j d }| t|d | tjj|dddd  | tjj|dddd  dS )z
        Test scenario for when the user changes email at social signup. Current
        behavior is that both the unverified and verified email are added, and
        that the user is allowed to pass because he did provide a verified one.
        zverified@example.comrF   googler   TrF   r   r   rL   rc   Zemail_addressessocialaccount_socialloginrD   rE   rF   unverified@example.orgrH   rJ   FrK   r   rL   rF   r   r   NrR   sessionr   r   r   r   	serializer   r'   r
   rS   r   valuerY   rQ   r)   allr   r   r   r   r8   r  r   rT   rb   rE   rL   r2   r2   r3   $test_verified_email_change_at_signupi  sH    
z7SocialAccountTests.test_verified_email_change_at_signupc                 C   s   | j j}t }t|ddtddtddddgd}| |d	< |  | j t	d
}|j
d }| |d  d | j jt	d
ddid}| |t	d |j d }| t|d | tjj|dddd  | tjj|dddd  dS )z
        Test scenario for when the user changes email at social signup, while
        his provider did not provide a verified email. In that case, email
        verification will kick in. Here, both email addresses are added as
        well.
        zunverified@example.comr   r   r   FTr   r  r  rD   rE   rF   r  rH   Zaccount_email_verification_sentr   r  Nr  r
  r2   r2   r3   &test_unverified_email_change_at_signup  sP    
z9SocialAccountTests.test_unverified_email_change_at_signup)ZACCOUNT_PREVENT_ENUMERATIONrf   r   r   r   r   rB   c                 C   s   | j j}t }|jjdd t|ddtddtddddgd}| |d< |	  | j 
td	}|jd
 }| |d  d | j jtd	ddid}tjdkr| |jd
 dd n| |d
dd d S )Nzme@example.comr   r   r   Tr   r  r  rD   rE   rF   rH   )   r   z{An account already exists with this e-mail address. Please sign in to that account first, then connect your Google account.)rR   r  r   r)   r*   r   r   r   r  r   r'   r
   rS   r   r  rY   djangoVERSIONZassertFormErrorr8   r  r   rT   rb   rE   r2   r2   r3   #test_unique_email_validation_signup  s<    

 
z6SocialAccountTests.test_unique_email_validation_signupc                 C   s   | j j}t }t|ddtddd}| |d< |  | j td}|j	d }| 
|d	  d | j jtdd
ddd}| 
|jd | 
|j d | 
tj d | j td}| |td dS )a  
        Test scenario for when the user signs up with a social account
        and uses email address in that social account. But upon seeing the
        verification screen, they realize that email address is somehow
        unusable for them, and so backs up and enters a different email
        address (and is forced to choose a new username) while providing
        the same social account token which is owned by their first attempt.
        zme1@example.comr   Zfacebookr   r   r  rD   rE   rF   Zme1r   rH   i.  r   Zaccount_loginN)rR   r  r   r   r   r  r   r'   r
   rS   r   r  rY   Zstatus_coder)   countrQ   r  r2   r2   r3   #test_social_account_taken_at_signup  s(    
z6SocialAccountTests.test_social_account_taken_at_signupc                 C   s.   t  }|dd}t|d}| dt| d S )Nr   rG   rL   r   r   r   rV   r8   r   rL   r   r2   r2   r3   test_social_account_str_default,  s    

z2SocialAccountTests.test_social_account_str_defaultc                 C   s   d | jS )NzA custom str builder for {})formatrL   )Zsocialaccountr2   r2   r3   "socialaccount_str_custom_formatter2  s    z5SocialAccountTests.socialaccount_str_custom_formatter)ZSOCIALACCOUNT_SOCIALACCOUNT_STRc                 C   s.   t  }|dd}t|d}| dt| d S )Nr   r  r  zA custom str builder for testr  r  r2   r2   r3   "test_social_account_str_customized5  s    

z5SocialAccountTests.test_social_account_str_customized)r   r   r   r;   r	   r   ZEmailVerificationMethodNONEr   r   r   r   r   r   r   r  r  r  r  r  r  r  r   r2   r2   r?   r3   r     s   



	

,
2	
%
r   )>r   r   r   rW   r   rN   urllib.parser   r   r  Zdjango.confr   Zdjango.contrib.auth.modelsr   Z"django.contrib.messages.middlewarer   Z"django.contrib.sessions.middlewarer   Zdjango.test.clientr   Zdjango.test.utilsr	   Zdjango.urlsr
   Zdjango.utils.httpr   Zallauth.app_settingsr+   rc   r   r   Zaccount.modelsr   Zaccount.utilsr   r   testsr   r   r   r   r   utilsr   r   r   Zhelpersr   Zmodelsr   r   r   Zviewsr   r4   objectr5   r   r   r   r   r   r2   r2   r2   r3   <module>   sB   \ j0