
    -:j                     "   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	m
Z
 dZd	Z G d
 dee      Zdedz  fdZdedefdZddddeez  dz  dedz  defdZdddedededz  defdZddddddededz  deez  dz  dedz  dedz  defdZy)u  Keyless CI/CD authentication via OIDC token exchange ("Trusted Publishers").

A CI job proves its identity to the Hub with a short-lived OIDC id token minted by its CI
provider (e.g. GitHub Actions), then exchanges it at ``POST {ENDPOINT}/oauth/token`` (RFC 8693)
for a short-lived Hugging Face token — no long-lived ``HF_TOKEN`` secret to store.

This module is self-contained: it only handles minting the provider id token and the exchange.
It deliberately does not register a public API or a CLI verb; the integration point is the token
resolution in ``utils/_auth.py`` (see ``_get_token_from_oidc``).

Docs: https://huggingface.co/docs/hub/trusted-publishers
    N)Enum   )	constants)	OIDCError)get_sessionhf_raise_for_statusz/urn:ietf:params:oauth:grant-type:token-exchangez)urn:ietf:params:oauth:token-type:id_tokenc                       e Zd ZdZdZy)ProviderzRCI providers that can mint an OIDC id token natively. GitHub Actions only for now.githubN)__name__
__module____qualname____doc__GITHUB     W/var/www/html/tokenscope/api/venv/lib/python3.12/site-packages/huggingface_hub/_oidc.pyr
   r
   (   s
    \Fr   r
   returnc                  h    t         j                  j                  d      dk(  rt        j                  S y)zYDetect the CI provider able to mint an OIDC id token, or `None` if not in a supported CI.GITHUB_ACTIONStrueN)osenvirongetr
   r   r   r   r   detect_providerr   .   s%    	zz~~&'61r   audiencec                    t         j                  j                  d      }t         j                  j                  d      }|r|st        d      t	               j                  |d| idd| i      }t        |       |j                         d   S )	zMint an OIDC id token from the GitHub Actions runtime.

    Relies on the `ACTIONS_ID_TOKEN_REQUEST_URL` / `ACTIONS_ID_TOKEN_REQUEST_TOKEN` env vars,
    which GitHub only injects when the job declares `permissions: id-token: write`.
    ACTIONS_ID_TOKEN_REQUEST_URLACTIONS_ID_TOKEN_REQUEST_TOKENzCannot request an OIDC id token from GitHub Actions. Make sure the workflow job sets `permissions: id-token: write`. See https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connectr   AuthorizationzBearer )paramsheadersvalue)r   r   r   r   r   r   json)r   request_urlrequest_tokenresponses       r   _get_github_oidc_tokenr(   5   s     **..!?@KJJNN#CDMmM
 	

 }  H% GM?";< ! H
 !==?7##r   providerr   r*   c                     |xs t         j                  }| xs
 t               } dj                  d t        D              }| t        d| d      | t        j                  k(  rt        |      S t        d|  d| d      )a  Mint a raw OIDC id token (JWT) from the current CI provider.

    Args:
        provider (`str`, *optional*):
            CI provider to use. Auto-detected from the environment when omitted.
        audience (`str`, *optional*):
            The `aud` claim to request. Defaults to `constants.ENDPOINT` so it matches the endpoint
            that validates it (respects `HF_ENDPOINT`/staging).

    Returns:
        `str`: The raw id token (JWT) to pass to [`exchange_oidc_token`].
    z, c              3   4   K   | ]  }|j                     y w)N)r#   ).0ps     r   	<genexpr>z!get_oidc_token.<locals>.<genexpr>[   s     4a!''4s   zONo supported CI OIDC provider detected. Trusted Publishers currently supports: .zOIDC provider 'z#' is not supported yet. Supported: )	r   ENDPOINTr   joinr
   r   r   r(   NotImplementedError)r*   r   	supporteds      r   get_oidc_tokenr5   L   s     -9--H,?,H		4844Iijsittuvww8??"%h//
z9\]f\gghi
jjr   )endpointsubject_tokenresourcer6   c                     t               j                  |xs t        j                   dt        t
        | |d      }t        |       |j                         S )u  Exchange a CI OIDC id token for a short-lived Hugging Face token (RFC 8693).

    Args:
        subject_token (`str`):
            The raw OIDC id token (JWT) from the CI provider. Its `aud` claim must be the Hub URL.
        resource (`str`):
            What to scope the token to: a Hub repo (`namespace/name`, `datasets/namespace/name`,
            `spaces/namespace/name`, `kernels/namespace/name`) for a write token, or a bare Hub
            username for a read-only `gated-repos` token.
        endpoint (`str`, *optional*):
            Hub endpoint. Defaults to `constants.ENDPOINT` (respects `HF_ENDPOINT`/staging).

    Returns:
        `dict`: The token-exchange response, e.g.
        `{"access_token": "hf_jwt_…", "token_type": "bearer", "expires_in": 3600, ...}`.
    z/oauth/token)
grant_typesubject_token_typer7   r8   )r$   )r   postr   r1   _TOKEN_EXCHANGE_GRANT_TYPE_ID_TOKEN_TYPEr   r$   )r7   r8   r6   r'   s       r   exchange_oidc_tokenr?   c   sX    " }!!)y))
*,74"0* 	
 " H !==?r   )r7   r*   r   r6   c                 l    |xs t         j                  }|t        ||xs |      }t        || |      S )u  Mint a CI OIDC id token and exchange it for a Hugging Face token.

    Convenience wrapper around [`get_oidc_token`] + [`exchange_oidc_token`]. Returns the raw
    exchange response (it does not persist anything — the caller decides what to do with the token).

    Args:
        resource (`str`):
            Repo or username to scope the token to. See [`exchange_oidc_token`].
        subject_token (`str`, *optional*):
            A pre-minted OIDC id token to exchange directly. Use this for CI providers not yet
            supported natively (e.g. GitLab): mint the id token in your job and pass it here. When
            omitted, the token is minted from the detected `provider`.
        provider (`str`, *optional*):
            CI provider. Auto-detected when omitted. Ignored when `subject_token` is provided.
        audience (`str`, *optional*):
            The `aud` claim to request. Defaults to the resolved `endpoint`, so it matches the
            endpoint that validates it.
        endpoint (`str`, *optional*):
            Hub endpoint. Defaults to `constants.ENDPOINT`.

    Returns:
        `dict`: The token-exchange response (`access_token`, `token_type`, `expires_in`, ...).
    r)   )r7   r8   r6   )r   r1   r5   r?   )r8   r7   r*   r   r6   s        r   
oidc_loginrA      s;    > -9--H&8CWxX]XX`aar   )r   r   enumr    r   errorsr   utilsr   r   r=   r>   strr
   r   r(   r5   dictr?   rA   r   r   r   <module>rH      s%   
    3 O <sD D $S $S $. 9=UY k3 5 kd
 k^a k. VZ #  d
 ^b B !%&*"b"b :"b nt#	"b
 Dj"b Dj"b 
"br   