Ë
    êmxi[  ã                   óê  — 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  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«      Z3y# e$ r dZY �Œ%w xY w)=é    N)ÚOpenIdMixinÚ
OAuthMixinÚOAuth2MixinÚGoogleOAuth2MixinÚFacebookGraphMixinÚTwitterMixin)Újson_decode)Úgen)ÚHTTPClientError)Ú
url_concat)Úapp_log)ÚAsyncHTTPTestCaseÚ	ExpectLog)ÚRequestHandlerÚApplicationÚ	HTTPError)Úmockc                   ó6   — e Zd Zd„ Zej
                  d„ «       Zy)ÚOpenIdClientLoginHandlerc                 ó0   — |j                  d«      | _        y )Nú/openid/server/authenticate)Úget_urlÚ_OPENID_ENDPOINT©ÚselfÚtests     úM/home/htdocs/ttos/venv/lib/python3.12/site-packages/tornado/test/auth_test.pyÚ
initializez#OpenIdClientLoginHandler.initialize   s   € Ø $§¡Ð-JÓ KˆÕó    c              #   óØ   K  — | j                  dd «      r@| j                  | j                  d   ¬«      –—}|€t        d«      ‚| j	                  |«       y | j                  «       }|�J ‚y ­w)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"   su   è ø€ à×Ñ˜]¨DÔ1Ø×4Ñ4Ø ŸM™M¨-Ñ8ð 5ó ñ ˆDð ˆ|Ü Ó/Ð/Ø�K‰K˜ÔØØ×(Ñ(Ó*ˆØˆ{Ð‰{ùs   ‚A(A*N©Ú__name__Ú
__module__Ú__qualname__r   r
   Ú	coroutiner-   © r   r   r   r      s    „ òLð 	‡]�]ñ
ó ñ
r   r   c                   ó   — e Zd Zd„ Zy)ÚOpenIdServerAuthenticateHandlerc                 ód   — | j                  d«      dk7  rt        d«      ‚| j                  d«       y )Nr!   Úcheck_authenticationzincorrect openid.mode %rzis_valid:true)r%   r(   Úwrite©r   s    r   Úpostz$OpenIdServerAuthenticateHandler.post1   s.   € Ø×Ñ˜]Ó+Ð/EÒEÜÐ6Ó7Ð7Ø�
‰
�?Õ#r   N©r/   r0   r1   r:   r3   r   r   r5   r5   0   s   „ ó$r   r5   c                   ó`   — e Zd Zd„ Zd„ Zej                  d„ «       Zej                  d„ «       Zy)ÚOAuth1ClientLoginHandlerc                 ó–   — || _         |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        y )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   s@   € Ø%ˆÔØ(,¯©Ð5SÓ(TˆÔ%Ø$(§L¡LÐ1KÓ$LˆÔ!Ø'+§|¡|Ð4QÓ'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  — | j                  dd «      r@| j                  | j                  d   ¬«      –—}|€t        d«      ‚| j	                  |«       y | j                  | j                  d   ¬«      –— y ­w)NÚoauth_tokenr"   r#   r$   )r%   r&   r'   r(   r)   Úauthorize_redirect©r   r+   s     r   r-   zOAuth1ClientLoginHandler.getA   sz   è ø€ à×Ñ˜]¨DÔ1Ø×4Ñ4Ø ŸM™M¨-Ñ8ð 5ó ñ ˆDð ˆ|Ü Ó/Ð/Ø�K‰K˜ÔØØ×%Ñ%°$·-±-ÀÑ2NÐ%ÓOÓOùs   ‚A5A7c                 ó�   — | j                  dd «      rt        d«      ‚|t        dd¬«      k7  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   sK   € à×ÑÐ/°Ô6ÜÐ1Ó2Ð2Øœ4 F°6Ô:Ò:ÜÐ7¸,ÑFÓGÐGÜÐ+Ô,Ð,r   N)	r/   r0   r1   r   rP   r
   r2   r-   r]   r3   r   r   r=   r=   7   s?   „ òSò/ð 	‡]�]ñ	Pó ð	Pð 	‡]�]ñ-ó ñ-r   r=   c                   ó4   — e Zd ZdZej
                  d„ «       Zy)Ú!OAuth1ClientLoginCoroutineHandlerzDReplaces OAuth1ClientLoginCoroutineHandler's get() with a coroutine.c              #   óò   K  — | j                  dd «      r	 | j                  «       –— y | j                  «       –— y # t        $ r/}| j                  d«       | j	                  d|z  «       Y d }~y d }~ww xY w­w)NrS   é÷  zgot exception: %s)r%   r&   r(   Ú
