
    Mh[                        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 	 d d
l mZ n# e$ r dZY nw xY w G d dee          Z G d de          Z G d dee          Z G d de          Z G d dee          Z G d de          Z  G d de          Z! G d dee          Z" G d dee          Z# G d de          Z$ G d d e          Z% G d! d"ee          Z& G d# d$e&          Z' G d% d&e&          Z( G d' d(e&          Z) G d) d*e&          Z* G d+ d,e          Z+ G d- d.e          Z, G d/ d0e          Z- G d1 d2e          Z. G d3 d4ee          Z/ G d5 d6e          Z0 G d7 d8e          Z1 G d9 d:e          Z2 G 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                   4    e Zd Zd Zej        d             ZdS )OpenIdClientLoginHandlerc                 :    |                     d          | _        d S )N/openid/server/authenticate)get_url_OPENID_ENDPOINTselftests     V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/tornado/test/auth_test.py
initializez#OpenIdClientLoginHandler.initialize   s     $-J K K    c              #      K   |                      dd           rK|                     | j        d                   V }|t          d          |                     |           d 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ress      r   getzOpenIdClientLoginHandler.get"   s      ]D11 	44 M-8 5    D |///KKF((**{{{{{r   N__name__
__module____qualname__r   r
   	coroutiner-    r   r   r   r      sC        L L L 	]
 
 ]
 
 
r   r   c                       e Zd Zd ZdS )OpenIdServerAuthenticateHandlerc                     |                      d          dk    rt          d          |                     d           d S )Nr!   check_authenticationzincorrect openid.mode %rzis_valid:true)r%   r(   writer   s    r   postz$OpenIdServerAuthenticateHandler.post1   sC    ]++/EEE6777

?#####r   Nr/   r0   r1   r:   r3   r   r   r5   r5   0   s#        $ $ $ $ $r   r5   c                   Z    e Zd Zd Zd Zej        d             Zej        d             ZdS )OAuth1ClientLoginHandlerc                     || _         |                    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   versions      r   r   z#OAuth1ClientLoginHandler.initialize8   sO    %(,5S(T(T%$(LL1K$L$L!'+||4Q'R'R$$$r   c                 $    t          dd          S Nasdfqwerkeysecretdictr9   s    r   _oauth_consumer_tokenz.OAuth1ClientLoginHandler._oauth_consumer_token>       v....r   c              #     K   |                      dd           rK|                     | j        d                   V }|t          d          |                     |           d S |                     | j        d                   V  d S )Noauth_tokenr"   r#   r$   )r%   r&   r'   r(   r)   authorize_redirectr   r+   s     r   r-   zOAuth1ClientLoginHandler.getA   s      ]D11 	44 M-8 5    D |///KKF%%$-2N%OOOOOOOr   c                     |                      dd           rt          d          |t          dd          k    rt          d|z            t          d          S )	Nfail_in_get_userzfailing in get_useruiop5678rK   zincorrect access token %rfoo@example.com)email)r%   r(   rO   )r   access_tokens     r   _oauth_get_user_futurez/OAuth1ClientLoginHandler._oauth_get_user_futureM   sh    /66 	312224F6:::::7,FGGG+,,,,r   N)	r/   r0   r1   r   rP   r
   r2   r-   r]   r3   r   r   r=   r=   7   sr        S S S/ / / 	]	P 	P ]	P 	]- - ]- - -r   r=   c                   2    e Zd ZdZej        d             ZdS )!OAuth1ClientLoginCoroutineHandlerzDReplaces OAuth1ClientLoginCoroutineHandler's get() with a coroutine.c              #     K   |                      dd           r^	 |                                 V  d S # t          $ r8}|                     d           |                     d|z             Y d }~d S d }~ww xY w|                                 V  d S )NrS     zgot exception: %s)r%   r&   r(   
set_statusr8   rT   )r   es     r   r-   z%OAuth1ClientLoginCoroutineHandler.getY   s      ]D11 		,4113333333 4 4 4$$$

.23333333334 ))+++++++s   2 
A4-A//A4N)r/   r0   r1   __doc__r
   r2   r-   r3   r   r   r_   r_   V   s5        NN]
