
    @i                     0    d dl  d dlmZ  G d de      Zy)    )*)abortc                   b    e Zd ZdZdZed        Zd Zej                  j                  d        Zy)CaptchaMixinrestore_password_captcha   c                 6    t         j                  j                  S N)gglobal_settingsauth_check_captcha)selfs    ./modules/auth/views/captcha.pycaptcha_enabledzCaptchaMixin.captcha_enabled   s      333    c                 (   dt         dt         fd}| j                  syt        j                  j	                  dd      }t
        j	                  dd      }|s?t        j                  j                  | j                  dddd	id
dddd	       t        d       d| }t        j                  j	                  |      }|s?t        j                  j                  | j                  ddddid
dddd	       t        d       t        |t        t        f      r|j!                         n
t        |      }|r ||       ||      k7  r?t        j                  j                  | j                  ddddid
dddd	       t        d       t
        j#                  dd       y)uo   Проверка капчи для восстановления пароля по captcha_id из сессии.sreturnc                 F    | xs dj                         j                         S )N )striplower)r   s    r   _normz*CaptchaMixin._check_captcha.<locals>._norm   s    G??$**,,r   Ncaptcha
captcha_idCmfAuthreasonzRequire captcha (no session id)failT   )	operatecmf_model_nameparent
audit_dataresult_statuscurrent_transactionsecurity_levelparent_nameparent_codei  auth:captcha:z Require captcha (no redis value)zBad captcha)strr   requestvaluesgetsessionmodelsCmfAuditaudit_eventcaptcha_operater   APPREDIS_DB
isinstancebytes	bytearraydecodepop)r   r   captcha_userr   keystored
stored_vals          r   _check_captchazCaptchaMixin._check_captcha   sv   	-S 	-S 	-##~~)))T:[[t4
OO'',,Y3T(U$$q d	 (  #Jj\*!!#&OO'',,Y3U(V$$q d	 (  #J(26E9;M(NV]]_TWX^T_
u\2eJ6GGOO'',,Y=(A$$q d	 (  #JL$'r   c                 z   ddl m | j                  syt        j	                  d      }|s&dd l}t        |j                               }|t        d<   d| }ddj                  fdt        d	      D              }t        j                  j                  ||| j                  
       |j                         }ddlm} ddlm}  |       }|j'                  t)        |t*        t,        f      r|j/                         n|      }	 ||	d      }
d|
j0                  d<   d|
j0                  d<   d|
j0                  d<   |
S )Nr   )choice)r   i  r   r)    ABCDEFGHJKLMNPQRSTUVWXYZ23456789r   c              3   .   K   | ]  }         y wr
    ).0_alphabetr@   s     r   	<genexpr>z+CaptchaMixin.captcha_img.<locals>.<genexpr>H   s     ;Qx(;s      )ex)Response)ImageCaptchaz	image/png)mimetypez.no-store, no-cache, must-revalidate, max-age=0zCache-Controlzno-cachePragma0Expires)secretsr@   r   r.   r-   uuidr*   uuid4joinranger3   r4   setcaptcha_ttlencodeflaskrJ   captcha.imagerK   generater5   r6   r7   r8   headers)r   r   rQ   r;   valuevalrJ   rK   imagedataresprF   r@   s              @@r   captcha_imgzCaptchaMixin.captcha_img8   s   "## [[.
TZZ\*J$.GL!j\*5;%(;;e(8(89lln".~~jui>P.QcjjlWZ[{3(X_%!+X"%Yr   N)__name__
__module____qualname__r2   rV   propertyr   r>   cmfviewsactionra   rC   r   r   r   r      sB    0OK4 4)(X 	YY r   r   N)cmf.includerX   r   objectr   rC   r   r   <module>rk      s     Q6 Qr   