U
    %FZhM                     @   s  d Z ddlZddlZddl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
ZddlZddlZddlmZ ddlmZ dd	lmZ d
ZdZdZdZeejdd Zeejdd Zeejdd ZdZedddddddddddd d!d"d#d$gZd%Zd&Z d'Z!d(Z"G d)d* d*ej#j$j%Z&G d+d, d,Z'G d-d. d.Z(G d/d0 d0e	j)Z*G d1d2 d2Z+G d3d4 d4Z,G d5d6 d6ej-Z.G d7d8 d8ej-Z/G d9d: d:ej0Z1G d;d< d<ej0Z2G d=d> d>ej3Z4G d?d@ d@e4Z5G dAdB dBe4Z6dS )Cz1Firebase token minting and validation sub module.    N)credentials)iam)jwt)	transport)
exceptions)_auth_utils)_http_clientzhttps://securetoken.google.com/zXhttps://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.comz$https://session.firebase.google.com/zEhttps://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys   )minutes   )days   )hourszYhttps://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkitZacrZamrZat_hashaudZ	auth_timeZazpZcnfZc_hashexpZfirebaseiatissZjtiZnbfnoncesubzZhttp://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/emailRS256nonez"firebase-auth-emulator@example.comc                   @   s    e Zd ZdZdd Zdd ZdS )_EmulatedSignerNc                 C   s   d S N selfr   r   `/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/firebase_admin/_token_gen.py__init__B   s    z_EmulatedSigner.__init__c                 C   s   dS )N    r   r   messager   r   r   signE   s    z_EmulatedSigner.sign)__name__
__module____qualname__Zkey_idr   r!   r   r   r   r   r   ?   s   r   c                   @   sd   e Zd ZdZefddZedd Zedd Zedd	 Z	e
d
d Ze
dd Ze
dd ZdS )_SigningProviderz2Stores a reference to a google.auth.crypto.Signer.c                 C   s   || _ || _|| _d S r   )_signer_signer_email_alg)r   signersigner_emailalgr   r   r   r   L   s    z_SigningProvider.__init__c                 C   s   | j S r   )r&   r   r   r   r   r)   Q   s    z_SigningProvider.signerc                 C   s   | j S r   )r'   r   r   r   r   r*   U   s    z_SigningProvider.signer_emailc                 C   s   | j S r   )r(   r   r   r   r   r+   Y   s    z_SigningProvider.algc                 C   s   t |j|jS r   )r%   r)   r*   )clsgoogle_credr   r   r   from_credential]   s    z _SigningProvider.from_credentialc                 C   s   t |||}t||S r   )r   Signerr%   )r,   requestr-   service_accountr)   r   r   r   from_iama   s    z_SigningProvider.from_iamc                 C   s   t t ttS r   )r%   r   AUTH_EMULATOR_EMAILALGORITHM_NONE)r,   r   r   r   for_emulatorf   s    z_SigningProvider.for_emulatorN)r"   r#   r$   __doc__ALGORITHM_RS256r   propertyr)   r*   r+   classmethodr.   r2   r5   r   r   r   r   r%   I   s   




r%   c                   @   sD   e Zd ZdZdZdddZdd Zedd	 Zdd
dZ	dd Z
dS )TokenGeneratorz,Generates custom tokens and session cookies.z)https://identitytoolkit.googleapis.com/v1Nc                 C   s<   || _ || _tj | _|p | j}d||j| _	d | _
d S )Nz{0}/projects/{1})apphttp_clientr   requestsRequestr0   ID_TOOLKIT_URLformat
project_idbase_url_signing_provider)r   r;   r<   Zurl_overrideZ
url_prefixr   r   r   r   p   s    
zTokenGenerator.__init__c                 C   s   t  rt S | jj }t|tj	j
jr6t|S | jjd}|rXt| j||S t|tjrnt|S | jtddid}|jdkrtd|j |j }t| j||S )zPInitializes a signing provider by following the go/firebase-admin-sign protocol.ZserviceAccountIdzMetadata-FlavorZGoogle)urlheaders   z2Failed to contact the local metadata service: {0}.)r   is_emulatedr%   r5   r;   Z
credentialget_credential
isinstancegoogleoauth2r1   Credentialsr.   optionsgetr2   r0   r   ZSigningMETADATA_SERVICE_URLstatus
ValueErrorr@   datadecode)r   r-   r1   respr   r   r   _init_signing_providerx   s"    



