
    ןEf"	                         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dS )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                  d    d                     d t          t                    D                       S )N c              3   H   K   | ]}t          j        t                    V  d S N)randomchoiceCSRF_ALLOWED_CHARS).0is     ./cmf/views/csrf.py	<genexpr>z'_get_new_csrf_string.<locals>.<genexpr>   s-      XX6=!344XXXXXX    )joinrangeCSRF_SECRET_LENGTH r   r   _get_new_csrf_stringr      s,    77XXeDV>W>WXXXXXXr   c                     t                      }t          t          fd| D             fd|D                       }d                    fd|D                       }||z   S )Nc              3   B   K   | ]}                     |          V  d S r
   indexr   xcharss     r   r   z&_salt_cipher_secret.<locals>.<genexpr>   s-      00AQ000000r   c              3   B   K   | ]}                     |          V  d S r
   r   r   s     r   r   z&_salt_cipher_secret.<locals>.<genexpr>   s-      2P2Pa5;;q>>2P2P2P2P2P2Pr   r   c              3   T   K   | ]"\  }}||z   t                    z           V  #d S r
   )lenr   r   yr   s      r   r   z&_salt_cipher_secret.<locals>.<genexpr>   s;      CCTQUAESZZ/0CCCCCCr   )r   r   zipr   )secretsaltpairscipherr   s       @r   _salt_cipher_secretr)      s|    !!DE00000002P2P2P2P42P2P2PQQEWWCCCCUCCCCCF&=r   c                     | d t                    }| t           d          } t          t          fd| D             fd|D                       }d                    fd|D                       }|S )Nc              3   B   K   | ]}                     |          V  d S r
   r   r   s     r   r   z'_unsalt_cipher_token.<locals>.<genexpr>    s-      //AQ//////r   c              3   B   K   | ]}                     |          V  d S r
   r   r   s     r   r   z'_unsalt_cipher_token.<locals>.<genexpr>    s-      1O1OQ%++a..1O1O1O1O1O1Or   r   c              3   4   K   | ]\  }}||z
           V  d S r
   r   r"   s      r   r   z'_unsalt_cipher_token.<locals>.<genexpr>!   s/      44daU1q5\444444r   )r   r   r$   r   )tokenr&   r'   r%   r   s       @r   _unsalt_cipher_tokenr/      s    $$$%D$%%&EE///////1O1O1O1O$1O1O1OPPEWW4444e44444FMr   c                  8    t          t                                S r
   )r)   r   r   r   r   _get_new_csrf_tokenr1   %   s    355666r   c                      dt           vr&t                      } t          |           t           d<   nt          t           d                   } t          |           S N
csrf_token)r   r   r)   r/   )csrf_secrets    r   get_csrf_tokenr6   )   sM    7""*,, 3K @ @*7<+@AA{+++r   c                  2    t                      t          d<   d S r3   )r1   r   r   r   r   rotate_csrf_tokenr8   2   s    /11GLr   c                 `    t          j        t          |           t          |                    S r
   )hmaccompare_digestr/   )request_csrf_tokenr4   s     r   _compare_salted_tokensr=   6   s0     /00Z((  r   c                       fd}|S )Nc                  "   t          j        dd           }t          j                            dd           }|st	                       t          dd           |st          dd           t          ||          st          dd            | i |S )Nr4   i  zNo csrf token is sessionzNo csrf token in formzcsrf token is not valid)r   getr   formr8   r   r=   )argskwargssession_token
form_tokenfs       r   wrapperz$csrf_token_required.<locals>.wrapper@   s    L$77\%%lD99
 	3#1222 	0#.///%mZ@@ 	2#0111q$!&!!!r   r   )rF   rG   s   ` r   csrf_token_requiredrH   ?   s#    
" 
" 
" 
" 
" Nr   )__doc__stringr   r:   flaskr   r   r   r   ascii_lettersdigitsr   r   r)   r/   r1   r6   r8   r=   rH   r   r   r   <module>rN      s        ) ) ) ) ) ) ) ) ) ) )FM9 Y Y Y    7 7 7, , ,2 2 2      r   