o
    b                     @   s   d dl Z d dlZd dlZd dlmZmZmZmZmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZ dd	lmZ G d
d deZdd Zdd ZdS )    N)
text_typesto_bytes
to_unicode
json_loads
json_dumps   )	JWTClaims   )DecodeErrorInsecureClaimError)JsonWebSignature)JsonWebEncryption)KeySetc                   @   sR   e Zd ZdZedg dejZdddZ	dd Z
dd
dZ		dddZdS )JsonWebToken)passwordtokensecretZ
secret_key|)z1\b(?:3[47]\d|(?:4\d|5[1-5]|65)\d{2}|6011)\d{12}\bzB-----BEGIN[A-Z ]+PRIVATE KEY-----.+-----END[A-Z ]+PRIVATE KEY-----z3^\b(?!(000|666|9))\d{3}-(?!00)\d{2}-(?!0000)\d{4}\bNc                 C   s    t ||d| _t||d| _d S )N)private_headers)r   _jwsr   _jwe)selfZ
algorithmsr    r   W/var/www/secure340b-portal/env/lib/python3.10/site-packages/authlib/jose/rfc7519/jwt.py__init__   s   zJsonWebToken.__init__c                 C   sF   |D ]}|| j v rt||| }t|tr | j|r t|qdS )z0Check if payload contains sensitive information.N)SENSITIVE_NAMESr   
isinstancer   SENSITIVE_VALUESsearch)r   payloadkvr   r   r   check_sensitive_data   s   
z!JsonWebToken.check_sensitive_dataTc                 C   s   d|d< dD ]}| |}t|tjrt| ||< q|r$| | t||}t|r2|||}t	t
|}d|v rD| j|||S | j|||S )a  Encode a JWT with the given header, payload and key.

        :param header: A dict of JWS header
        :param payload: A dict to be encoded
        :param key: key used to sign the signature
        :param check: check if sensitive data in payload
        :return: bytes
        ZJWTtyp)expZiatZnbfenc)getr   datetimecalendartimegmutctimetupler"   prepare_raw_keycallabler   r   r   Zserialize_compactr   )r   headerr   keycheckr    Zclaimtextr   r   r   encode+   s   	



zJsonWebToken.encodec           	         s~   |du rt } fdd}t|}|d}|dkr"| j||t}n|dkr/| j||t}ntd||d |d	 ||d
S )a  Decode the JWS with the given key. This is similar with
        :meth:`verify`, except that it will raise BadSignatureError when
        signature doesn't match.

        :param s: text of JWT
        :param key: key used to verify the signature
        :param claims_cls: class to be used for JWT claims
        :param claims_options: `options` parameters for claims_cls
        :param claims_params: `params` parameters for claims_cls
        :return: claims_cls instance
        :raise: BadSignatureError
        Nc                    s    t  | }t|r|| |S |S )N)r+   r,   )r-   r   Zkey_funcr.   r   r   load_keyZ   s   

z%JsonWebToken.decode.<locals>.load_key   .r	      zInvalid input segments lengthr   r-   )optionsparams)r   r   countr   Zdeserialize_compactdecode_payloadr   r
   )	r   sr.   Z
claims_clsZclaims_optionsZclaims_paramsr3   	dot_countdatar   r2   r   decodeI   s   
zJsonWebToken.decode)NN)T)NNN)__name__
__module____qualname__r   recompilejoinDOTALLr   r   r"   r1   r=   r   r   r   r   r      s    
	
r   c                 C   s>   zt t| }W n ty   tdw t|tstd|S )NzInvalid payload valuezInvalid payload type)r   r   
ValueErrorr
   r   dict)Zbytes_payloadr   r   r   r   r9   o   s   
r9   c                 C   s   t | tr| |dS t | tr!| dr!| dr!t| } nt | tt	fr,d| i} t | t
rRd| v rR| d }|d}|D ]}|d|krM|  S q@td| S )Nkid{}keyszInvalid JSON Web Key Set)r   r   Zfind_by_kidr&   r   
startswithendswithr   tuplelistrF   rE   )rawheadersrJ   rG   r    r   r   r   r+   y   s&   



r+   )rA   r'   r(   Zauthlib.common.encodingr   r   r   r   r   Zclaimsr   errorsr
   r   Zrfc7515r   Zrfc7516r   Zrfc7517r   objectr   r9   r+   r   r   r   r   <module>   s    `
