
    #h7                     T    d dl T ddlmZ d dlmZmZmZ  G d dej                  ZdS )    )*   )cmf_session)datetime	timedeltatimezonec                   n    e Zd Zi Ze                    ej                            e	j
        dd          g          Zeed<    ej        di eZdZg dZdefdZeddefd	            Zed
dd
ddefd            Zd Zedd
ddefd            Z fdZedefd            Zed             Zd Z xZS )
CmfSessioncmf	templatesloaderT)tfa_check_codetfa_send_codeswitch_userswitch_disablereturnc                     | j         j                            d          d         }t                              |          S )N:   )idvaluesplitcmfutilcrypt)selfmessages     ./cmf/models/cmf_session.py	get_tokenzCmfSession.get_token   s0    '-%%c**1-}}W%%%    Fc           
      b   	 t                               |          }n"#  t                              d           Y dS xY wt          j                            d| dddg          }|rFt          j        t          j
                  }||j        t          |j        j                  z   t          d	
          z
  k    rS|j        r1|                    dg           |j                            |          }nd|_        |                                 |                                 |j        r[t                              d|j         d           t          j                            dddd|j        |j        |j        d	           dS t                              d          }|j        j        |_        |j        j        |_        |j        j        |_        |j        s|rt          j        rt          j        j        |j        k    rgd}t          j         D ]Q}|!                    d          r:t           "                    |dg          }	|	s7|dtF          j$         d|	j%         z  }R||_        d|_&        d|_'        t                              d|j         d|j         d|j'                    ||fS dS )NuD   Не удалось расшифровать токен сессии)NNzCmfSession:Fr   plugin)r   expiredfieldssecondsr   )minuteszplugin.plugin.*Tu&   Сессия пользователя u    истекла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_fieldsrefresh_tokenr"   saveswitch_check_timeout
user_loginCmfAuditaudit_eventuser_idr(   login
user_emailemail
user_scopescopecurrent_usercurrent_person__member_of
startswithget_obj_by_idconfigORG_NAMEr4   jwt_is_supportjwt_is_match_org)
clssession_tokenrequire_scopesdecrypted_tokensessionr;   objrK   group_idgroups
             r   
from_tokenzCmfSession.from_token   s   	%oom<<OO	GGZ[[[::#''+J+J+JTYcfhpbq'rr ,	 ,x|,,Cg)Ig>]>c,d,d,ddgpyzg{g{g{{{{> #''):(;<<<%n::7CCGG '+GOLLNNN((*** "dASdddeee++HY"&D ' 2@R"?1 , > > > "z..t.,,C*0CI*0CI*0CI 9 	" 	"AN 	"q~G[_b_hGhGh ! ; D DH**+<== D ' 5 5hx 5 P P$ %$!CV_!C!Cuz!C!CC!	!&C#'C GGocioo39ooY\Ymooppp<zs    <Nany)two_factor_optmethodrX   r^   c                    st           j        fd}fd}dd l                    g d           t          j                            j        g d          j        st          d d           d S | s
                                } | r&j        rj                                        j        z
                                  d	k     rHt          d
d	j                                        j        z
                                  z
              d S d                    fdt          d          D                       _        j                                                                          | dk    r |              |             d S | dk    r |             d S | dk    r |             d S d S d S )Nc                      dk    sdk    rpj         j        st          d dd           d S t          j                                        } |                     j         j        j        j         d           d S d S )Nr]   phone   У абонента u.    не указан номер телефонаTabortu&    ваш проверочный код.)	
two_factorrb   	cmf_alertr9   CmfPluginSMSGateget_local_smsgatesend_messagenumbersms_code)sms_gater_   personrX   s    r   send_smsz*CmfSession.tfa_send_code.<locals>.send_smsT   s    &G"3"3(. kVkkkswxxxxF!2DDFF%%f&7&=&DIY  GB  GB  GB  C  C  C  C  C #4"3r   c                  `   dk    sdk    rj         j        st          d dd           d S j                            d          } |                     j                  }t          j        	                                }|
                    j         j        j        |d	
           d S d S )Nr]   rI   rc   u    не указан emailTrd   ztfa_mail.html)tfa_codern   uJ   Код безопасности для учетной записи EvaTeam)subject)rf   rI   rg   
