U
    7h                     @   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                   @   sx   e Zd ZdZejj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   dd l }ddlm} tjj}d }tjd}d}dtj	krDtj	d }|
|}|rbtj|\}}|dgd}|r|sttdtj	krtj	d nd}	| |	|S g }
tjjdd	d
gdd	dggddgdD ]}|
t|j||d qt|
}| dS )Nr   )get_flashed_messagessession_token/next_urlZ
auth_error)Zcategory_filterZservicedesk_supportz==TZdisabledFr   zplugin.*)filterfields)nameZ	login_urlzsignin.html)htmlflaskr	   gglobal_settingsZservicedesk_allow_auth_guestsrequestZcookiesgetvaluesescapemodelsZ
CmfSessionZ
from_tokenmake_responseredirect_okZCmfAuthOpenIdPluginlistappenddictr   Zget_redirect_urllenZrender)selfr   r	   Zshow_register_buttonauthr
   r   Z_sessionmessagesresponseZsso_buttonsZpluginZsso_buttons_count r$   %./modules/servicedesk/views/signin.pyr      s4    



zSigninView.getc                 C   s   t jj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 )Ncaptchaauth:user_login_captcha:    )kZauth_failedCmfAuthzRequire captcha)loginreasonZfailT   	ZoperateZcmf_model_nameparentZ
audit_dataZresult_statusZcurrent_transactionZsecurity_levelparent_nameZparent_codei  r!   zBad captcha)r   r   auth_check_captchar   r   r   APPREDIS_DBjoinrandomchoicesstringdigitssetr   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   sz   t jjsd S ttjd }tjd| s0d 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   r2   r   r   r   r3   r4   existsr   r?   Zcaptcha.imager@   r   r=   Zgenerate)r    r,   r?   r@   r&   Zimagedatar$   r$   r%   captcha_imgJ   s    
zSigninView.captcha_imgc           	      C   s^  dd l }|jtjd }d|kr*t|}tjd }| | t  t	j
||}t	j
j  |si }tjrtjd |d< td| |jr4t |jkr4tjdd }tjd	d }|r|st	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_respmessage  Znew_password_hashZnew_password_saltZpassword_expiredr+   password_expires_must_changeTr.   r/   i  Zpassword_changed   zSigned in successfully)urllibparseunquoter   r   r   r>   ZcmfutilZdisable_aclr   r+   get_by_challenge_respdpcommitr   alertr   rI   timer   r;   r<   Zset_pass_hashZsaver   r   )	r    rK   r,   rE   r!   abort_kwargshashsaltr#   r$   r$   r%   post\   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_lengthrU   Zauth_options)r,   r   r(   )r   r   r   r   r+   r   Zgen_server_challenger    r,   r!   r$   r$   r%   get_server_challenge   s
    zSigninView.get_server_challengec                 C   s`   t tjd }tjd }tj||}tjj  |sXi }tj	rNtj	d |d< t
d| | S )u>   
            Ручка для авторизации
        r,   passwordrF   rG   rH   )r   r   r   r   r+   rN   rO   rP   r   rQ   r   Zrsa_sign_pack_jwt)r    r,   rY   r!   rS   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infor   Zemailvaluer   r+   r   rW   r$   r$   r%   proceed   s    

zSigninView.proceedN)__name__
__module____qualname__Z__url__cmfviewsactionr   r>   rC   rV   rX   rZ   r]   r$   r$   r$   r%   r      s   


.

r   )ZdatetimeZujsonr6   r8   rR   r   r   Zcmf.data_providers.baser   Zcmf.includeZmodules.auth.models.emailr   Zmodules.auth.views.responser   urllib.parser   ra   rb   ZBaseViewr   r$   r$   r$   r%   <module>   s   