
    @d"	                         d Z ddlZddlZddlZddlmZmZmZ dZej                  ej                  z   Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zy)z
Cross Site Request Forgery Middleware.

This module provides a middleware that implements protection
against request forgeries from other sites.
    N)sessionrequestabort    c                  L    dj                  d t        t              D              S )N c              3   N   K   | ]  }t        j                  t                y wN)randomchoiceCSRF_ALLOWED_CHARS).0is     ./cmf/views/csrf.py	<genexpr>z'_get_new_csrf_string.<locals>.<genexpr>   s     X6==!34Xs   #%)joinrangeCSRF_SECRET_LENGTH     r   _get_new_csrf_stringr      s    77XeDV>WXXXr   c                     t               }t        t        fd| D        fd|D              }dj                  fd|D              }||z   S )Nc              3   @   K   | ]  }j                  |        y wr
   indexr   xcharss     r   r   z&_salt_cipher_secret.<locals>.<genexpr>   s     0AQ0   c              3   @   K   | ]  }j                  |        y wr
   r   r   s     r   r   z&_salt_cipher_secret.<locals>.<genexpr>   s     2Pa5;;q>2Pr   r   c              3   L   K   | ]  \  }}||z   t              z       y wr
   )lenr   r   yr   s      r   r   z&_salt_cipher_secret.<locals>.<genexpr>   s'     CTQUAESZ/0Cs   !$)r   r   zipr   )secretsaltpairscipherr   s       @r   _salt_cipher_secretr*      sF    !DE002P42PQEWWCUCCF&=r   c                     | d t          }| t         d  } t        t        fd| D        fd|D              }dj                  fd|D              }|S )Nc              3   @   K   | ]  }j                  |        y wr
   r   r   s     r   r   z'_unsalt_cipher_token.<locals>.<genexpr>    s     /AQ/r   c              3   @   K   | ]  }j                  |        y wr
   r   r   s     r   r   z'_unsalt_cipher_token.<locals>.<genexpr>    s     1OQ%++a.1Or   r   c              3   4   K   | ]  \  }}||z
       y wr
   r   r#   s      r   r   z'_unsalt_cipher_token.<locals>.<genexpr>!   s     4daU1q5\4s   )r   r   r%   r   )tokenr'   r(   r&   r   s       @r   _unsalt_cipher_tokenr0      sU    $$%D$%&EE//1O$1OPEWW4e44FMr   c                  (    t        t                     S r
   )r*   r   r   r   r   _get_new_csrf_tokenr2   %   s    3566r   c                      dt         vr't               } t        |       t         d<   t        |       S t        t         d         } t        |       S N
csrf_token)r   r   r*   r0   )csrf_secrets    r   get_csrf_tokenr7   )   sJ    7"*, 3K @ {++ +7<+@A{++r   c                  &    t               t        d<   y r4   )r2   r   r   r   r   rotate_csrf_tokenr9   2   s    /1GLr   c                 R    t        j                  t        |       t        |            S r
   )hmaccompare_digestr0   )request_csrf_tokenr5   s     r   _compare_salted_tokensr>   6   s(     /0Z( r   c                       fd}|S )Nc                      t        j                  dd       }t        j                  j                  dd       }|st	                t        dd       |st        dd       t        ||      st        dd        | i |S )Nr5   i  zNo csrf token is sessionzNo csrf token in formzcsrf token is not valid)r   getr   formr9   r   r>   )argskwargssession_token
form_tokenfs       r   wrapperz$csrf_token_required.<locals>.wrapper@   sp    L$7\\%%lD9
#12#./%mZ@#01$!&!!r   r   )rG   rH   s   ` r   csrf_token_requiredrI   ?   s    
" Nr   )__doc__stringr   r;   flaskr   r   r   r   ascii_lettersdigitsr   r   r*   r0   r2   r7   r9   r>   rI   r   r   r   <module>rO      s_       ) ) ))FMM9 Y7,2r   