
    3j                     2   S r SSKrSSKJr  SSKJr  SSKJr  SSKJ	r	J
r
  SrS	r " S
 S\\5      rS\S-  4S jrS\S\4S jrSSS.S\\-  S-  S\S-  S\4S jjrSS.S\S\S\S-  S\4S jjrSSSSS.S\S\S-  S\\-  S-  S\S-  S\S-  S\4S jjrg)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                       \ rS rSrSrSrSrg)Provider(   zRCI providers that can mint an OIDC id token natively. GitHub Actions only for now.github N)__name__
__module____qualname____firstlineno____doc__GITHUB__static_attributes__r       O/home/wildlama/miniconda3/lib/python3.13/site-packages/huggingface_hub/_oidc.pyr
   r
   (   s
    \Fr   r
   returnc                  j    [         R                  R                  S5      S:X  a  [        R                  $ g)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                 ,   [         R                  R                  S5      n[         R                  R                  S5      nU(       a  U(       d  [        S5      e[	        5       R                  USU 0SSU 30S9n[        U5        UR                  5       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                    U=(       d    [         R                  nU =(       d
    [        5       n SR                  S [         5       5      nU c  [        SU S35      eU [        R                  :X  a  [        U5      $ [        SU  SU S35      e)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   8   #    U  H  oR                   v   M     g 7f)N)r&   ).0ps     r   	<genexpr>!get_oidc_token.<locals>.<genexpr>[   s     48a''8s   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_tokenr9   L   s     -9--H,?,H		4844Iijsittuvww8??"%h//
z9\]f\gghi
jjr   )endpointsubject_tokenresourcer:   c                     [        5       R                  U=(       d    [        R                   S3[        [
        U US.S9n[        U5        UR                  5       $ )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_typer;   r<   )r'   )r   postr   r5   _TOKEN_EXCHANGE_GRANT_TYPE_ID_TOKEN_TYPEr   r'   )r;   r<   r:   r*   s       r   exchange_oidc_tokenrC   c   sX    " }!!)y))
*,74"0* 	
 " H !==?r   )r;   r-   r   r:   c                 r    U=(       d    [         R                  nUc  [        X#=(       d    US9n[        XUS9$ )uj  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,   )r;   r<   r:   )r   r5   r9   rC   )r<   r;   r-   r   r:   s        r   
oidc_loginrE      s7    > -9--H&CWxX]X`aar   )r   r   enumr    r   errorsr   utilsr   r   rA   rB   strr
   r   r+   r9   dictrC   rE   r   r   r   <module>rL      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   