o
    )Zh3[                     @   sR  d dl Z d dlmZmZmZmZ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mZ zd d
l mZ W n eyW   dZY nw G dd deeZG dd deZG dd deeZG dd deZG dd deeZG dd deZ G dd deZ!G dd deeZ"G dd deeZ#G dd deZ$G dd  d eZ%G d!d" d"eeZ&G d#d$ d$e&Z'G d%d& d&e&Z(G d'd( d(e&Z)G d)d* d*e&Z*G d+d, d,eZ+G d-d. d.eZ,G d/d0 d0eZ-G d1d2 d2eZ.G d3d4 d4eeZ/G d5d6 d6eZ0G d7d8 d8eZ1G d9d: d:eZ2G d;d< d<eZ3dS )=    N)OpenIdMixin
OAuthMixinOAuth2MixinGoogleOAuth2MixinFacebookGraphMixinTwitterMixin)json_decode)gen)HTTPClientError)
url_concat)app_log)AsyncHTTPTestCase	ExpectLog)RequestHandlerApplication	HTTPError)mockc                   @   "   e Zd Zdd Zejdd ZdS )OpenIdClientLoginHandlerc                 C      | d| _d S )N/openid/server/authenticate)get_urlZ_OPENID_ENDPOINTselftest r   M/var/www/html/lang_env/lib/python3.10/site-packages/tornado/test/auth_test.py
initialize      z#OpenIdClientLoginHandler.initializec                 c   sX    |  dd r | j| jd dV }|d u rtd| | d S |  }|d u s*J d S )Nopenid.modehttp_clientr    user is None)get_argumentget_authenticated_usersettings	Exceptionfinishauthenticate_redirect)r   userresr   r   r   get"   s   
zOpenIdClientLoginHandler.getN__name__
__module____qualname__r   r	   	coroutiner+   r   r   r   r   r      s    r   c                   @      e Zd Zdd ZdS )OpenIdServerAuthenticateHandlerc                 C   s$   |  ddkrtd| d d S )Nr   Zcheck_authenticationzincorrect openid.mode %rzis_valid:true)r#   r&   writer   r   r   r   post1   s   z$OpenIdServerAuthenticateHandler.postNr-   r.   r/   r5   r   r   r   r   r2   0       r2   c                   @   s8   e Zd Zdd Zdd Zejdd Zejdd Zd	S )
OAuth1ClientLoginHandlerc                 C   s.   || _ |d| _|d| _|d| _d S )N/oauth1/server/request_token/oauth1/server/authorize/oauth1/server/access_token)_OAUTH_VERSIONr   _OAUTH_REQUEST_TOKEN_URL_OAUTH_AUTHORIZE_URL_OAUTH_ACCESS_TOKEN_URL)r   r   versionr   r   r   r   8      z#OAuth1ClientLoginHandler.initializec                 C      t dddS NasdfZqwerkeysecretdictr4   r   r   r   _oauth_consumer_token>      z.OAuth1ClientLoginHandler._oauth_consumer_tokenc                 c   sX    |  dd r | j| jd dV }|d u rtd| | d S | j| jd dV  d S )Noauth_tokenr    r!   r"   )r#   r$   r%   r&   r'   authorize_redirectr   r)   r   r   r   r+   A   s   
zOAuth1ClientLoginHandler.getc                 C   s:   |  dd r
td|tdddkrtd| tddS )	NZfail_in_get_userzfailing in get_useruiop5678rE   zincorrect access token %rfoo@example.com)email)r#   r&   rI   )r   access_tokenr   r   r   _oauth_get_user_futureM   s
   
z/OAuth1ClientLoginHandler._oauth_get_user_futureN)	r-   r.   r/   r   rJ   r	   r0   r+   rT   r   r   r   r   r8   7   s    
r8   c                   @   s   e Zd ZdZejdd ZdS )!OAuth1ClientLoginCoroutineHandlerzDReplaces OAuth1ClientLoginCoroutineHandler's get() with a coroutine.c              
   c   sl    |  dd r/z|  V  W d S  ty. } z| d | d|  W Y d }~d S d }~ww |  V  d S )NrL     zgot exception: %s)r#   r$   r&   
