Ë
    %¹šj°_  ã                   ó  — 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mZ d d	l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 d0„ d1e«      Z0 G d2„ d3e«      Z1 G d4„ d5e«      Z2 G d6„ d7ee«      Z3 G d8„ d9e«      Z4 G d:„ d;e«      Z5 G d<„ d=e«      Z6 G d>„ d?e«      Z7y# e$ r dZY �Œ0w xY w)@é    N)ÚOpenIdMixinÚ
OAuthMixinÚOAuth2MixinÚGoogleOAuth2MixinÚFacebookGraphMixinÚTwitterMixin)Újson_decode)Úgen)ÚHTTPClientError)Ú
url_concat)Úapp_log)ÚAsyncHTTPTestCaseÚ	ExpectLogÚsetup_with_context_manager)Úignore_deprecation)Ú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     ú6lib/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d„ Zy)ÚOpenIdServerAuthenticateHandlerFc                 óú   — | j                  d«      dk7  rt        d«      ‚t        | «      j                  r| j	                  d«       n| j	                  d«       t        | «      j                   t        | «      _        y )Nr#   Úcheck_authenticationzincorrect openid.mode %rz2is_valid:true
ns:http://specs.openid.net/auth/2.0
z2ns:http://specs.openid.net/auth/2.0
is_valid:true
)r'   r*   ÚtypeÚ	flip_flopÚwrite©r   s    r   Úpostz$OpenIdServerAuthenticateHandler.post4   sd   € Ø×Ñ˜]Ó+Ð/EÒEÜÐ6Ó7Ð7ô
 �‹:×ÒØ�J‰JÐMÕNà�J‰JÐMÔNÜ#'¨£:×#7Ñ#7Ð7ŒˆT‹
