
    >&jg                    T   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
mZ d dlZ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mZ d dlmZ d d	lmZ d d
l d dlmZ d dlm Z  d dl!m!Z! d dl"Z"d dl#m$Z$ d dl%m&Z&  G d de'      Z( G d de'      Z) G d de jT                        Z*y)    )	timedeltaN)AnyDictListSet)LDAPException)TlsServer
ConnectionNTLMSIMPLE)parse_dn)escape_filter_chars)cmf_context)commit_all_ds)*)
log_config)cmf_auth_ldap_plugin)cached_property)Path)LdapStatusCodec                       e Zd Zy)LdapCredentialsErrorN__name__
__module____qualname__     1./modules/settings/models/cmf_auth_ldap_plugin.pyr   r          r   r   c                       e Zd Zy)LdapUserDisableErrorNr   r   r   r    r#   r#      r!   r   r#   c            
           e Zd ZdZdZej                  j                  dz   ZdZej                  j                  g dz   Z	dZ
d Zedej                  fd       Zd	 Zd
ej$                  j&                  j(                  defdZdIdedefdZddddZd ZdJdefdZdKdefdZe eddddd      d               Z e eddddd      d               Z!d Z"e edddd      dd d!              Z#e edd"      d#               Z$dId$Z%d% Z&dLd&Z'e edddd'      d(               Z(e edddd'      d)               Z)e eddd*d'      ddd+d,              Z*ed-        Z+d.e,e   fd/Z-	 	 dJd0e.e/ee0f      d1e.e   fd2Z1	 	 dJd0e.e/ee0f      d1e.e   de/ee.e   f   fd3Z2ed4e.e   de.e   fd5       Z3ed6        Z4ed7        Z5ed8        Z6d9 Z7d: Z8ed;        Z9d< Z:d= Z;dddd> fd?
Z< fd@Z=dA Z>dBedCede?fdDZ@dE ZAdFdG fdH
ZB xZCS )MCmfAuthLdapPluginN)loggerT)applyclearsyncsync_allsync_newget_log_filenametest_connectr   c                    	 ddl }t        j                         }|rdj                   |j                  |       }t
        j                         5  | j                  dg       | j                  j                  j                         r4|j                  | j                  j                  j                         d      }ddd       | j                  j                  | d|        y| j                  j                  |       y# 1 sw Y   FxY w# t        $ rC}| j                  j                  d|        | j                  j                  |       Y d}~yd}~ww xY w)um   Безопасное логирование исключений с маскированием паролейr   N plugin.ext_password***
u<   Ошибка безопасного логирования: )	tracebacksysexc_infojoinformat_exceptioncmfutildisable_aclload_fieldspluginext_passworddecryptreplacer&   error	Exception)selfmessager3   r5   exc_textes         r    _safe_log_exceptionz%CmfAuthLdapPlugin._safe_log_exception2   s   	'||~H77#=9#=#=x#HI ((* _$$&;%<={{//779#+#3#3DKK4L4L4T4T4VX]#^_
 !!WIRz":;!!'*_ _  	'KK \]^\_`aKKg&&	's7   AD
 A+C>9(D
 "D
 >DD
 
	E9EEreturnc                    | j                   r| j                   S t        j                  j                  | t        j
                        }|st        j                  | t        j
                        }|j                          |j                  s|j                  d       ddl	m
}m}m}  |t        j                          ||       t        j                  d      | _         t	        j                   | j                   |j"                  t        j$                         | j                   S t	        j&                  | j)                               | _         | j                   S )uE    Журнал логирования процесса импорта )parentnamer   r   ) set_library_log_activation_levelset_library_log_detail_levelEXTENDEDldap3)level)_CmfAuthLdapPlugin__loggermodelsCmfAttachmentgetr   LOG_NAMEsavefile_existsupload_fileldap3.utils.logrJ   rK   rL   loggingERROR	getLoggerinit_loggerfull_path_fileINFO
get_loggerget_files_dir)rA   
attachmentrJ   rK   rL   s        r    r&   zCmfAuthLdapPlugin.loggerJ   s     ==== ))--T
@S@S-T
--T
@S@S-TJOO))&&s+pp,W]];(2#--g6DM""4==*2K2KSZS_S_` }} '11$2D2D2FGDM}}r   c                     t        j                          | j                  z
  dkD  rTt        j                          | _        t        j                  j	                  | j
                  dg      j                  }|dk7  S y)N
   sync_statusidfieldsin_progressF)timebroken_startrP   r%   sgetre   rc   )rA   
new_statuss     r    brokenzCmfAuthLdapPlugin.broken_   s^    99;***R/ $		D1166$''=/6ZffJ..r   entryc                     | j                   dk7  ryd}d}t        |j                  j                        }t	        ||z        }t        |d   j                        }t	        ||z        }|xs |S )uK   Проверка, что пользователь заблокирован.adF      "msDS-User-Account-Control-Computed)directory_typeintuserAccountControlvaluebool)rA   rm   UAC_ACCOUNTDISABLEUAC_LOCKOUTuacdisabledcomputedlockeds           r    _is_user_disabledz#CmfAuthLdapPlugin._is_user_disabledf   sz     $&  %**001001 uABHHIh,-!6!r   ldap_user_nameldap_user_pwdc           	         t         j                         5  | j                  g d       |s | j                  j                  j
                  }|s$| j                  j                  j                         }t        t        j                  t        j                  d      }t        | j                  j                   d| j                  j                   |      }t        }t!        ||||d| j"                  j
                        }|j%                         r|cd d d        S d|j&                   }	|	}
|r|
j)                  |d	      }
| j*                  j-                  |
       |j&                  d
k(  rt/        |
      t1        |
      # 1 sw Y   y xY w)N)plugin.ext_urlplugin.ext_portconnection_timeoutzplugin.ext_loginr0   z"/etc/ssl/certs/ca-certificates.crt)validateversionca_certs_file:)tlsF)userpasswordauthenticationauto_referralsreceive_timeoutu@   Не удалось подключиться к серверу: r1   invalidCredentials)r8   r9   r:   r;   	ext_loginrv   r<   r=   r	   sslCERT_OPTIONALPROTOCOL_TLSv1_2r
   ext_urlext_portr   r   r   bind
last_errorr>   r&   r?   r   r@   )rA   r   r   argskwargstls_configurationserverr   connerrsafe_errs              r    connectzCmfAuthLdapPlugin.connecty   s\     " 	* G H!!%!6!6!<!<  $ 8 8 @ @ B #**C4H4HB!D t{{2231T[[5I5I4JKQbcF#Nf>Mbp+0$BYBYB_B_aDyy{	* 	*" YY]YhYhXij '//uEH!!(+??&::.x88))5	* 	*s   C<F A%F  F	)r   r<   c                   	 | j                  ||      5  	 d d d        t        d       | j                  j                  d       y# 1 sw Y   0xY w# t        $ r}t        |      }|r|j                  |d      }t        j                         5  | j                  dg       | j                  j                  j                         r4|j                  | j                  j                  j                         d      }d d d        n# 1 sw Y   nxY wt        d|        | j                  j                  d|        Y d }~yd }~ww xY w)NuK   Подключение к серверу выполнено успешно.Tr1   r0   uO   Подключение к серверу выполнено с ошибкой: F)r   	cmf_alertr&   infor@   strr>   r8   r9   r:   r;   r<   r=   r?   )rA   r   r<   r   r   rD   	error_msgs          r    r-   zCmfAuthLdapPlugin.test_connect   s!   	i6 cdKKjl	 
  	AI%--lEB	$$& ]  "7!89;;++335 ) 1 1$++2J2J2R2R2TV[ \I] ] ] ghqgrstKK opyoz{|	sF   A A.A A
