U
    luf3[                     @   sT  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k
r   dZY nX 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                   @   s"   e Zd Zdd Zejdd ZdS )OpenIdClientLoginHandlerc                 C   s   | d| _d S )N/openid/server/authenticate)get_urlZ_OPENID_ENDPOINTselftest r   :/tmp/pip-unpacked-wheel-bmg6zs32/tornado/test/auth_test.py
initialize   s    z#OpenIdClientLoginHandler.initializec                 c   sV   |  dd r>| j| jd dV }|d kr0td| | d S |  }|d ksRtd S )Nopenid.modehttp_clientr   user is None)get_argumentget_authenticated_usersettings	Exceptionfinishauthenticate_redirectAssertionError)r   userresr   r   r   get"   s    
zOpenIdClientLoginHandler.getN__name__
__module____qualname__r   r	   	coroutiner)   r   r   r   r   r      s   r   c                   @   s   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-   r2   r   r   r   r   r/   0   s   r/   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   s    z#OAuth1ClientLoginHandler.initializec                 C   s   t dddS NasdfZqwerkeysecretdictr1   r   r   r   _oauth_consumer_token>   s    z.OAuth1ClientLoginHandler._oauth_consumer_tokenc                 c   sV   |  dd r>| j| jd dV }|d kr0t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r0td| tddS )	NZfail_in_get_userzfailing in get_useruiop5678r?   zincorrect access token %rfoo@example.com)email)r    r#   rC   )r   access_tokenr   r   r   _oauth_get_user_futureM   s
    z/OAuth1ClientLoginHandler._oauth_get_user_futureN)	r+   r,   r-   r   rD   r	   r.   r)   rM   r   r   r   r   r4   7   s   
r4   c                   @   s   e Zd ZdZejdd ZdS )!OAuth1ClientLoginCoroutineHandlerzDReplaces OAuth1ClientLoginCoroutineHandler's get() with a coroutine.c              
   c   sf   |  dd rXz|  V  W qb tk
rT } z| d | d|  W 5 d }~X Y qbX n
|  V  d S )NrE     zgot exception: %s)r    r!   r#   
set_statusr0   rF   )r   er   r   r   r)   Y   s    
"z%OAuth1ClientLoginCoroutineHandler.getN)r+   r,   r-   __doc__r	   r.   r)   r   r   r   r   rN   V   s   rN   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )$OAuth1ClientRequestParametersHandlerc                 C   s
   || _ d S N)r8   )r   r<   r   r   r   r   h   s    z/OAuth1ClientRequestParametersHandler.initializec                 C   s   t dddS r=   rB   r1   r   r   r   rD   k   s    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/asdfrH   rI   r?   bar)foo)
