
    }gU                     N   d Z ddlZddlZddlmZ ddlm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 ddlmZ dZdZdZej*                  dfdZ G d dej.                  ej0                  ej2                        Z G d dej0                        Zg fdZy)a  Google Cloud Impersonated credentials.

This module provides authentication for applications where local credentials
impersonates a remote service account using `IAM Credentials API`_.

This class can be used to impersonate a service account as long as the original
Credential object has the "Service Account Token Creator" role on the target
service account.

    .. _IAM Credentials API:
        https://cloud.google.com/iam/credentials/reference/rest/
    N)datetime)_exponential_backoff)_helpers)credentials)
exceptions)iam)jwt)metrics)_clientz*Unable to acquire impersonated credentialsi  z#https://oauth2.googleapis.com/tokenc                    |xs= t         j                  j                  t        j                  |      j                  |      }t        j                  |      j                  d      } | |d||      }t        |j                  d      r|j                  j                  d      n|j                  }|j                  t        j                  k7  rt        j                   t"        |      	 t        j$                  |      }	|	d   }
t'        j(                  |	d   d      }|
|fS # t*        t,        f$ r1}t        j                   dj                  t"              |      }||d	}~ww xY w)
a  Makes a request to the Google Cloud IAM service for an access token.
    Args:
        request (Request): The Request object to use.
        principal (str): The principal to request an access token for.
        headers (Mapping[str, str]): Map of headers to transmit.
        body (Mapping[str, str]): JSON Payload body for the iamcredentials
            API call.
        iam_endpoint_override (Optiona[str]): The full IAM endpoint override
            with the target_principal embedded. This is useful when supporting
            impersonation with regional endpoints.

    Raises:
        google.auth.exceptions.TransportError: Raised if there is an underlying
            HTTP connection error
        google.auth.exceptions.RefreshError: Raised if the impersonated
            credentials are not available.  Common reasons are
            `iamcredentials.googleapis.com` is not enabled or the
            `Service Account Token Creator` is not assigned
    utf-8POSTurlmethodheadersbodydecodeaccessToken
expireTimez%Y-%m-%dT%H:%M:%SZz6{}: No access token or invalid expiration in response.N)r   _IAM_ENDPOINTreplacer   DEFAULT_UNIVERSE_DOMAINformatjsondumpsencodehasattrdatar   statushttp_clientOKr   RefreshError_REFRESH_ERRORloadsr   strptimeKeyError
ValueError)request	principalr   r   universe_domainiam_endpoint_overrideiam_endpointresponseresponse_bodytoken_responsetokenexpiry
caught_excnew_excs                 a/var/www/html/Manimaran/venv/lib/python3.12/site-packages/google/auth/impersonated_credentials.py_make_iam_token_requestr6   3   s=   6 ) C,=,=,E,E++_-fY  ::d""7+D<dSH
 8==(+ 	W%]]  +..(%%nmDD&M2}-"">,#?AUVf}j! &))DKK 	
 :%&s   '6D E-,EEc                       e Zd ZdZddeddf fd	Zd Z ej                  e	j                        d        Zd Zd Zed        Zed	        Zed
        Zed        Z ej                  e	j                        d        Zd Z ej                  e	j*                        d        Z ej                  e	j.                        dd       Z xZS )Credentialsa  This module defines impersonated credentials which are essentially
    impersonated identities.

    Impersonated Credentials allows credentials issued to a user or
    service account to impersonate another. The target service account must
    grant the originating credential principal the
    `Service Account Token Creator`_ IAM role:

    For more information about Token Creator IAM role and
    IAMCredentials API, see
    `Creating Short-Lived Service Account Credentials`_.

    .. _Service Account Token Creator:
        https://cloud.google.com/iam/docs/service-accounts#the_service_account_token_creator_role

    .. _Creating Short-Lived Service Account Credentials:
        https://cloud.google.com/iam/docs/creating-short-lived-service-account-credentials

    Usage:

    First grant source_credentials the `Service Account Token Creator`
    role on the target account to impersonate.   In this example, the
    service account represented by svc_account.json has the
    token creator role on
    `impersonated-account@_project_.iam.gserviceaccount.com`.

    Enable the IAMCredentials API on the source project:
    `gcloud services enable iamcredentials.googleapis.com`.

    Initialize a source credential which does not have access to
    list bucket::

        from google.oauth2 import service_account

        target_scopes = [
            'https://www.googleapis.com/auth/devstorage.read_only']

        source_credentials = (
            service_account.Credentials.from_service_account_file(
                '/path/to/svc_account.json',
                scopes=target_scopes))

    Now use the source credentials to acquire credentials to impersonate
    another service account::

        from google.auth import impersonated_credentials

        target_credentials = impersonated_credentials.Credentials(
          source_credentials=source_credentials,
          target_principal='impersonated-account@_project_.iam.gserviceaccount.com',
          target_scopes = target_scopes,
          lifetime=500)

    Resource access is granted::

        client = storage.Client(credentials=target_credentials)
        buckets = client.list_buckets(project='your_project')
        for bucket in buckets:
          print(bucket.name)
    Nc	                 r   t         t        |           t        j                  |      | _        t        | j                  t        j                        ru| j                  j                  t        j                        | _        t        | j                  d      r1| j                  j                  r| j                  j                  d       |j                  | _        || _        || _        || _        || _        |xs t(        | _        d| _        t/        j0                         | _        || _        || _        d| _        y)a$  
        Args:
            source_credentials (google.auth.Credentials): The source credential
                used as to acquire the impersonated credentials.
            target_principal (str): The service account to impersonate.
            target_scopes (Sequence[str]): Scopes to request during the
                authorization grant.
            delegates (Sequence[str]): The chained list of delegates required
                to grant the final access_token.  If set, the sequence of
                identities must have "Service Account Token Creator" capability
                granted to the prceeding identity.  For example, if set to
                [serviceAccountB, serviceAccountC], the source_credential
                must have the Token Creator role on serviceAccountB.
                serviceAccountB must have the Token Creator on
                serviceAccountC.
                Finally, C must have Token Creator on target_principal.
                If left unset, source_credential must have that role on
                target_principal.
            lifetime (int): Number of seconds the delegated credential should
                be valid for (upto 3600).
            quota_project_id (Optional[str]): The project ID used for quota and billing.
                This project may be different from the project used to
                create the credentials.
            iam_endpoint_override (Optional[str]): The full IAM endpoint override
                with the target_principal embedded. This is useful when supporting
                impersonation with regional endpoints.
            subject (Optional[str]): sub field of a JWT. This field should only be set
                if you wish to impersonate as a user. This feature is useful when
                using domain wide delegation.
        _create_self_signed_jwtN)superr8   __init__copy_source_credentials