A 	E3D>A+D8	D>D
	3D>>Ec           	   #     K   d}d}| j                         5 }|j                  j                  j                  ||d|dd      }|D ]  }| |dz  } 	 d d d        | j                  j                  d|        y # 1 sw Y   (xY ww)Nrb   r   r   T)search_basesearch_filter
attributes
paged_size	generatorget_operational_attributes   u"   Загружено записей )r   extendstandardpaged_searchr&   r   )rA   r   r   r   totalr   entry_generatorrm   s           r    _paged_searchzCmfAuthLdapPlugin._paged_search   s     
\\^ 	t"kk22??k@M=@=G:>[_	 @ aO
 ) 
	 	=eWEF	 	s   B<A;'B;B Bc           	   #     K   	 | j                  g d       | j                  j                  }|r$| j                  r| j                  j                  }ny d}d}|r8|d   dk(  r.t	        j
                  ddt	        j
                  dd|            }d}d}|rs|r,dj                  |D cg c]  }d	t        |       d
 c}      nd}| j                  dk(  r|d| d| dz  }|r"d| d| d}n|r|d| d
| d
z  }n	|d| d
z  }|rd}|rd| d
}| j                  j                  d|        | j                  rX| j                  j                  d      D ]9  }	| j                  |	j                          d| j                   |      E d {    ; y | j                  | j                  j                  |      E d {    y c c}w 7 ;7 # t         $ r | j#                  d        w xY ww)N)additional_user_dnuser_object_class_filterbase_dnFr   &z\)$r/   z\(&Tz#(memberof:1.2.840.113556.1.4.1941:=)ro   z(|(whenCreated>=z)(whenChanged>=))z(|z(&z(|(modifyTimeStamp>=z(modifyTimeStamp>=u%   Фильтр запроса к LDAP: ;,u8   Ошибка загрузки пользователей)r:   r   rv   user_disabled_filterresubr6   r   rs   r&   r   r   splitr   stripr   r@   rE   )
rA   prev_sync_gtr{   changed_groupsr   combine_filtersfilter_was_not_emptygor_in_groupsadd_dns
             r    ldap_get_usersz CmfAuthLdapPlugin.ldap_get_users   s+    )	Z[ 99??M,,$($=$=$C$CM#O#(  #s*$&FF62rvvfb-7X$YM&*O'+$ES  "ww1?(A,- +NNabcNdMeef(g (A  BY[ &&$.!'7~_UaTbbd%eeM#*,\N"]O2(N $%+?~Q|n\])^^%+=l^1)MM'&*O"$]O1 5KKD]OTU&&"55;;C@ eF#11V\\^4DAdll^2TVcddde  --dll.@.@-PPP+(A& eP 	$$%_`	sg   G'AG G'AG $F?:CG G	G G')G 9G:G >G'?G G G$$G'c              #     K   	 | j                  g d       | j                  j                  }| j                  rX| j                  j	                  d      D ]9  }| j                  |j                          d| j                   |      E d {    ; y | j                  | j                  j                  |      E d {    y 7 67 # t        $ r | j                  d        w xY ww)N)additional_group_dngroup_object_class_filterr   r   r   u(   Ошибка загрузки групп)
r:   r   rv   r   r   r   r   r   r@   rE   )rA   r   r   r   s       r    ldap_get_groupsz!CmfAuthLdapPlugin.ldap_get_groups   s     
	\] ::@@M''"66<<SA eF#11V\\^4DAdll^2TVcddde  --dll.@.@-PPP eP 	$$%OP	sM   C#BC 	C 
C C#)C :C;C ?C# C C C  C#z	@minutely  	   )	only_once
system_jobschedulesoft_time_limitpriorityc                     t         j                  g dddg      D ]  } | j                  r1| j                  j                  | j                  j
                  dz  k\  s@| j                  j                  d|  d       t         j                  | j                  j
                  dd	
       t         j                  | j                  j
                  d	       | j                  j                  d|  d        y )N	auto_sync==T	sync_datesync_intervalfilterrf   <   u.   Частичная синхронизация     запущенаu-   частичная синхронизацияauth_plugin_iddelta_minutes
sync_titler   r       завершена)r%   listr   ager   rv   r&   r   r)   re   r'   auth_plugins    r    	cron_synczCmfAuthLdapPlugin.cron_sync   s    
 -119R:E9W 2 Y 	{K((K,A,A,E,EIbIbIhIhkmIm,m""''*XYdXeev(wx!&&knn6J6JZ\  jY&  Z!''{~~7K7K  YH'  I""''*XYdXeex(yz	{r   z	H 4 * * *ip  c                  j   t         j                  g dddg      D ]  } | j                  r6| j                  j                  | j                  j
                  dz  dz  dz  k\  r| j                  j                  d|  d       t         j                  | j                  j
                  d d	
       t         j                  | j                  j
                  d	       | j                  j                  d|  d       | j                  j                  d|  d| j                  j                  dz   d        y )Nr   sync_all_datesync_all_intervalr   r      u(   Полная синхронизация r   u'   полная синхронизацияr   r   r   u/    пропускается: sync_all_date.age = u    мин.)r%   r   r   r   r   rv   r&   r   r)   re   r'   r   s    r    cron_full_syncz CmfAuthLdapPlugin.cron_full_sync   sL    -119R:IK^9_ 2 a 		gK,,0I0I0M0MQ\QnQnQtQtwyQy|~Q~  BD  RD  1D""''*RS^R__p(qr!&&knn6J6JZ^  lU&  V!''{~~7K7K  YB'  C""''*RS^R__r(st""''*RS^R_ `99D9R9R9V9VY[9[8\\d)f g		gr   c           	         | j                   j                  d       t               }g d}| j                  |      D ]  }| j	                         r y|j
                  j                  j                         D ]  \  }}||v r|j                  |       d| d}| j                   j                  d| d|d           t        |j                               d	gz   }t        j                  j                  d
dd| dg|      }|s't        j                  j                  dd|d   g|      }|s8| j                   j                  d|        t        j                  |d   |      }|j                  j                         s||_        ||j                  vr|j                   | |_        |j                         D ]]  \  }	}
|	d
k(  rt!        ||	      s|j"                  r,|	dk(  s|	dk(  r"| j                   j%                  d|	 d|        Qt'        ||	|
       _ |j(                  s|j+                          t-                 
 | j                   j                  dt/        |       d       y)Nu)   Синхронизируем группы)--re   groupspersonrf   Fz::u-   Обрабатываем группу ext_id=z name=rI   systemext_idLIKE%r   r   u0   Не нашли группу, создадим: )rI   r   codeu5   Игнорируется изменение поля u!    системной группы u   Обработано u    группT)r&   r   setall_raw_datarl   r   rv   itemsaddr   keysrP   CmfPersonGrouprR   r   loadhasattrr   warningsetattr
