
    kKjo
                    P    d Z ddlmZ ddlZddlZddlmZ d	dZd
dZd
dZ	ddZ
y)zAuthentication utility helpers.    )annotationsN)Anyc                    | j                  d      }t        |      dk7  rt        d      ||   }|dt        |       dz  z  z  }t        j                  t        j                  |            S )a7  Decode a JWT part (header or payload) without signature verification.

    Args:
        token: JWT token string (header.payload.signature)
        part_index: 0 for header, 1 for payload

    Returns:
        Decoded part as a dictionary

    Raises:
        ValueError: If token is not a valid JWT format
    .   z%Invalid JWT format (expected 3 parts)=   )splitlen
ValueErrorjsonloadsbase64urlsafe_b64decode)token
part_indexpartspart_b64s       g/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastmcp/utilities/auth.py_decode_jwt_partr   
   sg     KKE
5zQ@AAZ HH~)**H::f..x899    c                    t        | d      S )a2  Decode JWT header without signature verification.

    Useful for extracting the key ID (kid) for JWKS lookup.

    Args:
        token: JWT token string (header.payload.signature)

    Returns:
        Decoded header as a dictionary

    Raises:
        ValueError: If token is not a valid JWT format
    r   r   r   s    r   decode_jwt_headerr            E1%%r   c                    t        | d      S )aT  Decode JWT payload without signature verification.

    Use only for tokens received directly from trusted sources (e.g., IdP token endpoints).

    Args:
        token: JWT token string (header.payload.signature)

    Returns:
        Decoded payload as a dictionary

    Raises:
        ValueError: If token is not a valid JWT format
       r   r   s    r   decode_jwt_payloadr   1   r   r   c                   | | dk(  r| dS g S t        | t              rA| D cg c]5  }t        |      j                         st        |      j                         7 c}S t        | t              r| j                         } | sg S | j	                  d      rh	 t        j                  |       }t        |t              rA|D cg c]5  }t        |      j                         st        |      j                         7 c}S 	 | j                  dd      j                         D cg c]#  }|j                         s|j                         % c}S | S c c}w c c}w # t        $ r Y dw xY wc c}w )zParse scopes from environment variables or settings values.

    Accepts either a JSON array string, a comma- or space-separated string,
    a list of strings, or ``None``. Returns a list of scopes or ``None`` if
    no value is provided.
    N [, )

isinstanceliststrstrip
startswithr   r   	Exceptionreplacer
   )valuevdatass       r   parse_scopesr0   B   s.    }}t,",%(-@1QA@@%IC zz%(dD)48KDqCFLLNCFLLNDKK *
 $)==c#:#@#@#BP#Baaggi	#BPPL A L  QsA   EE)E >EE8E E$4E$E 	E! E!)r   r'   r   intreturndict[str, Any])r   r'   r2   r3   )r,   r   r2   zlist[str] | None)__doc__
__future__r   r   r   typingr   r   r   r   r0    r   r   <module>r8      s(    % "   :,&"&"r   