U
    d'                     @   s   d dl m Z  d dl mZ d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d d	lm
Z
 d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ G dd deZe ZdS )    )datetime)	timedelta)timezone)JSONEncoder)Iterable)List)Optional)Sequence)Type)Union)current_app)requires_cryptography)get_json_encoder)ExpiresDeltac                   @   s  e Zd ZdZeedddZeedddZeedddZ	ee
e dd	d
ZeedddZeedddZeedddZeedddZeedddZeedddZeedddZeedddZeedddZeedddZeeddd Zeedd!d"Zeedd#d$Zeedd%d&Zeedd'd(Zeedd)d*Zeedd+d,Zeedd-d.Zeedd/d0Zeee dd1d2Z eedd3d4Z!eedd5d6Z"eedd7d8Z#eedd9d:Z$eedd;d<Z%eedd=d>Z&eedd?d@Z'eeddAdBZ(eeddCdDZ)eeddEdFZ*ee+ddGdHZ,ee+ddIdJZ-eeddKdLZ.ee/e ddMdNZ0eeddOdPZ1eeddQdRZ2eeddSdTZ3ee4e5 ddUdVZ6eeddWdXZ7eee ddYdZZ8eedd[d\Z9ee:e; dd]d^Z<ee=eee f dd_d`Z>ee=eee f ddadbZ?eeddcddZ@eeddedfZAee5ddgdhZBeeddidjZCdkS )l_Configa  
    Helper object for accessing and verifying options in this extension. This
    is meant for internal use of the application; modifying config options
    should be done with flasks ```app.config```.

    Default values for the configuration options are set in the jwt_manager
    object. All of these values are read only. This is simply a loose wrapper
    with some helper functionality for flasks `app.config`.
    )returnc                 C   s
   | j tkS N)	algorithmr   self r   =/tmp/pip-unpacked-wheel-1sqzkeyl/flask_jwt_extended/config.pyis_asymmetric   s    z_Config.is_asymmetricc                 C   s   | j r| jS | jS r   )r   _private_key_secret_keyr   r   r   r   
encode_key"   s    z_Config.encode_keyc                 C   s   | j r| jS | jS r   )r   _public_keyr   r   r   r   r   
decode_key&   s    z_Config.decode_keyc                 C   sZ   t jd }t|tr|f}n t|ts0tdn|s<td|D ]}|dkr@tdq@|S )NZJWT_TOKEN_LOCATIONz.JWT_TOKEN_LOCATION must be a sequence or a setz_JWT_TOKEN_LOCATION must contain at least one of "headers", "cookies", "query_string", or "json")headerscookiesquery_stringjsonzSJWT_TOKEN_LOCATION can only contain "headers", "cookies", "query_string", or "json")r   config
isinstancestrr   RuntimeError)r   	locationslocationr   r   r   token_location*   s    



z_Config.token_locationc                 C   s
   d| j kS )Nr   r(   r   r   r   r   jwt_in_cookies>   s    z_Config.jwt_in_cookiesc                 C   s
   d| j kS )Nr   r)   r   r   r   r   jwt_in_headersB   s    z_Config.jwt_in_headersc                 C   s
   d| j kS )Nr    r)   r   r   r   r   jwt_in_query_stringF   s    z_Config.jwt_in_query_stringc                 C   s
   d| j kS )Nr!   r)   r   r   r   r   jwt_in_jsonJ   s    z_Config.jwt_in_jsonc                 C   s   t jd }|std|S )NZJWT_HEADER_NAMEz&JWT_ACCESS_HEADER_NAME cannot be empty)r   r"   r%   )r   namer   r   r   header_nameN   s    
