U
    dI                     @   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                   @   sp   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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 td | }|r||krtjjddd |dd
ddd td d S )Nr   captchaauth:user_login_captcha:    )kauthCmfAuthzRequire captcha)r   reasonZfailTZoperateZcmf_model_nameparentZ
audit_dataZresult_statusZcelery_skipi  z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)   s4    

  
  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   flaskr8   Zcaptcha.imager9   r   r6   Zgenerate)r
   r   r8   r9   r    Zimagedatar   r   r   captcha_imgF   s    
zSigninView.captcha_imgc                 C   sD  dd l }|jtjd }d|kr*t|}tjd }| | | | tj	
||}tj	j  |stjsrtjrtjjd| ddd td	 |jr0t |jkr0tjd
d }tjdd }|r|stjjddd d|iddd td ||| |jrd |_tjjddd d|iddd |  td}| ||S )Nr   r   @challenge_respzservicedesk:user_login_failed:     exi  Znew_password_hashZnew_password_saltr%   r&   password_expires_must_changeTr(   i  Zpassword_changedzSigned in successfully)urllibparseZunquoter+   r,   r   r   r7   r3   r&   Zget_by_challenge_respZdpZcommitr   r   r*   r   r   r2   r   rC   r   r   r4   r5   Zset_pass_hashZsaveZmake_responseZ_ok)r
   rD   r   r>   r%   hashsaltZresponser   r   r   postX   sH    



  
  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,   r3   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?   r@   rA   i  )r   r+   r,   r   r3   r&   Zfrom_login_passwordr   r   r*   r   r   r2   r   Zrsa_sign_pack_jwt)r
   r   rJ   r%   r   r   r   signin_with_login_password   s    

z%SigninView.signin_with_login_passwordN)__name__
__module____qualname__Z__url__cmfviewsactionr   r   r7   r<   rH   rI   rK   r   r   r   r   r      s   


+
r   )ZdatetimeZujsonr.   r0   r   r:   r   Zcmf.data_providers.baser   Zcmf.includeZmodules.auth.models.emailr   Zmodules.auth.views.responser   Zurllib.parser   rO   rP   ZBaseViewr   r   r   r   r   <module>   s   