
    rN                     	   d dl Z d dlmZ d dlZd dlZd dlZd dlZd dl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 d dlmZ ej$                  j'                  ej$                  j)                  e      d	d
      Z eej$                  j'                  ed      d      5 Zej3                         Zddd       ej6                  j9                  ed      ZddgZdZdZ dZ!ejD                  jG                  dddg      d        Z$d Z%d Z&d Z'ejD                  jG                  dddiddig      d        Z(ejD                  jG                  dddidd d!iid"d d!hig      d#        Z)ejD                  jG                  d$d%d&g       ejT                  d'e j                   jV                  (      d)               Z,d* Z-ej\                  fd+Z/d, Z0d- Z1d. Z2d/ Z3d0 Z4d1 Z5d2 Z6d3 Z7 ejT                  d'e j                   jV                  (      d4        Z8d5 Z9d6 Z:d7 Z;d8 Z<d9 Z= ejT                  d'e j                   jV                  (      d:        Z> ejT                  d'e j                   jV                  (      d;        Z?d< Z@ ejT                  d=e (       ejT                  d>d(      ejT                  j                  ed?d@      dA                      ZBejD                  jG                  dBddg       ejT                  d=e (       ejT                  d>d(      ejT                  j                  ed?d@      dC                             ZC ejT                  dDe!(       ejT                  dEdFd i(      ejT                  j                  ed?d@      dG                      ZDejD                  jG                  dBddg       ejT                  dDe!(       ejT                  dEdFd i(      ejT                  j                  ed?d@      dH                             ZE ejT                  d>d(      ejT                  j                  ed?d@      dI               ZFejD                  jG                  dBddg       ejT                  d>d(      ejT                  j                  ed?d@      dJ                      ZGejD                  jG                  dBddg      dK        ZHy# 1 sw Y   xY w)L    N)_helpers)crypt)
exceptions)iam)jwt)	transport)_clientz..datazprivatekey.pemrb1z&https://www.googleapis.com/auth/pubsubz-https://www.googleapis.com/auth/logging.writezThttps://www.googleapis.com/auth/pubsub https://www.googleapis.com/auth/logging.writez8gl-python/3.7 auth/1.1 auth-request-type/at cred-type/saz8gl-python/3.7 auth/1.1 auth-request-type/it cred-type/sa	retryableTFc                    ddd}t        j                  t        j                        5 }t	        j
                  ||        d d d        j                  j                  | k(  sJ |j                  d      sJ y # 1 sw Y   8xY w)Nhelp	I'm aliveerrorerror_descriptionzhelp: I\'m alive	pytestraisesr   RefreshErrorr	   _handle_error_responsevaluer   match)r   response_dataexcinfos      Splatform/gsutil/third_party/google-auth-library-python/tests/oauth2/test__client.pytest__handle_error_responser   9   sk    $;GM	z..	/7&&}i@ 
0 ==""i///==,---	 
0	/s   A77B c                      ddi} t        j                  t        j                        5 }t	        j
                  | d       d d d        j                  j                  rJ |j                  d      sJ y # 1 sw Y   5xY w)NfoobarFz{\"foo\": \"bar\"}r   r   r   s     r   $test__handle_error_response_no_errorr#   D   se    ENM	z..	/7&&}e< 
0 }}&&&&==.///	 
0	/s   A33A<c                      d} t        j                  t        j                        5 }t	        j
                  | d       d d d        j                  j                  rJ |j                  |       sJ y # 1 sw Y   5xY w)Nthis is an error messageFr   r"   s     r   $test__handle_error_response_not_jsonr&   N   s`    .M	z..	/7&&}e< 