, 
, ]
, 
, 
,r   r_   c                        e Zd Zd Zd Zd ZdS )$OAuth1ClientRequestParametersHandlerc                     || _         d S N)rB   )r   rF   s     r   r   z/OAuth1ClientRequestParametersHandler.initializeh   s    %r   c                 $    t          dd          S rH   rN   r9   s    r   rP   z:OAuth1ClientRequestParametersHandler._oauth_consumer_tokenk   rQ   r   c                     |                      dt          dd          t          d                    }|                     |           d S )Nzhttp://www.example.com/api/asdfrX   rY   rK   bar)foo)
parameters)_oauth_request_parametersrO   r8   )r   paramss     r   r-   z(OAuth1ClientRequestParametersHandler.getn   sT    //-VF+++ 0 
 

 	

6r   N)r/   r0   r1   r   rP   r-   r3   r   r   rf   rf   g   sA        & & &/ / /    r   rf   c                       e Zd Zd ZdS )OAuth1ServerRequestTokenHandlerc                 0    |                      d           d S )Nz(oauth_token=zxcv&oauth_token_secret=1234r8   r9   s    r   r-   z#OAuth1ServerRequestTokenHandler.getx       

=>>>>>r   Nr/   r0   r1   r-   r3   r   r   rq   rq   w   #        ? ? ? ? ?r   rq   c                       e Zd Zd ZdS )OAuth1ServerAccessTokenHandlerc                 0    |                      d           d S )Nz(oauth_token=uiop&oauth_token_secret=5678rs   r9   s    r   r-   z"OAuth1ServerAccessTokenHandler.get}   rt   r   Nru   r3   r   r   rx   rx   |   rv   r   rx   c                       e Zd Zd Zd ZdS )OAuth2ClientLoginHandlerc                 :    |                     d          | _        d S )Nz/oauth2/server/authorize)r   rD   r   s     r   r   z#OAuth2ClientLoginHandler.initialize   s    $(LL1K$L$L!!!r   c                 6    |                                  }|J d S rh   )rT   )r   r,   s     r   r-   zOAuth2ClientLoginHandler.get   s     %%''{{{{{r   N)r/   r0   r1   r   r-   r3   r   r   r{   r{      s5        M M M    r   r{   c                   4    e Zd Zd Zej        d             ZdS )FacebookClientLoginHandlerc                     |                     d          | _        |                     d          | _        |                     d          | _        d S )Nz/facebook/server/authorize/facebook/server/access_tokenz/facebook/server)r   rD   rE   _FACEBOOK_BASE_URLr   s     r   r   z%FacebookClientLoginHandler.initialize   sG    $(LL1M$N$N!'+||4S'T'T$"&,,/A"B"Br   c              #     K   |                      dd           rr|                     | j                                        | j        d         | j        d         |                      d                    V }|                     |           d S |                     | j                                        | j        d         ddi           d S )Ncodefacebook_api_keyfacebook_secret)redirect_uri	client_idclient_secretr   scopezread_stream,offline_access)r   r   extra_params)r%   r&   requestfull_urlr'   r8   rT   rU   s     r   r-   zFacebookClientLoginHandler.get   s      VT** 	44!\2244-(:;"m,=>&&v..	 5    D JJt##!\2244-(:;%'CD $     r   Nr.   r3   r   r   r   r      sC        C C C
 	]  ]  r   r   c                       e Zd Zd ZdS ) FacebookServerAccessTokenHandlerc                 N    |                      t          dd                     d S )NrI   i  r\   
expires_in)r8   rO   r9   s    r   r-   z$FacebookServerAccessTokenHandler.get   s'    

4V===>>>>>r   Nru   r3   r   r   r   r      rv   r   r   c                       e Zd Zd ZdS )FacebookServerMeHandlerc                 0    |                      d           d S )Nz{}rs   r9   s    r   r-   zFacebookServerMeHandler.get   s    

