
    ?%iS9                     X    d dl  ddlmZ d dlmZmZmZ  G d dej                        Zy)    )*   )cmf_session)datetime	timedeltatimezonec                   v    e Zd Zdej                  iZej                  ej                  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
autoescapecmf	templatesloaderT)tfa_check_codetfa_send_codeswitch_userswitch_disablereturnc                 |    | j                   j                  j                  d      d   }t        j	                  |      S )N:   )idvaluesplitcmfutilcrypt)selfmessages     ./cmf/models/cmf_session.py	get_tokenzCmfSession.get_token   s.    ''--%%c*1-}}W%%    c           	         	 t         j                  |      }t        j
                  j                  d| dddg      }|rt        j                  t        j                        }||j                  t        |j                  j                        z   t        d	
      z
  k\  rQ|j                  r.|j!                  dg       |j                  j#                  |      }nd|_        |j'                          |j)                          |j$                  rht        j                  d|j*                   d       t        j,                  j/                  ddd|j*                  |j*                  |j0                  d	       yt        j3                  d      }|j*                  j                  |_        |j6                  j                  |_        |j:                  j                  |_        |j<                  s|rt        j>                  rt        j>                  j4                  |j4                  k(  rnd}t        j@                  D ]R  }|jC                  d      st         jE                  |dg      }	|	s0|dtF        jH                   d|	jJ                   z  }T ||_        d|_&        d|_'        t        j                  d|j4                   d|j<                   d|jN                          ||fS y#  t        j                  d       Y yxY w)NuD   Не удалось расшифровать токен сессии)NNzCmfSession:Fr   plugin)r   expiredfieldssecondsr   )minuteszplugin.plugin.*Tu&   Сессия пользователя u    истеклаlogoutCmfAuthok)operatecmf_model_nameresult_status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<O ##''[8I+JTYcfhpbq'r,,x||,Cg))Ig>]>]>c>c,ddgpyzg{{{>>''):(;<%nn::7CG '+GOLLN((*@ASAS@TTcde++HY"& ' 2 2@R@R"??1 , > "..t.,C**00CI**00CI**00CI 99ANNq~~G[G[_b_h_hGh ! ; ; DH**+<= ' 5 5hx 5 P$$1V__$5Quzzl!CCD "	!&C#'C GG5cii[399+[Y\YmYmXnop<c	GGZ[s   K K8Nany)two_factor_optmethodrX   r^   c                 J   st         j                  fd}fd}dd lj                  g d       t        j
                  j                  j                  g d      j                  st        d d       y | sj                         } | r
j                  r}j                  j                         j                  z
  j                         d	k  rEt        d
d	j                  j                         j                  z
  j                         z
          y dj                  fdt        d      D              _        j                  j#                          j%                          | dk(  r |         |        y | dk(  r |        y | dk(  r |        y y y )Nc                  "   dk(  sdk(  rj                   j                  st        d dd       y t        j                  j                         } | j                  j                   j                  j                  j                   d       y y )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_smsU   s    &G"3((.. 4VH<jkswx!22DDF%%f&7&7&=&=&D&DIYIYHZ  [A  GB  C #4r    c                  |   dk(  sdk(  rj                   j                  st        d dd       y j                  j	                  d      } | j                  j                        }t        j                  j                         }|j                  j                   j                  j                  |d	
       y y )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((.. 4VH<TU]ab"--::?K%__g6F6Fv_V
!22DDF%%%%++11:  HT & U #4r    r   )sms_send_timerl   rF   )two_factor.*two_factor.two_factor_optr   r   r$   u   У пользователя u    не настроена 2FA   uK   Следующая отправка будет доступна через r3   c              3   T   K   | ]  }t        j                  d d             ! yw)r   	   N)strrandint).0_randoms     r   	<genexpr>z+CmfSession.tfa_send_code.<locals>.<genexpr>w   s!     &SQs6>>!Q+?'@&Ss   %(   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_codeQ   sh   iiG	C		U 	DE!!%%As%t  4VH<XYZ#668N$$'*?*?*C*C*EH]H]*])l)l)nqs)saW226687;P;PP__aabde !ww&S%PQ(&SSG!!))+LLN&
5(
7* + r    c                    ddl m} | j                  ry | j                  t        j
                  j                  j                  k(  rt        j
                  }n-t        j                  j                  | j                  g d      }|j                         r|j                  rt        j                  j                  sy 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 y )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   s   *<<<<1>>,,222^^F%%))<<(_ * aF$$&q'8'8'I'I '++.F6"B#%&&6rd;C{{h&')**FrdKA9A&//AR7SAII34<BAII898MAII45H 'r    rb   )r_   rX   r4   c                F   dd l }|st        j                  }t        j                  j                  |j                  ddg      }d}|3dD ].  }t        |j                  |      s|j                  d      d   } n |s
