
    |j                        S r SSKJr  SSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJr  SrSS jrSS	 jrSS
 jrSS jrSS jrSS jr        SS jr          SS jrSSS jjrSS.SS jjrg)u9   OAuth Web de Google Drive por customer (Aplicación web).    )annotationsN)Any)	urlencode)settings)z%https://www.googleapis.com/auth/drivec                 b    [        [        R                  =(       d    SR                  5       5      $ N )boolr   google_drive_oauth_redirect_uristrip     VC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\google_drive_oauth.pyoauth_redirect_configuredr      s!    99?RFFHIIr   c                     [        5       $ )z=True si hay redirect URI (client_id/secret van por customer).)r   r   r   r   oauth_web_configuredr      s    $&&r   c                     [         R                  =(       d    SR                  5       n [         R                  =(       d    SR                  5       nU (       a
  U(       a  X4$ g r   )r   google_drive_oauth_client_idr    google_drive_oauth_client_secret)cidsecrets     r   platform_oauth_clientr      sD    006B
=
=
?C77=2DDFF
v{r   c                   [         R                  " U SSS9n[        R                  " [        R
                  =(       d    SR                  S5      UR                  S5      [        R                  5      R                  5       nSS K
nUR                  UR                  S5      5      R                  S5      R                  S5      nU S	U 3$ )
N),:T)
separators	sort_keyspie360utf-8r   ascii=.)jsondumpshmacnewr   
secret_keyencodehashlibsha256	hexdigestbase64urlsafe_b64encodedecoderstrip)payloadrawsigr,   bodys        r   _sign_stater4   "   s    
**Wt
DC
((				(009

7 ik	 
 ##CJJw$78??HOOPSTDV1SE?r   c                   SS K nU (       a  SU ;  a  [        S5      eU R                  SS5      u  p#S[        U5      * S-  -  nUR	                  X$-   5      R                  S5      n[        R                  " [        R                  =(       d    SR                  S5      UR                  S5      [        R                  5      R                  5       n[        R                  " Xc5      (       d  [        S	5      e[        R                   " U5      n[#        UR%                  S
5      =(       d    S5      [#        [&        R&                  " 5       5      :  a  [        S5      eU$ )Nr   r"   u   state OAuth inválido.   r!      r   r   zstate OAuth no verificado.expu8   El enlace OAuth expiró. Vuelve a pulsar Conectar Drive.)r,   
ValueErrorrsplitlenurlsafe_b64decoder.   r%   r&   r   r'   r(   r)   r*   r+   compare_digestr#   loadsintgettime)stater,   r3   r2   padr1   expecteddatas           r   _verify_staterF   /   s   Cu$122S!$ID
#d)a
 C

"
"4:
.
5
5g
>Cxx				(009

7 ik	 
 x--566::c?D
488E?a 3tyy{#33STTKr   c                    [        U 5      $ )N)rF   )rB   s    r   verify_oauth_staterH   D   s    r   c           	        [         R                  =(       d    SR                  5       nU(       d  [        S5      eU=(       d    SR                  5       nU=(       d    SR                  5       nU(       a  U(       d  [        S5      e[	        U 5      S:  a  [        S5      e[        [	        U 5      U[	        [        R                  " 5       5      S-   S.5      nUUSS	R                  [        5      S
SSUS.nS[        U5      -   nXdS.$ )Nr	   zFalta GOOGLE_DRIVE_OAUTH_REDIRECT_URI en el .env del servidor PIE360 (solo el redirect; cada cliente usa su propio client_id/secret).zFGuarda primero el client_id y client_secret OAuth Web de este cliente.r6   u   customer_id inválido.iX  )customer_id	client_idr8   code offlinetrueconsent)rK   redirect_uriresponse_typescopeaccess_typeinclude_granted_scopespromptrB   z-https://accounts.google.com/o/oauth2/v2/auth?)authorize_urlrB   )
r   r   r   r9   r?   r4   rA   joinDRIVE_OAUTH_SCOPESr   )rJ   rK   client_secretredirectrB   paramsurls          r   build_authorize_urlr^   H   s     88>BEEGHO
 	
 b'')I"(b//1MMT
 	
 ;!122{+"tyy{#c)	
E  ,- "(	F :If<M
MC 11r   c                   [         R                  =(       d    SR                  5       nU(       d  [        S5      e[	        U5      n[        US   5      n[        UR                  S5      =(       d    S5      R                  5       nU=(       d    SR                  5       nU=(       d    SR                  5       nU(       a  U(       a  Xr:w  a  [        S5      eU(       a  U(       d  [        S5      eU =(       d    SR                  5       n U (       d  [        S5      e SS	KJ	n  SUUSSU/S.0n
UR                  U
[        [        5      S9nXKl        UR                  U S9  UR                   nUR"                  (       d  [        S5      eSUUUR"                  UR$                  SS.nU[&        R(                  " USS9S.$ ! [         a  n	[        S
5      U	eSn	A	ff = f)zGIntercambia code por tokens y devuelve {customer_id, credentials_json}.r	   z5Falta GOOGLE_DRIVE_OAUTH_REDIRECT_URI en el servidor.rJ   rK   z-El client_id no coincide con el inicio OAuth.z<Faltan client_id/client_secret del cliente para el callback.zFalta el code de Google.r   )FlowzEFalta google-auth-oauthlib. Instala: pip install google-auth-oauthlibNwebz)https://accounts.google.com/o/oauth2/authz#https://oauth2.googleapis.com/token)rK   rZ   auth_uri	token_uriredirect_uris)scopes)rL   u   Google no devolvió refresh_token. Revoca el acceso de la app en https://myaccount.google.com/permissions y vuelve a conectar con prompt=consent.authorized_user)typerK   rZ   refresh_tokentokenrc   F)ensure_ascii)rJ   credentials_json)r   r   r   r9   rF   r?   strr@   google_auth_oauthlib.flowr`   ImportErrorfrom_client_configlistrY   rQ   fetch_tokencredentialsrh   ri   r#   r$   )rL   rB   rK   rZ   r[   rE   rJ   expected_clientr`   excclient_configflowcredscredentials_objs                 r   exchange_code_for_credentialsry   r   s    88>BEEGHPQQDd=)*K$((;/526<<>Ob'')I"(b//1M9)EHIIMWXXJBD3442 	"*C>&Z
M ""=>P9Q"RD $E_
 	
 "&,,:O # JJUK A  S
	s   F9 9
GGGc                t    U =(       d    SR                  5       nU(       d  g [        U5      U::  a  gUS U  S3$ )Nr	   u   ••••••••)r   r;   )valueheadtexts      r   _mask_secretr~      s=    KR D
4yD)5Dk]233r   r	   )messagec                   [         R                  =(       d    SR                  5       R                  S5      nU(       ad  UR	                  S5      (       d  UR	                  S5      (       a8  UR	                  S5      (       a  UR                  SS5      nU S[        U5       3nSU;   a  SOSnU (       a  SOS	US S
 S.nU U [        U5       3$ )Nz8https://pie-360-chile.web.app/configuracion/google-drive/z/configuracion/google-drivez/agents/settingsz	/cliente/?&okerror   )drive_oauthr   )r   google_drive_oauth_success_urlr   r/   endswithreplacer?   r   )r   rJ   r   basesepqs         r   frontend_return_urlr      s    // 	FEegffSk 	 ==6774==I[;\;\}}/00||$68UVV9S%5$67D##C!tw4C=	A VC51''r   )returnr
   )r   ztuple[str, str] | None)r0   dict[str, Any]r   rl   )rB   rl   r   r   )rJ   r?   rK   rl   rZ   rl   r   zdict[str, str])
rL   rl   rB   rl   rK   rl   rZ   rl   r   r   )   )r{   
str | Noner|   r?   r   r   )r   r
   rJ   z
int | Noner   rl   r   rl   )__doc__
__future__r   r)   r%   r#   rA   typingr   urllib.parser   app.backend.core.configr   rY   r   r   r   r4   rF   rH   r^   ry   r~   r   r   r   r   <module>r      s    ? "      " ,? J'

* '2'2 '2 	'2
 '2T=
= = 	=
 = =@4 NP ( (r   