z%TokenGenerator._init_signing_providerc              
   C   sR   | j sLz|  | _ W n6 tk
rJ } zd}td||W 5 d}~X Y nX | j S )z@Initializes and returns the SigningProvider instance to be used.z@https://firebase.google.com/docs/auth/admin/create-custom-tokenszFailed to determine service account: {0}. Make sure to initialize the SDK with service account credentials or specify a service account ID with iam.serviceAccounts.signBlob permission. Please refer to {1} for more details on creating custom tokens.N)rC   rU   	ExceptionrQ   r@   )r   errorrD   r   r   r   signing_provider   s     zTokenGenerator.signing_providerc              
   C   s0  |dk	rdt |tstdt| t@ }|rdt|dkrLdd|}ndd|}t||r~t |t	r~t|dkrtd| j
}tt }|j|jt|||t d	}|r||d
< |dk	r||d< d|ji}	ztj|j||	dW S  tjjjk
r* }
 zd|
}t||
W 5 d}
~
X Y nX dS )z.Builds and signs a Firebase custom auth token.Nz%developer_claims must be a dictionaryr   z:Developer claims {0} are reserved and cannot be specified.z, z8Developer claim {0} is reserved and cannot be specified.   z2uid must be a string between 1 and 128 characters.)r   r   r   uidr   r   	tenant_idZclaimsr+   )headerz Failed to sign custom token. {0})rI   dictrQ   setkeysRESERVED_CLAIMSlenr@   joinstrrX   inttimer*   FIREBASE_AUDIENCEMAX_TOKEN_LIFETIME_SECONDSr+   r   encoder)   rJ   authr   TransportErrorTokenSignError)r   rZ   Zdeveloper_claimsr[   Zdisallowed_keyserror_messagerX   nowpayloadr\   rW   msgr   r   r   create_custom_token   sD    


z"TokenGenerator.create_custom_tokenc              
   C   s.  t |tr|dn|}t |tr&|s4td|t |tjrLt|	 }t |t