is_changedrT   
cmf_commitlen)rA   syncedrf   objgroup_idvalr   group_fieldsgroupkeyrv   s              r    process_groupsz CmfAuthLdapPlugin.process_groups  sb   DE/$$F$3 "	!C{{}
 "%!1!1!7!7!9 !#v%

8$hZr*  #PQWPXX^_bci_j^k!lm#CHHJ/8*<--11(FaPVxWXM9Zco1p"1155fdCPVK=Xam5nEKK$$'WX[W\%]^"11s6{61RE||((*#)EL-&+ll^F8#<EL"%))+ 7JCh uc* <<SF]cVm KK//2ghkgl  mN  OT  NU  1V  W#E367 ##JJLL7!"	!F 	0V[IJr   i@8  )r   r   r   r   u   синхронизация)r   c                 
   ddl }t        j                  d|  d       dt        _        t        j
                  j                  | g d      }	 |j                  dk(  rs|j                  j                  d	kD  r-|j                  j                  |j                          d
       n-|j                  j                  |j                          d       y|j                  j                  d|        |j                  j                          d|_        |j                          t                t        j                   j#                          |j%                         s-|j                  j                  |j                          d       yt                |j&                  sJ d       |j(                  s-t        j*                  j-                  g dg ddd|ggddi       t.        j1                         5  t.        j3                         5  d}t        j*                  j5                  dd|gg dgdgdg      D cg c]  }|j6                   }}t9        |      }	d}t;        d|j=                  |	|z              D ]  }
t        j*                  j?                  dd|gg ddd||
|z  |
|z  |z    ggg ddg      D ]  }|jA                         r?|j                  j                  |j                          d         ddd       ddd       y|dz  }	 |j                  j                  |j                          d|jB                   d| d |	 d       |jE                          t                  	 ddd       ddd       d"|_        |j                          t                t;        dd#      D ]  }t        jL                  jN                  dk7  rQ|j                  j                  |j                          d$       tQ        t        jR                  jT                          ntW        jX                  d        |j                  j                  |j                          d%       tQ        t        jZ                  j\                         yc c}w #  |jF                  jI                          |j                  jK                  |j                          d!|        Y xY w# 1 sw Y   lxY w# 1 sw Y   qxY w# t^        $ r}ta        |       d&|_        |j                          tQ        t        jZ                  j\                         t                |j                  jK                  |j                          d'        d}~ww xY w)(uP   
        Сохраняем данные в CmfPerson и CmfPersonGroup
        r   NzStart CmfAuthLdapPlugin.apply(r   T)rc   r   
sync_groupdomainrd   rg   r   h    пользователей зависла, запускаем форсированно повторно    уже запущена   Запущена u8   : синхронизация групп прерванаuH   Укажите "Домен для логина" в настройках.)dirtyr   F)	person_idr   Nr   r   r  )r   values2   )r  r   Tre   z-ldap_deleted)r   rf   order_byIN)r   re   loginuM   : обработка данных пользователей прерванаr   u!   : обрабатываем login= (    из uH   : ошибка обработки данных пользователя closedr   u-   : синхронизируем с eva_accountu2   : изменения применены в eva_appr?   u6   : ошибка применения изменений)1mathr   debug license_disable_user_count_hooksrP   r%   rR   rc   r   r   r&   r   
capitalizeset_nowrT   r  r   
ldap_groupr  r  r  CmfAuthPluginDatabulk_updater8   disable_notifyr9   slistre   r  rangeceilr   rl   r  process_persondprollback	exception
global_varaccount_sync_statusschedule_deferred_job	CmfPersonaccount_sync_usersrh   sleep
CmfLicenserecalc_users_countsr@   cmf_rollback)r   r   _args_kwargsr  r   stepiall_dirty_idscntchunkraw_datarD   s                r    r'   zCmfAuthLdapPlugin.apply;  sE    		00@BC-1*..22n  NB2  CG	&&-7((,,w6&&++z/D/D/F.G  Hp  -q  r&&++z/D/D/F.GG_,`a##&7
|$DE!!))+&3K#L!!,,.--/""'':+@+@+B*CC{(|}L%%q'qq%))((44=S<U=JDR]<^=`iprvhw 5 y '') i7+>+>+@ i060H0H0N0N+T;?AVX 6_,= 1O 1? !A1!$$ !A !A -("1diid
&;< iE$*$<$<$A$A!.k B 5!%t]54<%RV,Y]J]-^ _$ '<FW %B %Y i '--/'..33z7L7L7N6O  P]  5^  _"#i i i$ Qi'..33z7L7L7N6O PWW_WeWeVf686#a5I J %335&Liii i8 '/K#L1b\ <<33}D&&++z/D/D/F.GGt,uv)&*:*:*M*MN

1 ##z'<'<'>&??q$rs!&"3"3"G"GHI!A.i$KK002'..88J<Q<Q<S;T  U]  ^f  ]g  :h  i7i i i iP  	O&-K#!&"3"3"G"GHL((J,A,A,C+DDz){|	s   BS+ B3S+ A*S+ -S0S2Q<B-S2S:S+ S	AR"S'S/DS+ <SA
SSS	SS(#S+ +	U54A<U00U5)r   r   c                 N   t         j                  d|  d       dt         _        t        j                  j                  | ddg      }|j                  dk(  r|j                  j                  d       y |j                  j                  d	       |j                  j                          d|_        |j                          t                d
}|j                  j                  d       t        j                  j                  |       }d}d}||k  r||z  |k  r|j                         r|j                  j                  d       y t        j                  j!                  | d|gg d      D ]/  }	 |j"                  r|j"                  j$                  sC|j&                  j                  j                  d|j"                          d|j"                  _        t        j*                  j-                         }	|	|j"                  j.                  v r%|j"                  j.                  j1                  |	       |j"                  j2                  j                          d |_        |j5                          |d
z  }t                |j                  j                  d| d|        2 |d
z  }||k  r
||z  |k  rd
}t        j*                  j                  |       }|j                  j                  d       t        j*                  j!                  | dg      D ]g  }
	 |