4r   Nru   r3   r   r   r   r      s#            r   r   c                       e Zd Zd Zd ZdS )TwitterClientHandlerc                 
   |                     d          | _        |                     d          | _        |                     d          | _        |                     d          | _        |                     d          | _        d S )Nr?   /twitter/server/access_tokenr@   z/twitter/server/authenticatez/twitter/api)r   rC   rE   rD   _OAUTH_AUTHENTICATE_URL_TWITTER_BASE_URLr   s     r   r   zTwitterClientHandler.initialize   sp    (,5S(T(T%'+||4R'S'S$$(LL1K$L$L!'+||4R'S'S$!%n!=!=r   c                     | j         d         S )Nr"   )r'   r9   s    r   get_auth_http_clientz)TwitterClientHandler.get_auth_http_client   s    }]++r   N)r/   r0   r1   r   r   r3   r   r   r   r      s2        > > >, , , , ,r   r   c                   .    e Zd Zej        d             ZdS )TwitterClientLoginHandlerc              #      K   |                      dd           r>|                                 V }|t          d          |                     |           d S |                                 V  d S NrS   r$   )r%   r&   r(   r)   rT   rU   s     r   r-   zTwitterClientLoginHandler.get   s}      ]D11 	446666D|///KKF%%'''''''r   Nr/   r0   r1   r
   r2   r-   r3   r   r   r   r      s/        ]( ( ]( ( (r   r   c                   .    e Zd Zej        d             ZdS ) TwitterClientAuthenticateHandlerc              #      K   |                      dd           r>|                                 V }|t          d          |                     |           d S |                                 V  d S r   )r%   r&   r(   r)   r*   rU   s     r   r-   z$TwitterClientAuthenticateHandler.get   s}      ]D11 	446666D|///KKF((*******r   Nr   r3   r   r   r   r      s1         	]+ + ]+ + +r   r   c                   .    e Zd Zej        d             ZdS )%TwitterClientLoginGenCoroutineHandlerc              #      K   |                      dd           r-|                                 V }|                     |           d S |                                 V  d S )NrS   )r%   r&   r)   rT   rU   s     r   r-   z)TwitterClientLoginGenCoroutineHandler.get   sm      ]D11 	,446666DKK ))+++++++r   Nr   r3   r   r   r   r      s/        ], , ], , ,r   r   c                   .    e Zd Zej        d             ZdS )TwitterClientShowUserHandlerc              #   (  K   	 |                      d|                     d          z  t          dd                    V }|                     |           d S # t          $ r. |                     d           |                     d           Y d S w xY w)	Nz/users/show/%snamehjklvbnmrK   r\     zerror from twitter request)twitter_requestr%   rO   r)   r   rb   r   responses     r   r-   z TwitterClientShowUserHandler.get   s      	"!11 4#4#4V#<#<<!fV<<< 2    H KK!!!!!  	6 	6 	6 OOC   KK4555555		6s   >A 4BBNr   r3   r   r   r   r      s/        ]" " ]" " "r   r   c                       e Zd Zd ZdS )TwitterServerAccessTokenHandlerc                 0    |                      d           d S )Nz8oauth_token=hjkl&oauth_token_secret=vbnm&screen_name=foors   r9   s    r   r-   z#TwitterServerAccessTokenHandler.get   s    

MNNNNNr   Nru   r3   r   r   r   r      s(        O O O O Or   r   c                       e Zd Zd ZdS )TwitterServerShowUserHandlerc                    |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    sJ |                     d
          dk    sJ |                     d          dk    sJ |                     t          ||                                                     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.0rS   r   screen_namer   )r   r   	argumentsr%   r8   rO   
capitalize)r   r   s     r   r-   z TwitterServerShowUserHandler.get   s   '!!C..  66666 DL$::::: DL$:::::  !566:UUUUU  !9::kIIII  11U::::  //69999

4Kk6L6L6N6NOOOPPPPPr   Nru   r3   r   r   r   r      s(        
Q 
Q 
Q 
Q 
Qr   r   c                       e Zd Zd ZdS )%TwitterServerVerifyCredentialsHandlerc                    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    sJ |                     d
          dk    sJ |                     t	          dd                     d S )Nr   r   r   r   r   r   r   r   r   rS   r   rl   Foor   )r   r   r%   r8   rO   r9   s    r   r-   z)TwitterServerVerifyCredentialsHandler.get  s     66666 DL$::::: DL$:::::  !566:UUUUU  !9::kIIII  11U::::  //69999