set_statusr3   rM   )r   er   r   r   r+   Y   s   
z%OAuth1ClientLoginCoroutineHandler.getN)r-   r.   r/   __doc__r	   r0   r+   r   r   r   r   rU   V   s    rU   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )$OAuth1ClientRequestParametersHandlerc                 C   s
   || _ d S N)r<   )r   r@   r   r   r   r   h      
z/OAuth1ClientRequestParametersHandler.initializec                 C   rB   rC   rH   r4   r   r   r   rJ   k   rK   z:OAuth1ClientRequestParametersHandler._oauth_consumer_tokenc                 C   s,   | j dtdddtddd}| | d S )Nzhttp://www.example.com/api/asdfrO   rP   rE   bar)foo)
parameters)Z_oauth_request_parametersrI   r3   )r   paramsr   r   r   r+   n   s   
z(OAuth1ClientRequestParametersHandler.getN)r-   r.   r/   r   rJ   r+   r   r   r   r   rZ   g   s    rZ   c                   @   r1   )OAuth1ServerRequestTokenHandlerc                 C      |  d d S )Nz(oauth_token=zxcv&oauth_token_secret=1234r3   r4   r   r   r   r+   x      z#OAuth1ServerRequestTokenHandler.getNr-   r.   r/   r+   r   r   r   r   ra   w   r7   ra   c                   @   r1   )OAuth1ServerAccessTokenHandlerc                 C   rb   )Nz(oauth_token=uiop&oauth_token_secret=5678rc   r4   r   r   r   r+   }   rd   z"OAuth1ServerAccessTokenHandler.getNre   r   r   r   r   rf   |   r7   rf   c                   @      e Zd Zdd Zdd ZdS )OAuth2ClientLoginHandlerc                 C   r   )Nz/oauth2/server/authorize)r   r>   r   r   r   r   r      r   z#OAuth2ClientLoginHandler.initializec                 C   s   |   }|d u s
J d S r[   )rM   )r   r*   r   r   r   r+      s   zOAuth2ClientLoginHandler.getN)r-   r.   r/   r   r+   r   r   r   r   rh      s    rh   c                   @   r   )FacebookClientLoginHandlerc                 C   s(   | d| _| d| _| d| _d S )Nz/facebook/server/authorize/facebook/server/access_tokenz/facebook/server)r   r>   r?   Z_FACEBOOK_BASE_URLr   r   r   r   r      s   z%FacebookClientLoginHandler.initializec                 c   sl    |  dd r$| j| j | jd | jd |  ddV }| | d S | j| j | jd ddid d S )Ncodefacebook_api_keyfacebook_secret)redirect_uri	client_idZclient_secretrk   scopezread_stream,offline_access)rn   ro   extra_params)r#   r$   requestfull_urlr%   r3   rM   rN   r   r   r   r+      s   
zFacebookClientLoginHandler.getNr,   r   r   r   r   ri      s    ri   c                   @   r1   ) FacebookServerAccessTokenHandlerc                 C   s   |  tddd d S )NrD   i  rS   Z
expires_in)r3   rI   r4   r   r   r   r+      s   z$FacebookServerAccessTokenHandler.getNre   r   r   r   r   rt      r7   rt   c                   @   r1   )FacebookServerMeHandlerc                 C   rb   )Nz{}rc   r4   r   r   r   r+      rd   zFacebookServerMeHandler.getNre   r   r   r   r   rv      r7   rv   c                   @   rg   )TwitterClientHandlerc                 C   s@   | d| _| d| _| d| _| d| _| d| _d S )Nr9   /twitter/server/access_tokenr:   z/twitter/server/authenticatez/twitter/api)r   r=   r?   r>   Z_OAUTH_AUTHENTICATE_URLZ_TWITTER_BASE_URLr   r   r   r   r      s
   zTwitterClientHandler.initializec                 C   s
   | j d S )Nr    )r%   r4   r   r   r   get_auth_http_client   r\   z)TwitterClientHandler.get_auth_http_clientN)r-   r.   r/   r   ry   r   r   r   r   rw      s    rw   c                   @      e Zd Zejdd ZdS )TwitterClientLoginHandlerc                 c   D    |  dd r|  V }|d u rtd| | d S |  V  d S NrL   r"   )r#   r$   r&   r'   rM   rN   r   r   r   r+         