j:                  rd |
_        |
j                          (|
j5                          |j                  j                  d| d|        |d
z  }t                i d|_        |j                          |j                  j                  d       t=        t        j>                  j@                         y # t6        $ r |j                  j9                  d       Y w xY w# t6        $ r |j                  j9                  d       Y w xY w)NzStart CmfAuthLdapPlugin.clear(r   Trc   r   rd   rg   u2   Синхронизация уже запущенаu)   Очищаем синхронизациюr   uh   Удаляем данные по пользователям (не самих пользователей)r      r   u:   Очистка синхронизации прервана)zperson.does_not_workzperson.rg_member_ofr   zperson.is_adminzperson.is_support)r   slicerf   u    Блокируем учетку u   Удалено r  u/   Ошибка удаления CmfAuthPluginDatau   Удаляем группы
cmf_import)r   rf   u,   Ошибка удаления CmfPersonGroupr  u!   Очистка завершена)!r   r  r   rP   r%   rR   rc   r&   r   r   r"  rT   r  r$  countrl   r   r   is_adminr   does_not_workr   r#  rg_member_ofremoverv   deleter@   r-  rB  r0  r4  r5  )r   r7  r8  r   r:  r   r9  ndataldap_grpr  s              r    r(   zCmfAuthLdapPlugin.clear  s    	
00@BC-1*..22nm]hMi2j""m3##$XY KL%%'"/  !K  	L((..>.J%iAHu,!!#""''*df0055.YZ\`Xa B 6 C dd{{#{{33 ,,3388;[\`\g\g[h9ij8<DKK5#)#8#8#C#C#E#t{{'?'?? KK44;;HE))..0&*KKMFAL&&++oaSug,NO!d& FA/ %iAHu,0 %%+++G =>**//NT`Sa/b 	]E
]##(,E%JJL""''/!F5'(JKQ	] #+"CEf//CCD+ ! d&&001bcd   ]"",,-[\]s,   0D+O#O<9A O<$O98O9<$P$#P$c              #     K   ddl }d}|r|n"t        j                  j                  dd| g      }t	        |j                  ||z              D ];  }t        j                  j                  dd| g|||z  ||z  |z   g      D ]  }|  = yw)uB  Частями загружаем в память и отдаем, иначе будет утечка памяти

        Args:
            fields (list, optional): Поля для загрузки. Defaults to None.

        Yields:
            CmfAuthPluginData: загруженные сырые данные
        r   Nr@  r   r   )r   )r   rf   rA  )r  rP   r$  rC  r(  r)  r   )rA   rf   r<  r  r9  r:  rows          r    r   zCmfAuthLdapPlugin.all_raw_data  s      	cf66<<]TXZ^D_<`tyyt,- 	A//44]DRV<W`f<=Ha$hQUo;V 5 X 		s   B
Bc                     |sy||vrVt         j                  j                  | |dg      }|r,|j                  j                  r|j                  j                  nd||<   ||   S )u:  Вернуть сохранённый логин по ext_id без сканирования всех LDAP-данных.

        Используется как fallback для участников группы, у которых в частичной
        LDAP-выборке пропал логин.
        Nr  )r   r   rf   )rP   r$  rR   r  rv   )rA   r   cached_user_login_by_ext_idr>  s       r    _get_cached_raw_login_by_ext_idz1CmfAuthLdapPlugin._get_cached_raw_login_by_ext_id  sh     44//33V]d\e3fHJRW_WeWeWkWk(..2F2Fqu'/*622r   c           	      z   ddl m}m} |j                  sy |j                   ||      z   j	                  |j
                        j                         }t        |j                        dj                  d |j                  |j                  |j                  |j                  |j                  fD              z   }|dz   S )Nr   )r   timezoneminutesr/   c              3   h   K   | ]*  }d dt        t        |            z
  z  t        |      z    , yw)0rp   N)r  r   ).0items     r    	<genexpr>z6CmfAuthLdapPlugin._generalized_time.<locals>.<genexpr>  s5      *W +.ST^1C*Ds4y*P *Ws   02z.0Z)datetimer   rR  rv   
astimezoneutc	timetupler   tm_yearr6   tm_montm_mdaytm_hourtm_mintm_sec)rA   	date_timer   r   rR  dtgtimes          r    _generalized_timez#CmfAuthLdapPlugin._generalized_time  s    0oo	- @@LLX\\ZddfBJJ"'' *WYY

BJJ		299U*W #W Wu}r   )r   r   r   r   c                 b    t         j                  | dd       t         j                  | d       y )Niu:   ручная частичная синхронизацияr   r   r%   r)   r'   r   r7  r8  s      r    r+   zCmfAuthLdapPlugin.sync_new  s;     	n-W 	 	Y 	~W 	  	Yr   c                 `    t         j                  | d       t         j                  | d       y )Nu4   ручная полная синхронизацияr   ri  rj  s      r    r*   zCmfAuthLdapPlugin.sync_all  s6     	nQ 	 	S~Q 	  	Sr   i   )r   r   c                    t         j                  d|  d       dt         _        t        j                  j                  | g d      }	 |j                  dk(  rs|j                  j                  dkD  r-|j                  j                  |j                          d       n-|j                  j                  |j                          d	       y |j                  j                  d
|        |r|j                  |j                  |      nd }|j                  r|r|j                  t        |      z   n|j                  }|j                  j                         }d|_        |j                          t!                |j                  j                  d       i }	g }
g }|j#                  |      D ]P  }|j%                         r.|j                  j                  |j                          d        y |j                  d      s|j                  j'                  d|        rt)        |j*                  j,                        }|j.                  dk(  s|j.                  j0                  rt3        |d         |d<   n4t3        |d   j                  |j.                  j,                              |d<   t5        |d   t6              r|d   d   |d<   |d   j                  |j8                  j,                        }t5        |t6              r|d   }|r||d<   |d   j                  |j:                  j,                        }t5        |t6              r|d   }|r||d<   |j<                  r-|d   j                  |j>                  j,                  g       |d<   nd|d<   |d   j                  d      }|r6|j                  r*||kD  r%|
jA                  |d          |jA                  |       ||	|d   <   |j                  j                  |        S |j                  j                  |j                          d       tC        jB                         }t)               }tC        jB                         }g }g }tE               }i }tE               }i }|jG                  ||
      D ]r  }|jI                  |      }|s|jK                  di       }|j                  d      xs |j                  d      }|j                  d      }|j                  d       }|rb|d!   r|jA                  |       |r|j                  j'                  d"|       n,|j                  j'                  d#|j                  d$      |       |r\|j                  d      }|jM                  |       |||<   |d!   r|jA                  |       |j                  j'                  d%||       2|d   }|||<   |d!   r|jA                  |       T|jN                  sb|jA                  |       u |jQ                  |||||&       tS        |      retC        jB                         |z
  } tS        |      | z  }!|j                  j                  |j                          d'tS        |       d(| d)d*|!d+d,       t)               }"tC        jB                         }|jT                  r|jG                  d|-      D ]  }|jI                  |      }|s|jK                  di       }|j                  d       r?|j                  j'                  d.|j                  d      xs |j                  d             y||"|d   <    tS        |"      ritC        jB                         |z
  } tS        |"      | z  }!|j                  j                  |j                          d'tS        |"       d/d0| d)d*|!d+d,z          d}#d}$d}%d}&tE               }'tC        jB                         }|rd1nt        jV                  jY                  |       }(|r`|j[                  g d23      D ]H  })	 |j%                         r.|j                  j                  |j                          d4        y |)j\                  j,                  |vr\|jK                  |)j\                  j,                        }|s|j_                  |)||	       |'jM                  |)j\                  j,                         |&d5z  }&|)j`                  rd6|)_0        |)j\                  |"v |)_1        |)jd                  rV|j                  j                  |j                          d7|d$    d0|& d8|( d       |%d5z  }%d|)_3        |)j                  d9       K tC        jB                         |z
  } |&r<|&| z  }!|j                  j                  |j                          d>|& d?| d)d*|!d+d,       |%r<|%| z  }!|j                  j                  |j                          d@|% d?| d)d*|!d+d,       tC        jB                         }|jm                         D ]  \  }+}	 |j%                         r.|j                  j                  |j                          dA        y |j                  j                  dB|d$           t        jW                  |+|C      },|j_                  |,||	       d|,_3        |,j                          t!                |'jM                  |,j\                  j,                         |$d5z  }$ |$rStC        jB                         |z
  } |$| z  }!|j                  j                  |j                          dE|$ d?| d)d*|!d+d,       d}-to        ||jN                  |j                  d=k7  f      rA|D ]<  }+t        jV                  j                  ||+F      })|)s'|jq                  |)       |-d5z  }-> |s\|j                  d=k7  rM|'|z  }.|j[                  g dG3      D ]1  })|)j\                  j,                  |.vs|jq                  |)       |-d5z  }-3 |-rStC        jB                         |z
  } |-| z  }!|j                  j                  |j                          dH|- d?| d)d*|!d+d,       |j                  dk(  rdI|_        |j                          t!                t        jr                  ju                          t        jv                  jy                          t{        ddJ      D ]Y  }/t         j|                  j~                  dk7  r%t        t        jr                  j                          ntC        j                  d5       [ |#r^|j                  j'                  |j                          dK|# dL       t        j                  |j                          dM| dN|# dL|O       nM|j                  j                  |j                          dP       ||j                  _        |j                          t        t        j                  j                         y # th        $ rQ}*|j                  jk                  |j                          d:d$    d;|d    d<|        d=|_        |#d5z  }#Y d }*~*Jd }*~*ww xY w# th        $ rQ}*d=|_        |j                  jk                  |j                          dD|d$    d;|d    d<|        |#d5z  }#Y d }*~*d }*~*ww xY w# th        $ r}*t        |*       |r|j                  jk                  |j                          dQ       d=|_        |j                          t        j                  |j                          dM| dQ|O       t        t        j                  j                         t!                 d }*~*ww xY w)RNzStart CmfAuthLdapPlugin.sync(r   T)r   r   zplugin.loginr0   r   r  zcmf_owner.loginrs   rc   use_user_groups_attrgroup_uid_attrgroup_name_attrgroup_desc_attrgroup_users_attruser_full_name_attruser_uid_attruser_display_name_attruser_name_attruser_last_name_attruser_email_attruser_groups_attruser_employee_number_attrr   block_users_without_groupsmapping_fieldsr   rd   rg   i0*  r  r  r  )r   rS  u   Загружаем группы)r   u.   : загрузка групп прерванаr   u-   У записи нет аттрибутов: r   entryDNdnr   r   rI   textmembersr/   whenChangedu,   : загружаем сырые данные)r   r   _ldap_validationlogin_invalidext_id_invaliduser_groupsuo   LDAP-синхронизация: пропущен пользователь без логина и ext_id. dn=%suh   LDAP-синхронизация: пропущен пользователь без ext_id. login=%s dn=%sr  uo   LDAP-синхронизация: пропущен пользователь без логина. ext_id=%s dn=%s)incomplete_group_keysinvalid_user_ext_id_by_dnrO  u   : загружено u2    изменённых пользователей (z.1fu
    сек., z.0fu    польз./сек.))r{   r   uv   LDAP-синхронизация: пропущен отключенный пользователь без ext_id. dn=%su2    отключенных пользователейr  i  )r   r  rI   