4E66677777r   Nru   r3   r   r   r   r     s#        8 8 8 8 8r   r   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	 e
j        edu d	          d
             Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )AuthTestc                    t          dt          t          |           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          |           fdt          t          |           fdt          t          |           fdt          t          |           fdt          t          |           fdt          t          |           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          S )N/openid/client/loginr   /oauth10/client/loginr   )r   rF   /oauth10/client/request_params)rF   /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?   rA   r   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_secretr   r   )r   r   rO   r=   rf   r_   r{   r   r   r   r   r   r5   rq   rx   r   r   r   r   r   r"   r9   s    r   get_appzAuthTest.get_app  s    ()A4T???S+,dE222 58''' -,dF333 75dF333 68(((
 ()A4T???S)+EtQUW(*CTt___U24dOOO :9dOOO 00dOOO /0OP/1PQ.0NO02RS&(?@/1PQ68TUD9m:v (!<$B42AA
 A
 A
 A	
r   c                     |                      dd          }|                     |j        d           |                     d|j        d                    d S )Nr   Ffollow_redirects.  z/openid/server/authenticate?LocationfetchassertEqualr   assertInheadersr   s     r   test_openid_redirectzAuthTest.test_openid_redirectU  sS    ::4u:MM,,,4h6Fz6RSSSSSr   c                     |                      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.comr[   rZ   r   rethrowr	   bodyr   r   r   parseds      r   test_openid_get_userzAuthTest.test_openid_get_userZ  s^    ::5
 
 	X]++*;<<<<<r   c                 *   |                      dd          }|                     |j        d           |                     |j        d                             d                     |                     d|j        d         |j        d                    d S )	Nr   Fr   r   r   )/oauth1/server/authorize?oauth_token=zxcv(_oauth_request_token="enhjdg==|MTIzNA=="
Set-Cookier   r   r   
assertTruer   endswithr   r   s     r   test_oauth10_redirectzAuthTest.test_oauth10_redirecte  s    ::5:NN,,,Z(11; 	
 	
 	
 	6\*\*	
 	
 	
 	
 	
r   c                    |                      dddi          }|                                 t          |j                  }|                     |d         d           |                     |d         t          dd	
                     d S )Nz&/oauth10/client/login?oauth_token=zxcvCookie&_oauth_request_token=enhjdg==|MTIzNA==r   r[   rZ   r\   rX   rY   rK   r   r   r	   r   r   rO   r   s      r   test_oauth10_get_userzAuthTest.test_oauth10_get_usert  s    ::4GH  
 
 	X]++*;<<</&1P1P1PQQQQQr   c                 H   |                      d          }|                                 t          |j                  }|                     |d         d           |                     |d         d           |                     d|           |                     d|           d S )Nr   r   rI   rS   rX   r   r   r   r   r	   r   r   r   r   s      r   test_oauth10_request_parametersz(AuthTest.test_oauth10_request_parameters~  s    ::>??X]++ 45v>>>.777mV,,,'00000r   c                 ,   |                      dd          }|                     |j        d           |                     |j        d                             d                     |                     d|j        d         v |j        d                    d S )	Nr   Fr   r   r   r   r   r   )r   r   r   r   r   r   r   s     r   test_oauth10a_redirectzAuthTest.test_oauth10a_redirect  s    ::6:OO,,,Z(11; 	
 	
 	
 	6-.\*	
 	
 	
 	
 	