J d|        |xj                  d	z  c_
        |j                  j                          |j                  | k(  x}rd
|_        n|j                  j                  rjt         j#                         5  |j%                  |j                  j                  j'                               }	d d d        	j)                  |       x}rd
|_        |r4t+        |j                  | dd
       |j                  j-                          |j-                          |S # 1 sw Y   kxY w)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   iiG!!%%.RUAV%W>Q 6,,a0WWS\!_F   	l  c  dj  ck  l  	lv"$$&%%--6-"GO  ,,((* O ::f&7&7&C&C&K&K&MNDO![[..6.&*GOF%%&';TB""$O Os   94FF c           
      >   t         j                  dt         _        d }| j                  r>| j                  t	        | j                  j
                        z   }|j                  d      }d }| j                  r>| j                  t	        | j                  j
                        z   }|j                  d      }| j                  rt        j                  j                  ddt        | j                        t        | j                        dd| j                  | j                         t         j!                  d	| j                   d
| d|        n(t         j!                  d| j                   d
| d|        | j"                  s| j                  | _        t%        | L  |i |S )NTr%   z%Y-%m-%d %H:%M:%S %Z%zlogin_successedr)   r*   r   )r+   r,   
cmf_authorr0   r-   r1   r.   r/   u-   Создали новую сессию login=u   , время жизни до u)   , обновление токена до u$   Обновили сессию login=)r7   hack_session_need_commitr>   r=   r   r   strftimelifetime	auth_dateis_newr9   rD   rE   r   rF   rC   r8   real_user_idsuperrA   )r   r   r   refresh_untillifetime_until	__class__s        r   rA   zCmfSession.save   s    %%-)-A&''!--	$B^B^BdBd0eeM)223KLM=="nnyATAT/UUN+445MNN;;OO''))PSTXT`T`Pa4<<(Q OO ( J
 GGCDOOCTTq  sA  rB  Bk  ly  kz  {  |GG:4??:KKhiwhx  yb  cp  bq  r  s   $Dw|T,V,,r    rF   c                    t         j                  j                  | t        j                        }|sJ d       t         j
                  j                  d      }|j                  t        j                  vrt        d       yt         j
                  j                  d      }t         j                  j                  |j                  d	      }|j                  |v rt        d
       yt        j                  j                  t        j                  _        t        j                  j                  j!                          |j"                  t        j                  _        |j&                  t        j                  _        |j                  t        j                  _        |j*                  r+|j*                  j,                  rdt        j                  _        t        j                  j1                          t        j2                  j4                  dv r@t         j6                  j9                  |dt        j:                  j"                   ddd       yy)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    $$8Q8Q$RMLMt,,11}1E??!"="==`a**//[/A
 ..FFRVRYRYcgFh==O+  G  H!"!2!2					""**,#zz		#zz		 GG		??t== $AII			&&*ZZ))01A1A1G1G0HHlm,0	 *  [r    c                     t         j                  j                  r5t         j                  j                  t         j                  j                  k(  ryt        j
                  j                  t         j                  j                  g d      }|j                  t         j                  _        |j                  t         j                  _
        |j                  t         j                  _        dt         j                  _        t         j                  j                          t         j                  j                  dv r@t        j                   j#                  t         j$                  d|j                   ddd	       yy)
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     yy%%)?)?199CTCT)T$$))QYY-C-CLd)e	(		(		%LL		%)		"			&&*XX))''00AAop,0	 *  Yr    c                    t        j                  t        j                        }| j                  rW|| j                  t        t        j                  j                  j                        z   k\  rd| _
        | j                          yyy)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  st     ll8<<(  SD,A,AIVWVgVgV}V}  WD  WD  EE  -E  &EDLIIK &E r     )F)__name__
__module____qualname__r   select_jinja_autoescape_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   c99:H%%rww||F4F4F{'[&\]G HX###/h/JI
K&3 &
 5 5 5n 37t .S . .`. 07 S  :-4 #3 # #J  &r    r
   N)cmf.includer$   r   r   r   r   r
   r   r    r   <module>r      s%       2 2K'' Kr    