isinstancer   Scopedwith_scopesr   
_IAM_SCOPEr   _always_use_jwt_accessr:   r+   _universe_domain_target_principal_target_scopes
_delegates_subject_DEFAULT_TOKEN_LIFETIME_SECS	_lifetimer1   r   utcnowr2   _quota_project_id_iam_endpoint_override_cred_file_path)
selfsource_credentialstarget_principaltarget_scopes	delegatessubjectlifetimequota_project_idr,   	__class__s
            r5   r<   zCredentials.__init__   s    T 	k4)+#'99-?#@  d..0B0BC'+'?'?'K'K(D$ 002KL,,CC((@@F 2 B B!1+#!A%A
oo'!1&;##    c                 "    t         j                  S N)r
   CRED_TYPE_SA_IMPERSONATErO   s    r5   _metric_header_for_usagez$Credentials._metric_header_for_usage   s    ///rX   c                 &    | j                  |       y rZ   )_update_token)rO   r)   s     r5   refreshzCredentials.refresh   s    7#rX   c                 x   | j                   j                  t        j                  j                  k(  s1| j                   j                  t        j                  j
                  k(  r| j                   j                  |       | j                  | j                  t        | j                        dz   d}ddt        j                  t        j                         i}| j                   j                  |       | j                  r| j                   t        j"                  k7  rt%        j&                  d      t)        j*                         }| j,                  t)        j.                  | j                  xs d      | j                  t0        t)        j2                  |      t)        j2                  |      t4        z   d}t7        || j,                  ||| j                        }t9        j:                  |t0        |      \  | _        | _        }y	tA        || j,                  ||| j                   | jB                  
      \  | _        | _        y	)zUpdates credentials with a new access_token representing
        the impersonated account.

        Args:
            request (google.auth.transport.requests.Request): Request object
                to use for refreshing credentials.
        s)rS   scoperU   Content-Typeapplication/jsonzNDomain-wide delegation is not supported in universes other than googleapis.com )issrc   subaudiatexp)r)   r*   r   payloadrS   N)r)   r*   r   r   r+   r,   )"r>   token_stater   
