U
    j*g4                     @   s>   d dl T ddlmZ d dlmZmZmZ G dd dejZdS )    )*   )cmf_session)datetime	timedeltatimezonec                       s   e Zd Zi Zeeje	j
ddgZeed< ejf eZdZddddgZed	d
dZeed	ddZeddddedddZdd ZedddedddZ fddZeedddZed d! Zd"d# Z  ZS )$
CmfSessionZcmfZ	templatesloaderTtfa_check_codetfa_send_codeswitch_userswitch_disable)returnc                 C   s   | j jdd }t|S )N:   )idvaluesplitcmfutilZcrypt)selfmessage r   ./cmf/models/cmf_session.py	get_token   s    zCmfSession.get_tokenc           	   
   C   s  zt |}W n   td Y dS X tjjd| dddgd}|rtt	j
}||jt|jjd td	d
 kr|jr|dg |j|}nd|_|  |  |jrtd|j d tjjdddd|j|j|jd	d dS tjdd}|jj|_|jj|_|jj|_|jstjrtjj|jkrd}tj D ]:}|!drBt j"|dgd}|dt#j$ d|j% 7 }qB||_d|_&d|_'td|j d|j d|j'  ||fS dS )NuD   Не удалось расшифровать токен сессии)NNzCmfSession:Fr   plugin)r   expiredfieldsZsecondsr   )Zminuteszplugin.plugin.*Tu&   Сессия пользователя u    истеклаZlogoutCmfAuthok)operatecmf_model_nameresult_statuscurrent_transactionparent_nameparent_codeparentsecurity_level)empty zCmfPersonGroup:code)r    r   zfrom_session_token: jwt is ok, z, z, is_local=)(r   decryptgdebugmodelsr   getr   nowr   utcreauth_dater   access_token_expires_inr   r   load_fieldsZrefresh_tokenr   saveswitch_check_timeout
user_loginCmfAuditaudit_eventuser_idr   login
user_emailemailZ
user_scopescopecurrent_usercurrent_person__member_of
startswithZget_obj_by_idconfigZORG_NAMEr*   Zjwt_is_supportZjwt_is_match_org)	clsZsession_tokenZdecrypted_tokensessionr1   objr?   Zgroup_idgroupr   r   r   
from_token   sT    
"
   


 
"zCmfSession.from_tokenNany)two_factor_optmethodrE   )rJ   c                    s8  s
t j fdd} fdd}dd ldddg tjjjd	d
dgdjstt	d d d S | s
 } | r4jrʈj j  dk rt	ddj j     d S dfddtdD _j    | dkr|  |  n"| dkr$|  n| dkr4|  d S )Nc                     sX    dks dkrTj js0td ddd d S tj } | j jjj d d S )NrI   phone   У абонента u.    не указан номер телефонаTabortu&    ваш проверочный код.)	
two_factorrL   	cmf_alertr/   ZCmfPluginSMSGateZget_local_smsgatesend_messageZnumbersms_code)Zsms_gaterK   personrE   r   r   send_smsM   s    
z*CmfSession.tfa_send_code.<locals>.send_smsc                     sp    dks dkrlj js0td ddd d S jd} | jjd}tj	 }|j
j jj|d	d
 d S )NrI   r>   rM   u    не указан emailTrN   ztfa_mail.html)Ztfa_coderU   uJ   Код безопасности для учетной записи EvaTeam)Zsubject)rP   r>   rQ   
_jinja_envZget_templateZrenderrS   r/   ZCmfPluginMailBoxZget_local_mailboxrR   r   )templateZ
email_bodyZmail_boxrT   r   r   
send_emailU   s    
  z,CmfSession.tfa_send_code.<locals>.send_emailr   sms_send_timerS   r;   two_factor.*two_factor.two_factor_optr   r   r   u   У пользователя u    не настроена 2FA   uK   Следующая отправка будет доступна через r)   c                 3   s   | ]}t  d dV  qdS )r   	   N)strZrandint).0_)randomr   r   	<genexpr>o   s     z+CmfSession.tfa_send_code.<locals>.<genexpr>   rI   Zsmsr>   )r-   rE   rc   r5   r/   	CmfPersonr0   r;   rP   rQ   get_two_factor_optrZ   r1   Ztotal_secondsjoinrangerS   set_nowr6   )rJ   rK   rE   argskwargsrV   rY   r   )rK   rU   rc   rE   r   r   I   s8    



zCmfSession.tfa_send_codec                 C   s   ddl m} | jrd S | jtjjjkr.tj}ntj	j
| jdddgd}| r|jr`tjjs`d S dtji}||}tt  d| }d	tj |jd
< d|jd< d|jd< |S d S )Nr   )	urlencodeis_adminZ
is_supportr\   r]   Znext_urlzauth/two-factor?zhttps://zAccess-Control-Allow-Origintruez Access-Control-Allow-CredentialszContent-Type, x-ijtzAccess-Control-Allow-Headers)urllib.parserm   checkedr;   r-   r@   r   r   r/   rf   r0   rg   rn   global_settingsZtwo_factor_adminZrequesturlZredirectZauth_base_hrefrC   ZAPP_FQDNZheaders)r   rm   rU   paramsqsrr   r   r   tfa_check_two_factorz   s&     