set_statusr8   rT   )r   Úes     r   r-   z%OAuth1ClientLoginCoroutineHandler.getY   sm   è ø€ à×Ñ˜]¨DÔ1ð4Ø×1Ñ1Ó3Ó3ð
 ×)Ñ)Ó+Ó+øô	 ò 4Ø—‘ Ô$Ø—
‘
Ð.°Ñ2×3Ñ3ûð4üs+   ‚A7–< ¨A7¼	A4Á%A/Á*A7Á/A4Á4A7N)r/   r0   r1   Ú__doc__r
   r2   r-   r3   r   r   r_   r_   V   s   „ ÙNà‡]�]ñ
,ó ñ
,r   r_   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)Ú$OAuth1ClientRequestParametersHandlerc                 ó   — || _         y ©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                 óx   — | j                  dt        dd¬«      t        d¬«      ¬«      }| j                  |«       y )Nzhttp://www.example.com/api/asdfrX   rY   rK   Úbar)Úfoo)Ú
parameters)Ú_oauth_request_parametersrO   r8   )r   Úparamss     r   r-   z(OAuth1ClientRequestParametersHandler.getn   s9   € Ø×/Ñ/Ø-Ü�V FÔ+Ü ”ð 0ó 
ˆð
 	�
‰
�6Õr   N)r/   r0   r1   r   rP   r-   r3   r   r   rf   rf   g   s   „ ò&ò/ór   rf   c                   ó   — e Zd Zd„ Zy)ÚOAuth1ServerRequestTokenHandlerc                 ó&   — | j                  d«       y )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y)ÚOAuth1ServerAccessTokenHandlerc                 ó&   — | j                  d«       y )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y)ÚOAuth2ClientLoginHandlerc                 ó0   — |j                  d«      | _        y )Nz/oauth2/server/authorize)r   rD   r   s     r   r   z#OAuth2ClientLoginHandler.initialize‚   s   € Ø$(§L¡LÐ1KÓ$LˆÕ!r   c                 ó,   — | j                  «       }|�J ‚y rh   )rT   )r   r,   s     r   r-   zOAuth2ClientLoginHandler.get…   s   € Ø×%Ñ%Ó'ˆØˆ{Ð‰{r   N)r/   r0   r1   r   r-   r3   r   r   r{   r{   �   s   „ òMór   r{   c                   ó6   — e Zd Zd„ Zej
                  d„ «       Zy)ÚFacebookClientLoginHandlerc                 óˆ   — |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        y )Nz/facebook/server/authorizeú/facebook/server/access_tokenz/facebook/server)r   rD   rE   Ú_FACEBOOK_BASE_URLr   s     r   r   z%FacebookClientLoginHandler.initialize‹   s8   € Ø$(§L¡LÐ1MÓ$NˆÔ!Ø'+§|¡|Ð4SÓ'TˆÔ$Ø"&§,¡,Ð/AÓ"BˆÕr   c              #   óz  K  — | j                  dd «      rj| j                  | j                  j                  «       | j                  d   | j                  d   | j                  d«      ¬«      –—}| j                  |«       y | j                  | j                  j                  «       | j                  d   ddi¬«       y ­w)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¯   è ø€ à×Ñ˜V TÔ*Ø×4Ñ4Ø!Ÿ\™\×2Ñ2Ó4ØŸ-™-Ð(:Ñ;Ø"Ÿm™mÐ,=Ñ>Ø×&Ñ& vÓ.ð	 5ó ñ ˆDð �J‰J�tÕà×#Ñ#Ø!Ÿ\™\×2Ñ2Ó4ØŸ-™-Ð(:Ñ;Ø%Ð'CÐDð $õ ùs   ‚B9B;Nr.   r3   r   r   r   r   Š   s    „ òCð
 	‡]�]ñó ñr   r   c                   ó   — e Zd Zd„ Zy)Ú FacebookServerAccessTokenHandlerc                 ó<   — | j                  t        dd¬«      «       y )NrI   i  ©r\   Ú