_jinja_envget_templaterenderrl   r9   CmfPluginMailBoxget_local_mailboxrj   r   )template
email_bodymail_boxr_   rn   rX   s      r   
send_emailz,CmfSession.tfa_send_code.<locals>.send_email\   s    &G"3"3(. UVUUU]abbbbF"-::?KK%__g6Fv_VV
!2DDFF%%%+1:  HT & U U U U U #4"3r   r   )sms_send_timerl   rF   )two_factor.*two_factor.two_factor_optr   r   r#   u   У пользователя u    не настроена 2FA   uK   Следующая отправка будет доступна через r3   c              3   ^   K   | ]'}t                              d d                    V  (dS )r   	   N)strrandint).0_randoms     r   	<genexpr>z+CmfSession.tfa_send_code.<locals>.<genexpr>v   s9      &S&SQs6>>!Q+?+?'@'@&S&S&S&S&S&Sr      r]   smsrI   )r7   rX   r   r?   r9   	CmfPersonr:   rF   rf   rg   get_two_factor_optr|   r;   total_secondsjoinrangerl   set_nowrA   )	r^   r_   rX   argskwargsro   r{   rn   r   s	    ``    @@r   r   zCmfSession.tfa_send_codeP   sM    	 iG	C 	C 	C 	C 	C 	C 	C		U 		U 		U 		U 		U 		U 		U 	DDDEEE!%%AsAsAs%tt  	YVYYYZZZF 	9#6688N 	$ '*?*C*C*E*EH]*])l)l)n)nqs)s)sdW266887;PP__aaad de e e !ww&S&S&S&S%PQ((&S&S&SSSG!))+++LLNNN&&





5((




7**
!	 	 +*r   c                 >   ddl m} | j        rd S | j        t          j        j        j        k    rt          j        }n(t          j	        
                    | j        g d          }|                                r|j        rt          j        j        sd S dt          j        i} ||          }t#                       d| }t          j        dk    rt#                       d| }t'          |          }d	t(          j         |j        d
<   d|j        d<   d|j        d<   |S d S )Nr   )	urlencode)is_admin
is_supportr~   r   next_urlzauth/two-factor?sd_apizservicedesk/auth/two-factor?zhttps://zAccess-Control-Allow-Origintruez Access-Control-Allow-CredentialszContent-Type, x-ijtzAccess-Control-Allow-Headers)urllib.parser   checkedrF   r7   rL   r   r   r9   r   r:   r   r   global_settingstwo_factor_adminrequesturlauth_base_href	api_scoperedirectrP   APP_FQDNheaders)r   r   rn   paramsqsr   rs          r   tfa_check_two_factorzCmfSession.tfa_check_two_factor   sC   ******< 	F<1>,222^FF%))<(_(_(_ * a aF$$&& 	 q'8'I  '+.F6""B#%%;;r;;C{h&&'))KKrKKA7S&/7S7SAI34<BAI898MAI45H	 	r   rb   )r_   rX   r4   c                2   dd l }|st          j        }t          j                            |j        ddg          }d}|7dD ]4}t          |j        |          r|	                    d          d         } n5|sJ d|             |xj
        d	z  c_
        |j                                         |j        | k    x}rd
|_        n|j        j        rt                                           5  |                    |j        j                                                  }	d d d            n# 1 swxY w Y   |	                    |           x}rd
|_        |r2t+          |j        | dd
           |j                                         |                                 |S )Nr   r}   r   r   F)application_verifiedemail_verifiedphone_verifiedr   u   Необходимо указать метод авторизации по которому происходит проверка method=r   T	_verified)pyotpr7   rX   r9   r   r:   rF   getattrrf   r   sms_try_countsms_try_timer   rl   r   topt_secretr   disable_aclTOTPr6   verifysetattrrA   )