z_Config.header_namec                 C   s
   t jd S )NZJWT_HEADER_TYPEr   r"   r   r   r   r   header_typeU   s    z_Config.header_typec                 C   s
   t jd S )NZJWT_QUERY_STRING_NAMEr0   r   r   r   r   query_string_nameY   s    z_Config.query_string_namec                 C   s
   t jd S )NZJWT_QUERY_STRING_VALUE_PREFIXr0   r   r   r   r   query_string_value_prefix]   s    z!_Config.query_string_value_prefixc                 C   s
   t jd S )NZJWT_ACCESS_COOKIE_NAMEr0   r   r   r   r   access_cookie_namea   s    z_Config.access_cookie_namec                 C   s
   t jd S )NZJWT_REFRESH_COOKIE_NAMEr0   r   r   r   r   refresh_cookie_namee   s    z_Config.refresh_cookie_namec                 C   s
   t jd S )NZJWT_ACCESS_COOKIE_PATHr0   r   r   r   r   access_cookie_pathi   s    z_Config.access_cookie_pathc                 C   s
   t jd S )NZJWT_REFRESH_COOKIE_PATHr0   r   r   r   r   refresh_cookie_pathm   s    z_Config.refresh_cookie_pathc                 C   s
   t jd S )NZJWT_COOKIE_SECUREr0   r   r   r   r   cookie_secureq   s    z_Config.cookie_securec                 C   s
   t jd S )NZJWT_COOKIE_DOMAINr0   r   r   r   r   cookie_domainu   s    z_Config.cookie_domainc                 C   s
   t jd S )NZJWT_SESSION_COOKIEr0   r   r   r   r   session_cookiey   s    z_Config.session_cookiec                 C   s
   t jd S )NZJWT_COOKIE_SAMESITEr0   r   r   r   r   cookie_samesite}   s    z_Config.cookie_samesitec                 C   s
   t jd S )NZJWT_JSON_KEYr0   r   r   r   r   json_key   s    z_Config.json_keyc                 C   s
   t jd S )NZJWT_REFRESH_JSON_KEYr0   r   r   r   r   refresh_json_key   s    z_Config.refresh_json_keyc                 C   s   | j otjd S )NZJWT_COOKIE_CSRF_PROTECT)r*   r   r"   r   r   r   r   csrf_protect   s    z_Config.csrf_protectc                 C   s
   t jd S )NZJWT_CSRF_METHODSr0   r   r   r   r   csrf_request_methods   s    z_Config.csrf_request_methodsc                 C   s
   t jd S )NZJWT_CSRF_IN_COOKIESr0   r   r   r   r   csrf_in_cookies   s    z_Config.csrf_in_cookiesc                 C   s
   t jd S )NZJWT_ACCESS_CSRF_COOKIE_NAMEr0   r   r   r   r   access_csrf_cookie_name   s    z_Config.access_csrf_cookie_namec                 C   s
   t jd S )NZJWT_REFRESH_CSRF_COOKIE_NAMEr0   r   r   r   r   refresh_csrf_cookie_name   s    z _Config.refresh_csrf_cookie_namec                 C   s
   t jd S )NZJWT_ACCESS_CSRF_COOKIE_PATHr0   r   r   r   r   access_csrf_cookie_path   s    z_Config.access_csrf_cookie_pathc                 C   s
   t jd S )NZJWT_REFRESH_CSRF_COOKIE_PATHr0   r   r   r   r   refresh_csrf_cookie_path   s    z _Config.refresh_csrf_cookie_pathc                 C   s
   t jd S )NZJWT_ACCESS_CSRF_HEADER_NAMEr0   r   r   r   r   access_csrf_header_name   s    z_Config.access_csrf_header_namec                 C   s
   t jd S )NZJWT_REFRESH_CSRF_HEADER_NAMEr0   r   r   r   r   refresh_csrf_header_name   s    z _Config.refresh_csrf_header_namec                 C   s
   t jd S )NZJWT_CSRF_CHECK_FORMr0   r   r   r   r   csrf_check_form   s    z_Config.csrf_check_formc                 C   s
   t jd S )NZJWT_ACCESS_CSRF_FIELD_NAMEr0   r   r   r   r   access_csrf_field_name   s    z_Config.access_csrf_field_namec                 C   s
   t jd S )NZJWT_REFRESH_CSRF_FIELD_NAMEr0   r   r   r   r   refresh_csrf_field_name   s    z_Config.refresh_csrf_field_namec              
   C   sr   t jd }t|tkr t|d}|dk	rnz|ttj  W n0 t	k