first_name	last_nameemailemployee_numberr   ldap_disabledldap_deletedr  
fields_mapr   u?   : обновление сырых данных прерваноr   Fu;   : синхронизируем учетную запись /	only_datauC   : Ошибка синхронизации пользователя (z): r?   u   : проверено u    пользователей (u#   : синхронизировано u/   : импортирование прерваноu$   Импортируем учетку )r   r   uC   : ошибка синхронизации пользователя u   : добавлено )r   r   )r   r  r  u   : удалено r  r   u)    завершена с ошибками (z). u(    завершена с ошибками()r  u#    успешно завершена.u%    завершена с ошибкой)Hr   r  r   rP   r%   rR   rc   r   r   r&   r   r!  rg  r   nowrT   r  r   rl   r  dictre   rv   rn  is_nullr   
isinstancer   ro  rp  rm  rq  appendrh   r   r   ldap_user_attributespopr   rz  _delete_users_from_groupr  r   r$  rC  r   r   update_raw_datar  r  r  r  r@   r-  r   all_mark_deletedr1  flush_all_notify_opt_cacheCmfProjectNotifySchemetrigger_reloadr(  r.  r/  r0  r2  r3  r8   admin_alertr4  r5  r6  )0r   r   r   r7  r8  r   r   prev_sync_date
sync_start
cached_grpr   changed_groups_namesgrpr  grp_namegrp_attrwhen_changed
start_timeldap_users_dictgroup_usersblock_user_idsskipped_invalid_ext_idsr  r  rO  	ldap_userr   
validationr}  r  r  user_ext_iddurationspeedldap_disabled_users_dictsync_errorsusers_addedusers_synchronizedusers_updatedldap_synchronizedr<  r>  rD   r   raw_userusers_deletedprotected_ext_idsr:  s0                                                   r    r)   zCmfAuthLdapPlugin.sync  s    	
//?qAB-1*..22 ' 3 w	&&-7 ((,,{:&&++z/D/D/F.G  Hp  -q  r&&++z/D/D/F.GG_,`a##&7
|$DEp};889N9N^k8l  DHLYdYnYn  tA[22Y}5UU  GR  G\  G\N$..224J&3K#L##$EFJN#% "222M #4%%'&&++z/D/D/F.GGu,vwww|,&&..1^_b^c/de)=)=>--:k>X>X>`>`&)#d)nE(O&)#l*;*?*?@Z@Z@`@`*a&bE(OeHot4&+Hoa&8E(O|,001L1L1R1RSh-'{H$,E&M|,001L1L1R1RSh-'{H$,E&M33'*<'8'<'<[=Y=Y=_=_`b'cE)$')E)$"<044]CK$9$9l^>["))#d)4(//9(-
3t9%""''5'3G#4^ ##z'<'<'>&??k$lmJ #fOJKN&)e#(*%$'E!*,'(77\bp7q 37	"77	B "XX&8"=
^^D);TXXd^ * ?!+0@!A! M*#**40$#**22 N
 $**22 G HHW-r   #'((8"4K+//<4?-b1M*#**40&&.. J#R "8n/3,&&&t, ;;"))+6g37j 00$&;*C,G 1  ?#99;3O,x7""'':+@+@+B*CCXY\]lYmXn o--5cN*U3KOd)f g (,v$J//!,!;!;TXd!;!e DI&;;IFD !%*<b!AJ!~~&67#**22 U&NN40BDHHTN !?C,T(^<D +,99;345@""'':+@+@+B*CCXY\]uYvXw  xj  )k*,XcN*U3KOd(e)f g KK!"M #J ($V-E-E-K-KXf-K-gC + 8 8 AV 8 !W )H)&--/'..33z7L7L7N6O  PO  5P  Q"#??00G$$3$7$78M8M$N	($#33HiT)--hoo.C.CD%*#0049H119D\1\.#..'..33z7L7L7N6O Pqqz  |C  rD  qE68qQ5P Q /!3.-1HN$MMDM91)< yy{Z/H%0""'':+@+@+B*CCXYfXg h--5cN*U3KOd)f g!*X5""'':+@+@+B*CCfgyfz {--5cN*U3KOd)f g J%4%:%:%< %!	%"))+#**//:3H3H3J2KKz0{|&&++.RS\]dSeRf,gh%77vS^7_H//)ZP%)HNMMOL%))(//*?*?@1$K%$ 99;3#h.""'':+@+@+B*CCXYdXe f--5cN*U3KOd)f g M 66''72 
 - +F%77;;\b;cH#11(;%*	+ ![%<%<%G %68O$O! + 8 8@c 8 d +H,,4EE#11(;%*+
 99;3%0""'':+@+@+B*CCTUbTc d--5cN*U3KOd)f g &&-7*2'  "L779))88:1b\ <<33}D)&*:*:*M*MN