expires_in)r8   rO   r9   s    r   r-   z$FacebookServerAccessTokenHandler.get£   s   € Ø�
‰
”4 V¸Ô=Õ>r   Nru   r3   r   r   r�   r�   ¢   rv   r   r�   c                   ó   — e Zd Zd„ Zy)ÚFacebookServerMeHandlerc                 ó&   — | j                  d«       y )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y)ÚTwitterClientHandlerc                 óà   — |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        y )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­   s[   € Ø(,¯©Ð5SÓ(TˆÔ%Ø'+§|¡|Ð4RÓ'SˆÔ$Ø$(§L¡LÐ1KÓ$LˆÔ!Ø'+§|¡|Ð4RÓ'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—   ¬   s   „ ò>ó,r   r—   c                   ó0   — e Zd Zej                  d„ «       Zy)ÚTwitterClientLoginHandlerc              #   ó¶   K  — | j                  dd «      r1| j                  «       –—}|€t        d«      ‚| j                  |«       y | j	                  «       –— y ­w©NrS   r$   )r%   r&   r(   r)   rT   rU   s     r   r-   zTwitterClientLoginHandler.get¹   sU   è ø€ à×Ñ˜]¨DÔ1Ø×4Ñ4Ó6Ñ6ˆDØˆ|Ü Ó/Ð/Ø�K‰K˜ÔØØ×%Ñ%Ó'Ó'ùó   ‚AAN©r/   r0   r1   r
   r2   r-   r3   r   r   rŸ   rŸ   ¸   s   „ Ø‡]�]ñ(ó ñ(r   rŸ   c                   ó0   — e Zd Zej                  d„ «       Zy)Ú TwitterClientAuthenticateHandlerc              #   ó¶   K  — | j                  dd «      r1| j                  «       –—}|€t        d«      ‚| j                  |«       y | j	                  «       –— y ­wr¡   )r%   r&   r(   r)   r*   rU   s     r   r-   z$TwitterClientAuthenticateHandler.getÇ   sU   è ø€ à×Ñ˜]¨DÔ1Ø×4Ñ4Ó6Ñ6ˆDØˆ|Ü Ó/Ð/Ø�K‰K˜ÔØØ×(Ñ(Ó*Ó*ùr¢   Nr£   r3   r   r   r¥   r¥   Ä   s   „ ð 	‡]�]ñ+ó ñ+r   r¥   c                   ó0   — e Zd Zej                  d„ «       Zy)Ú%TwitterClientLoginGenCoroutineHandlerc              #   óœ   K  — | j                  dd «      r$| j                  «       –—}| j                  |«       y | j                  «       –— y ­w)NrS   )r%   r&   r)   rT   rU   s     r   r-   z)TwitterClientLoginGenCoroutineHandler.getÓ   sD   è ø€ à×Ñ˜]¨DÔ1Ø×4Ñ4Ó6Ñ6ˆDØ�K‰K˜Õð ×)Ñ)Ó+Ó+ùs   ‚A
ANr£   r3   r   r   r¨   r¨   Ò   s   „ Ø‡]�]ñ,ó ñ,r   r¨   c                   ó0   — e Zd Zej                  d„ «       Zy)ÚTwitterClientShowUserHandlerc              #   óö   K  — 	 | j                  d| j                  d«      z  t        dd¬«      ¬«      –—}| j                  |«       y # t        $ r% | j                  d«       | j                  d«       Y y w xY w­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Ñ#4°VÓ#<Ñ<Ü! f°VÔ<ð 2ó ñ ˆHð �K‰K˜Õ!øô ò 	6ð �O‰O˜CÔ Ø�K‰KÐ4Ö5ð		6üs'   ‚A9„2A ¶A9Á+A6Á3A9Á5A6Á6A9Nr£   r3   r   r   r«   r«   Þ   s   „ Ø‡]�]ñ"ó ñ"r   r«   c                   ó   — e Zd Zd„ Zy)ÚTwitterServerAccessTokenHandlerc                 ó&   — | j                  d«       y )Nz8oauth_token=hjkl&oauth_token_secret=vbnm&screen_name=foors   r9   s    r   r-   z#TwitterServerAccessTokenHandler.getò   s   € Ø�
‰
ÐMÕNr   Nru   r3   r   r   r¶   r¶   ñ   s   „ óOr   r¶   c                   ó   — e Zd Zd„ Zy)ÚTwitterServerShowUserHandlerc                 óÄ  — |dk(  rt        d«      ‚d| j                  j                  v sJ ‚d| j                  j                  v sJ ‚d| j                  j                  v sJ ‚| j                  d«      dk(  sJ ‚| j                  d«      d	k(  sJ ‚| j                  d
«      dk(  sJ ‚| j                  d«      dk(  sJ ‚| j	                  t        ||j                  «       ¬«      «       y )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Ø  D§L¡L×$:Ñ$:Ñ:Ð:Ð:Ø  D§L¡L×$:Ñ$:Ñ:Ð:Ð:Ø× Ñ Ð!5Ó6Ð:UÒUÐUÐUØ× Ñ Ð!9Ó:¸kÒIÐIÐIØ× Ñ  Ó1°UÒ:Ð:Ð:Ø× Ñ  Ó/°6Ò9Ð9Ð9Ø�
‰
”4 K°k×6LÑ6LÓ6NÔOÕPr   Nru   r3   r   r   r¹   r¹   ö   s   „ ó
Qr   r¹   c                   ó   — e Zd Zd„ Zy)Ú%TwitterServerVerifyCredentialsHandlerc                 óˆ  — d| j                   j                  v sJ ‚d| j                   j                  v sJ ‚d| j                   j                  v sJ ‚| j                  d«      dk(  sJ ‚| j                  d«      dk(  sJ ‚| j                  d«      d	k(  sJ ‚| j                  d
«      dk(  sJ ‚| j                  t	        dd¬«      «       y )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Ø  D§L¡L×$:Ñ$:Ñ:Ð:Ð:Ø  D§L¡L×$:Ñ$:Ñ:Ð:Ð:Ø× Ñ Ð!5Ó6Ð:UÒUÐUÐUØ× Ñ Ð!9Ó:¸kÒIÐIÐIØ× Ñ  Ó1°UÒ:Ð:Ð:Ø× Ñ  Ó/°6Ò9Ð9Ð9Ø�
‰
”4 E°Ô6Õ7r   Nru   r3   r   r   rÊ   rÊ     s   „ ó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y)Ú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  sd  € Üð (Ô)AÄ4ÈTÄ?ÐSà+Ü,Ü˜d¨EÔ2ðð 5Ü8Ü Ô'ðð -Ü,Ü˜d¨FÔ3ðð 7Ü5Ü˜d¨FÔ3ðð 6Ü8Ü Ô(ðð
 (Ô)AÄ4ÈTÄ?ÐSØ)Ô+EÄtÐQUÄÐWØ(Ô*CÄTÈtÄ_ÐUà2Ü4Ü˜d”Oðð :Ü9Ü˜d”Oðð 0Ü0Ü˜d”Oðð /Ô0OÐPØ/Ô1PÐQØ.Ô0NÐOØ0Ô2RÐSØ&Ô(?Ð@Ø/Ô1PÐQØ6Ô8TÐUàDÜ9ððm:ðv ×(Ñ(Ø!<Ø$BØ4Ø2ôAA
ð A	
r   c                 ó    — | j                  dd¬«      }| j                  |j                  d«       | j                  d|j                  d   «       y )NrÐ   F©Úfollow_redirectsé.  z/openid/server/authenticate?ÚLocation©ÚfetchÚassertEqualr„   ÚassertInÚheadersr³   s     r   Útest_openid_redirectzAuthTest.test_openid_redirectU  sC   € Ø—:‘:Ð4Àu�:ÓMˆØ×Ñ˜Ÿ™¨Ô,Ø�‰Ð4°h×6FÑ6FÀzÑ6RÕSr   c                 óš   — | j                  d«      }|j                  «        t        |j                  «      }| j	                  |d   d«       y )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  sF   € Ø—:‘:ð5ó
ˆð 	×ÑÔÜ˜XŸ]™]Ó+ˆØ×Ñ˜ ™Ð*;Õ<r   c                 ó  — | j                  dd¬«      }| j                  |j                  d«       | j                  |j                  d   j                  d«      «       | j                  d|j                  d   |j                  d   «       y )	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ˆØ×Ñ˜Ÿ™¨Ô,Ø�‰Ø×Ñ˜ZÑ(×1Ñ1Ø;óô	
ð 	�‰Ø6Ø×Ñ˜\Ñ*Ø×Ñ˜\Ñ*õ	
r   c                 óâ   — | j                  dddi¬«      }|j                  «        t        |j                  «      }| j	                  |d   d«       | j	                  |d   t        dd	¬
«      «       y )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  sn   € Ø—:‘:Ø4ØÐGÐHð ó 
ˆð 	×ÑÔÜ˜XŸ]™]Ó+ˆØ×Ñ˜ ™Ð*;Ô<Ø×Ñ˜ Ñ/´¸&ÈÔ1PÕQr   c                 ó  — | j                  d«      }|j                  «        t        |j                  «      }| j	                  |d   d«       | j	                  |d   d«       | j                  d|«       | j                  d|«       y )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~  ss   € Ø—:‘:Ð>Ó?ˆØ×ÑÔÜ˜XŸ]™]Ó+ˆØ×Ñ˜Ð 4Ñ5°vÔ>Ø×Ñ˜ Ñ.°Ô7Ø�‰�m VÔ,Ø�‰Ð'¨Õ0r   c                 ó  — | j                  dd¬«      }| j                  |j                  d«       | j                  |j                  d   j                  d«      «       | j                  d|j                  d   v |j                  d   «       y )	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ˆØ×Ñ˜Ÿ™¨Ô,Ø�‰Ø×Ñ˜ZÑ(×1Ñ1Ø;óô	
ð 	�‰Ø6Ø×Ñ Ñ-ð.à×Ñ˜\Ñ*õ	
r   Nzmock package not presentc                 ó>  — t         j                  j                  t        d«      5 }t	        d«      |_        t        t        d«      5  | j                  dd¬«      }d d d «       | j                  j                  d«       d d d «       y # 1 sw Y   Œ.xY w# 1 sw Y   y xY w)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–  s‹   € ä�Z‰Z×ÑÔ>ÀÓFð 	1È#Ü'¨Ó/ˆCŒOÜœ7Ð$8Ó9ñ XØŸ:™:Ð&>ÐQV˜:ÓW�÷Xà×Ñ˜XŸ]™]¨CÔ0÷		1ð 	1÷Xð Xú÷	1ð 	1ús#   ¥!BÁBÁ$BÂB	ÂBÂBc                 óâ   — | j                  dddi¬«      }|j                  «        t        |j                  «      }| j	                  |d   d«       | j	                  |d   t        dd	¬
«      «       y )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ž  sn   € Ø—:‘:Ø5ØÐGÐHð ó 
ˆð 	×ÑÔÜ˜XŸ]™]Ó+ˆØ×Ñ˜ ™Ð*;Ô<Ø×Ñ˜ Ñ/´¸&ÈÔ1PÕQr   c                 ó  — | j                  d«      }|j                  «        t        |j                  «      }| j	                  |d   d«       | j	                  |d   d«       | j                  d|«       | j                  d|«       y )NrÕ   r¿   rI   rS   rX   r¼   r¾   r  rð   s      r   Ú test_oauth10a_request_parametersz)AuthTest.test_oauth10a_request_parameters¨  ss   € Ø—:‘:Ð?Ó@ˆØ×ÑÔÜ˜XŸ]™]Ó+ˆØ×Ñ˜Ð 4Ñ5°vÔ>Ø×Ñ˜ Ñ.°Ô7Ø�‰�m VÔ,Ø�‰Ð'¨Õ0r   c                 óf   — | j                  dddi¬«      }| j                  |j                  d«       y )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±  s7   € Ø—:‘:ØUØÐGÐHð ó 
ˆð 	×Ñ˜Ÿ™¨Õ,r   c                 ó    — | j                  dd¬«      }| j                  |j                  d«       | j                  d|j                  d   «       y )NrÖ   Frâ   rä   z/oauth2/server/authorize?rå   ræ   r³   s     r   Útest_oauth2_redirectzAuthTest.test_oauth2_redirect¸  sC   € Ø—:‘:Ð4Àu�:ÓMˆØ×Ñ˜Ÿ™¨Ô,Ø�‰Ð1°8×3CÑ3CÀJÑ3OÕPr   c                 ó~  — | j                  dd¬«      }| j                  |j                  d«       | j                  d|j                  d   v «       | j                  dd¬«      }| j                  |j                  d«       t        |j                  «      }| j                  |d	   d
«       | j                  |d   d«       y )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ˆØ×Ñ˜Ÿ™¨Ô,Ø�‰Ð5¸×9IÑ9IÈ*Ñ9UÐUÔVØ—:‘:Ø.Àð ó 
ˆð 	×Ñ˜Ÿ™¨Ô,Ü˜8Ÿ=™=Ó)ˆØ×Ñ˜˜nÑ-¨vÔ6Ø×Ñ˜Ð/Ñ0°&Õ9r   c                 ó  — | j                  |d¬«      }| j                  |j                  d«       | j                  |j                  d   j                  d«      «       | j                  d|j                  d   |j                  d   «       y )NFrâ   rä   rå   rô   rõ   rö   r÷   )r   Úurlr´   s      r   Úbase_twitter_redirectzAuthTest.base_twitter_redirectÉ  s}   € à—:‘:˜c°E�:Ó:ˆØ×Ñ˜Ÿ™¨Ô,Ø�‰Ø×Ñ˜ZÑ(×1Ñ1Ø;óô	
ð 	�‰Ø6Ø×Ñ˜\Ñ*Ø×Ñ˜\Ñ*õ	
r   c                 ó&   — | j                  d«       y )NrØ   ©r  r9   s    r   Útest_twitter_redirectzAuthTest.test_twitter_redirectÙ  s   € Ø×"Ñ"Ð#:Õ;r   c                 ó&   — | j                  d«       y )NrÚ   r  r9   s    r   Ú#test_twitter_redirect_gen_coroutinez,AuthTest.test_twitter_redirect_gen_coroutineÜ  s   € Ø×"Ñ"Ð#HÕIr   c                 ó2  — | j                  dd¬«      }| j                  |j                  d«       | j                  |j                  d   j                  d«      |j                  d   «       | j                  d|j                  d   |j                  d   «       y )	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ˆØ×Ñ˜Ÿ™¨Ô,Ø�‰Ø×Ñ˜ZÑ(×1Ñ1Ø?óð ×Ñ˜ZÑ(ô		
ð 	�‰Ø6Ø×Ñ˜\Ñ*Ø×Ñ˜\Ñ*õ	
r   c                 ó®   — | j                  dddi¬«      }|j                  «        t        |j                  «      }| j	                  |ddddœd	ddd
œ«       y )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ï  sn   € Ø—:‘:Ø4ØÐGÐHð ó 
ˆð 	×ÑÔÜ˜XŸ]™]Ó+ˆØ×ÑØð "Ø#(Ø$ñ!ð
 Ø$Ø!ñ	õ	