zCmfSession.tfa_check_two_factorrL   )rK   rE   r*   c          
   	   O   s  dd l }|stj}tjj|jddgd}d}|d kr\dD ]"}t|j|r8|	dd } q\q8|snt
d| | jd	7  _|j  |j| k }rd
|_nB|jjrt  ||jj }	W 5 Q R X |	|  }rd
|_|rt|j| dd
 |j  |  |S )Nr   r[   r   r]   F)Zapplication_verifiedZemail_verifiedZphone_verifiedrb   u   Необходимо указать метод авторизации по которому происходит проверка method=r   TZ	_verified)pyotpr-   rE   r/   rf   r0   r;   getattrrP   r   AssertionErrorZsms_try_countZsms_try_timerj   rS   rq   Ztopt_secretr   Zdisable_aclZTOTPr,   Zverifysetattrr6   )
r*   rK   rE   rk   rl   ry   rU   resultmZtotpr   r   r   r
      s2    


zCmfSession.tfa_check_codec                    s   d }| j r(| jt| j jd }|d}d }| jrP| jt| jjd }|d}| jrtj	j
ddt| jt| jddd| j| jd	 td	| j d
| d|  ntd| j d
| d|  | js| j| _t j||S )Nr   z%Y-%m-%d %H:%M:%S %Z%zZlogin_successedr   r   Tr   )	r    r!   Z
cmf_authorr&   r"   r#   r'   r$   r%   u-   Создали новую сессию login=u   , время жизни до u)   , обновление токена до u$   Обновили сессию login=)r4   r3   r   r   strftimeZlifetimeZ	auth_dateZis_newr/   r9   r:   r`   r;   r8   r-   r.   real_user_idsuperr6   )r   rk   rl   Zrefresh_untilZlifetime_until	__class__r   r   r6      s2    

       zCmfSession.save)r;   c                 O   s   t jj| tjd}|stdt jjdd}|jtj	krDt
d dS t jjdd}t jj|jdd	}|j|krzt
d
 dS tjjtj_tjj  |jtj_|jtj_|jtj_|jr|jjrdtj_tj  tjjdkrt jj|dtjj dddd dS )u   Метод переключает пользователя в текущей сессии

        Args:
            user_id (str): ИД пользователя на которого хотим переключиться
        r]   u5   Пользователь не найден id=user_idZSuAvailablerx   uH   Пользователь не состоит в группе SuAvailableNZ	SuExcludeT)Z
subject_idZid_onlyun   На этого пользователя нельзя переключится, он в группе SuExclude)Zon_session_starton_session_start_and_end   Пользователь u$    вошел в ваш аккаунтr)   rU   namemsgZforce_notify_current_person)r/   rf   sgetZAPPZcurrent_person_fieldsr{   ZCmfPersonGroupr   r-   rA   rQ   ZCmfAccessListZsubject_full_group_listrE   r;   r   switch_user_daterj   r<   r8   r>   r=   rP   rJ   rq   r6   rr   	su_notify	CmfNotifyplace_notifycurrent_person)r;   rk   rl   userZsu_availableZ
su_excludeZuser__member_ofr   r   r   r      s4    




zCmfSession.switch_userc                  O   s   t jjrt jjt jjkrdS tjjt jjdddgd}|jt j_|j	t j_
|jt j_dt j_t j  t jjdkrtjjt jd|j dd	d
d dS )u)   Выключаем SU режим
        Nz--r<   r>   r]   )Zon_session_endr   r   u.    вышел из вашего аккаунтаr)   Tr   )r-   rE   r   r;   r/   rf   r   r<   r8   r>   r=   r   r   r6   rr   r   r   r   r   )rk   rl   Z	real_userr   r   r   r      s    



zCmfSession.switch_disablec                 C   s>   t tj}| jr:|| jttjjj	d kr:d| _
|   dS )u   Отключаем сессию если вышел таймаут на перключение пользователя
        r   TN)r   r1   r   r2   r   r   r-   rr   Zsu_session_time_limitr   r   r6   )r   r1   r   r   r   r7      s     zCmfSession.switch_check_timeout)__name__
__module____qualname__Z_optionsZjinja2ZFileSystemLoaderospathrh   rC   ZPROJECT_DIRZ_loaderZEnvironmentrW   Z	api_allowZapi_methodsr`   r   classmethodrH   staticmethodr   rw   r
   r6   r   r   r7   __classcell__r   r   r   r   r      s0   00%
r   N)Zcmf.includer   r   r   r   r   r   r   r   r   r   <module>   s   