1	
 ""**j.C.C.E-FFop{o||~+  A##z'<'<'>&?qMu  wB  vC  CE  %F  LW#  X""'':+@+@+B*CCf(gh.8%%+  "!&"3"3"G"GHw % )#**44
8M8M8O7P Q99B79K8LAiX`NaMbbefoep6r s29/#q(	)< ! %.5K+&&00J4I4I4K3L M55>w5G4H)T\J]I^^abkal2n o1$K	%~  		O"",,
0E0E0G/HHm-no*1'  "##z'<'<'>&?qMr$s  zE#  F%f&7&7&K&KL		s   	B{ D!{ -O?{ .H3{ "<x{  x8{ 9'x { !Cx&C { '<y/#{ %By/;B&{ "A{  H{ 	y,Ay'!{ 'y,,{ /	{	8A{>{ {		{ 	~B)}>>~c                 D    d| _         d| _        | j                  d       y )NTr  )r  r  rT   )r>  s    r    r  zCmfAuthLdapPlugin._mark_deletedO  s     $%r   affected_users_idsc                 .   t         j                  j                  ddt        |      ggddg      }|D ]`  }t        d |j                  D              }|r"| j
                  j                  d|j                         d|_        |j                  d	       b y
)uZ   
        Вычисление и блокировка пользователей.
        re   r  r  zrg_member_of.ext_idr   c              3   N   K   | ]  }|j                   j                  sd   yw)r   N)r   rv   )rW  r  s     r    rY  z1CmfAuthLdapPlugin._block_users.<locals>.<genexpr>a  s      XuU\\EWEW Xs   %%u.   Блокируем пользователя %sT)	from_ldapN)
rP   r1  r   sumrF  r&   r   r  rE  rT   )rA   r  	all_usersr   ext_groups_sums        r    _block_userszCmfAuthLdapPlugin._block_usersU  s    
 $$))4&8!9:;23 * 
	
  	*D  X0A0A XXN!  !QSWS]S]^%)"		D	)	*r   r  r  c                    t        |xs d      }| j                  |||||      }t               }|D ]  }||v r| j                  j                  d|       %t        j
                  j                  |dg|       }	|	sK|	j                  D 
ch c]9  }
|
j                  dk(  r(|
j                  j                  j                  d      d   ; }}
t        ||         }||z
  }|s| j                  j                  d	||       |	j                  D 
cg c]=  }
|
j                  dk(  r,|
j                  j                  j                  d      d   |v r|
? }}
|D ]B  }
|j                  |
j                  j                         |	j                  j                  |
       D |	j                  |	_        |	j!                  d
        |r| j"                  r| j%                  |       yyyc c}
w c c}
w )u  Удалить из LDAP-групп только участников, которых точно нет во внешнем списке.

        Если состав группы неполный, удаление по ней пропускается, чтобы одна
        некорректная LDAP-запись не привела к массовому удалению участников.
        r   )r  rO  r  u  LDAP-синхронизация: удаление пользователей из группы при частичной синхронизации пропущено, потому что список участников группы неполный. group=%s
rg_members)rI   rf   r   r1  @r   uB   Удаляем пользователей из группы %s: %sTr  N)r   _map_users_groupr&   r  rP   r   rR   r  
class_namer  rv   r   r   r   re   rG  rT   rz  r  )rA   r  r  r  r  rO  groups_user_mappingr  
group_namer  r   rg_members_loginsexternal_memberslogins_to_deleteusers_to_deletes                  r    r  z*CmfAuthLdapPlugin._delete_users_from_groupg  s    !$$9$?R @"33 &?(C"7 4 
 !U. 	+J 22##H
 ))--:|nbf-gE .3-=-=!a%)T_A_ "&!1!1!7!7!<Q!? !a !a"#6z#BC03CC  !egq  tD  E%*%5%5#!+5$**:J:J:P:PQT:UVW:X\l:l # #
 , 2D&**477==9$$++D12 $)#3#3 

T
*?	+B $"A"A01 #B%!a#s   >GAG$c           	         |i }|i }|D ci c]  }|g  }}|D ]K  }t        |j                  d      xs g       }	|D cg c]	  }||	v s| }
}|
s9|j                  d      }| j                  |      rdn| j                  |      }|si|j                  |j                  d            xs |j                  d      }| j	                  ||      }| j                  |      rdn| j                  |      }|sH|
D ]A  }||j                  |       | j                  j                  d||j                  d             C #|
D ]$  }||   j                  |j                                & N |S c c}w c c}w )u  Построить карту LDAP-группа -> логины для безопасного удаления лишних участников.

        Для участника без логина сначала используется сохранённый логин по ext_id;
        если сопоставление невозможно, соответствующая группа помечается неполной.
        Nuser_groups_namesr  r}  r   u   LDAP-синхронизация: список участников группы неполный, потому что участника не удалось сопоставить с пользователем. group=%s member_dn=%s)
r   rR   _is_blank_ldap_value_normalize_ldap_valuerP  r   r&   r  r  lower)rA   r  r  r  rO  r  r  resultr   r  affected_groupsr  normalized_loginfallback_ext_idcached_loginr  s                   r    r  z"CmfAuthLdapPlugin._map_users_group  s    %,(*%&.*,'?S'Ter	'T'T 	DDdhh':;ArBK2F_%S^J^u_O_"HHW%E'+'@'@'GtTMgMghmMn# #<"?"?"O"eSWS[S[\dSe#CC#/  ,0+D+D\+R4X\XrXrs  YA #"1 J,8-11*=KK''z"DHHTN - D
z"))*:*@*@*BCD;	D@ C (U `s   
E,	E1E1r  c                     g }| D ]O  }t        |      }|s|d   }t        |      dk\  s%|d   j                         dk(  s<|j                  |d          Q |S )Nr   rp   CNr   )r   r  upperr  )r  user_group_namesr  parsedrdns        r    __get_group_namesz#CmfAuthLdapPlugin.__get_group_names  se      	0Ee_F)C3x1}Q4!7 ''A/	0  r   c                 B    t        | t        t        f      r| sy| d   S | S )u}   Вернуть первое значение LDAP-атрибута, сохранив None для пустых списков.Nr   )r  r   tuplerv   s    r    _first_ldap_valuez#CmfAuthLdapPlugin._first_ldap_value  s&     edE]+8Or   c                     t        | t              r 	 | j                  d      j                         S t        | t
              r| j                         S t        |       S # t        $ r t        |       cY S w xY w)u^   Привести LDAP-значение к строке без внешних пробелов.zutf-8)r  bytesdecoder   UnicodeDecodeErrorr   r  s    r    r  z'CmfAuthLdapPlugin._normalize_ldap_value  sh     eU#"||G,2244 eS!;;= 5z	 & "5z!"s   A A32A3c                     t        | t        t        f      r| syt        j	                  | d         S | yt        | t
              r| j                          S t        | t              r| j                          S y)ul   Проверить пустоту LDAP-атрибута с учётом списков, bytes и строк.Tr   F)r  r   r  r%   r  r  r   r   r  s    r    r  z&CmfAuthLdapPlugin._is_blank_ldap_value  sj     edE]+$99%(CC=eU#{{}$$eS!{{}$$r   c                 8   ddl }|j                  d      sy|d   }| j                  |j                  | j                  j                              }| j                  |j                  | j
                  j                              }| j                  |      }| j                  |      }|rdn| j                  |      }|rdn| j                  |      }	|j                  | j                  j                        }