r   c                 ó–   — | j                  d«      }|j                  «        | j                  t        |j                  «      dddœ«       y )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ˆØ×ÑÔØ×ÑÜ˜Ÿ™Ó&°ÈJÑ(Wõ	
r   c                 ó–   — | j                  d«      }| j                  |j                  d«       | j                  |j                  d«       y )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  s:   € Ø—:‘:ÐDÓEˆØ×Ñ˜Ÿ™¨Ô,Ø×Ñ˜Ÿ™Ð(EÕ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Î     s�   „ òB
òHTò
	=ò
òRò1ò
ð €X‡_�_�T˜T�\Ð#=Ó>ñ1ó ?ð1òRò1ò-òQò

:ò
ò <òJò
ò 
ò*
óGr   rÎ   c                   ó6   — e Zd Zd„ Zej
                  d„ «       Zy)ÚGoogleLoginHandlerc                 ó–   — || _         |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        y )Nú/client/loginú/google/oauth2/authorizeú/google/oauth2/token)r   r   Ú_OAUTH_REDIRECT_URIrD   rE   r   s     r   r   zGoogleLoginHandler.initialize  s>   € ØˆŒ	Ø#'§<¡<°Ó#@ˆÔ Ø$(§L¡LÐ1KÓ$LˆÔ!Ø'+§|¡|Ð4JÓ'KˆÕ$r   c              #   ón  K  — | j                  dd «      }|�i| j                  | j                  |«      –—}| j                  | j                  j                  d«      |d   ¬«      –—}|d   |d<   | j                  |«       y | j                  | j                  | j                  d   d   ddgdd	d
