U
    `e-                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	T d dl
mZ d dlmZ d dlmZ G dd	 d	ejjeZdS )
    N)abort)rollback_all_ds)*)normalize_email_address)ResponseMixin)urlparsec                   @   s   e Zd ZdZejjdd Zdd Zdd Z	ejjdd	 Z
ejjd
d Zejjdd Zejjdd Zejjdd ZdS )
SigninViewz/auth/signinc                 C   s   t jj}| dS )Nzsignin.html)gZglobal_settingsZservicedesk_allow_auth_guestsZrender)selfZshow_register_button r   %./modules/servicedesk/views/signin.pyget   s    zSigninView.getc              
   C   s   t js
d S tjd| s d S tjjjd| t jd d}|jdd t	t j z|
  W n" tk
r } zW 5 d }~X Y nX d S )Nauth:user_login_failed:zauth:user_login_failed_lock:   )timeoutT)blocking)configAUTH_FREEZE_AFTER_LOGIN_FAILAPPREDIS_DBexistsZredislockacquiretimesleeprelease	Exception)r
   loginr   er   r   r   _auth_freeze   s    zSigninView._auth_freezec                 C   s   t js
d S tjd| s d S tjdd }d| }tj|}dt	j
tjdd}tj|| |stjjddd |d	d
ddd||d	 td | }|r||krtjjddd |dd
ddd||d	 td d S )Nr   captchaauth:user_login_captcha:    )kZauth_failedCmfAuthzRequire captcha)r   reasonZfailT   	ZoperateZcmf_model_nameparentZ
audit_dataZresult_statusZcurrent_transactionZsecurity_levelparent_nameZparent_codei  authzBad captcha)r   AUTH_CHECK_CAPTCHAr   r   r   requestvaluesr   joinrandomchoicesstringdigitssetmodelsCmfAuditaudit_eventr   decode)r
   r   r    Zdb_keyZ
db_captchaZnew_captchar   r   r   _auth_check_captcha)   s@    

    
    zSigninView._auth_check_captchac                 C   sx   t js
d S ttjd }tjd| s.d S ddlm	} ddl
m} tjd|  }| }||}||ddS )Nr   r!   r   )Response)ImageCaptchaz	image/png)Zmimetype)r   r,   r   r-   r.   r   r   r   flaskr:   Zcaptcha.imager;   r   r8   Zgenerate)r
   r   r:   r;   r    Zimagedatar   r   r   captcha_imgH   s    
zSigninView.captcha_imgc                 C   st  dd l }|jtjd }d|kr*t|}tjd }| | | | t	  t
j||}t
jj  |stjs~tjrtjjd| ddd td	 |jrJt |jkrJtjd
d }tjdd }|r|st
jjddd d|iddd||d	 td ||| |jr d |_t
jjddd d|iddd||d	 |  td}| ||W  5 Q R  S Q R X d S )Nr   r   @challenge_respzservicedesk:user_login_failed:r'     exi  Znew_password_hashZnew_password_saltZpassword_expiredr%   password_expires_must_changeTr(   i  Zpassword_changedr   zSigned in successfully)urllibparseZunquoter-   r.   r   r   r9   ZcmfutilZdisable_aclr5   r%   Zget_by_challenge_respZdpZcommitr   r   r,   r   r   r4   r   rD   r   r   r6   r7   Zset_pass_hashZsaveZmake_responseZ_ok)r
   rE   r   r@   r+   hashsaltZresponser   r   r   postZ   sV    




    
    zSigninView.postc                 C   s4   t tjd }tjj|dddgd}|s,dS | S )Nr   Ztoken_lengthrH   Zauth_options)r   Zfieldsr"   )r   r-   r.   r5   r%   r   Zgen_server_challenger
   r   r+   r   r   r   get_server_challenge   s
    zSigninView.get_server_challengec                 C   sh   t tjd }tjd }| | tj||}|s`tjs@tj	rXt
jjd| ddd td | S )u>   
            Ручка для авторизации
        r   passwordr   r'   rA   rB   i  )r   r-   r.   r   r5   r%   Zfrom_login_passwordr   r   r,   r   r   r4   r   Zrsa_sign_pack_jwt)r
   r   rL   r+   r   r   r   signin_with_login_password   s    

z%SigninView.signin_with_login_passwordc                 C   sD   t jstd tdS t jjj}tjj	|d}|s<tdS tdS )uu    Определить по куке куда отправить пользователя автоматически. u7   1. Нет куки - форма авторизации.z/servicedesk/auth/signin)r   z./servicedesk/auth/signout?next_url=auth/signinz/servicedesk)
r	   r+   ZlogginginfoZredirectZemailvaluer5   r%   r   rJ   r   r   r   proceed   s    

zSigninView.proceedN)__name__
__module____qualname__Z__url__cmfviewsactionr   r   r9   r>   rI   rK   rM   rP   r   r   r   r   r      s   


.

r   )ZdatetimeZujsonr0   r2   r   r<   r   Zcmf.data_providers.baser   Zcmf.includeZmodules.auth.models.emailr   Zmodules.auth.views.responser   Zurllib.parser   rT   rU   ZBaseViewr   r   r   r   r   <module>   s   