r   Nzmock package not presentc                 h   t           j                            t          d          5 }t	          d          |_        t          t          d          5  |                     dd          }d d d            n# 1 swxY w Y   | 	                    |j
        d           d d d            d S # 1 swxY w Y   d S )Nr-   boomzUncaught exceptionr   Fr   r   )r   patchobjectrq   r(   side_effectr   r   r   r   r   )r   r-   r   s      r   test_oauth10a_redirect_errorz%AuthTest.test_oauth10a_redirect_error  s1   Z>FF 	1#'//CO7$899 X X::&>QV:WWX X X X X X X X X X X X X X XX]C000		1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s5   *B'A4(B'4A8	8B';A8	<B''B+.B+c                    |                      dddi          }|                                 t          |j                  }|                     |d         d           |                     |d         t          dd	
                     d S )Nz'/oauth10a/client/login?oauth_token=zxcvr   r   r   r[   rZ   r\   rX   rY   rK   r   r   s      r   test_oauth10a_get_userzAuthTest.test_oauth10a_get_user  s    ::5GH  
 
 	X]++*;<<</&1P1P1PQQQQQr   c                 H   |                      d          }|                                 t          |j                  }|                     |d         d           |                     |d         d           |                     d|           |                     d|           d S )Nr   r   rI   rS   rX   r   r   r  r   s      r    test_oauth10a_request_parametersz)AuthTest.test_oauth10a_request_parameters  s    ::?@@X]++ 45v>>>.777mV,,,'00000r   c                 n    |                      dddi          }|                     |j        d           d S )NzG/oauth10a/client/login_coroutine?oauth_token=zxcv&fail_in_get_user=truer   r   r   ra   )r   r   r   r   s     r   *test_oauth10a_get_user_coroutine_exceptionz3AuthTest.test_oauth10a_get_user_coroutine_exception  sF    ::UGH  
 
 	,,,,,r   c                     |                      dd          }|                     |j        d           |                     d|j        d                    d S )Nr   Fr   r   z/oauth2/server/authorize?r   r   r   s     r   test_oauth2_redirectzAuthTest.test_oauth2_redirect  sS    ::4u:MM,,,183CJ3OPPPPPr   c                    |                      dd          }|                     |j        d           |                     d|j        d         v            |                      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   r\   rI   session_expires3600)r   r   r   r   r   r	   r   )r   r   r+   s      r   test_facebook_loginzAuthTest.test_facebook_login  s    ::6:OO,,,59I*9UUVVV::.  
 
 	,,,8=))n-v666/0&99999r   c                 *   |                      |d          }|                     |j        d           |                     |j        d                             d                     |                     d|j        d         |j        d                    d S )NFr   r   r   r   r   r   r   )r   urlr   s      r   base_twitter_redirectzAuthTest.base_twitter_redirect  s    ::cE:::,,,Z(11; 	
 	
 	
 	6\*\*	
 	
 	
 	
 	
r   c                 0    |                      d           d S )Nr   r  r9   s    r   test_twitter_redirectzAuthTest.test_twitter_redirect  s    ""#:;;;;;r   c                 0    |                      d           d S )Nr   r  r9   s    r   #test_twitter_redirect_gen_coroutinez,AuthTest.test_twitter_redirect_gen_coroutine  s    ""#HIIIIIr   c                 B   |                      dd          }|                     |j        d           |                     |j        d                             d          |j        d                    |                     d|j        d         |j        d                    d S )	Nr   Fr   r   r   z-/twitter/server/authenticate?oauth_token=zxcvr   r   r   r   s     r   "test_twitter_authenticate_redirectz+AuthTest.test_twitter_authenticate_redirect  s    ::<u:UU,,,Z(11?  Z(		
 	
 	
 	6\*\*	
 	
 	
 	
 	
r   c                     |                      dddi          }|                                 t          |j                  }|                     |ddddd	ddd
           d S )Nz&/twitter/client/login?oauth_token=zxcvr   r   r   r   rl   r   )rL   r   rM   r   )r\   r   r   usernamer   r   s      r   test_twitter_get_userzAuthTest.test_twitter_get_user  s    ::4GH  
 
 	X]++ "#($! !
 $!	 		
 	
 	
 	
 	
