o
    }l~i                     @   s   d Z ddlmZmZ ddlZddlmZmZmZ ddlmZm	Z	m
Z
 ddlmZ dZdefd	d
Zddedeeef fddZG dd dZG dd dZdS )zFirebase App Check module.    )AnyDictN)PyJWKClientExpiredSignatureErrorInvalidTokenError)InvalidAudienceErrorInvalidIssuerErrorInvalidSignatureError)_utils
_app_checkreturnc                 C   s   t | ttS N)r
   get_app_service_APP_CHECK_ATTRIBUTE_AppCheckService)app r   _/var/www/newdalilibackend/backend/venv/lib/python3.10/site-packages/firebase_admin/app_check.py_get_app_check_service   s   r   tokenc                 C   s   t || S )aX  Verifies a Firebase App Check token.

    Args:
        token: A token from App Check.
        app: An App instance (optional).

    Returns:
        Dict[str, Any]: The token's decoded claims.

    Raises:
        ValueError: If the app's ``project_id`` is invalid or unspecified,
        or if the token's headers or payload are invalid.
    )r   verify_token)r   r   r   r   r   r      s   r   c                   @   sj   e Zd ZdZdZdZdZdZdZdd Z	de
dee
ef fd	d
ZdeddfddZde
de
fddZdS )r   z?Service class that implements Firebase App Check functionality.z(https://firebaseappcheck.googleapis.com/z/https://firebaseappcheck.googleapis.com/v1/jwksNc                 C   s6   |j | _| jstdd|j  | _t| jdd| _d S )NzA project ID must be specified to access the App Check service. Either set the projectId option, use service account credentials, or set the GOOGLE_CLOUD_PROJECT environment variable.z	projects/i`T  )lifespan)
project_id_project_id
ValueError_scoped_project_idr   	_JWKS_URL_jwks_client)selfr   r   r   r   __init__5   s   z_AppCheckService.__init__r   r   c                 C   sH   t d| | j|}| t| | ||j}|	d|d< |S )z$Verifies a Firebase App Check token.zapp check tokensubapp_id)
_Validatorscheck_stringr   get_signing_key_from_jwt_has_valid_token_headersjwtget_unverified_header_decode_and_verifykeyget)r   r   signing_keyverified_claimsr   r   r   r   C   s   z_AppCheckService.verify_tokenheadersc                 C   s<   | ddkrtd| d}|dkrtd| ddS )	z9Checks whether the token has valid headers for App Check.typJWTz9The provided App Check token has an incorrect type headeralgRS256zQThe provided App Check token has an incorrect alg header. Expected RS256 but got .N)r*   r   )r   r-   	algorithmr   r   r   r%   Q   s   
z)_AppCheckService._has_valid_token_headersr+   c              
   C   s   i }zt j||dg| jd}W nD ty   td ty)   td| j d ty7   td| j  tyA   td t	yS } ztd| d	}~ww |
d
}t|trc| j|vrgtd|
d| jsttdtd|
d |S )z.Decodes and verifies the token from App Check.r1   )
algorithmsaudiencez6The provided App Check token has an invalid signature.zbThe provided App Check token has an incorrect "aud" (audience) claim. Expected payload to include r2   z^The provided App Check token has an incorrect "iss" (issuer) claim. Expected claim to include z)The provided App Check token has expired.z(Decoding App Check token failed. Error: Naudz>Firebase App Check token has incorrect "aud" (audience) claim.issz2Token does not contain the correct "iss" (issuer).z2The provided App Check token "sub" (subject) claimr    )r&   decoder   r	   r   r   r   _APP_CHECK_ISSUERr   r   r*   
isinstancelist
startswithr"   r#   )r   r   r+   payload	exceptionr5   r   r   r   r(   ^   sX   

z#_AppCheckService._decode_and_verify)__name__
__module____qualname____doc__r9   r   r   r   r   r   strr   r   r   r%   r(   r   r   r   r   r   ,   s    r   c                   @   s&   e Zd ZdZededefddZdS )r"   zA collection of data validation utilities.

    Methods provided in this class raise ``ValueErrors`` if any validations fail.
    labelvaluec                 C   s6   |du rt d||t|tst d||dS )z&Checks if the given value is a string.Nz%{0} "{1}" must be a non-empty string.z{0} "{1}" must be a string.)r   formatr:   rC   )clsrD   rE   r   r   r   r#      s
   
z_Validators.check_stringN)r?   r@   rA   rB   classmethodrC   r   r#   r   r   r   r   r"      s    r"   r   )rB   typingr   r   r&   r   r   r   r   r   r	   firebase_adminr
   r   r   rC   r   r   r"   r   r   r   r   <module>   s   ^