U
    *fx                     @   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edddZeedddZded
ddZdd ZededddZ fddZ  ZS )
CmfSessionZ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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   plugin)r   Zexpiredfields)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_fieldsr   Zrefresh_tokenCmfAuth
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
dgd  jsftd  d d S |sr  }|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kr&|  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_factor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_email3   s    
  z,CmfSession.tfa_send_code.<locals>.send_emailr   sms_send_timer/   user_idtwo_factor.*two_factor.two_factor_optr   r   r   u   У пользователя u    не настроена 2FA   uK   Следующая отправка будет доступна через  c                 3   s   | ]}t  d dV  qdS )r   	   N)strZrandint).0_)randomr   r   	<genexpr>L   s     z+CmfSession.tfa_send_code.<locals>.<genexpr>   anyZsmsr"   )rA   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   rA   r   r   tfa_send_code+   s4    




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j d| }tj
d	d
|jd< d|jd< d|jd< |S d S )Nr   )	urlencodeis_adminZ
is_supportr9   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.parserL   checkedr7   r   Zcurrent_userr   r   r   rE   r   rF   rM   Zglobal_settingsZtwo_factor_adminZrequestZurlZredirectconfigZAUTH_SERVER_URLZheaders)r   rL   r1   paramsZqsrr   r   r   tfa_check_two_factorW   s&     


zCmfSession.tfa_check_two_factorr,   )codec              	   C   s   dd l }tj jd7  _tjj  tjjtjj	ddgd}tjj
| krRdtj_n@|jjrt  ||jj }W 5 Q R X || rdtj_tjjrt|j| dd |j  tj  tjjjS )Nr   r   r8   r   r:   TZ	_verified)pyotpr   r$   Zsms_try_countZsms_try_timerI   r   rE   r   r7   r/   rO   r+   Ztopt_secretr   Zdisable_aclZTOTPr   ZverifysetattrrJ   r   )rT   methodrU   r1   Ztotpr   r   r   tfa_check_codek   s     




zCmfSession.tfa_check_codec                    s<   t jjddt| jt| jddd| j| jd	 t j||S )NZlogin_successedr    okTr   )	ZoperateZcmf_model_nameZ
cmf_authorparentZresult_statusZcurrent_transactionZsecurity_levelparent_nameZparent_code)r   ZCmfAuditZaudit_eventr>   r7   r!   superrJ   )r   argskwargs	__class__r   r   rJ      s          zCmfSession.save)N)r,   )__name__
__module____qualname__Z_optionsZjinja2ZFileSystemLoaderospathrG   rP   ZPROJECT_DIRZ_loaderZEnvironmentr3   r>   r   classmethodr&   rK   rS   staticmethodrX   rJ   __classcell__r   r   r_   r   r      s   ,r   N)Zcmf.includer   r   r   r   r   r   r   r   r   r   <module>   s   