TokenStateSTALEINVALIDr`   rG   rF   strrJ   r
   API_CLIENT_HEADER&token_request_access_token_impersonateapplyrH   r+   r   r   GoogleAuthErrorr   rK   rE   scopes_to_string_GOOGLE_OAUTH2_TOKEN_ENDPOINTdatetime_to_secsrI   _sign_jwt_requestr   	jwt_grantr1   r2   r6   rM   )rO   r)   r   r   nowrl   	assertion_s           r5   r_   zCredentials._update_token   s    $$00K4J4J4P4PP''33{7M7M7U7UU$$,,W5 ((DNN+c1
 .%%w'U'U'W
 	  &&w/ ==##{'J'JJ 00, 
 //#C--!2243F3F3L"M}}40050058TTG *00//I *1):):6	*&DJQ "9,, 00"&"="=#

DKrX   c                 Z   ddl m} t        j                  j	                  t
        j                  | j                        j                  | j                        }t        j                  |      j                  d      | j                  d}ddi} || j                        }	 t        j                          }|D ]  }|j#                  |||      }	|	j$                  t        j&                  v r4|	j$                  t(        j*                  k7  r2t-        j.                  dj                  |	j1                                     t        j2                  |	j1                         d	         c |j5                          S  	 |j5                          t-        j.                  d
      # |j5                          w xY w)Nr   AuthorizedSessionr   )rl   rS   rd   re   )r   r   r   zError calling sign_bytes: {}
signedBlobz#exhausted signBlob endpoint retries)google.auth.transport.requestsr   r   _IAM_SIGN_ENDPOINTr   r   r   r+   r   rE   base64	b64encoder   rG   r>   r   ExponentialBackoffpoststatus_codeIAM_RETRY_CODESr!   r"   r   TransportErrorr   	b64decodeclose)
rO   messager   iam_sign_endpointr   r   authed_sessionretriesr}   r.   s
             r5   
sign_byteszCredentials.sign_bytesH  sj   D22:://1E1E

&''
( 	
 ''077@

 "#56*4+C+CD	#*==?G)..)7 /  ''3+>+>>'';>>9$336==hmmoN  ''(EFF  "    "''(MNN   "s    C F 1F F*c                     | j                   S rZ   rE   r\   s    r5   signer_emailzCredentials.signer_emailj      %%%rX   c                     | j                   S rZ   r   r\   s    r5   service_account_emailz!Credentials.service_account_emailn  r   rX   c                     | S rZ   rf   r\   s    r5   signerzCredentials.signerr  s    rX   c                     | j                    S rZ   )rF   r\   s    r5   requires_scopeszCredentials.requires_scopesv  s    &&&&rX   c                 P    | j                   r| j                   d| j                  dS y )Nzimpersonated credentials)credential_sourcecredential_typer*   )rN   rE   r\   s    r5   get_cred_infozCredentials.get_cred_infoz  s/    %)%9%9#=!33 
 rX   c           	          | j                  | j                  | j                  | j                  | j                  | j
                  | j                  | j                        }| j                  |_        |S )N)rQ   rR   rS   rU   rV   r,   )	rW   r>   rE   rF   rG   rJ   rL   rM   rN   )rO   creds     r5   
_make_copyzCredentials._make_copy  se    ~~$$!33--oo^^!33"&"="=  
  $33rX   c                 4    | j                         }||_        |S rZ   )r   rL   )rO   rV   r   s      r5   with_quota_projectzCredentials.with_quota_project  s     !1rX   c                 <    | j                         }|xs ||_        |S rZ   )r   rF   )rO   scopesdefault_scopesr   s       r5   rA   zCredentials.with_scopes  s      $6rX   rZ   )__name__
__module____qualname____doc__rI   r<   r]   r   copy_docstringr   r8   r`   r_   r   propertyr   r   r   r   r   r   CredentialsWithQuotaProjectr   r@   rA   __classcell__rW   s   @r5   r8   r8   q   s&   ;D -"F$P0 X[445$ 6$F
P OD & & & &   ' ' X[445 6 X[DDE F
 X[//0 1rX   r8   c                        e Zd ZdZ	 	 	 d fd	Zd	dZd Zd Z ej                  e
j                        d        Z ej                  e
j                        d        Z xZS )
IDTokenCredentialszAOpen ID Connect ID Token-based service account credentials.

    c                     t         t        |           t        |t              st        j                  d      || _        || _        || _	        || _
        y)a  
        Args:
            target_credentials (google.auth.Credentials): The target
                credential used as to acquire the id tokens for.
            target_audience (string): Audience to issue the token for.
            include_email (bool): Include email in IdToken
            quota_project_id (Optional[str]):  The project ID used for
                quota and billing.
        z4Provided Credential must be impersonated_credentialsN)r;   r   r<   r?   r8   r   ru   _target_credentials_target_audience_include_emailrL   )rO   target_credentialstarget_audienceinclude_emailrV   rW   s        r5   r<   zIDTokenCredentials.__init__  sV      	 $02,k:,,I  $6  /+!1rX   c                 T    | j                  ||| j                  | j                        S N)r   r   r   rV   )rW   r   rL   )rO   r   r   s      r5   from_credentialsz#IDTokenCredentials.from_credentials  s0    ~~1+--!33	  
 	