r   c                     |                      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   s     r   test_twitter_show_userzAuthTest.test_twitter_show_user  s_    ::GHH&&J(W(W	
 	
 	
 	
 	
r   c                     |                      d          }|                     |j        d           |                     |j        d           d S )Nz$/twitter/client/show_user?name=errorr   s   error from twitter request)r   r   r   r   r   s     r   test_twitter_show_user_errorz%AuthTest.test_twitter_show_user_error  sK    ::DEE,,,(EFFFFFr   )r/   r0   r1   r   r   r   r   r   r  r  unittestskipIfr   r
  r  r  r  r  r  r  r  r  r!  r$  r(  r*  r3   r   r   r   r     sx       B
 B
 B
HT T T
	= 	= 	=
 
 
R R R1 1 1
 
 
 X_TT\#=>>1 1 ?>1R R R1 1 1- - -Q Q Q

: 
: 
:
 
 
 < < <J J J
 
 
 
 
 
*
 
 
G G G G Gr   r   c                   4    e Zd Zd Zej        d             ZdS )GoogleLoginHandlerc                     || _         |                    d          | _        |                    d          | _        |                    d          | _        d S )N/client/login/google/oauth2/authorize/google/oauth2/token)r   r   _OAUTH_REDIRECT_URIrD   rE   r   s     r   r   zGoogleLoginHandler.initialize  sM    	#'<<#@#@ $(LL1K$L$L!'+||4J'K'K$$$r   c              #     K   |                      dd           }|v|                     | j        |          V }|                     | j                            d          |d                   V }|d         |d<   |                     |           d S |                     | j        | j        d         d         ddgdd	d
i           d S )Nr   /google/oauth2/userinfor\   r   google_oauthrL   profiler[   promptselect_account)r   r   r   response_typer   )	r%   r&   r3  oauth2_requestr   r   r8   rT   r'   )r   r   accessr+   s       r   r-   zGoogleLoginHandler.get  s        ..66t7OQUVVVVF,,	!!";<<#N3 -    D
 $*.#9D JJt##!5-7> '*$&(89 $     r   Nr.   r3   r   r   r.  r.    sC        L L L 	]  ]  r   r.  c                       e Zd Zd ZdS )GoogleOAuth2AuthorizeHandlerc                     d}|                      t          |                     d          t          |                               d S )Nfake-authorization-coder   )r   )redirectr   r%   rO   )r   r   s     r   r-   z GoogleOAuth2AuthorizeHandler.get0  s?    (j!2!2>!B!BDdOOOTTUUUUUr   Nru   r3   r   r   r>  r>  /  s(        V V V V Vr   r>  c                       e Zd Zd ZdS )GoogleOAuth2TokenHandlerc                 l    |                      d          dk    sJ |                     ddd           d S )Nr   r@  fake-access-tokenznever-expiresr   r%   r)   r9   s    r   r:   zGoogleOAuth2TokenHandler.post7  sM      ((,EEEEE0PP	
 	
 	
 	
 	
r   Nr;   r3   r   r   rC  rC  6  s#        
 
 
 
 
r   rC  c                       e Zd Zd ZdS )GoogleOAuth2UserinfoHandlerc                 l    |                      d          dk    sJ |                     ddd           d S )Nr\   rE  r   rZ   )r   r[   rF  r9   s    r   r-   zGoogleOAuth2UserinfoHandler.get@  sC      004GGGGGU->??@@@@@r   Nru   r3   r   r   rH  rH  ?  s(        A A A A Ar   rH  c                       e Zd Zd Zd ZdS )GoogleOAuth2Testc                     t          dt          t          |           fdt          fdt          fdt
          fgddd	          S )
Nr0  r   r1  r2  r5  fake_google_client_idfake_google_client_secretrK   )r6  )r   r.  rO   r>  rC  rH  r9   s    r   r   zGoogleOAuth2Test.get_appG  s`     !"4doooF+-IJ')AB*,GH /5 
 
 
 	
r   c                     |                      d          }|                     ddddt          |j                             d S )Nr0  r   rZ   rE  )r   r[   r\   )r   assertDictEqualr	   r   r   s     r   test_google_loginz"GoogleOAuth2Test.test_google_loginW  sW    ::o..* 3 
 &&	
 	
 	
 	
 	
r   N)r/   r0   r1   r   rQ  r3   r   r   rK  rK  F  s2        
 
 
 	
 	
 	
 	
 	
r   rK  )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   r5   r=   r_   rf   rq   rx   r{   r   r   r   r   r   r   r   r   r   r   r   r   r.  r>  rC  rH  rK  r3   r   r   <module>r[     s                   ' & & & & &       . . . . . . ' ' ' ' ' '       8 8 8 8 8 8 8 8 > > > > > > > > > >   DDD    ~{   $$ $ $ $ $n $ $ $- - - - -~z - - ->, , , , ,(@ , , ,"    >:    ? ? ? ? ?n ? ? ?
? ? ? ? ?^ ? ? ?
    ~{       1C   0? ? ? ? ?~ ? ? ?
    n   
	, 	, 	, 	, 	,>< 	, 	, 	,	( 	( 	( 	( 	( 4 	( 	( 	(+ + + + +'; + + +	, 	, 	, 	, 	,,@ 	, 	, 	," " " " "#7 " " "&O O O O On O O O
Q Q Q Q Q> Q Q Q	8 	8 	8 	8 	8N 	8 	8 	8~G ~G ~G ~G ~G  ~G ~G ~GB    ):   <V V V V V> V V V
 
 
 
 
~ 
 
 
A A A A A. A A A
 
 
 
 
( 
 
 
 
 
s   A AA