o
    Df                     @   sh   d 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	m
Z
 d
ZG dd de
ZdS )a  
A provided CSRF implementation which puts CSRF data in a session.

This can be used fairly comfortably with many `request.session` type
objects, including the Werkzeug/Flask session store, Django sessions, and
potentially other similar objects which use a dict-like API for storing
session keys.

The basic concept is a randomly generated value is stored in the user's
session, and an hmac-sha1 of it (along with an optional expiration time,
for extra security) is used as the value of the csrf_token. If this token
validates with the hmac of the random value + expiration time, and the
expiration time is not passed, the CSRF validation will pass.
    N)datetime)	timedelta)sha1   )ValidationError   )CSRF)SessionCSRFc                       sP   e Zd ZdZ fddZdd Zdd Zdd	 Zed
d Z	edd Z
  ZS )r	   z%Y%m%d%H%M%Sc                    s   |j | _t |S )N)meta	form_metasuper
setup_form)selfform	__class__ M/home/ubuntu/webapp/venv/lib/python3.10/site-packages/wtforms/csrf/session.pyr      s   zSessionCSRF.setup_formc                 C   s   | j }|jd u rtd|jd u rtd| j}d|vr'ttd	 |d< | j
r>|  | j
 | j}d|d |}nd}|d }tj|j|dtd}| d	|	  S )
Nz<must set `csrf_secret` on class Meta for SessionCSRF to workz2Must provide a session-like object as csrf contextcsrf@   z{}{} utf8	digestmod##)r   csrf_secret	Exceptioncsrf_context	TypeErrorsessionr   osurandom	hexdigest
time_limitnowstrftimeTIME_FORMATformathmacnewencode)r   csrf_token_fieldr
   r   expires
csrf_build	hmac_csrfr   r   r   generate_csrf_token"   s&   

zSessionCSRF.generate_csrf_tokenc           	      C   s   | j }|jrd|jvrt|d|jdd\}}| jd | d}tj|j	|t
d}| |kr;t|d| jrQ|  | j}||krSt|dd S d S )	Nr   zCSRF token missing.r   r   r   r   zCSRF failed.zCSRF token expired.)r   datar   gettextsplitr   r*   r(   r)   r   r   r"   r#   r$   r%   r&   )	r   r   fieldr
   r,   r.   	check_valhmac_comparenow_formattedr   r   r   validate_csrf_token<   s   zSessionCSRF.validate_csrf_tokenc                 C   s   t  S )zP
        Get the current time. Used for test mocking/overriding mainly.
        )r   r$   r   r   r   r   r$   N   s   zSessionCSRF.nowc                 C   s   t | jdtddS )Ncsrf_time_limit   )minutes)getattrr   r   r8   r   r   r   r#   T   s   zSessionCSRF.time_limitc                 C   s   t | jjd| jjS )Nr   )r<   r   r   r8   r   r   r   r   X   s   zSessionCSRF.session)__name__
__module____qualname__r&   r   r/   r7   r$   propertyr#   r   __classcell__r   r   r   r   r	      s    
r	   )__doc__r(   r    r   r   hashlibr   
validatorsr   corer   __all__r	   r   r   r   r   <module>   s    