U
    _gS7                     @   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d%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_tokenFc           
   
   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s|rtjrtjj|jkrd}tj D ]D}|!drHt j"|dgd}	|	srqH|dt#j$ d|	j% 7 }qH||_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require_scopesZdecrypted_tokensessionr1   objr?   Zgroup_idgroupr   r   r   
from_token   sX    
"
   


	&
"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_messagenumbersms_code)Zsms_gaterK   personrE   r   r   send_smsT   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_coderV   uJ   Код безопасности для учетной записи EvaTeam)Zsubject)rP   r>   rQ   
_jinja_envZget_templateZrenderrT   r/   ZCmfPluginMailBoxZget_local_mailboxrR   r   )templateZ
email_bodyZmail_boxrU   r   r   
send_email\   s    
  z,CmfSession.tfa_send_code.<locals>.send_emailr   sms_send_timerT   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>v   s     z+CmfSession.tfa_send_code.<locals>.<genexpr>   rI   Zsmsr>   )r-   rE   rd   r5   r/   	CmfPersonr0   r;   rP   rQ   get_two_factor_optr[   r1   Ztotal_secondsjoinrangerT   set_nowr6   )rJ   rK   rE   argskwargsrW   rZ   r   )rK   rV   rd   rE   r   r   P   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.parsern   checkedr;   r-   r@   r   r   r/   rg   r0   rh   ro   global_settingsZtwo_factor_adminZrequesturlZredirectZauth_base_hrefrC   ZAPP_FQDNZheaders)r   rn   rV   paramsqsrr   r   r   tfa_check_two_factor   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_verifiedrc   u   Необходимо указать метод авторизации по которому происходит проверка method=r   TZ	_verified)pyotpr-   rE   r/   rg   r0   r;   getattrrP   r   AssertionErrorZsms_try_countZsms_try_timerk   rT   rr   Ztopt_secretr   Zdisable_aclZTOTPr,   Zverifysetattrr6   )
r*   rK   rE   rl   rm   rz   rV   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:   ra   r;   r8   r-   r.   real_user_idsuperr6   )r   rl   rm   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SuAvailablery   uH   Пользователь не состоит в группе SuAvailableNZ	SuExcludeT)Z
subject_idZid_onlyun   На этого пользователя нельзя переключится, он в группе SuExclude)Zon_session_starton_session_start_and_end   Пользователь u$    вошел в ваш аккаунтr)   rV   namemsgZforce_notify_current_person)r/   rg   sgetZAPPZcurrent_person_fieldsr|   ZCmfPersonGroupr   r-   rA   rQ   ZCmfAccessListZsubject_full_group_listrE   r;   r   switch_user_daterk   r<   r8   r>   r=   rP   rJ   rr   r6   rs   	su_notify	CmfNotifyplace_notifycurrent_person)r;   rl   rm   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/   rg   r   r<   r8   r>   r=   r   r   r6   rs   r   r   r   r   )rl   rm   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-   rs   Zsu_session_time_limitr   r   r6   )r   r1   r   r   r   r7     s     zCmfSession.switch_check_timeout)F)__name__
__module____qualname__Z_optionsZjinja2ZFileSystemLoaderospathri   rC   ZPROJECT_DIRZ_loaderZEnvironmentrX   Z	api_allowZapi_methodsra   r   classmethodrH   staticmethodr   rx   r
   r6   r   r   r7   __classcell__r   r   r   r   r      s0   70%
r   N)Zcmf.includer   r   r   r   r   r   r   r   r   r   <module>   s   