zTwitterClientLoginHandler.getNr-   r.   r/   r	   r0   r+   r   r   r   r   r{          r{   c                   @   rz   ) TwitterClientAuthenticateHandlerc                 c   r|   r}   )r#   r$   r&   r'   r(   rN   r   r   r   r+      r~   z$TwitterClientAuthenticateHandler.getNr   r   r   r   r   r      s    r   c                   @   rz   )%TwitterClientLoginGenCoroutineHandlerc                 c   s4    |  dd r|  V }| | d S |  V  d S )NrL   )r#   r$   r'   rM   rN   r   r   r   r+      s
   
z)TwitterClientLoginGenCoroutineHandler.getNr   r   r   r   r   r      r   r   c                   @   rz   )TwitterClientShowUserHandlerc                 c   s`    z| j d| d tddddV }W n ty(   | d | d Y d S w | | d S )	Nz/users/show/%snamehjklvbnmrE   rS     zerror from twitter request)Ztwitter_requestr#   rI   r
   rW   r'   r   responser   r   r   r+      s   

z TwitterClientShowUserHandler.getNr   r   r   r   r   r      r   r   c                   @   r1   )TwitterServerAccessTokenHandlerc                 C   rb   )Nz8oauth_token=hjkl&oauth_token_secret=vbnm&screen_name=foorc   r4   r   r   r   r+      rd   z#TwitterServerAccessTokenHandler.getNre   r   r   r   r   r      r7   r   c                   @   r1   )TwitterServerShowUserHandlerc                 C   s   |dkrt dd| jjv sJ d| jjv sJ d| jjv s J | ddks)J | dd	ks2J | d
dks;J | ddksDJ | t|| d d S )Nerrorr   oauth_nonceoauth_timestampoauth_signatureoauth_consumer_keytest_twitter_consumer_keyoauth_signature_method	HMAC-SHA1oauth_version1.0rL   r   screen_namer   )r   rr   	argumentsr#   r3   rI   
capitalize)r   r   r   r   r   r+      s   z TwitterServerShowUserHandler.getNre   r   r   r   r   r      r7   r   c                   @   r1   )%TwitterServerVerifyCredentialsHandlerc                 C   s   d| j jv sJ d| j jv sJ d| j jv sJ | ddks!J | ddks*J | dd	ks3J | d
dks<J | tddd d S )Nr   r   r   r   r   r   r   r   r   rL   r   r^   Foor   )rr   r   r#   r3   rI   r4   r   r   r   r+     s   z)TwitterServerVerifyCredentialsHandler.getNre   r   r   r   r   r     r7   r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	e
edu ddd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* ZdS )+AuthTestc                 C   s   t dtt| dfdtt| ddfdttddfdtt| d	dfd
tt| d	dfdttd	dfdtt| dfdtt| dfdtt| dfdt	t| dfdt
t| dfdtt| dfdtfdtfdtfdtfdtfdtfdtfdtfg| jdddddS )N/openid/client/loginr   /oauth10/client/loginr   )r   r@   /oauth10/client/request_params)r@   /oauth10a/client/loginz1.0az /oauth10a/client/login_coroutine/oauth10a/client/request_params/oauth2/client/login/facebook/client/login/twitter/client/login/twitter/client/authenticate#/twitter/client/login_gen_coroutinez/twitter/client/show_userr   r9   r;   rj   z/facebook/server/merx   z"/twitter/api/users/show/(.*)\.jsonz-/twitter/api/account/verify_credentials\.jsonr   Ztest_twitter_consumer_secretZtest_facebook_api_keyZtest_facebook_secret)r    Ztwitter_consumer_keyZtwitter_consumer_secretrl   rm   )r   r   rI   r8   rZ   rU   rh   ri   r{   r   r   r   r2   ra   rf   rt   rv   r   r   r   r    r4   r   r   r   get_app  sl   


;zAuthTest.get_appc                 C   4   | j ddd}| |jd | d|jd v  d S )Nr   FZfollow_redirects.  z/openid/server/authenticate?LocationfetchassertEqualrk   
assertTrueheadersr   r   r   r   test_openid_redirectU     zAuthTest.test_openid_redirectc                 C   s0   |  d}|  t|j}| |d d d S )Nz/openid/client/login?openid.mode=blah&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.type.email=http://axschema.org/contact/email&openid.ax.value.email=foo@example.comrR   rQ   r   rethrowr   bodyr   r   r   parsedr   r   r   test_openid_get_userZ  s   
zAuthTest.test_openid_get_userc                 C   R   | j ddd}| |jd | |jd d | d|jd v |jd  d S )	Nr   Fr   r   r   )/oauth1/server/authorize?oauth_token=zxcv(_oauth_request_token="enhjdg==|MTIzNA=="
Set-Cookier   r   rk   r   r   endswithr   r   r   r   test_oauth10_redirecte     
zAuthTest.test_oauth10_redirectc                 C   P   | j dddid}|  t|j}| |d d | |d tdd	d
 d S )Nz&/oauth10/client/login?oauth_token=zxcvCookie&_oauth_request_token=enhjdg==|MTIzNA==r   rR   rQ   rS   rO   rP   rE   r   r   r   r   r   rI   r   r   r   r   test_oauth10_get_usert     
zAuthTest.test_oauth10_get_userc                 C   \   |  d}|  t|j}| |d d | |d d | d|v  | d|v  d S )Nr   r   rD   rL   rO   r   r   r   r   r   r   r   r   r   r   r   r   test_oauth10_request_parameters~     

z(AuthTest.test_oauth10_request_parametersc                 C   r   )	Nr   Fr   r   r   r   r   r   r   r   r   r   r   test_oauth10a_redirect  r   zAuthTest.test_oauth10a_redirectNzmock package not presentc              	   C   s   t jtd1}td|_ttd | jddd}W d    n1 s$w   Y  | 	|j
d W d    d S 1 s;w   Y  d S )Nr+   boomzUncaught exceptionr   Fr   r   )r   patchobjectra   r&   Zside_effectr   r   r   r   rk   )r   r+   r   r   r   r   test_oauth10a_redirect_error  s   
"z%AuthTest.test_oauth10a_redirect_errorc                 C   r   )Nz'/oauth10a/client/login?oauth_token=zxcvr   r   r   rR   rQ   rS   rO   rP   rE   r   r   r   r   r   test_oauth10a_get_user  r   zAuthTest.test_oauth10a_get_userc                 C   r   )Nr   r   rD   rL   rO   r   r   r   r   r   r   r    test_oauth10a_request_parameters  r   z)AuthTest.test_oauth10a_request_parametersc                 C   s$   | j dddid}| |jd d S )NzG/oauth10a/client/login_coroutine?oauth_token=zxcv&fail_in_get_user=truer   r   r   rV   )r   r   rk   r   r   r   r   *test_oauth10a_get_user_coroutine_exception  s
   z3AuthTest.test_oauth10a_get_user_coroutine_exceptionc                 C   r   )Nr   Fr   r   z/oauth2/server/authorize?r   r   r   r   r   r   test_oauth2_redirect  r   zAuthTest.test_oauth2_redirectc                 C   sz   | j ddd}| |jd | d|jd v  | j ddd}| |jd t|j}| |d	 d
 | |d d d S )Nr   Fr   r   z/facebook/server/authorize?r   z /facebook/client/login?code=1234   rS   rD   Zsession_expiresZ3600)r   r   rk   r   r   r   r   )r   r   r)   r   r   r   test_facebook_login  s   
zAuthTest.test_facebook_loginc                 C   sR   | j |dd}| |jd | |jd d | d|jd v |jd  d S )NFr   r   r   r   r   r   r   )r   urlr   r   r   r   base_twitter_redirect  s   
zAuthTest.base_twitter_redirectc                 C   rb   )Nr   r   r4   r   r   r   test_twitter_redirect  rd   zAuthTest.test_twitter_redirectc                 C   rb   )Nr   r   r4   r   r   r   #test_twitter_redirect_gen_coroutine  rd   z,AuthTest.test_twitter_redirect_gen_coroutinec                 C   sZ   | j ddd}| |jd | |jd d|jd  | d|jd v |jd  d S )	Nr   Fr   r   r   z-/twitter/server/authenticate?oauth_token=zxcvr   r   r   r   r   r   r   "test_twitter_authenticate_redirect  s   
z+AuthTest.test_twitter_authenticate_redirectc                 C   sF   | j dddid}|  t|j}| |ddddd	ddd
 d S )Nz&/twitter/client/login?oauth_token=zxcvr   r   r   r   r^   r   )rF   r   rG   r   )rS   r   r   usernamer   r   r   r   r   test_twitter_get_user  s"   
zAuthTest.test_twitter_get_userc                 C   s.   |  d}|  | t|jddd d S )Nz'/twitter/client/show_user?name=somebodyZSomebodyZsomebody)r   r   )r   r   r   r   r   r   r   r   r   test_twitter_show_user  s
   
zAuthTest.test_twitter_show_userc                 C   s*   |  d}| |jd | |jd d S )Nz$/twitter/client/show_user?name=errorr   s   error from twitter request)r   r   rk   r   r   r   r   r   test_twitter_show_user_error  s   
z%AuthTest.test_twitter_show_user_error)r-   r.   r/   r   r   r   r   r   r   r   unittestZskipIfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s,    D
	

	r   c                   @   r   )GoogleLoginHandlerc                 C   s.   || _ |d| _|d| _|d| _d S )N/client/login/google/oauth2/authorize/google/oauth2/token)r   r   _OAUTH_REDIRECT_URIr>   r?   r   r   r   r   r     rA   zGoogleLoginHandler.initializec                 c   s    |  dd }|d ur.| | j|V }| j| jd|d dV }|d |d< | | d S | j| j| jd d ddgdd	d
id d S )Nrk   /google/oauth2/userinforS   r   google_oauthrF   ZprofilerR   promptZselect_account)rn   ro   rp   Zresponse_typerq   )	r#   r$   r   Zoauth2_requestr   r   r3   rM   r%   )r   rk   accessr)   r   r   r   r+     s"   

zGoogleLoginHandler.getNr,   r   r   r   r   r     s    r   c                   @   r1   )GoogleOAuth2AuthorizeHandlerc                 C   s$   d}|  t| dt|d d S )Nfake-authorization-codern   )rk   )redirectr   r#   rI   )r   rk   r   r   r   r+   0  s    z GoogleOAuth2AuthorizeHandler.getNre   r   r   r   r   r   /  r7   r   c                   @   r1   )GoogleOAuth2TokenHandlerc                 C   &   |  ddks	J | ddd d S )Nrk   r   fake-access-tokenznever-expiresru   r#   r'   r4   r   r   r   r5   7  s   zGoogleOAuth2TokenHandler.postNr6   r   r   r   r   r   6  r7   r   c                   @   r1   )GoogleOAuth2UserinfoHandlerc                 C   r   )NrS   r   r   rQ   )r   rR   r   r4   r   r   r   r+   @  s   zGoogleOAuth2UserinfoHandler.getNre   r   r   r   r   r   ?  r7   r   c                   @   rg   )GoogleOAuth2Testc                 C   s2   t dtt| dfdtfdtfdtfgdddd	S )
Nr   r   r   r   r   Zfake_google_client_idZfake_google_client_secretrE   )r   )r   r   rI   r   r   r   r4   r   r   r   r   G  s   	zGoogleOAuth2Test.get_appc                 C   s(   |  d}| ddddt|j d S )Nr   r   rQ   r   )r   rR   rS   )r   ZassertDictEqualr   r   r   r   r   r   test_google_loginW  s   
z"GoogleOAuth2Test.test_google_loginN)r-   r.   r/   r   r   r   r   r   r   r   F  s    r   )4r   Ztornado.authr   r   r   r   r   r   Ztornado.escaper   tornador	   Ztornado.httpclientr
   Ztornado.httputilr   Ztornado.logr   Ztornado.testingr   r   Ztornado.webr   r   r   r   ImportErrorr   r2   r8   rU   rZ   ra   rf   rh   ri   rt   rv   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sR    	  	