U
    VPd                     @   sn   d dl mZ d dlT ddlmZ d dlmZmZmZmZmZ d dl	m
Z
 d dlZd dlZG dd	 d	ejZdS )
    )fields)*   )cmf_session)datedatetime	timedeltatimezonetime)AESNc                   @   s   e Zd Zi Zeeje	j
ddgZeed< ejf eZedddZeedddZded
ddZdd ZeedddZd	S )
CmfSessioncmfZ	templatesloader)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gd}|rtt	j
}||jt|jjd kr|dg |j|}|rtjd	d
}|jj|_|jj|_|jj|_d|_d	|_td|j d|j d|j  ||fS dS )NuD   Не удалось расшифровать токен сессии)NNzCmfSession:Fr   )r   Zexpiredr   )Zsecondszplugin.plugin.*T)emptyzfrom_session_token: jwt is ok, z, z, is_local=)r   decryptgdebugmodelsr   getr   nowr	   ZutcZreauth_dater   Zaccess_token_expires_inr   load_fieldsZpluginZrefresh_tokenZCmfAuthZ
user_loginZloginZ
user_emailemailZ
user_scopeZscopeZjwt_is_supportZjwt_is_match_org)clsZsession_tokenZdecrypted_tokensessionr!   objr   r   r   
from_token   s*    



"zCmfSession.from_tokenN)two_factor_optc                    s   fdd} fdd}dd l dddg tjjjd	d
gd  jsdtd  d d S |sp  }|r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 S )Nc                     sH    j js td  ddd d S tj } |  j jjj d d S )N   У абонента u.    не указан номер телефонаTabortu&    ваш проверочный код.)	
two_factorZphone	cmf_alertr   ZCmfPluginSMSGateZget_local_smsgatesend_messageZnumbersms_code)Zsms_gatepersonr   r   r   send_sms.   s
    
z*CmfSession.tfa_send_code.<locals>.send_smsc                     s`    j js td  ddd d S jd} | jj d}tj	 }|j
 j jj|dd d S )	Nr)   u    не указан emailTr*   ztfa_mail.html)Ztfa_coder1   uJ   Код безопасности для учетной записи EvaTeam)Zsubject)r,   r#   r-   
_jinja_envZget_templateZrenderr/   r   ZCmfPluginMailBoxZget_local_mailboxr.   r   )templateZ
email_bodyZmail_boxr0   r   r   
send_email4   s    
z,CmfSession.tfa_send_code.<locals>.send_emailr   sms_send_timer/   user_idtwo_factor.*r   r   r   u   У пользователя u    не настроена 2FA   uK   Следующая отправка будет доступна через  c                 3   s   | ]}t  d dV  qdS )r   	   N)strZrandint).0_)randomr   r   	<genexpr>I   s     z+CmfSession.tfa_send_code.<locals>.<genexpr>   anyZsms)r@   r"   r   	CmfPersonr    r7   r,   r-   get_two_factor_optr6   r!   Ztotal_secondsjoinranger/   set_nowsave)r   r(   r2   r5   r   )r1   r@   r   r   tfa_send_code-   s.    "


zCmfSession.tfa_send_codec                 C   s   ddl m} | jrd S tjj| jd}| rdtj	i}||}t
tj d| }tjdd|jd< d	|jd
< d|jd< |S d S )Nr   )	urlencode)r   Znext_urlz/auth/two-factor?ZOriginr   zAccess-Control-Allow-Origintruez Access-Control-Allow-CredentialszContent-Type, x-ijtzAccess-Control-Allow-Headers)Zurllib.parserK   checkedr   rD   r    r7   rE   ZrequestZurlZredirectconfigZAUTH_SERVER_URLZheaders)r   rK   r1   paramsZqsrr   r   r   tfa_check_two_factorT   s    


zCmfSession.tfa_check_two_factor)codec              	   C   s   dd l }tj jd7  _tjj  tjj| kr:dtj_nXtj	j
tjjddgd}|jjrt  ||jj }W 5 Q R X || rdtj_tj  tjjjS )Nr   r   Tr8   r   r9   )pyotpr   r%   Zsms_try_countZsms_try_timerH   r/   rM   r   rD   r    r7   r,   Ztopt_secretr   Zdisable_aclZTOTPr   ZverifyrI   r   )rR   rS   r1   Ztotpr   r   r   tfa_check_codeb   s    



zCmfSession.tfa_check_code)N)__name__
__module____qualname__Z_optionsZjinja2ZFileSystemLoaderospathrF   rN   ZPROJECT_DIRZ_loaderZEnvironmentr3   r=   r   classmethodr'   rJ   rQ   staticmethodrT   r   r   r   r   r      s   'r   )r   r   Zcmf.includer   r   r   r   r	   r
   ZCrypto.Cipherr   Zbinasciibase64r   r   r   r   r   <module>   s   