o
    h3[                     @   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_url_OPENID_ENDPOINTselftest r   J/var/www/vscode/kcb/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    check_authenticationzincorrect openid.mode %rzis_valid:true)r$   r'   writer   r   r   r   post1   s   z$OpenIdServerAuthenticateHandler.postNr.   r/   r0   r7   r   r   r   r   r3   0       r3   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asdfqwerkeysecretdictr6   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 )	Nfail_in_get_userzfailing in get_useruiop5678rH   zincorrect access token %rfoo@example.com)email)r$   r'   rL   )r   access_tokenr   r   r   _oauth_get_user_futureM   s
   
z/OAuth1ClientLoginHandler._oauth_get_user_futureN)	r.   r/   r0   r   rM   r	   r1   r,   rX   r   r   r   r   r:   7   s    
r:   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 )NrO     zgot exception: %s)r$   r%   r'   
set_statusr5   rP   )r   er   r   r   r,   Y   s   
z%OAuth1ClientLoginCoroutineHandler.getN)r.   r/   r0   __doc__r	   r1   r,   r   r   r   r   rY   V   s    rY   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   rB   r   r   r   r   h      
z/OAuth1ClientRequestParametersHandler.initializec                 C   rD   rE   rK   r6   r   r   r   rM   k   rN   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/asdfrS   rT   rH   bar)foo)
parameters)_oauth_request_parametersrL   r5   )r   paramsr   r   r   r,   n   s   
z(OAuth1ClientRequestParametersHandler.getN)r.   r/   r0   r   rM   r,   r   r   r   r   r^   g   s    r^   c                   @   r2   )OAuth1ServerRequestTokenHandlerc                 C      |  d d S )Nz(oauth_token=zxcv&oauth_token_secret=1234r5   r6   r   r   r   r,   x      z#OAuth1ServerRequestTokenHandler.getNr.   r/   r0   r,   r   r   r   r   rf   w   r9   rf   c                   @   r2   )OAuth1ServerAccessTokenHandlerc                 C   rg   )Nz(oauth_token=uiop&oauth_token_secret=5678rh   r6   r   r   r   r,   }   ri   z"OAuth1ServerAccessTokenHandler.getNrj   r   r   r   r   rk   |   r9   rk   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_   )rP   )r   r+   r   r   r   r,      s   zOAuth2ClientLoginHandler.getN)r.   r/   r0   r   r,   r   r   r   r   rm      s    rm   c                   @   r   )FacebookClientLoginHandlerc                 C   s(   | d| _| d| _| d| _d S )Nz/facebook/server/authorize/facebook/server/access_tokenz/facebook/server)r   r@   rA   _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_idclient_secretrq   scopezread_stream,offline_access)rt   ru   extra_params)r$   r%   requestfull_urlr&   r5   rP   rQ   r   r   r   r,      s   
zFacebookClientLoginHandler.getNr-   r   r   r   r   rn      s    rn   c                   @   r2   ) FacebookServerAccessTokenHandlerc                 C   s   |  tddd d S )NrF   i  rW   
expires_in)r5   rL   r6   r   r   r   r,      s   z$FacebookServerAccessTokenHandler.getNrj   r   r   r   r   r{      r9   r{   c                   @   r2   )FacebookServerMeHandlerc                 C   rg   )Nz{}rh   r6   r   r   r   r,      ri   zFacebookServerMeHandler.getNrj   r   r   r   r   r~      r9   r~   c                   @   rl   )TwitterClientHandlerc                 C   s@   | d| _| d| _| d| _| d| _| d| _d S )Nr;   /twitter/server/access_tokenr<   z/twitter/server/authenticatez/twitter/api)r   r?   rA   r@   _OAUTH_AUTHENTICATE_URL_TWITTER_BASE_URLr   r   r   r   r      s
   zTwitterClientHandler.initializec                 C   s
   | j d S )Nr!   )r&   r6   r   r   r   get_auth_http_client   r`   z)TwitterClientHandler.get_auth_http_clientN)r.   r/   r0   r   r   r   r   r   r   r      s    r   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 NrO   r#   )r$   r%   r'   r(   rP   rQ   r   r   r   r,         

zTwitterClientLoginHandler.getNr.   r/   r0   r	   r1   r,   r   r   r   r   r          r   c                   @   r   ) TwitterClientAuthenticateHandlerc                 c   r   r   )r$   r%   r'   r(   r)   rQ   r   r   r   r,      r   z$TwitterClientAuthenticateHandler.getNr   r   r   r   r   r      s    r   c                   @   r   )%TwitterClientLoginGenCoroutineHandlerc                 c   s4    |  dd r|  V }| | d S |  V  d S )NrO   )r$   r%   r(   rP   rQ   r   r   r   r,      s
   
z)TwitterClientLoginGenCoroutineHandler.getNr   r   r   r   r   r      r   r   c                   @   r   )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vbnmrH   rW     zerror from twitter request)twitter_requestr$   rL   r
   r[   r(   r   responser   r   r   r,      s   

z TwitterClientShowUserHandler.getNr   r   r   r   r   r      r   r   c                   @   r2   )TwitterServerAccessTokenHandlerc                 C   rg   )Nz8oauth_token=hjkl&oauth_token_secret=vbnm&screen_name=foorh   r6   r   r   r   r,      ri   z#TwitterServerAccessTokenHandler.getNrj   r   r   r   r   r      r9   r   c                   @   r2   )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.0rO   r   screen_namer   )r   ry   	argumentsr$   r5   rL   
capitalize)r   r   r   r   r   r,      s   z TwitterServerShowUserHandler.getNrj   r   r   r   r   r      r9   r   c                   @   r2   )%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   rO   r   rb   Foor   )ry   r   r$   r5   rL   r6   r   r   r   r,     s   z)TwitterServerVerifyCredentialsHandler.getNrj   r   r   r   r   r     r9   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   rB   /oauth10/client/request_params)rB   /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   r;   r=   ro   z/facebook/server/mer   z"/twitter/api/users/show/(.*)\.jsonz-/twitter/api/account/verify_credentials\.jsonr   test_twitter_consumer_secrettest_facebook_api_keytest_facebook_secret)r!   twitter_consumer_keytwitter_consumer_secretrr   rs   )r   r   rL   r:   r^   rY   rm   rn   r   r   r   r   r3   rf   rk   r{   r~   r   r   r   r!   r6   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follow_redirects.  z/openid/server/authenticate?LocationfetchassertEqualrq   
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.comrV   rU   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   rq   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   rV   rU   rW   rS   rT   rH   r   r   r   r   r   rL   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   rF   rO   rS   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objectrf   r'   side_effectr   r   r   r   rq   )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   rV   rU   rW   rS   rT   rH   r   r   r   r   r   test_oauth10a_get_user  r   zAuthTest.test_oauth10a_get_userc                 C   r   )Nr   r   rF   rO   rS   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   rZ   )r   r   rq   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   rW   rF   session_expires3600)r   r   rq   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   rg   )Nr   r   r6   r   r   r   test_twitter_redirect  ri   zAuthTest.test_twitter_redirectc                 C   rg   )Nr   r   r6   r   r   r   #test_twitter_redirect_gen_coroutine  ri   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   rb   r   )rI   r   rJ   r   )rW   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=somebodySomebody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   rq   r   r   r   r   r   test_twitter_show_user_error  s   
z%AuthTest.test_twitter_show_user_error)r.   r/   r0   r   r   r   r   r   r   r   unittest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@   rA   r   r   r   r   r     rC   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 )Nrq   /google/oauth2/userinforW   r   google_oauthrI   profilerV   promptselect_account)rt   ru   rw   response_typerx   )	r$   r%   r   oauth2_requestr   r   r5   rP   r&   )r   rq   accessr*   r   r   r   r,     s"   

zGoogleLoginHandler.getNr-   r   r   r   r   r     s    r   c                   @   r2   )GoogleOAuth2AuthorizeHandlerc                 C   s$   d}|  t| dt|d d S )Nfake-authorization-codert   )rq   )redirectr   r$   rL   )r   rq   r   r   r   r,   0  s    z GoogleOAuth2AuthorizeHandler.getNrj   r   r   r   r   r  /  r9   r  c                   @   r2   )GoogleOAuth2TokenHandlerc                 C   &   |  ddks	J | ddd d S )Nrq   r	  fake-access-tokenznever-expiresr|   r$   r(   r6   r   r   r   r7   7  s   zGoogleOAuth2TokenHandler.postNr8   r   r   r   r   r  6  r9   r  c                   @   r2   )GoogleOAuth2UserinfoHandlerc                 C   r  )NrW   r  r   rU   )r   rV   r  r6   r   r   r   r,   @  s   zGoogleOAuth2UserinfoHandler.getNrj   r   r   r   r   r  ?  r9   r  c                   @   rl   )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   fake_google_client_idfake_google_client_secretrH   )r  )r   r   rL   r  r  r  r6   r   r   r   r   G  s   	zGoogleOAuth2Test.get_appc                 C   s(   |  d}| ddddt|j d S )Nr   r   rU   r  )r   rV   rW   )r   assertDictEqualr   r   r   r   r   r   test_google_loginW  s   
z"GoogleOAuth2Test.test_google_loginN)r.   r/   r0   r   r  r   r   r   r   r  F  s    r  )4r   tornado.authr   r   r   r   r   r   tornado.escaper   tornador	   tornado.httpclientr
   tornado.httputilr   tornado.logr   tornado.testingr   r   tornado.webr   r   r   r   ImportErrorr   r3   r:   rY   r^   rf   rk   rm   rn   r{   r~   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r   r   <module>   sR    	  	