§
    ç“?j  ã                   óv   — 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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                   ó`   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zed„ ¦   «         Z	ed„ ¦   «         Z
ˆ xZS )r
   z%Y%m%d%H%M%Sc                 ó^   •— |j         | _        t          ¦   «                              |¦  «        S )N)ÚmetaÚ	form_metaÚsuperÚ
setup_form)ÚselfÚformÚ	__class__s     €ú[/var/www/stessy.org/copro_gestion/venv/lib/python3.11/site-packages/wtforms/csrf/session.pyr   zSessionCSRF.setup_form   s$   ø€ ØœˆŒÝ‰wŒw×!Ò! $Ñ'Ô'Ð'ó    c                 óH  — | j         }|j        €t          d¦  «        ‚|j        €t	          d¦  «        ‚| j        }d|vr6t          t          j        d¦  «        ¦  «         	                    ¦   «         |d<   | j
        rQ|                      ¦   «         | j
        z                        | j        ¦  «        }d                     |d         |¦  «        }n
d}|d         }t          j        |j        |                     d¦  «        t          ¬¦  «        }|› 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_csrfs          r   Úgenerate_csrf_tokenzSessionCSRF.generate_csrf_token#   s  € ØŒ~ˆØÔÐ#ÝØNñô ð ð ÔÐ$ÝÐPÑQÔQÐQà”,ˆà˜Ð Ð Ý"¥2¤:¨b¡>¤>Ñ2Ô2×<Ò<Ñ>Ô>ˆG�F‰OàŒ?ð 	)Ø—x’x‘z”z D¤OÑ3×=Ò=¸dÔ>NÑOÔOˆGØŸš w¨v¤¸Ñ@Ô@ˆJˆJàˆGØ  œˆJå”HØÔ˜j×/Ò/°Ñ7Ô7Å4ð
ñ 
ô 
ˆ	ð Ð4Ð4˜Y×0Ò0Ñ2Ô2Ð4Ð4Ð4r   c                 ój  — | j         }|j        r	d|j        vr"t          |                     d¦  «        ¦  «        ‚|j                             dd¦  «        \  }}| j        d         |z                        d¦  «        }t          j        |j	        |t          ¬¦  «        }|                     ¦   «         |k    r"t          |                     d¦  «        ¦  «        ‚| j        rT|                      ¦   «                              | j        ¦  «        }||k    r$t          |                     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/   r1   Ú	check_valÚhmac_compareÚnow_formatteds	            r   Úvalidate_csrf_tokenzSessionCSRF.validate_csrf_token=   s!  € ØŒ~ˆØŒzð 	H˜T¨¬Ð3Ð3Ý! %§-¢-Ð0EÑ"FÔ"FÑGÔGÐGà"œZ×-Ò-¨d°AÑ6Ô6Ñˆ�à”\ &Ô)¨GÑ3×;Ò;¸FÑCÔCˆ	å”x Ô 0°)ÅtÐLÑLÔLˆØ×!Ò!Ñ#Ô# yÒ0Ð0Ý! %§-¢-°Ñ"?Ô"?Ñ@Ô@Ð@àŒ?ð 	LØ ŸHšH™JœJ×/Ò/°Ô0@ÑAÔAˆMØ˜wÒ&Ð&Ý% e§m¢mÐ4IÑ&JÔ&JÑKÔKÐKð	Lð 	Là&Ð&r   c                 ó(   — t          j        ¦   «         S )zP
        Get the current time. Used for test mocking/overriding mainly.
        )r   r'   ©r   s    r   r'   zSessionCSRF.nowO   s   € õ Œ|‰~Œ~Ðr   c                 óJ   — t          | j        dt          d¬¦  «        ¦  «        S )NÚcsrf_time_limité   )Úminutes)Úgetattrr   r   r=   s    r   r&   zSessionCSRF.time_limitU   s"   € å�t”~Ð'8½)ÈBÐ:OÑ:OÔ:OÑPÔPÐPr   c                 óL   — t          | j        j        d| j        j        ¦  «        S )Nr"   )rB   r   r    r=   s    r   r"   zSessionCSRF.sessionY   s%   € åØŒNÔ'¨°D´NÔ4Oñ
ô 
ð 	
r   )Ú__name__Ú
__module__Ú__qualname__r)   r   r2   r;   r'   Úpropertyr&   r"   Ú__classcell__)r   s   @r   r
   r
      s¦   ø€ € € € € Ø €Kð(ð (ð (ð (ð (ð5ð 5ð 5ð4Lð Lð Lð$ð ð ð ðQð Qñ „XðQð ð
ð 
ñ „Xð
ð 
ð 
ð 
ð 
r   r
   )Ú__doc__r+   r#   r   r   Úhashlibr   Ú
validatorsr   Úcorer	   Ú__all__r
   © r   r   ú<module>rO      sÀ   ððð ð €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à
€ðA
ð A
ð A
ð A
ð A
�$ñ A
ô A
ð A
ð A
ð A
r   