r4   r_   rX   r   r   r   rn   resultmtotps
             r   r   zCmfSession.tfa_check_code   s!    	 iG!%%.RUAV%WW>Q  6,a00 WWS\\!_FE   	l  	l  l  dj  l  l  	l  	l  	l"$$&&&%--6 	+"GOO , +((** O O ::f&7&C&K&K&M&MNNDO O O O O O O O O O O O O O O![[...6 +&*GO 	%F%&';';';TBBB""$$$s   (2D&&D*-D*c                    d }| j         r7| j        t          | j         j                  z   }|                    d          }d }| j        r7| j        t          | j        j                  z   }|                    d          }| j        rt          j	        
                    ddt          | j                  t          | j                  ddd| j        | j        	  	         t                              d	| j         d
| d|            n(t                              d| j         d
| d|            | j        s| j        | _         t#                      j        |i |S )Nr$   z%Y-%m-%d %H:%M:%S %Z%zlogin_successedr(   r)   Tr   )	r*   r+   
cmf_authorr0   r,   r-   r1   r.   r/   u-   Создали новую сессию login=u   , время жизни до u)   , обновление токена до u$   Обновили сессию login=)r>   r=   r   r   strftimelifetime	auth_dateis_newr9   rD   rE   r   rF   rC   r7   r8   real_user_idsuperrA   )r   r   r   refresh_untillifetime_until	__class__s        r   rA   zCmfSession.save   s   ' 	M!-	$B^Bd0e0e0eeM)223KLLM= 	O"nyAT/U/U/UUN+445MNNN; 	sO''))PSTXT`PaPa4<((RVgh O ( J J J
 GG  {DO  {  {  sA  {  {  ly  {  {  |  |  |  |GG  r4?  r  riw  r  r  cp  r  r  s  s  s  	- $Duww|T,V,,,r   rF   c                    t           j                            | t          j                  }|s
J d            t           j                            d          }|j        t          j        vrt          d           dS t           j                            d          }t           j
                            |j        d	          }|j        |v rt          d
           dS t          j        j        t          j        _        t          j        j                                         |j        t          j        _        |j        t          j        _        |j        t          j        _        |j        r|j        j        rdt          j        _        t          j                                         t          j        j        dv r8t           j                            |dt          j        j         ddd           dS dS )u   Метод переключает пользователя в текущей сессии

        Args:
            user_id (str): ИД пользователя на которого хотим переключиться
        r   u5   Пользователь не найден id=user_idSuAvailable)r4   uH   Пользователь не состоит в группе SuAvailableN	SuExcludeT)
subject_idid_onlyun   На этого пользователя нельзя переключится, он в группе SuExclude)on_session_starton_session_start_and_end   Пользователь u$    вошел в ваш аккаунтr3   rn   namemsgforce_notify_current_person)r9   r   sgetAPPcurrent_person_fieldsCmfPersonGroupr   r7   rM   rg   CmfAccessListsubject_full_group_listrX   rF   r   switch_user_dater   rG   rC   rI   rH   rf   r^   r   rA   r   	su_notify	CmfNotifyplace_notifycurrent_person)rF   r   r   usersu_available
su_excludeuser__member_ofs          r   r   zCmfSession.switch_user   s    $$8Q$RRMMMMMM,11}1EE?!"===`aaaF*//[/AA
 .FFRVRYcgFhh=O++  G  H  H  HF!"!2			"**,,,#z	#z	 G	? 	%t= 	% $AI		&*ZZZ))m1A1Gmmm,0	 *      [Zr   c                  P   t           j        j        r$t           j        j        t           j        j        k    rdS t          j                            t           j        j        g d          }|j        t           j        _        |j	        t           j        _
        |j        t           j        _        dt           j        _        t           j                                         t           j        j        dv r8t          j                            t           j        d|j         ddd	           dS dS )
u)   Выключаем SU режим
        N)z--rG   rI   r   )on_session_endr   r   u.    вышел из вашего аккаунтаr3   Tr   )r7   rX   r   rF   r9   r   r   rG   rC   rI   rH   r   r   rA   r   r   r   r   r   )r   r   	real_users      r   r   zCmfSession.switch_disable   s     y% 	)?19CT)T)TF$))QY-CLdLdLd)ee	(	(	%L	%)	"		&*XXX))'pppp,0	 *      YXr   c                     t          j        t          j                  }| j        rM|| j        t          t          j        j        j	                  z   k    rd| _
        |                                  dS dS dS )u   Отключаем сессию если вышел таймаут на перключение пользователя
        r$   TN)r   r;   r   r<   r   r   r7   r   su_session_time_limitr   r"   rA   )r   r;   s     r   rB   zCmfSession.switch_check_timeout  s     l8<((  	SD,AIVWVgV}  WD  EE  EE  EE  -E  &E  &EDLIIKKKKK	 	  &E  &Er    )F)__name__
__module____qualname___optionsjinja2FileSystemLoaderospathr   rP   PROJECT_DIR_loaderEnvironmentrs   	api_allowapi_methodsr   r   classmethodr\   staticmethodr   r   r   rA   r   r   rB   __classcell__)r   s   @r   r
   r
      s       H%%rw||F4F{'['[&\]]G HX##//h//JI
 
 
K&3 & & & &
 5 5 5 5 5 [5n 37t . . .S . . . \.`  . 07   S    \:- - - - -, #3 # # # \#J   \&      r   r
   N)cmf.includer#   r   r   r   r   r
   r   r   r   <module>r      s                    2 2 2 2 2 2 2 2 2 2F F F F F' F F F F Fr   