Õr!   N)r1   r2   r3   r;   r>   r5   r!   r   r7   r7   1   s   „ Ø€Ió8r!   r7   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.initializeC   s@   € Ø%ˆÔØ(,¯©Ð5SÓ(TˆÔ%Ø$(§L¡LÐ1KÓ$LˆÔ!Ø'+§|¡|Ð4QÓ'RˆÕ$r!   c                 ó   — t        dd¬«      S ©NÚasdfÚqwer©ÚkeyÚsecret©Údictr=   s    r   Ú_oauth_consumer_tokenz.OAuth1ClientLoginHandler._oauth_consumer_tokenI   ó   € Ü˜ 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.getL   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Ú5678rN   zincorrect access token %rúfoo@example.com)Úemail)r'   r*   rR   )r   Úaccess_tokens     r   Ú_oauth_get_user_futurez/OAuth1ClientLoginHandler._oauth_get_user_futureX   sK   € à×ÑÐ/°Ô6ÜÐ1Ó2Ð2Øœ4 F°6Ô:Ò:ÜÐ7¸,ÑFÓGÐGÜÐ+Ô,Ð,r!   N)	r1   r2   r3   r    rS   r
   r4   r/   r`   r5   r!   r   r@   r@   B   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)NrV   é÷  zgot exception: %s)r'   r(   r*   Ú
set_statusr<   rW   )r   Úes     r   r/   z%OAuth1ClientLoginCoroutineHandler.getd   sm   è ø€ à×Ñ˜]¨DÔ1ð4Ø×1Ñ1Ó3Ó3ð
 ×)Ñ)Ó+Ó+øô	 ò 4Ø—‘ Ô$Ø—
‘
Ð.°Ñ2×3Ñ3ûð4üs+   ‚A7–< ¨A7¼	A4Á%A/Á*A7Á/A4Á4A7N)r1   r2   r3   Ú__doc__r
   r4   r/   r5   r!   r   rb   rb   a   s   „ ÙNà‡]�]ñ
,ó ñ
,r!   rb   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)Ú$OAuth1ClientRequestParametersHandlerc                 ó   — || _         y ©N)rE   )r   rI   s     r   r    z/OAuth1ClientRequestParametersHandler.initializes   s
   € Ø%ˆÕr!   c                 ó   — t        dd¬«      S rK   rQ   r=   s    r   rS   z:OAuth1ClientRequestParametersHandler._oauth_consumer_tokenv   rT   r!   c                 óx   — | j                  dt        dd¬«      t        d¬«      ¬«      }| j                  |«       y )Nzhttp://www.example.com/api/asdfr[   r\   rN   Úbar)Úfoo)Ú
parameters)Ú_oauth_request_parametersrR   r<   )r   Úparamss     r   r/   z(OAuth1ClientRequestParametersHandler.gety   s9   € Ø×/Ñ/Ø-Ü�V FÔ+Ü ”ð 0ó 
ˆð
 	�
‰
�6Õr!   N)r1   r2   r3   r    rS   r/   r5   r!   r   ri   ri   r   s   „ ò&ò/ór!   ri   c                   ó   — e Zd Zd„ Zy)ÚOAuth1ServerRequestTokenHandlerc                 ó&   — | j                  d«       y )Nz(oauth_token=zxcv&oauth_token_secret=1234©r<   r=   s    r   r/   z#OAuth1ServerRequestTokenHandler.getƒ   ó   € Ø�
‰
Ð=Õ>r!   N©r1   r2   r3   r/   r5   r!   r   rt   rt   ‚   ó   „ ó?r!   rt   c                   ó   — e Zd Zd„ Zy)ÚOAuth1ServerAccessTokenHandlerc                 ó&   — | j                  d«       y )Nz(oauth_token=uiop&oauth_token_secret=5678rv   r=   s    r   r/   z"OAuth1ServerAccessTokenHandler.getˆ   rw   r!   Nrx   r5   r!   r   r{   r{   ‡   ry   r!   r{   c                   ó   — e Zd Zd„ Zd„ Zy)ÚOAuth2ClientLoginHandlerc                 ó0   — |j                  d«      | _        y )Nz/oauth2/server/authorize)r   rG   r   s     r   r    z#OAuth2ClientLoginHandler.initialize�   s   € Ø$(§L¡LÐ1KÓ$LˆÕ!r!   c                 ó,   — | j                  «       }|�J ‚y rk   )rW   )r   r.   s     r   r/   zOAuth2ClientLoginHandler.get�   s   € Ø×%Ñ%Ó'ˆØˆ{Ð‰{r!   N)r1   r2   r3   r    r/   r5   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   rG   rH   Ú_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)   r<   rW   rX   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;Nr0   r5   r!   r   r‚   r‚   •   s    „ òCð
 	‡]�]ñó ñr!   r‚   c                   ó   — e Zd Zd„ Zy)Ú FacebookServerAccessTokenHandlerc                 ó<   — | j                  t        dd¬«      «       y )NrL   i  ©r_   Ú
expires_in)r<   rR   r=   s    r   r/   z$FacebookServerAccessTokenHandler.get®   s   € Ø�
‰
”4 V¸Ô=Õ>r!   Nrx   r5   r!   r   r’   r’   ­   ry   r!   r’   c                   ó   — e Zd Zd„ Zy)ÚFacebookServerMeHandlerc                 ó&   — | j                  d«       y )Nz{}rv   r=   s    r   r/   zFacebookServerMeHandler.get³   s   € Ø�
‰
�4Õr!   Nrx   r5   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 )NrB   ú/twitter/server/access_tokenrC   z/twitter/server/authenticatez/twitter/api)r   rF   rH   rG   Ú_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)   r=   s    r   Úget_auth_http_clientz)TwitterClientHandler.get_auth_http_client¿   s   € Ø�}‰}˜]Ñ+Ð+r!   N)r1   r2   r3   r    r    r5   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©NrV   r&   )r'   r(   r*   r+   rW   rX   s     r   r/   zTwitterClientLoginHandler.getÄ   sU   è ø€ à×Ñ˜]¨DÔ1Ø×4Ñ4Ó6Ñ6ˆDØˆ|Ü Ó/Ð/Ø�K‰K˜ÔØØ×%Ñ%Ó'Ó'ùó   ‚AAN©r1   r2   r3   r
   r4   r/   r5   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,   rX   s     r   r/   z$TwitterClientAuthenticateHandler.getÒ   sU   è ø€ à×Ñ˜]¨DÔ1Ø×4Ñ4Ó6Ñ6ˆDØˆ|Ü Ó/Ð/Ø�K‰K˜ÔØØ×(Ñ(Ó*Ó*ùr¥   Nr¦   r5   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)NrV   )r'   r(   r+   rW   rX   s     r   r/   z)TwitterClientLoginGenCoroutineHandler.getÞ   sD   è ø€ à×Ñ˜]¨DÔ1Ø×4Ñ4Ó6Ñ6ˆDØ�K‰K˜Õð ×)Ñ)Ó+Ó+ùs   ‚A
ANr¦   r5   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ÚvbnmrN   ©r_   éô  zerror from twitter request)Útwitter_requestr'   rR   r+   r   re   ©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¦   r5   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=foorv   r=   s    r   r/   z#TwitterServerAccessTokenHandler.getý   s   € Ø�
‰
ÐMÕNr!   Nrx   r5   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.0rV   r±   ©Úscreen_namer°   )r   r�   Ú	argumentsr'   r<   rR   Ú
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!   Nrx   r5   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Ç   rV   r±   ro   ÚFoorÈ   )r�   rÊ   r'   r<   rR   r=   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!   Nrx   r5   r!   r   rÍ   rÍ     s   „ ó8r!   rÍ   c                   ó0   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zˆ xZS )ÚOpenIDAuthTestc                 óH   •— t        | t        «       «       t        ‰| �  «       S rk   )r   r   ÚsuperÚsetUp)r   Ú	__class__s    €r   rÔ   zOpenIDAuthTest.setUp  s   ø€ Ü" 4Ô);Ó)=Ô>Ü‰w‰}‹Ðr!   c                 ób   — t        dt        t        | ¬«      fdt        fg| j                  ¬«      S )Nú/openid/client/login©r   r   r%   )r   r   rR   r7   r$   r=   s    r   Úget_appzOpenIDAuthTest.get_app   s7   € Üà'Ô)AÄ4ÈTÄ?ÐSØ.Ô0OÐPðð ×(Ñ(ô
ð 	
r!   c                 óÞ   — t        «       5  | j                  dd¬«      }| j                  |j                  d«       | j	                  d|j
                  d   «       d d d «       y # 1 sw Y   y xY w)Nr×   F©Úfollow_redirectsé.  z/openid/server/authenticate?ÚLocation)r   ÚfetchÚassertEqualr‡   ÚassertInÚheadersr¶   s     r   Útest_openid_redirectz#OpenIDAuthTest.test_openid_redirect)  sU   € ÜÕ!Ø—z‘zÐ"8È5�zÓQˆHØ×Ñ˜XŸ]™]¨CÔ0Ø�M‰MÐ8¸(×:JÑ:JÈ:Ñ:VÔW÷ "×!Ñ!ús   ‹AA#Á#A,c                 óF  — t        d«      D ]{  }| j                  |¬«      5  t        «       5  | j                  d«      }d d d «       j	                  «        t        |j                  «      }| j                  |d   d«       d d d «       Œ} y # 1 sw Y   ŒNxY w# 1 sw Y   Œ”xY w)Né   )Úiz¬/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^   r]   )ÚrangeÚsubTestr   rß   Úrethrowr	   Úbodyrà   )r   ræ   r·   Úparseds       r   Útest_openid_get_userz#OpenIDAuthTest.test_openid_get_user/  s†   € Ü�q–ˆAØ—‘ �Õ"Ü'Õ)Ø#Ÿz™zðAó �H÷ *ð × Ñ Ô"Ü$ X§]¡]Ó3�Ø× Ñ  ¨¡Ð2CÔD÷ #Ð"ñ ç)Ð)ú÷ #Ð"ús"   ¡B¬B¾ABÂBÂBÂB 	)r1   r2   r3   rÔ   rÙ   rã   rì   Ú__classcell__)rÕ   s   @r   rÑ   rÑ     s   ø„ ôò
òXöEr!   rÑ   c                   ó¨   — e 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        | 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g| j$                  dddd¬«      S )Nú/oauth10/client/loginrÇ   )r   rI   ú/oauth10/client/request_params)rI   ú/oauth10a/client/loginz1.0az /oauth10a/client/login_coroutineú/oauth10a/client/request_paramsú/oauth2/client/loginrØ   ú/facebook/client/loginú/twitter/client/loginú/twitter/client/authenticateú#/twitter/client/login_gen_coroutinez/twitter/client/show_userrB   rD   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@   rR   ri   rb   r~   r‚   r¢   r¨   r«   r®   rt   r{   r’   r—   r¹   r¼   rÍ   r$   r=   s    r   rÙ   zAuthTest.get_app?  sJ  € Üð ,Ü,Ü˜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ðð 0Ô1PÐQØ.Ô0NÐOØ0Ô2RÐSØ&Ô(?Ð@Ø/Ô1PÐQØ6Ô8TÐUàDÜ9ðði8ðr ×(Ñ(Ø!<Ø$BØ4Ø2ô}?
ð ?	
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_redirect�  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^   r]   r_   r[   r\   rN   ©rß   ré   r	   rê   rà   rR   ©r   r·   rë   s      r   Útest_oauth10_get_userzAuthTest.test_oauth10_get_user�  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Â   rL   rV   r[   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Úobjectrt   r*   Úside_effectr   r   rß   rà   r‡   )r   r/   r·   s      r   Útest_oauth10a_redirect_errorz%AuthTest.test_oauth10a_redirect_error²  sw   € ä�Z‰Z×ÑÔ>ÀÔFÈ#Ü'¨Ó/ˆCŒOÜœ7Ð$8Õ9ØŸ:™:Ð&>ÐQV˜:ÓW�÷ :à×Ñ˜XŸ]™]¨CÔ0÷	 GÐFç9Ð9ú÷ GÐFú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^   r]   r_   r[   r\   rN   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Â   rL   rV   r[   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
  rd   )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à   r‡   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_   rL   Ú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(  r=   s    r   Útest_twitter_redirectzAuthTest.test_twitter_redirectõ  s   € Ø×"Ñ"Ð#:Õ;r!   c                 ó&   — | j                  d«       y )Nrù   r*  r=   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±   ro   r²   )rO   rÉ   rP   rÏ   )r_   r°   rÉ   Úusername)rß   ré   r	   rê   rà   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!   )r1   r2   r3   rÙ   r  r  r  r  ÚunittestÚskipIfr   r  r  r  r  r   r%  r(  r+  r-  r/  r2  r6  r8  r5   r!   r   rï   rï   >  s„   „ ò@
òD
ò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_URIrG   rH   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_oauthrO   Úprofiler^   ÚpromptÚselect_account)rŠ   r‹   r�   Úresponse_typerŽ   )	r'   r(   rA  Úoauth2_requestr   r   r<   rW   r)   )r   r‡   Úaccessr-   s       r   r/   zGoogleLoginHandler.get4  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Nr0   r5   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'   rR   )r   r‡   s     r   r/   z GoogleOAuth2AuthorizeHandler.getL  s)   € à(ˆØ�‰”j ×!2Ñ!2°>Ó!BÄDÈdÄOÓTÕUr!   Nrx   r5   r!   r   rL  rL  K  s   „ óVr!   rL  c                   ó   — e Zd Zd„ Zy)ÚGoogleOAuth2TokenHandlerc                 óX   — | j                  d«      dk(  sJ ‚| j                  dddœ«       y )Nr‡   rN  úfake-access-tokenznever-expiresr”   ©r'   r+   r=   s    r   r>   zGoogleOAuth2TokenHandler.postS  s0   € Ø× Ñ  Ó(Ð,EÒEÐEÐEà�‰Ø0ÀÑPõ	
r!   N)r1   r2   r3   r>   r5   r!   r   rQ  rQ  R  s   „ ó
r!   rQ  c                   ó   — e Zd Zd„ Zy)ÚGoogleOAuth2UserinfoHandlerc                 óX   — | j                  d«      dk(  sJ ‚| j                  dddœ«       y )Nr_   rS  rÏ   r]   )r°   r^   rT  r=   s    r   r/   zGoogleOAuth2UserinfoHandler.get\  s.   € Ø× Ñ  Ó0Ð4GÒGÐGÐGà�‰˜UÐ->Ñ?Õ@r!   Nrx   r5   r!   r   rV  rV  [  s   „ óAr!   rV  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 )
Nr>  rØ   r?  r@  rC  Úfake_google_client_idÚfake_google_client_secretrN   )rD  )r   r<  rR   rL  rQ  rV  r=   s    r   rÙ   zGoogleOAuth2Test.get_appc  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 )Nr>  rÏ   r]   rS  )r°   r^   r_   )rß   ÚassertDictEqualr	   rê   r¶   s     r   Útest_google_loginz"GoogleOAuth2Test.test_google_logins  s:   € Ø—:‘:˜oÓ.ˆØ×ÑàØ*Ø 3ñô
 ˜Ÿ™Ó&õ	
r!   N)r1   r2   r3   rÙ   r_  r5   r!   r   rY  rY  b  s   „ ò
ó 	
r!   rY  )8r9  Útornado.authr   r   r   r   r   r   Útornado.escaper	   Útornador
   Útornado.httpclientr   Útornado.httputilr   Útornado.logr   Útornado.testingr   r   r   Útornado.test.utilr   Útornado.webr   r   r   r   ÚImportErrorr   r7   r@   rb   ri   rt   r{   r~   r‚   r’   r—   rš   r¢   r¨   r«   r®   r¹   r¼   rÍ   rÑ   rï   r<  rL  rQ  rV  rY  r5   r!   r   Ú<module>rj     s³  ðó ÷÷ õ 'Ý Ý .Ý 'Ý ß TÑ TÝ 0ß >Ñ >ðÝô
˜~¨{ô ô$8 nô 8ô"-˜~¨zô -ô>,Ð(@ô ,ô"¨>¸:ô ô ? nô ?ô
? ^ô ?ô
˜~¨{ô ô Ð1Cô ô0? ~ô ?ô
˜nô ô
	,˜>¨<ô 	,ô	(Ð 4ô 	(ô+Ð';ô +ô	,Ð,@ô 	,ô"Ð#7ô "ô&O nô Oô
Q >ô Qô	8¨Nô 	8ô EÐ&ô  EôFlGÐ ô lGô^˜Ð):ô ô<V >ô Vô
˜~ô 
ôA .ô Aô
Ð(õ 
øðO ò ØƒDðús   ÁE: Å:FÆF