B
    f-                 @   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 y|
  W n" tk
r } zW d d }~X Y nX d S )Nzauth:user_login_failed:zauth:user_login_failed_lock:   )ZtimeoutT)Zblocking)configAUTH_FREEZE_AFTER_LOGIN_FAILAPPREDIS_DBexistsZredislockacquiretimeZ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 )Nzauth:user_login_failed:captchazauth:user_login_captcha:    )kZauth_failedCmfAuthzRequire captcha)r   reasonZfailT   )	operatecmf_model_nameparent
audit_dataresult_statuscurrent_transactionsecurity_levelparent_name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   zauth:user_login_captcha:r   )Response)ImageCaptchaz	image/png)Zmimetype)r   r-   r   r.   r/   r   r   r   flaskr;   Zcaptcha.imager<   r   r9   Zgenerate)r
   r   r;   r<   r   Zimagedatar   r   r   captcha_imgH   s    
zSigninView.captcha_imgc             C   sh  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}| ||S Q R X d S )Nr   r   @challenge_respzservicedesk:user_login_failed:r"   i  )exi  Znew_password_hashZnew_password_saltZpassword_expiredr    password_expires_must_changeT)	r#   r$   r%   r&   r'   r(   r)   r*   r+   i  Zpassword_changedr   zSigned in successfully)urllibparseZunquoter.   r/   r   r   r:   ZcmfutilZdisable_aclr6   r    Zget_by_challenge_respZdpZcommitr   r   r-   r   r   r5   r   rC   r   r   r7   r8   Zset_pass_hashZsaveZmake_responseZ_ok)r
   rD   r   rA   r,   hashsaltZresponser   r   r   postZ   sB    






zSigninView.postc             C   s4   t tjd }tjj|dddgd}|s,dS | S )Nr   Ztoken_lengthrG   Zauth_options)r   Zfieldsr   )r   r.   r/   r6   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   passwordzauth:user_login_failed:r"   i  )rB   i  )r   r.   r/   r   r6   r    Zfrom_login_passwordr   r   r-   r   r   r5   r   Zrsa_sign_pack_jwt)r
   r   rJ   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valuer6   r    r   )r
   r   r,   r   r   r   proceed   s    

zSigninView.proceedN)__name__
__module____qualname__Z__url__cmfviewsactionr   r   r:   r?   rH   rI   rK   rN   r   r   r   r   r      s   /r   )ZdatetimeZujsonr1   r3   r   r=   r   Zcmf.data_providers.baser   Zcmf.includeZmodules.auth.models.emailr   Zmodules.auth.views.responser   Zurllib.parser   rR   rS   ZBaseViewr   r   r   r   r   <module>   s   