t        |
t              r|
d   }
|j                  | j                  j                        }t        |t              r|d   }|j                  | j                  j                        }t        |t              r|d   }|j                  | j                  j                        }t        |t              r|d   }|j                  | j                  j                  g       xs g }| j                  |      }t!        ||	|
||||||d   |d   ||d
      }| j"                  r?|j                  | j"                  j                        }t        |t              r|d   }||d<   | j$                  rt!               |d<   |j'                  | j$                  j                        }|j)                         D ]l  \  }}|j                  |      }t        |t              r|d   |d   |<   3t        |t*              r	||d   |<   L| j,                  j/                  d	| d
|        n |S )u  Преобразовать LDAP-entry в словарь и отдельно вернуть признаки обязательных полей.

        Пустые login/ext_id не приводят к исключению: вызывающий код решает, можно ли
        пропустить запись без остановки синхронизации.
        r   Nr   r}  )r}  r  r  )
r  r   	name_attrru  rv  rw  r  r  r}  r  ry  r  u   Аттрибута нет u    в )jsonrR   r  rr  rv   rs  r  r  rt  r  r   ru  rv  rw  rx  #_CmfAuthLdapPlugin__get_group_namesr  ry  r{  loadsr   r   r&   r   )rA   r  r  attrs	raw_login
raw_ext_idr  r  r  r   r  ru  rv  rw  r  r  r   ry  r{  	attr_name
field_nameatt_vals                         r    r  z&CmfAuthLdapPlugin.ldap_user_attributes  s    	}}\*,'**599T5M5M5S5S+TU	++EIId6H6H6N6N,OP
11)<22:>%4+E+Ei+P'T-G-G
-SYYt::@@A	i&!!I4#6#6#<#<=nd++A.N#ii(@(@(F(FG)40"5a"8))D$8$8$>$>?ot,-a0Oii 5 5 ; ;R@FB 22;?%'(;$3 +?P 'o)6*8&
 ))(-		$2P2P2V2V(W%3T:,Ea,H)0ID,-!%D!ZZ(;(;(A(ABN)7)=)=)? Z%	:))I.gd+5<QZD&z2,5<D&z2KK$$'A)DQVPW%XYZ r   c                    |d   |_         d|v r|d   |_        nd |_        d|v r'|d   r"|d   d |j                  j                   |_        nd |_        d|v r'|d   r"|d   d |j                  j                   |_        nd |_        d|v r|d   |_        nd |_        d|v r|d   |_        nd |_        d|v r
|d   |_        g }| j                  r|D ]y  }||   }|d   |d	   v s|j                  |d
          |d
   |j                  vs9| j                  j                  d|        ||j                  |d
   <   |j                  |_
        { n|d   D ]  }| j                  j                  d|        |j                  |      }|rJ|j                  |d
          |d
   |j                  vsZ||j                  |d
   <   |j                  |_
        ~| j                  j                  d|         t        |j                  j                   j#                               D ]%  }||vs|j                  |= |j                  |_
        ' t%        | j&                  |j                  f      r|j                  |_
        d|_        y y )Nr  r  ru  rv  rw  ry  r  r}  r  r   u9   Добавляем пользователю группу r  u   Ищем группу u   Не нашли группу T)r  rI   r  
max_lengthr  r  r  r  rm  r  r   r&   r   rR   warnr   rv   r   r  rz  r  )	rA   r  r  r  current_user_groups	group_uidr  entry_dn	gr_ext_ids	            r    r  z!CmfAuthLdapPlugin.update_raw_data:  s   "7+)#%k2HM HMy(Y7G-H"+,<"=>]x?R?R?]?]"^H"&H I-)<Q2R!*+@!AB`8CUCUC`C`!aH!%H	)&'89HN!HN&)3'01L'MH$'+H$9$"+L"9H $$' :	"9-T?eI&66'..uX?Xhoo=((+dendo)pq;@h8*2//: &m4 
Q  #9(!DE"x0'..uX?Xhoo=;@h8*2//KK$$'DXJ%OP
Q hoo3388:; 	2I 33OOI."*//		2 ++OO
  'ooHO"&Hr   c                      t         j                  dk(  ryg } t        j                  j	                  ddg      D ]"  }| j                  |j                  d             $ t               | ddd	}t        d
|       y)u=   
        Отправляем в аккаунт 1к1
        FalseNz**plugin.*r   r  )eva_app_tokenauth_pluginsrpc_account_plugin_push)r   methodzauth/sync_accounts)	configEVA_ACCOUNT_USErP   r%   r   r  dumpsgen_eva_app_tokencall_eva_account)r  r;   rJ  s      r    account_plugin_pushz%CmfAuthLdapPlugin.account_plugin_pushy  sz    
 !!W,..33D*;M3N 	6FV 45	6,=,?Q]^35-t4r   c                     | j                   j                  sy | j                   r<t        t        j                  j
                  d| j                  j                  i       y y )Nr   )r   )r   r  r0  rP   r%   r'   re   rv   rA   s    r    _process_auto_syncz$CmfAuthLdapPlugin._process_auto_sync  sG    ~~((>>!&":":"@"@JZ\`\c\c\i\iIjk r   c                     dd l }| j                  j                  r| j                  sy 	 |j                  | j                  j                         y #  t        dd       Y y xY w)Nr   uY   Не правильный формат маппинга. прим {"description": "text"}Tabort)r  r{  r  r  rv   r   )rA   r  s     r    _validate_mapping_fieldsz*CmfAuthLdapPlugin._validate_mapping_fields  sQ    ""--T5H5H	JJt**001	qy}~s   %A A depthnotifyemitc                f   t         j                  st        dd       | j                  r0| j                  s$t
        j                  j                         g| _        t         j                  | _	        | j                          | j                          | j                          t        | 8  ||||d|S )NuE   Модуль доступен только в версии On-PremiseTr  r  )r  IS_BOX_VERSIONr   is_newdefault_groupsrP   r   
