
    &g/#                         d 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	Z
d
ZdZ ej        d          Z G d dej                  ZdS )z'Experimental GDCH credentials support.
    N)_helpers)_service_account_info)credentials)
exceptions)jwt)_clientz/urn:ietf:params:oauth:token-type:token-exchangez-urn:ietf:params:oauth:token-type:access_tokenz.urn:k8s:params:oauth:token-type:serviceaccounti  )secondsc                        e Zd ZdZ fdZd Z ej        ej	                  d             Z
d Zed             Zed             Zed             Z xZS )	ServiceAccountCredentialsa  Credentials for GDCH (`Google Distributed Cloud Hosted`_) for service
    account users.

    .. _Google Distributed Cloud Hosted:
        https://cloud.google.com/blog/topics/hybrid-cloud/            announcing-google-distributed-cloud-edge-and-hosted

    To create a GDCH service account credential, first create a JSON file of
    the following format::

        {
            "type": "gdch_service_account",
            "format_version": "1",
            "project": "<project name>",
            "private_key_id": "<key id>",
            "private_key": "-----BEGIN EC PRIVATE KEY-----
<key bytes>
-----END EC PRIVATE KEY-----
",
            "name": "<service identity name>",
            "ca_cert_path": "<CA cert path>",
            "token_uri": "https://service-identity.<Domain>/authenticate"
        }

    The "format_version" field stands for the format of the JSON file. For now
    it is always "1". The `private_key_id` and `private_key` is used for signing.
    The `ca_cert_path` is used for token server TLS certificate verification.

    After the JSON file is created, set `GOOGLE_APPLICATION_CREDENTIALS` environment
    variable to the JSON file path, then use the following code to create the
    credential::

        import google.auth

        credential, _ = google.auth.default()
        credential = credential.with_gdch_audience("<the audience>")

    We can also create the credential directly::

        from google.oauth import gdch_credentials

        credential = gdch_credentials.ServiceAccountCredentials.from_service_account_file("<the json file path>")
        credential = credential.with_gdch_audience("<the audience>")

    The token is obtained in the following way. This class first creates a
    self signed JWT. It uses the `name` value as the `iss` and `sub` claim, and
    the `token_uri` as the `aud` claim, and signs the JWT with the `private_key`.
    It then sends the JWT to the `token_uri` to exchange a final token for
    `audience`.
    c                     t          t          |                                            || _        || _        || _        || _        || _        || _        dS )af  
        Args:
            signer (google.auth.crypt.Signer): The signer used to sign JWTs.
            service_identity_name (str): The service identity name. It will be
                used as the `iss` and `sub` claim in the self signed JWT.
            project (str): The project.
            audience (str): The audience for the final token.
            token_uri (str): The token server uri.
            ca_cert_path (str): The CA cert path for token server side TLS
                certificate verification. If the token server uses well known
                CA, then this parameter can be `None`.
        N)	superr   __init___signer_service_identity_name_project	_audience
_token_uri_ca_cert_path)selfsignerservice_identity_nameprojectaudience	token_urica_cert_path	__class__s          P/var/www/api/venv/lib/python3.11/site-packages/google/oauth2/gdch_credentials.pyr   z"ServiceAccountCredentials.__init__S   sT     	'..77999&;#!#)    c                 6   t          j                    }|t          z   }d                    | j        | j                  }||| j        t          j        |          t          j        |          d}t          j        t          j
        | j        |                    S )Nzsystem:serviceaccount:{}:{})isssubaudiatexp)r   utcnowJWT_LIFETIMEformatr   r   r   datetime_to_secs
from_bytesr   encoder   )r   nowexpiryiss_sub_valuepayloads        r   _create_jwtz%ServiceAccountCredentials._create_jwtj   s    o|#5<<M46
 

 ! ?,S11,V44
 
 "3:dlG#D#DEEEr   c                 n   dd l }t          ||j        j        j        j                  st          j        d          |                                 }t          | j
        t          |t          d}t          j        || j        |d d| j                  }t          j        |d           \  | _        }| _        }d S )Nr   zeFor GDCH service account credentials, request must be a google.auth.transport.requests.Request object)