i¬«       y ­w)Nr„   ú/google/oauth2/userinfor\   r°   Úgoogle_oauthrL   Úprofiler[   ÚpromptÚselect_account)r‡   rˆ   rŠ   Úresponse_typer‹   )	r%   r&   r4  Úoauth2_requestr   r   r8   rT   r'   )r   r„   Úaccessr+   s       r   r-   zGoogleLoginHandler.get  sÍ   è ø€ à× Ñ  ¨Ó.ˆØÐà×6Ñ6°t×7OÑ7OÐQUÓVÑVˆFØ×,Ñ,Ø—	‘	×!Ñ!Ð";Ó<Ø# NÑ3ð -ó ñ ˆDð
 $*¨.Ñ#9ˆD�Ñ Ø�J‰J�tÕà×#Ñ#Ø!×5Ñ5ØŸ-™-¨Ñ7¸Ñ>Ø  'Ð*Ø$Ø&Ð(8Ð9ð $õ ùs   ‚B3B5Nr.   r3   r   r   r/  r/    s    „ òLð 	‡]�]ñó ñr   r/  c                   ó   — e Zd Zd„ Zy)ÚGoogleOAuth2AuthorizeHandlerc                 óp   — d}| j                  t        | j                  d«      t        |¬«      «      «       y )Núfake-authorization-coder‡   )r„   )Úredirectr   r%   rO   )r   r„   s     r   r-   z GoogleOAuth2AuthorizeHandler.get0  s)   € à(ˆØ�‰”j ×!2Ñ!2°>Ó!BÄDÈdÄOÓTÕUr   Nru   r3   r   r   r?  r?  /  s   „ óVr   r?  c                   ó   — e Zd Zd„ Zy)ÚGoogleOAuth2TokenHandlerc                 óX   — | j                  d«      dk(  sJ ‚| j                  dddœ«       y )Nr„   rA  úfake-access-tokenznever-expiresr‘   ©r%   r)   r9   s    r   r:   zGoogleOAuth2TokenHandler.post7  s0   € Ø× Ñ  Ó(Ð,EÒEÐEÐEà�‰Ø0ÀÑPõ	