parameters)Z_oauth_request_parametersrC   r0   )r   paramsr   r   r   r)   n   s    
z(OAuth1ClientRequestParametersHandler.getN)r+   r,   r-   r   rD   r)   r   r   r   r   rS   g   s   rS   c                   @   s   e Zd Zdd ZdS )OAuth1ServerRequestTokenHandlerc                 C   s   |  d d S )Nz(oauth_token=zxcv&oauth_token_secret=1234r0   r1   r   r   r   r)   x   s    z#OAuth1ServerRequestTokenHandler.getNr+   r,   r-   r)   r   r   r   r   rY   w   s   rY   c                   @   s   e Zd Zdd ZdS )OAuth1ServerAccessTokenHandlerc                 C   s   |  d d S )Nz(oauth_token=uiop&oauth_token_secret=5678rZ   r1   r   r   r   r)   }   s    z"OAuth1ServerAccessTokenHandler.getNr[   r   r   r   r   r\   |   s   r\   c                   @   s   e Zd Zdd Zdd ZdS )OAuth2ClientLoginHandlerc                 C   s   | d| _d S )Nz/oauth2/server/authorize)r   r:   r   r   r   r   r      s    z#OAuth2ClientLoginHandler.initializec                 C   s   |   }|d kstd S rT   )rF   r&   )r   r(   r   r   r   r)      s    zOAuth2ClientLoginHandler.getN)r+   r,   r-   r   r)   r   r   r   r   r]      s   r]   c                   @   s"   e Zd Zdd Zejdd ZdS )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   sh   |  dd rD| j| j | jd | jd |  ddV }| | n | j| j | jd ddid d S )Ncodefacebook_api_keyfacebook_secret)redirect_uri	client_idZclient_secretr`   scopezread_stream,offline_access)rc   rd   extra_params)r    r!   requestfull_urlr"   r0   rF   rG   r   r   r   r)      s    zFacebookClientLoginHandler.getNr*   r   r   r   r   r^      s   r^   c                   @   s   e Zd Zdd ZdS ) FacebookServerAccessTokenHandlerc                 C   s   |  tddd d S )Nr>   i  rL   Z
expires_in)r0   rC   r1   r   r   r   r)      s    z$FacebookServerAccessTokenHandler.getNr[   r   r   r   r   ri      s   ri   c                   @   s   e Zd Zdd ZdS )FacebookServerMeHandlerc                 C   s   |  d d S )Nz{}rZ   r1   r   r   r   r)      s    zFacebookServerMeHandler.getNr[   r   r   r   r   rk      s   rk   c                   @   s   e Zd Zdd Zdd ZdS )TwitterClientHandlerc                 C   s@   | d| _| d| _| d| _| d| _| d| _d S )Nr5   /twitter/server/access_tokenr6   z/twitter/server/authenticatez/twitter/api)r   r9   r;   r:   Z_OAUTH_AUTHENTICATE_URLZ_TWITTER_BASE_URLr   r   r   r   r      s
    zTwitterClientHandler.initializec                 C   s
   | j d S )Nr   )r"   r1   r   r   r   get_auth_http_client   s    z)TwitterClientHandler.get_auth_http_clientN)r+   r,   r-   r   rn   r   r   r   r   rl      s   rl   c                   @   s   e Zd Zejdd ZdS )TwitterClientLoginHandlerc                 c   sB   |  dd r4|  V }|d kr&td| | d S |  V  d S NrE   r   )r    r!   r#   r$   rF   rG   r   r   r   r)      s    

zTwitterClientLoginHandler.getNr+   r,   r-   r	   r.   r)   r   r   r   r   ro      s   ro   c                   @   s   e Zd Zejdd ZdS ) TwitterClientAuthenticateHandlerc                 c   sB   |  dd r4|  V }|d kr&td| | d S |  V  d S rp   )r    r!   r#   r$   r%   rG   r   r   r   r)      s    

z$TwitterClientAuthenticateHandler.getNrq   r   r   r   r   rr      s   rr   c                   @   s   e Zd Zejdd ZdS )%TwitterClientLoginGenCoroutineHandlerc                 c   s0   |  dd r"|  V }| | n
|  V  d S )NrE   )r    r!   r$   rF   rG   r   r   r   r)      s    
z)TwitterClientLoginGenCoroutineHandler.getNrq   r   r   r   r   rs      s   rs   c                   @   s   e Zd Zejdd ZdS )TwitterClientShowUserHandlerc                 c   s^   z&| j d| d tddddV }W n( tk
rN   | d | d Y nX | | d S )	Nz/users/show/%snamehjklvbnmr?   rL     zerror from twitter request)Ztwitter_requestr    rC   r
   rP   r$   r   responser   r   r   r)      s    