rl } zd}t
||W 5 d }~X Y nX |S )NZJWT_ACCESS_TOKEN_EXPIRESsecondsFzAmust be able to add JWT_ACCESS_TOKEN_EXPIRES to datetime.datetimer   r"   typeintr   r   nowr   utc	TypeErrorr%   r   deltaeerrr   r   r   access_expires   s    

z_Config.access_expiresc              
   C   sr   t jd }t|tkr t|d}|dk	rnz|ttj  W n0 t	k
rl } zd}t
||W 5 d }~X Y nX |S )NZJWT_REFRESH_TOKEN_EXPIRESrJ   FzBmust be able to add JWT_REFRESH_TOKEN_EXPIRES to datetime.datetimerL   rR   r   r   r   refresh_expires   s    

z_Config.refresh_expiresc                 C   s
   t jd S )NZJWT_ALGORITHMr0   r   r   r   r   r      s    z_Config.algorithmc                 C   s0   t jd }|s| jgS | j|kr,|| j |S )NZJWT_DECODE_ALGORITHMS)r   r"   r   append)r   Z
algorithmsr   r   r   decode_algorithms   s    

z_Config.decode_algorithmsc                 C   s4   t jd }|s0t jdd }|s0td| j|S )NZJWT_SECRET_KEYZ
SECRET_KEYzRJWT_SECRET_KEY or flask SECRET_KEY must be set when using symmetric algorithm "{}")r   r"   getr%   formatr   r   keyr   r   r   r      s    
z_Config._secret_keyc                 C   s"   t jd }|std| j|S )NZJWT_PUBLIC_KEYzHJWT_PUBLIC_KEY must be set to use asymmetric cryptography algorithm "{}"r   r"   r%   r[   r   r\   r   r   r   r      s    
z_Config._public_keyc                 C   s"   t jd }|std| j|S )NZJWT_PRIVATE_KEYzIJWT_PRIVATE_KEY must be set to use asymmetric cryptography algorithm "{}"r^   r\   r   r   r   r      s    
z_Config._private_keyc                 C   s   | j r
d S dS )Ni C)r:   r   r   r   r   cookie_max_age  s    z_Config.cookie_max_agec                 C   s
   t jd S )NZJWT_IDENTITY_CLAIMr0   r   r   r   r   identity_claim_key  s    z_Config.identity_claim_keyc                 C   s   dhS )NOPTIONSr   r   r   r   r   exempt_methods  s    z_Config.exempt_methodsc                 C   s
   t jd S )NZJWT_ERROR_MESSAGE_KEYr0   r   r   r   r   error_msg_key  s    z_Config.error_msg_keyc                 C   s   t tS r   )r   r   r   r   r   r   json_encoder  s    z_Config.json_encoderc                 C   s
   t jd S )NZJWT_DECODE_AUDIENCEr0   r   r   r   r   decode_audience"  s    z_Config.decode_audiencec                 C   s
   t jd S )NZJWT_ENCODE_AUDIENCEr0   r   r   r   r   encode_audience&  s    z_Config.encode_audiencec                 C   s
   t jd S )NZJWT_ENCODE_ISSUERr0   r   r   r   r   encode_issuer*  s    z_Config.encode_issuerc                 C   s
   t jd S )NZJWT_DECODE_ISSUERr0   r   r   r   r   decode_issuer.  s    z_Config.decode_issuerc                 C   s
   t jd S )NZJWT_DECODE_LEEWAYr0   r   r   r   r   leeway2  s    z_Config.leewayc                 C   s
   t jd S )NZJWT_ENCODE_NBFr0   r   r   r   r   
encode_nbf6  s    z_Config.encode_nbfN)D__name__
__module____qualname____doc__propertyboolr   r$   r   r   r	   r(   r*   r+   r,   r-   r/   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   r   rV   rW   r   r   rY   r   r   r   r   rN   r_   r`   rb   rc   r
   r   rd   r   re   rf   rg   rh   ri   rj   r   r   r   r   r      s   


r   N)r   r   r   r!   r   typingr   r   r   r	   r
   r   Zflaskr   Zjwt.algorithmsr   Z!flask_jwt_extended.internal_utilsr   Zflask_jwt_extended.typingr   objectr   r"   r   r   r   r   <module>   s"     *