user_groupORG_NAMEorg_name_process_directory_typer	  r  superrT   )rA   r  r  r  r   r   	__class__s         r    rT   zCmfAuthLdapPlugin.save  s    $$]eij;;t22#)#8#8#C#C#E"FD$$&  "%%'w|TvDSFSSr   c                 *    t         |          ddgz   S )Nr   r  )r  save_preload_fields)rA   r  s    r    r   z%CmfAuthLdapPlugin.save_preload_fields  s    w*,Z/@@@r   c                    | j                   j                  sy | j                   dk(  rd| _        d| _        d| _        d| _        d| _        d| _        d| _        d	| _	        d
| _
        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        y | j                   dk(  rd| _        d| _        d| _        d| _        d| _        d| _        d| _        d	| _	        d
| _
        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        y y )Nro   r   z,(&(objectCategory=Person)(sAMAccountName=*))zZ(&(objectCategory=Person)(sAMAccountName=*)(userAccountControl:1.2.840.113556.1.4.803:=2))sAMAccountNamecn	givenNamesndisplayNamemail
unicodePwd	plaintext
objectGUIDr  z6(&(objectCategory=group)(!(isCriticalSystemObject=*)))descriptionmembermemberOfldapinetorgpersonz(objectclass=inetorgperson)r/   userPasswordsha	entryUUIDgroupOfUniqueNamesz (objectclass=groupOfUniqueNames)uniqueMember)rs   r  user_object_classr   r   rr  user_rdn_attrru  rv  rt  rw  user_password_attruser_password_cryptrs  rn  group_object_classr   ro  rp  rq  rx  r  s    r    r  z)CmfAuthLdapPlugin._process_directory_type  sh   ""--$&%+D",ZD) )ED%'7D$!%D"-D'+D$*7D'#)D &2D#'2D$!-D".D&-D#-eD*#'D #0D $,D!$.D!  F*%4D",ID)(*D%'+D$!%D"-D'+D$*7D'#)D &4D#',D$!,D"-D&:D#-OD*#'D #0D $2D!$.D!' +r   r  r   c           
      "   t         j                         5  | j                  g d       t        d      D ]@  }	 | j	                  | j
                  j                  j                  | j
                  j                  j                               5 }d| j                   d| j                   d| d}| j                  dk(  rg d}nd	g}|j                  | j                  j                  ||
      r|j                  D ]s  }| j                  dk(  r| j!                  |      rt"        | j	                  |j$                  |      5  t&        j(                  cddd       c cddd       c cddd       S  ddd       C t9        d| d       ddd       t&        j:                  S # 1 sw Y   xY w# 1 sw Y   @xY w# t*        $ r< | j,                  j/                  d|        t&        j0                  cY c cddd       S t"        $ r< | j,                  j/                  d|        t&        j2                  cY c cddd       S t4        $ r,}| j,                  j7                  d| d|        Y d}~:d}~ww xY w# 1 sw Y   t&        j:                  S xY w)u?   Авторизация через внешнюю систему)r5  rr  r   rs   r     z(&(ObjectClass=z)(=r   ro   )ru   rr   r   r   )r   Nu>   Неправильный логин или пароль login=u=   Учетная запись заблокирована login=u   Ошибка u-    попытки авторизации login=u7   Не удалось авторизоваться login=Tr  )r8   r9   r:   r(  r   r;   r   rv   r<   r=   r5  rr  rs   searchr   entriesr~   r#   r  r   SUCCESSr   r&   r?   INVALID_CREDENTIALSUSER_DISABLEDr@   r-  r   UNKNOWN_ERROR)	rA   r  r   r:  r   _filterr   resrD   s	            r    signinzCmfAuthLdapPlugin.signin  sj     " 	ers1X ssdkk&;&;&A&A4;;C[C[CcCcCef Bjn$3D4J4J3K2dNfNfMgghinhooq"r..$6)jJ*-J;;t||'9'97z;Z'+|| B#'#6#6$#>4CYCYZ]C^*>$>%)\\#,,%I !B+9+A+A!B !BB B		e 	eBBs2 OPUwW_cd7	e8 +++!B !BB B , >KK%%(fglfm&no)===+	e 	e, , 8KK%%(efkel&mn)7771	e 	e2 ! sKK))M!<ijoip*qrrs3	e8 +++s   #I6AF8B1F,<F F,	F8 I6,F,-F85I6 F)%F,,F51F887I3/I6<6I32I6?I3!I.(I6.I33I66Jc                    t         j                  j                  | j                         t        j
                        }t         j                  j                  t         j                  j                  t        j                  |            s| j                  j                  d       t         j                  j                  d|      S )Ninitfiles)ospathr6   r_   r   rS   existsr  
UPLOAD_DIRr&   r   )rA   r   r   	file_paths       r    r,   z"CmfAuthLdapPlugin.get_log_filename  sq    GGLL!3!3!5z7J7JK	ww~~bggll6+<+<iHIKKV$ww||GY//r   F)forcec                    t         j                  j                  |       }|rt        d| d       y t	        |   ||dd| | j                          y )Nr   uM   Сначала очистите интегрированные данные: Tr  )rN  	recursive)rP   r$  rC  r   r  rH  r	  )rA   rN  r   r   has_datar  s        r    rH  zCmfAuthLdapPlugin.delete  sX    ++11d1Cefneopx|}ETDVD  "r   )NN)NNN)N)r   )Dr   r   r   _CmfAuthLdapPlugin__connectrO   r   r%   ui_meta_skip	api_allowapi_methodsri   rE   propertyrX   Loggerr&   rl   rM   abstractrm   Entryrw   r~   r   r   r-   r   r   r   r   staticmethodcmf_deferred_jobr   r   r  r'   r(   r   rP  rg  r+   r*   r)   r  r   r  r   r   r   r  r  r  r  r  r  r  r  r	  r  r  rT   r   r  r   rE  r,   rH  __classcell__)r  s   @r    r%   r%   "   s   IH'99FFTLI&88DD H
 
K L'0   ("u~~';';'A'A "d "&*c * *: -1t ,G*W[ *XD  ]almn	{ o 	{ ]epqrg s g(X xZ[\1M P ] Pd 6<E 7 <E|"3 tVWXY Y Y xZ[\S ] S xZ[\37D` D ] DL
 & &
*s3x *& X\=A42Dc3h4H 42`deh`i 42n VZ/3-Dc3h,@ -X\]`Xa -8<S$s)^8L-^ 
 tCy 
 T#Y 
  
    	 	  ;z='~ 5 5l !"$T TA,/\,C ,3 ,> ,@0 #( # #r   r%   )+rZ  r   gcr4   rh   rX   r   typingr   r   r   r   rM   ldap3.core.exceptionsr   r	   r
   r   r   r   ldap3.utils.dnr   ldap3.utils.convr   cmf.appr   cmf.data_providers.baser   cmf.includecmf.modules.logsr   modules.settings.fieldsr   r   r   pathlibr   modules.auth.enumsr   r@   r   r#   r%   r   r   r    <module>ri     sw     	 
   	 ' '  / 7 7 # 0  1  ' 8 + 
  -9 9 
`#,>> `#r   