rX   c                 h    | j                  | j                  || j                  | j                        S r   )rW   r   r   rL   )rO   r   s     r5   with_target_audiencez'IDTokenCredentials.with_target_audience  s6    ~~#77+--!33	  
 	
rX   c                 h    | j                  | j                  | j                  || j                        S r   )rW   r   r   rL   )rO   r   s     r5   with_include_emailz%IDTokenCredentials.with_include_email  s6    ~~#77 11'!33	  
 	
rX   c                 h    | j                  | j                  | j                  | j                  |      S r   )rW   r   r   r   )rO   rV   s     r5   r   z%IDTokenCredentials.with_quota_project  s6    ~~#77 11---	  
 	
rX   c                    ddl m} t        j                  j	                  t
        j                  | j                  j                        j                  | j                  j                        }| j                  | j                  j                  | j                  d}ddt        j                  t        j                          i} || j                  j"                  |      }	 |j%                  ||t'        j(                  |      j+                  d            }|j-                          |j.                  t0        j2                  k7  r2t5        j6                  d	j                  |j'                                     |j'                         d
   }|| _        t;        j<                  t?        j@                  |d      d         | _!        y # |j-                          w xY w)Nr   r   )audiencerS   includeEmailrd   re   )auth_requestr   )r   r   r   zError getting ID token: {}r1   F)verifyrk   )"r   r   r   _IAM_IDTOKEN_ENDPOINTr   r   r   r   r+   r   r   r   rG   r   r
   rr   "token_request_id_token_impersonater>   r   r   r   r   r   r   r!   r"   r   r#   r1   r   utcfromtimestampr	   r   r2   )	rO   r)   r   r   r   r   r   r.   id_tokens	            r5   r`   zIDTokenCredentials.refresh  s   D55==//$$44
 &))66
7 	 --11<< //
 .%%w'Q'Q'S

 +$$88w
	#%**%ZZ%,,W5 + H   ";>>1)),33HMMOD  ==?7+
//JJx.u5
   "s   6G G)NFNrZ   )r   r   r   r   r<   r   r   r   r   r   r   r   r   r8   r`   r   r   s   @r5   r   r     sv     26


 X[DDE
 F
 X[445)
 6)
rX   r   c                 x   t         j                  j                  |      }|t        j                  |      d}t        j                  |      j                  d      } | |d||      }t        |j                  d      r|j                  j                  d      n|j                  }|j                  t        j                  k7  rt        j                  t        |      	 t        j                  |      }	|	d   }
|
S # t         t"        f$ r1}t        j                  dj                  t              |      }||d}~ww xY w)	a  Makes a request to the Google Cloud IAM service to sign a JWT using a
    service account's system-managed private key.
    Args:
        request (Request): The Request object to use.
        principal (str): The principal to request an access token for.
        headers (Mapping[str, str]): Map of headers to transmit.
        payload (Mapping[str, str]): The JWT payload to sign. Must be a
            serialized JSON object that contains a JWT Claims Set.
        delegates (Sequence[str]): The chained list of delegates required
            to grant the final access_token.  If set, the sequence of
            identities must have "Service Account Token Creator" capability
            granted to the prceeding identity.  For example, if set to
            [serviceAccountB, serviceAccountC], the source_credential
            must have the Token Creator role on serviceAccountB.
            serviceAccountB must have the Token Creator on
            serviceAccountC.
            Finally, C must have Token Creator on target_principal.
            If left unset, source_credential must have that role on
            target_principal.

    Raises:
        google.auth.exceptions.TransportError: Raised if there is an underlying
            HTTP connection error
        google.auth.exceptions.RefreshError: Raised if the impersonated
            credentials are not available.  Common reasons are
            `iamcredentials.googleapis.com` is not enabled or the
            `Service Account Token Creator` is not assigned
    )rS   rl   r   r   r   r   	signedJwtz{}: No signed JWT in response.N)r   _IAM_SIGNJWT_ENDPOINTr   r   r   r   r   r   r   r    r!   r"   r   r#   r$   r%   r'   r(   )r)   r*   r   rl   rS   r-   r   r.   r/   jwt_response
signed_jwtr3   r4   s                r5   ry   ry     s   : ,,33I>L"tzz'/BCD::d""7+D<dSH
 8==(+ 	W%]]  +..(%%nmDD	&zz-0!+.
j! &)),33NC]
 :%	&s   C9 9D9,D44D9)r   r   r=   r   http.clientclientr!   r   google.authr   r   r   r   r   r	   r
   google.oauth2r   r$   rI   rw   r   r6   r@   r   Signingr8   r   ry   rf   rX   r5   <module>r      s       !  ,   # "    ! >#  E   77;&|j??ATATjZ	k
@@ k
\ GI 7&rX   