U
    ch2                     @   s   d dl Z 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 G dd dejjeZdS )	    N)abort)rollback_all_ds)*)normalize_email_address)ResponseMixinc                   @   s   e Zd ZdZdZdd Zd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/signin   c                 C   s4   t jd}|s0t jr0tt j}|r0|d}|S )Naccess_token)requestcookiesgetdataujsonloads)selfr	   Zjson_res r   ./modules/auth/views/signin.py_get_access_token   s    

zSigninView._get_access_tokenc                 C   s   |   }|rtj|S d S )N)r   modelsCmfAuthZrsa_verify_unpack_jwt)r   r	   r   r   r   _jwt_from_request   s    zSigninView._jwt_from_requestc                 C   s8  dd l }ddlm} |  }|rnz0|d d }|d d }t|d d }d}W n6 ttttfk
r   t	
d d }d }d}d	}Y nX d }|sd	}|rtjj|dgd
}|sd	}|r|j|krd	}|rhtj tj| j}	|	dk rdtjkrhtd| d| dtjd   nLd|	  kr6tjk rhn n.ttdtjkrTtjd nd}
| |
|S t  d }tjd}d}|rtj|\}}|dgd}|r|sttdtjkrtjd nd}
| |
|S tj  }g }tj!j"ddd	gddgdD ] }|#t$|j%|&|d qt'|}| (dS )Nr   )get_flashed_messagesZpayloadloginscopeexpTzjwt value errorFr   fieldsnext_urlz !!! Maybe Cycle Redirect: login=z, scope=z
 next_url=/session_tokenZ
auth_error)Zcategory_filterZdisabledz==r   zplugin.*)filterr   )nameZ	login_urlzsignin.html))htmlflaskr   r   int
ValueError	TypeErrorAttributeErrorKeyErrorlogging	exceptionr   r   r   r   datetimenowZfromtimestampdaysr
   valuesprintr   prolong_daysmake_responseredirect_okr   r   Z
CmfSessionZ
from_tokenconfigIS_BOX_VERSIONZCmfAuthOpenIdPluginlistappenddictr!   Zget_redirect_urllenZrender)r   r"   r   Zjwtr   r   r   Zjwt_okauthZexpired_daysresponser   r   Z_sessionmessagesZshow_register_buttonZsso_buttonsZpluginZsso_buttons_countr   r   r   r   "   sn    



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_failedr   zRequire captcha)r   reasonZfailT   	ZoperateZcmf_model_nameparentZ
audit_dataZresult_statusZcurrent_transactionZsecurity_levelparent_nameZparent_codei  zBad captcha)gglobal_settings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_captchai   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)rG   rH   rI   r   r
   r.   rJ   rK   existsr#   rV   Zcaptcha.imagerW   r   rT   Zgenerate)r   r   rV   rW   r=   Zimager   r   r   r   captcha_img   s    
zSigninView.captcha_imgc                 C   s  dd l }|jtjd }d|kr*t|}tjd }| | t p t	j
||}t	j
j  |si }tjrtjd |d< td| d}|jrt |jkrd	}tjjr|jr|jtjtjjjd
 }||j k rd	}|rztjdd }tjdd }	|r|	s6t	jjddd d|idd	d||d	 td |||	 |jrPd |_t	jjddd d|idd	d||d	 |  tjdd}
tt d|j|
i}| !||W  5 Q R  S Q R X d S )Nr   r   @challenge_respmessage  FT)r-   Znew_password_hashZnew_password_saltZpassword_expiredr   password_expires_must_changerC   rD   i  Zpassword_changed   r   r   Zredirect_url)"urllibparseunquoter
   r.   r   rU   cmfutildisable_aclr   r   get_by_challenge_respdpcommitrG   alertr   r_   timerH   Zpassword_max_daysZpassword_changed_dater+   Z	timedeltavaluer,   r   rR   rS   Zset_pass_hashZsaver1   Zjsonifyr3   )r   ra   r   r[   r:   abort_kwargsZneed_change_passwordZexpire_datehashZsaltr   r;   r   r   r   post   sf    



    
    zSigninView.postc                 C   s   dS )Nr?   r   )r   r   r   r   get_server_challenge   s    zSigninView.get_server_challengec                 C   sZ  t jstd tdS t jjj}tjj	|ddgd}|sBtdS |j
jrftd | jtd|d	S td
d |j
j D }|std | jtd|d	S t|dkrtd t|D ]}td|r|| qt|dkr>td | }td| tj }tjr0tj|r0tdtj }| j||d	S td | jtd|d	S )uu    Определить по куке куда отправить пользователя автоматически. u7   1. Нет куки - форма авторизации.z/auth/signinr   r   r   z"/auth/signout?next_url=auth/signinuO   2.1. У пользователя нет scope - форма создания VM.z/auth/assign)r:   c                 S   s   g | ]}| d d qS ):r   )split).0r   r   r   r   
<listcomp>   s     z&SigninView.proceed.<locals>.<listcomp>uO   2.2. У пользователя нет scope - форма создания VM.r`   ur   3.2. У пользователя два scope, проверим, не системный ли один из нихz^acrm[0-9]{5,6}$rC   uo   3. У пользователя один единственный scope - на эту CRM и отправить.zhttps://uc   4. У пользователя несколько scope - отправить на список CRM.r   )rG   r:   r)   infor2   Zemailrk   r   r   r   r   Zis_nullr3   rQ   rq   r9   rematchdiscardpopr4   ZAUTH_SESSION_COOKIE_DOMAINr5   
startswith)r   r   r:   Zscopesr   r;   r   r   r   proceed   s8    






zSigninView.proceedc              	   C   st   t tjd }tjd }t F tj||}tjj	  |sbi }t
jrXt
jd |d< td| W 5 Q R X | S )u>   
            Ручка для авторизации
        r   passwordr\   r]   r^   )r   r
   r.   rd   re   r   r   rf   rg   rh   rG   ri   r   Zrsa_sign_pack_jwt)r   r   r{   r:   rl   r   r   r   signin_with_login_password   s    

z%SigninView.signin_with_login_passwordN)__name__
__module____qualname__Z__url__r0   r   r   cmfviewsactionr   rU   rY   rn   ro   rz   r|   r   r   r   r   r      s"   
F

7

%r   )r+   urllib.parsera   r   rM   rO   rj   r#   r   Zcmf.data_providers.baser   Zcmf.includeZmodules.auth.models.emailr   Zmodules.auth.views.responser   r   r   ZBaseViewr   r   r   r   r   <module>   s   