r   Nr;   r3   r   r   rD  rD  6  s   „ ó
r   rD  c                   ó   — e Zd Zd„ Zy)ÚGoogleOAuth2UserinfoHandlerc                 óX   — | j                  d«      dk(  sJ ‚| j                  dddœ«       y )Nr\   rF  rÌ   rZ   )r­   r[   rG  r9   s    r   r-   zGoogleOAuth2UserinfoHandler.get@  s.   € Ø× Ñ  Ó0Ð4GÒGÐGÐGà�‰˜UÐ->Ñ?Õ@r   Nru   r3   r   r   rI  rI  ?  s   „ óAr   rI  c                   ó   — e Zd Zd„ Zd„ Zy)ÚGoogleOAuth2Testc                 óp   — t        dt        t        | ¬«      fdt        fdt        fdt
        fgdddœ¬	«      S )
Nr1  rÑ   r2  r3  r6  Úfake_google_client_idÚfake_google_client_secretrK   )r7  )r   r/  rO   r?  rD  rI  r9   s    r   rà   zGoogleOAuth2Test.get_appG  sM   € Üð !Ô"4´dÀ´oÐFà+Ô-IÐJØ'Ô)AÐBØ*Ô,GÐHðð /Ø5ñô
ð 	
r   c                 óx   — | j                  d«      }| j                  ddddœt        |j                  «      «       y )Nr1  rÌ   rZ   rF  )r­   r[   r\   )rç   ÚassertDictEqualr	   rï   r³   s     r   Útest_google_loginz"GoogleOAuth2Test.test_google_loginW  s:   € Ø—:‘:˜oÓ.ˆØ×ÑàØ*Ø 3ñô
 ˜Ÿ™Ó&õ	
r   N)r/   r0   r1   rà   rR  r3   r   r   rL  rL  F  s   „ ò
ó 	
r   rL  )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?  rD  rI  rL  r3   r   r   ú<module>r\     s�  ðó ÷÷ õ 'Ý Ý .Ý 'Ý ß 8ß >Ñ >ðÝô
˜~¨{ô ô$$ nô $ô-˜~¨zô -ô>,Ð(@ô ,ô"¨>¸:ô ô ? nô ?ô
? ^ô ?ô
˜~¨{ô ô Ð1Cô ô0? ~ô ?ô
˜nô ô
	,˜>¨<ô 	,ô	(Ð 4ô 	(ô+Ð';ô +ô	,Ð,@ô 	,ô"Ð#7ô "ô&O nô Oô
Q >ô Qô	8¨Nô 	8ô~GÐ ô ~GôB˜Ð):ô ô<V >ô Vô
˜~ô 
ôA .ô Aô
Ð(õ 
øðY ò ØƒDðús   ÁE' Å'E2Å1E2