z TwitterClientShowUserHandler.getNrq   r   r   r   r   rt      s   rt   c                   @   s   e Zd Zdd ZdS )TwitterServerAccessTokenHandlerc                 C   s   |  d d S )Nz8oauth_token=hjkl&oauth_token_secret=vbnm&screen_name=foorZ   r1   r   r   r   r)      s    z#TwitterServerAccessTokenHandler.getNr[   r   r   r   r   r|      s   r|   c                   @   s   e Zd Zdd ZdS )TwitterServerShowUserHandlerc                 C   s   |dkrt dd| jjks td| jjks0td| jjks@t| ddksRt| dd	ksdt| d
dksvt| ddkst| t|| d d S )Nerrorry   oauth_nonceoauth_timestampoauth_signatureoauth_consumer_keytest_twitter_consumer_keyoauth_signature_method	HMAC-SHA1oauth_version1.0rE   rv   screen_nameru   )r   rg   	argumentsr&   r    r0   rC   
capitalize)r   r   r   r   r   r)      s    z TwitterServerShowUserHandler.getNr[   r   r   r   r   r}      s   r}   c                   @   s   e Zd Zdd ZdS )%TwitterServerVerifyCredentialsHandlerc                 C   s   d| j jkstd| j jks td| j jks0t| ddksBt| ddksTt| dd	ksft| d
dksxt| tddd d S )Nr   r   r   r   r   r   r   r   r   rE   rv   rV   Foor   )rg   r   r&   r    r0   rC   r1   r   r   r   r)     s    z)TwitterServerVerifyCredentialsHandler.getNr[   r   r   r   r   r     s   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k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   r5   r7   r_   z/facebook/server/merm   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_secretra   rb   )r   r   rC   r4   rS   rN   r]   r^   ro   rr   rs   rt   r/   rY   r\   ri   rk   r|   r}   r   r   r1   r   r   r   get_app  sl    


;zAuthTest.get_appc                 C   s4   | j ddd}| |jd | d|jd k d S )Nr   FZfollow_redirects.  z/openid/server/authenticate?LocationfetchassertEqualr`   
assertTrueheadersrz   r   r   r   test_openid_redirectU  s    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.comrK   rJ   r   rethrowr   bodyr   r   r{   parsedr   r   r   test_openid_get_userZ  s    
zAuthTest.test_openid_get_userc                 C   sR   | j ddd}| |jd | |jd d | d|jd k|jd  d S )	Nr   Fr   r   r   )/oauth1/server/authorize?oauth_token=zxcv(_oauth_request_token="enhjdg==|MTIzNA=="
Set-Cookier   r   r`   r   r   endswithrz   r   r   r   test_oauth10_redirecte  s    
zAuthTest.test_oauth10_redirectc                 C   sP   | 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   rK   rJ   rL   rH   rI   r?   r   r   r   r   r   rC   r   r   r   r   test_oauth10_get_usert  s    
zAuthTest.test_oauth10_get_userc                 C   s\   |  d}|  t|j}| |d d | |d d | d|k | d|k d S )Nr   r   r>   rE   rH   r   r   r   r   r   r   r   r   r   r   r   r   test_oauth10_request_parameters~  s    

z(AuthTest.test_oauth10_request_parametersc                 C   sR   | j ddd}| |jd | |jd d | d|jd k|jd  d S )	Nr   Fr   r   r   r   r   r   r   rz   r   r   r   test_oauth10a_redirect  s    
zAuthTest.test_oauth10a_redirectNzmock package not presentc              
   C   sZ   t jtdB}td|_ttd | jddd}W 5 Q R X | 	|j
d W 5 Q R X d S )Nr)   ZboomzUncaught exceptionr   Fr   ry   )r   patchobjectrY   r#   Zside_effectr   r   r   r   r`   )r   r)   r{   r   r   r   test_oauth10a_redirect_error  s
    
z%AuthTest.test_oauth10a_redirect_errorc                 C   sP   | j dddid}|  t|j}| |d d | |d tdd	d
 d S )Nz'/oauth10a/client/login?oauth_token=zxcvr   r   r   rK   rJ   rL   rH   rI   r?   r   r   r   r   r   test_oauth10a_get_user  s    