grant_typer   requested_token_typesubject_tokensubject_token_typeT)access_tokenuse_jsonverify)google.auth.transport.requests
isinstanceauth	transportrequestsRequestr   RefreshErrorr/   TOKEN_EXCHANGE_TYPEr   ACCESS_TOKEN_TOKEN_TYPESERVICE_ACCOUNT_TOKEN_TYPEr   _token_endpoint_requestr   r   _handle_refresh_grant_responsetokenr,   )r   requestgoogle	jwt_tokenrequest_bodyresponse_data_s          r   refreshz!ServiceAccountCredentials.refresh{   s    ----'6;#8#A#IJJ 	)w  
 $$&&	-$;&"<
 
  7O%
 
 
 )0(N4)
 )
%
At{AAAr   c                 h    |                      | j        | j        | j        || j        | j                  S )zCreate a copy of GDCH credentials with the specified audience.

        Args:
            audience (str): The intended audience for GDCH credentials.
        )r   r   r   r   r   r   )r   r   s     r   with_gdch_audiencez,ServiceAccountCredentials.with_gdch_audience   s8     ~~L'MO
 
 	
r   c                     |d         dk    rt          d           | ||d         |d         d|d         |                    dd                    S )	a  Creates a Credentials instance from a signer and service account
        info.

        Args:
            signer (google.auth.crypt.Signer): The signer used to sign JWTs.
            info (Mapping[str, str]): The service account info.

        Returns:
            google.oauth2.gdch_credentials.ServiceAccountCredentials: The constructed
                credentials.

        Raises:
            ValueError: If the info is not in the expected format.
        format_version1z"Only format version 1 is supportednamer   Nr   r   )
ValueErrorget)clsr   infos      r   _from_signer_and_infoz/ServiceAccountCredentials._from_signer_and_info   se       !S((ABBBsLOHH^T**
 
 	
r   c                 `    t          j        |g dd          }|                     ||          S )a  Creates a Credentials instance from parsed service account info.

        Args:
            info (Mapping[str, str]): The service account info in Google
                format.
            kwargs: Additional arguments to pass to the constructor.

        Returns:
            google.oauth2.gdch_credentials.ServiceAccountCredentials: The constructed
                credentials.

        Raises:
            ValueError: If the info is not in the expected format.
        rO   private_key_idprivate_keyrQ   r   r   Frequireuse_rsa_signer)r   	from_dictrV   )rT   rU   r   s      r   from_service_account_infoz3ServiceAccountCredentials.from_service_account_info   sJ      '0   !
 
 
 ((666r   c                 f    t          j        |g dd          \  }}|                     ||          S )ai  Creates a Credentials instance from a service account json file.

        Args:
            filename (str): The path to the service account json file.
            kwargs: Additional arguments to pass to the constructor.

        Returns:
            google.oauth2.gdch_credentials.ServiceAccountCredentials: The constructed
                credentials.
        rX   Fr[   )r   from_filenamerV   )rT   filenamerU   r   s       r   from_service_account_filez3ServiceAccountCredentials.from_service_account_file   sN     -:   !
 
 
f ((666r   )__name__
__module____qualname____doc__r   r/   r   copy_docstringr   CredentialsrK   rM   classmethodrV   r_   rc   __classcell__)r   s   @r   r   r   "   s        . .`* * * * *.F F F" X[455
 
 65
<
 
 
 
 
 [
6 7 7 [7: 7 7 [7 7 7 7 7r   r   )rg   datetimegoogle.authr   r   r   r   r   google.oauth2r   r?   r@   rA   	timedeltar&   ri   r    r   r   <module>rq      s                  - - - - - - # # # # # # " " " " " "       ! ! ! ! ! ! H I M !x!$///Y7 Y7 Y7 Y7 Y7 7 Y7 Y7 Y7 Y7 Y7r   