0 }}&&&&=='''	 
0	/s   A11A:c                      t         j                  } t        dd      D ];  }|| v rt        j                  |ddi      r J t        j                  |ddi      s;J  y )Nd   iX  r   invalid_scope)r   DEFAULT_RETRYABLE_STATUS_CODESranger	   
_can_retry)retryable_codesstatus_codes     r   test__can_retry_retryabler/   X   s[    >>OS#/)%%kG_3MNNN))+7QRRR	 '    r   r   internal_failureserver_errorc                 P    t        j                  t        j                  |       sJ y Nr	   r,   http_clientOKr   s    r   test__can_retry_messager9   a   s     knnm<<<r0   r)   r    r!   r   c                 P    t        j                  t        j                  |       rJ y r4   r5   r8   s    r    test__can_retry_no_retry_messager;   h   s!     !!+..-@@@@r0   mock_expires_in  500zgoogle.auth._helpers.utcnow)return_valuec                     t        j                  d|i      }|t        j                  j                  t        j                  d      z   k(  sJ y )N
expires_inr=   seconds)r	   _parse_expirydatetimemin	timedelta)unused_utcnowr<   results      r   test__parse_expiryrJ   t   sC     ""L/#BCFX&&**X-?-?-LLLLLr0   c                  2    t        j                  i       J y r4   )r	   rD    r0   r   test__parse_expiry_nonerM   {   s      $,,,r0   c                    t        j                  t        j                  d      }||_        t        j                  |       j                  d      |_        t        j                  t        j                        }||_
        |S )NTinstanceutf-8)mockcreate_autospecr   Responsestatusjsondumpsencoder
   Requestr?   )r   rU   responserequests       r   make_requestr\      s_    ##I$6$6FHHOJJ}-44W=HM""9#4#45G#GNr0   c                      t        ddi      } t        j                  | dddi      }| j                  ddddidj	                  d	      
       |ddik(  sJ y )NtestrZ   http://example.comparamsPOSTContent-Typez!application/x-www-form-urlencodedztest=paramsrQ   methodurlheadersbody)r\   r	   _token_endpoint_requestassert_called_withrX   r[   rI   s     r   test__token_endpoint_requestrk      su    FJ/0G,,%'9F
  !DE!!'*	   fj))))r0   c                      t        ddi      } t        j                  | dddidd      }| j                  ddd	d
dd       |ddik(  sJ y )Nr^   rZ   r_   r`   access_tokenT)rm   use_jsonra   application/jsonzBearer access_token)rb   Authorizations   {"test": "params"}rc   )r\   r	   rh   ri   rj   s     r   %test__token_endpoint_request_use_jsonrq      su    FJ/0G,,	#F  .2
 #   fj))))r0   c                      t        i t        j                        } t        j                  t
        j                        5  t        j                  | di        d d d        y # 1 sw Y   y xY w)NrU   r_   )	r\   r6   BAD_REQUESTr   r   r   r   r	   rh   r[   s    r   "test__token_endpoint_request_errorrv      sE    2k&=&=>G	z..	/''1ErJ 
0	/	/s   A  A)c                      t        ddit        j                        } t        j                  t
        j                        5  t        j                  | dddi       d d d        | j                  dk(  sJ t        ddit        j                        } t        j                  t
        j                        5  t        j                  | dddi       d d d        | j                  dk(  sJ y # 1 sw Y   xY w# 1 sw Y   'xY w)Nr   r1   rs   r_      r   )
r\   r6   rt   r   r   r   r   r	   rh   
call_countru   s    r   3test__token_endpoint_request_internal_failure_errorrz      s    	01+:Q:QG 
z..	/''),?AS+T	
 
0
 """	$%k.E.EG 
z..	/'')G5G+H	
 
0
 """! 
0	/ 
0	/s   C(4C4(C14C=c                     t        j                  t        j                  d      } t        j
                  | _        t        j                  ddi      j                  d      | _
        t        j                  t        j                  d      }t        j
                  |_        t        j                  ddi      j                  d      |_
        t        j                  t        j                        }| | |g|_        t        j                  t        j                         5  t#        j$                  |dddi       d d d        |j&                  dk(  sJ y # 1 sw Y   xY w)	NTrO   r   r1   rQ   r)   r_   rx   )rR   rS   r   rT   r6   rt   rU   rV   rW   rX   r
   rY   side_effectr   r   r   r   r	   rh   ry   )retryable_errorunretryable_errorr[   s      r   Etest__token_endpoint_request_internal_failure_and_retry_failure_errorr      s   **9+=+=MO(44O::':<N&OPWWO ,,Y-?-?$O*66!ZZ)<o(NOVV ""9#4#45G*O=NOG	z..	/''),?+Q	
 
0 """ 
0	/s   EEc                  D   t        j                  t        j                  d      } t        j
                  | _        t        j                  ddi      j                  d      | _
        t        j                  t        j                  d      }t        j                  |_        t        j                  ddi      j                  d      |_
        t        j                  t        j                        }| |g|_        t        j                  |dd	d
i      }|j                   dk(  sJ y )NTrO   r   r1   rQ   helloworldr_   r^   r`      )rR   rS   r   rT   r6   rt   rU   rV   rW   rX   r
   r7   rY   r|   r	   rh   ry   )r}   rZ   r[   _s       r   @test__token_endpoint_request_internal_failure_and_retry_succeedsr      s    **9+=+=MO(44O::':<N&OPWWO ##I$6$6FH!nnHOJJ1299'BHM""9#4#45G*H5G''%'9	A """r0   c                     t        j                  t        j                  d      } t        j
                  | _        d| _        t        j                  t        j                        }| |_	        t        j                  t        j                        5 }t        j                  |di        d d d        j!                  d      sJ y # 1 sw Y   xY w)NTrO   r%   r_   )rR   rS   r   rT   r6   rt   rU   r
   rY   r?   r   r   r   r   r	   rh   r   )rZ   r[   r   s      r   )test__token_endpoint_request_string_errorr     s    ##I$6$6FH!--HO.HM""9#4#45G#G	z..	/7''1ErJ 
0==3444 
0	/s   CCc                     | j                   d   d   j                  d      }t        j                  j	                  |      }|j                         D ]  \  }}||   d   |k(  rJ  y )N   rg   rQ   r   )	call_argsdecodeurllibparseparse_qsitems)r[   r`   request_bodyrequest_paramskeyr   s         r   verify_request_paramsr     sb    $$Q'/66w?L\\**<8Nlln
Uc"1%... %r0   c                     t        dddd      }t        j                  |dd      \  }}}t        |t        j                  dd       |dk(  sJ | |        t        j                  d      z   k(  sJ |d	   dk(  sJ y )
Ntokenr=   r
   )rm   rA   extrar_   assertion_value
grant_type	assertionrB   r   )r\   r	   	jwt_grantr   _JWT_GRANT_TYPErE   rG   )utcnowr[   r   expiry
extra_datas        r   test_jwt_grantr     s     fEG !( 1 1%'8!E6:
  7 7FWX
 GVX 2 23 ?????g&(((r0   c                      t        ddd      } t        j                  t        j                        5 }t        j                  | dd       d d d        j                  j                  rJ y # 1 sw Y   "xY wNr=   r
   )rA   r   r_   r   )	r\   r   r   r   r   r	   r   r   r   r[   r   s     r   test_jwt_grant_no_access_tokenr   -  sg     	
G 
z..	/7'#79JK 
0}}&&&&& 
0	/   A++A4c                  x   t        j                         } t        j                  |       }t        j                  t
        d|i      j                  d      }t        d|i      }t        j                  |t        j                  dddd      \  }}|j                  d   d	   d
k(  sJ |j                  d   d   d   dk(  sJ |j                  d   d   d   dk(  sJ t        j                  |j                  d   d         }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ ||k(  sJ | j                  d      } || k(  sJ y )NexprQ   r   
fake_emailfake_audiencefake_access_tokengoogleapis.comr   re   z^https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/fake_email:generateIdTokenrf   rb   ro   rp   zBearer fake_access_tokenrg   audienceincludeEmailtrueuseEmailAzpr   microsecond)r   r   datetime_to_secsr   rX   SIGNERr   r\   r	   #call_iam_generate_id_token_endpointr   _IAM_IDTOKEN_ENDPOINTr   rV   loadsreplace)nowid_token_expiryid_tokenr[   r   r   response_bodys          r   (test_call_iam_generate_id_token_endpointr   ;  sq   
//
C//4Ozz&5/":;BB7KHGX./G??!!ME6 	!U#k	l	l Q	*>:>PPPP!Y'8<VVVJJw003F;<M$777(F222'6111 H
++!+
$CS==r0   c            	         t        ddi      } t        j                  t        j                        5 }t        j                  | t        j                  dddd       d d d        j                  d      sJ y # 1 sw Y   xY w)Nr   zno tokenr   r   r   r   zNo ID token in response)
r\   r   r   r   r   r	   r   r   r   r   r   s     r   4test_call_iam_generate_id_token_endpoint_no_id_tokenr   ^  sw     Z	
G 
z..	/733%%	
 
0 ==2333 
0	/s   )A66A?c                     t        j                         } t        j                  |       }t        j                  t
        d|i      j                  d      }t        |dd      }t        j                  |dd      \  }}}t        |t        j                  dd       ||k(  sJ | j                  d	      } || k(  sJ |d
   dk(  sJ y )Nr   rQ   r
   )r   r   r_   r   r   r   r   r   )r   r   r   r   rX   r   r   r\   r	   id_token_jwt_grantr   r   r   )r   r   r   r[   r   r   r   s          r   test_id_token_jwt_grantr   r  s    
//
C//4Ozz&5/":;BB7KH6BCG ' : :%'8!E6:
  7 7FWX
 H
++!+
$CS==g&(((r0   c                      t        ddd      } t        j                  t        j                        5 }t        j                  | dd       d d d        j                  j                  rJ y # 1 sw Y   "xY wr   )	r\   r   r   r   r   r	   r   r   r   r   s     r   'test_id_token_jwt_grant_no_access_tokenr     sg     	
G 
z..	/7""7,@BST 
0}}&&&&& 
0	/r   c           	      @   t        ddddd      }t        j                  |dddd	d
      \  }}}}t        |t        j                  ddd	d
d       |dk(  sJ |dk(  sJ |t
        j
                  j                  t        j                  d      z   k(  sJ |d   dk(  sJ y )Nr   new_refresh_tokenr=   r
   )rm   refresh_tokenrA   r   r_   r   	client_idclient_secret
rapt_token)r   )r   r   r   r   raptrB   r   )r\   r	   refresh_grantr   _REFRESH_GRANT_TYPErE   rF   rG   rH   r[   r   r   r   r   s         r   test_refresh_grantr     s    #0		
G 07/D/D0,E=&* !55,$, 	
	 G////X&&**X-?-?-LLLLLg&(((r0   c           	      X   t        ddddt        d      }t        j                  |dddd	t              \  }}}}t        |t        j                  ddd	t        d
       |dk(  sJ |dk(  sJ |t        j                  j                  t        j                  d      z   k(  sJ |d   dk(  sJ y )Nr   r   r=   r
   )rm   r   rA   r   scoper_   r   r   r   )r   r   r   r   r   rB   r   )
r\   SCOPES_AS_STRINGr	   r   SCOPES_AS_LISTr   r   rE   rF   rG   r   s         r   test_refresh_grant_with_scopesr     s    #0%	
G 07/D/D0,E=&* !55,$,%	
	 G////X&&**X-?-?-LLLLLg&(((r0   c                      t        dddd      } t        j                  t        j                        5 }t        j                  | dddd       d d d        j                  j                  rJ y # 1 sw Y   "xY w)	Nr   r=   r
   )r   rA   r   r_   r   r   r   )	r\   r   r   r   r   r	   r   r   r   r   s     r   "test_refresh_grant_no_access_tokenr     sr     1		
G 
z..	/7)?K	
 
0 }}&&&&&	 
0	/s   A..A7z;google.auth.metrics.token_request_access_token_sa_assertionz#google.oauth2._client._parse_expiryrh   )autospecc                 *   t        j                  t        j                         t        j                         t        j                                | j	                  t        j
                  t        j
                  t        j
                  ddt        i       y NTx-goog-api-client	can_retryrf   r	   r   rR   Mockri   ANY)ACCESS_TOKEN_REQUEST_METRICS_HEADER_VALUE)mock_token_endpoint_requestmock_expirymock_metrics_header_values      r   test_jwt_grant_retry_defaultr     s\     diik499;		<22$&OP 3 r0   r   c                 .   t        j                  t        j                         t        j                         t        j                         |       | j	                  t        j
                  t        j
                  t        j
                  |dt        i       y Nr   r   r   r   )r   r   r   r   s       r   test_jwt_grant_retry_with_retryr   
  s^     diik499;		yQ22$&OP 3 r0   z7google.auth.metrics.token_request_id_token_sa_assertionzgoogle.auth.jwt.decoder   c                 *   t        j                  t        j                         t        j                         t        j                                | j	                  t        j
                  t        j
                  t        j
                  ddt        i       y r   r	   r   rR   r   ri   r   %ID_TOKEN_REQUEST_METRICS_HEADER_VALUE)r   mock_jwt_decoder   s      r   %test_id_token_jwt_grant_retry_defaultr     s\     tyy{DIIKE22$&KL 3 r0   c                 .   t        j                  t        j                         t        j                         t        j                         |       | j	                  t        j
                  t        j
                  t        j
                  |dt        i       y r   r   )r   r   r   r   s       r   (test_id_token_jwt_grant_retry_with_retryr   1  sc     		TYY[$))+  22$&KL 3 r0   c                 h   t        j                  t        j                         t        j                         t        j                         t        j                         t        j                                | j	                  t        j
                  t        j
                  t        j
                  d       y )NTr   r	   r   rR   r   ri   r   )r   mock_parse_expirys     r    test_refresh_grant_retry_defaultr   G  se     		TYY[$))+tyy{DIIK  22$((DHH 3 r0   c                 l   t        j                  t        j                         t        j                         t        j                         t        j                         t        j                         |       | j	                  t        j
                  t        j
                  t        j
                  |       y )Nr   r   )r   r   r   s      r   #test_refresh_grant_retry_with_retryr   R  sl     										  22$((DHH	 3 r0   c                    ddd}d}t        j                  t        j                  d      }t        j
                  |_        t        j                  |      j                  d      |_
        t        j                  t        j                        }||_        t        j                  |t        j                         |t        j                         t        j                         |        | r|j                   d	k(  sJ y |j                   d
k(  sJ y )Nr   r   r   z
dummy bodyTrO   rQ   r   rx   r   )rR   rS   r   rT   r6   INTERNAL_SERVER_ERRORrU   rV   rW   rX   r
   rY   r?   r	    _token_endpoint_request_no_throwr   ry   )r   r   rg   mock_responsemock_requests        r   0test__token_endpoint_request_no_throw_with_retryr   e  s    $;GMD((););dKM&<<MM299'BM''	(9(9:L -L,,diik4diikY &&!+++&&!+++r0   )IrE   http.clientclientr6   rV   osr   rR   r   google.authr   r   r   r   r   r   google.oauth2r	   pathjoindirname__file__DATA_DIRopenfhreadPRIVATE_KEY_BYTES	RSASignerfrom_stringr   r   r   r   r   markparametrizer   r#   r&   r/   r9   r;   patchrF   rJ   rM   r7   r\   rk   rq   rv   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   objectr   r   r   r   r   r   r   rL   r0   r   <module>r     sN    !  	       "   ! ! 77<<14@	"'',,x!1
2D9R	 : 
	$	$%6	< -3
5  ? * ? &
 tUm4. 5.0(S w 23g~5NO== 	/"	5%.!	uen-AA *S%L9)8I8I8M8MNM O :M
- (3~~ *&*4K#0#4#,	5/ )8I8I8M8MN) O)(' F4().' )8I8I8M8MN#) O#)L )8I8I8M8MN$) O$)N'" A: 1E75E
 F F	
 tUm4A: 1E75E
 F F	 5
 =6 $E1:>75E
 F ?	
 tUm4=6 $E1:>75E F ?	 5 1E75E F F tUm41E75E F F 5  tUm4, 5,G :9s   "SS