U
    X(i                      @   s~   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}tj	dd}|j
|}t|sTd}|rhtj|\}}|dgd}|r|stt|}	| |	|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_url/Z
auth_error)Zcategory_filterZservicedesk_supportz==TZdisabledFr   zplugin.*)filterfields)nameZ	login_urlzsignin.html)urllibflaskr	   gglobal_settingsZservicedesk_allow_auth_guestsrequestZcookiesgetvaluesparseunquotecmfutilis_safe_next_url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      s0    

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 td | }|r||krtjj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fail   ZoperateZcmf_model_nameparentZ
audit_dataZresult_statusZsecurity_levelparent_nameZparent_codei  r$   zBad captcha)r   r   auth_check_captchar   r   r   lower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+   s8    
   
   zSigninView._auth_check_captchac                 C   s   t jjsd S dd l}|jtjd }d|kr6t|}t	j
d|  sPd 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   r5   r   r   r   r   r   r   r7   r8   existsr6   r   rD   Zcaptcha.imagerE   r   rA   Zgenerate)r#   r   r/   rD   rE   r)   Zimagedatar'   r'   r(   captcha_imgG   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| | r tjdd }tjd	d }|r|st	jjd
dd d|idd||d td ||| |jrd |_t	jjddd d|idd||d |  tjdd}|j|}t|sJd}ttd|i}	| |	|W  5 Q R  S Q R X d S )Nr   r/   rC   challenge_respmessage  Znew_password_hashZnew_password_saltZpassword_expiredr.   password_expires_must_changer1   r2   i  Zpassword_changed   r   r   Zredirect_url)r   r   r   r   r   r   rB   r   Zdisable_aclr   r.   get_by_challenge_respdpcommitr   alertr   Zneed_change_passwordr   r?   r@   Zset_pass_hashrM   Zsaver   r   Zjsonifyr   )
r#   r   r/   rI   r$   abort_kwargshashsaltr   r&   r'   r'   r(   post\   sZ    




   
   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/   passwordrJ   rK   rL   )r   r   r   r   r.   rO   rP   rQ   r   rR   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   rB   rH   rV   rX   rZ   r]   r'   r'   r'   r(   r      s   


2

r   )ZdatetimeZujsonr:   r<   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   