zAuthTest.test_oauth10a_get_userc                 C   s\   |  d}|  t|j}| |d d | |d d | d|k | d|k d S )Nr   r   r>   rE   rH   r   r   r   r   r   r   r    test_oauth10a_request_parameters  s    

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   rO   )r   r   r`   rz   r   r   r   *test_oauth10a_get_user_coroutine_exception  s
    z3AuthTest.test_oauth10a_get_user_coroutine_exceptionc                 C   s4   | j ddd}| |jd | d|jd k d S )Nr   Fr   r   z/oauth2/server/authorize?r   r   rz   r   r   r   test_oauth2_redirect  s    zAuthTest.test_oauth2_redirectc                 C   sz   | j ddd}| |jd | d|jd k | 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   rL   r>   Zsession_expiresZ3600)r   r   r`   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 k|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   s   |  d d S )Nr   r   r1   r   r   r   test_twitter_redirect  s    zAuthTest.test_twitter_redirectc                 C   s   |  d d S )Nr   r   r1   r   r   r   #test_twitter_redirect_gen_coroutine  s    z,AuthTest.test_twitter_redirect_gen_coroutinec                 C   sZ   | j ddd}| |jd | |jd d|jd  | d|jd k|jd  d S )	Nr   Fr   r   r   z-/twitter/server/authenticate?oauth_token=zxcvr   r   r   rz   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   rv   rV   rw   )r@   r   rA   r   )rL   ru   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)ru   r   )r   r   r   r   r   rz   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=errorry   s   error from twitter request)r   r   r`   r   rz   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                   @   s"   e Zd Zdd Zejdd ZdS )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     s    zGoogleLoginHandler.initializec                 c   s   |  dd }|d k	rX| | j|V }| j| jd|d dV }|d |d< | | n(| j| j| jd d ddgdd	d
id d S )Nr`   /google/oauth2/userinforL   rx   google_oauthr@   ZprofilerK   promptZselect_account)rc   rd   re   Zresponse_typerf   )	r    r!   r   Zoauth2_requestr   r   r0   rF   r"   )r   r`   accessr'   r   r   r   r)     s     
zGoogleLoginHandler.getNr*   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )GoogleOAuth2AuthorizeHandlerc                 C   s$   d}|  t| dt|d d S )Nfake-authorization-coderc   )r`   )redirectr   r    rC   )r   r`   r   r   r   r)   0  s    z GoogleOAuth2AuthorizeHandler.getNr[   r   r   r   r   r   /  s   r   c                   @   s   e Zd Zdd ZdS )GoogleOAuth2TokenHandlerc                 C   s&   |  ddkst| ddd d S )Nr`   r   fake-access-tokenznever-expiresrj   r    r&   r$   r1   r   r   r   r2   7  s    zGoogleOAuth2TokenHandler.postNr3   r   r   r   r   r   6  s   r   c                   @   s   e Zd Zdd ZdS )GoogleOAuth2UserinfoHandlerc                 C   s&   |  ddkst| ddd d S )NrL   r   r   rJ   )ru   rK   r   r1   r   r   r   r)   @  s    zGoogleOAuth2UserinfoHandler.getNr[   r   r   r   r   r   ?  s   r   c                   @   s   e Zd Zdd Zdd ZdS )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_secretr?   )r   )r   r   rC   r   r   r   r1   r   r   r   r   G  s    	zGoogleOAuth2Test.get_appc                 C   s(   |  d}| ddddt|j d S )Nr   r   rJ   r   )ru   rK   rL   )r   ZassertDictEqualr   r   rz   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   Ztornador	   Ztornado.httpclientr
   Ztornado.httputilr   Ztornado.logr   Ztornado.testingr   r   Ztornado.webr   r   r   r   ImportErrorr   r/   r4   rN   rS   rY   r\   r]   r^   ri   rk   rl   ro   rr   rs   rt   r|   r}   r   r   r   r   r   r   r   r   r   r   r   <module>   sN    
	  	