s`t |tsntd||tk rtd|t|tkrtd|td| j}||d}z| jjd||d	\}}W n0 tjjk
r } zt|W 5 d
}~X Y n,X |r|ds tjd|d|dS d
S )z4Creates a session cookie from the provided ID token.utf-8zDIllegal ID token provided: {0}. ID token must be a non-empty string.zIllegal expiry duration: {0}.zDIllegal expiry duration: {0}. Duration must be at least {1} seconds.zCIllegal expiry duration: {0}. Duration must be at most {1} seconds.z{0}:createSessionCookie)ZidTokenZvalidDurationpost)jsonNZsessionCookiez Failed to create session cookie.)http_response)rI   bytesrS   rc   rQ   r@   datetime	timedeltard   total_secondsbool#MIN_SESSION_COOKIE_DURATION_SECONDS#MAX_SESSION_COOKIE_DURATION_SECONDSrB   r<   Zbody_and_responser=   r   RequestExceptionr   Zhandle_auth_backend_errorrN   ZUnexpectedResponseError)r   id_tokenZ
expires_inrD   rn   bodyZ	http_resprW   r   r   r   create_session_cookie   sF       z$TokenGenerator.create_session_cookie)N)NN)r"   r#   r$   r6   r?   r   rU   r8   rX   rp   r   r   r   r   r   r:   k   s   


-r:   c                   @   s<   e Zd ZdZdddZedd Zedd Zdd
dZdS )CertificateFetchRequestzyA google-auth transport that supports HTTP cache-control.

    Also injects a timeout to each outgoing HTTP request.
    Nc                 C   s*   t t | _tj| j| _|| _	d S r   )
cachecontrolCacheControlr=   Session_sessionr   r>   session	_delegate_timeout_seconds)r   timeout_secondsr   r   r   r      s    z CertificateFetchRequest.__init__c                 C   s   | j S r   )r   r   r   r   r   r      s    zCertificateFetchRequest.sessionc                 C   s   | j S r   )r   r   r   r   r   r     s    z'CertificateFetchRequest.timeout_secondsGETc                 K   s&   |p| j }| j|f||||d|S )N)methodr~   rE   timeout)r   r   )r   rD   r   r~   rE   r   kwargsr   r   r   __call__  s    
   z CertificateFetchRequest.__call__)N)r   NNN)	r"   r#   r$   r6   r   r8   r   r   r   r   r   r   r   r      s   


r   c                   @   s,   e Zd ZdZdd Zd
ddZdddZd	S )TokenVerifierz'Verifies ID tokens and session cookies.c              
   C   sX   |j dtj}t|| _t|jdddtt	t
jtd| _t|jdddttttd| _d S )NZhttpTimeoutzID tokenzverify_id_token()z<https://firebase.google.com/docs/auth/admin/verify-id-tokens)rA   
short_name	operationdoc_urlcert_urlissuerinvalid_token_errorexpired_token_errorzsession cookiezverify_session_cookie())rM   rN   r   ZDEFAULT_TIMEOUT_SECONDSr   r0   _JWTVerifierrA   ID_TOKEN_CERT_URIID_TOKEN_ISSUER_PREFIXr   InvalidIdTokenErrorExpiredIdTokenErrorid_token_verifierCOOKIE_CERT_URICOOKIE_ISSUER_PREFIXInvalidSessionCookieErrorExpiredSessionCookieErrorcookie_verifier)r   r;   r   r   r   r   r     s,    
  zTokenVerifier.__init__r   c                 C   s   | j || j|S r   )r   verifyr0   )r   r}   clock_skew_secondsr   r   r   verify_id_token$  s    zTokenVerifier.verify_id_tokenc                 C   s   | j || j|S r   )r   r   r0   )r   cookier   r   r   r   verify_session_cookie'  s    z#TokenVerifier.verify_session_cookieN)r   )r   )r"   r#   r$   r6   r   r   r   r   r   r   r   r     s   
r   c                   @   s*   e Zd ZdZdd Zd
ddZdd Zd	S )r   z6Verifies Firebase JWTs (ID tokens or session cookies).c                 K   s   | d| _| d| _| d| _| d| _| d| _| d| _| jd  dkrjd	| j| _	nd
| j| _	| d| _
| d| _d S )NrA   r   r   r   r   r   r   Zaeiouzan {0}za {0}r   r   )poprA   r   r   rD   r   r   lowerr@   articled_short_name_invalid_token_error_expired_token_error)r   r   r   r   r   r   .  s    z_JWTVerifier.__init__r   c              
   C   s  t |tr|dn|}t |tr&|s8td| j|| jsNtd| j|dk s^|dkrltd|| 	|\}}|
d}|
d}|
d	}| j| j }	d
| j}
d| j| j}t }d}|tkrd| j| j}n.|sL|
dsL|
ddkr>|
ddkr>d|
di kr>d| j| j}nd| j}n|sz|
ddkrzd| j|
d|}n|| jkrd| j| j||
|}nx||	krd| j|	||
|}nX|dkst |tsd| j|}n2|sd| j|}nt|dkrd| j|}|r&| |z:|r4|}ntjjj||| j| j|d}|d	 |d< |W S  tjjjk
r } ztt||dW 5 d}~X Y nV tk
r } z6d t|kr| jt||d| jt||dW 5 d}~X Y nX dS )!z5Verifies the signature and data for the provided JWT.rq   z:Illegal {0} provided: {1}. {0} must be a non-empty string.a  Failed to ascertain project ID from the credential or the environment. Project ID is required to call {0}. Initialize the app with a credentials.Certificate or set your Firebase project ID as an app option. Alternatively set the GOOGLE_CLOUD_PROJECT environment variable.r   <   zKIllegal clock_skew_seconds value: {0}. Must be between 0 and 60, inclusive.r   r   r   zlMake sure the {0} comes from the same Firebase project as the service account used to authenticate this SDK.z+See {0} for details on how to retrieve {1}.Nz.{0} expects {1}, but was given a custom token.kidr+   ZHS256vrZ   dz5{0} expects {1}, but was given a legacy custom token.z Firebase {0} has no "kid" claim.r   zIFirebase {0} has incorrect algorithm. Expected "RS256" but got "{1}". {2}zXFirebase {0} has incorrect "aud" (audience) claim. Expected "{1}" but got "{2}". {3} {4}zVFirebase {0} has incorrect "iss" (issuer) claim. Expected "{1}" but got "{2}". {3} {4}z.Firebase {0} has no "sub" (subject) claim. {1}z;Firebase {0} has an empty string "sub" (subject) claim. {1}rY   zHFirebase {0} has a "sub" (subject) claim longer than 128 characters. {1})r0   audienceZ	certs_urlZclock_skew_in_secondscausezToken expired)rI   rc   rh   ru   rQ   r@   r   rA   r   _decode_unverifiedrN   r   rD   r   rG   rf   r   ra   r   rJ   rK   r}   Zverify_tokenr   ri   r   rj   CertificateFetchErrorr   )r   tokenr0   r   r\   rn   r   r   subjectZexpected_issuerZproject_id_match_msgZverify_id_token_msgZemulatedrl   Zverified_claimsrW   r   r   r   r   <  s     


       
      
 z_JWTVerifier.verifyc              
   C   s\   z"t |}t j|dd}||fW S  tk
rV } z| jt||dW 5 d }~X Y nX d S )NF)r   r   )r   decode_headerrS   rQ   r   rc   )r   r   r\   rn   rW   r   r   r   r     s    

z_JWTVerifier._decode_unverifiedN)r   )r"   r#   r$   r6   r   r   r   r   r   r   r   r   +  s   
`r   c                   @   s   e Zd ZdZdd ZdS )rk   z7Unexpected error while signing a Firebase custom token.c                 C   s   t j| || d S r   r   UnknownErrorr   r   r    r   r   r   r   r     s    zTokenSignError.__init__Nr"   r#   r$   r6   r   r   r   r   r   rk     s   rk   c                   @   s   e Zd ZdZdd ZdS )r   zHFailed to fetch some public key certificates required to verify a token.c                 C   s   t j| || d S r   r   r   r   r   r   r     s    zCertificateFetchError.__init__Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdd ZdS )r   z!The provided ID token is expired.c                 C   s   t j| || d S r   r   r   r   r   r   r   r   r     s    zExpiredIdTokenError.__init__Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdd ZdS )RevokedIdTokenErrorz'The provided ID token has been revoked.c                 C   s   t j| | d S r   r   r   r   r   r   r     s    zRevokedIdTokenError.__init__Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdddZdS )r   z;The provided string is not a valid Firebase session cookie.Nc                 C   s   t j| || d S r   )r   InvalidArgumentErrorr   r   r   r   r   r     s    z"InvalidSessionCookieError.__init__)Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdd ZdS )r   z'The provided session cookie is expired.c                 C   s   t | || d S r   r   r   r   r   r   r   r     s    z"ExpiredSessionCookieError.__init__Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdd ZdS )RevokedSessionCookieErrorz-The provided session cookie has been revoked.c                 C   s   t | | d S r   r   r   r   r   r   r     s    z"RevokedSessionCookieError.__init__Nr   r   r   r   r   r     s   r   )7r6   rv   re   r   r=   Zgoogle.authr   r   r   r   Zgoogle.auth.exceptionsrJ   Zgoogle.oauth2.id_tokenZgoogle.oauth2.service_accountZfirebase_adminr   r   r   r   r   r   r   rd   rw   rx   rz   r{   rg   rf   r^   r`   rO   r7   r4   r3   ri   Zcryptr/   r   r%   r:   r>   r   r   r   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   <module>   st                 
" 
z