
    oiz                     L   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	 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jP                        Z(y)    )	timedeltaN)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dEdedefdZddddZd ZdFdefdZdGd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$dEd$Z%dHd%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,d/e-e.ee/f      d0e-e   fd1Z0d/e-e.ee/f      d0e-e   de.ee-e   f   fd2Z1ed3e-e   de-e   fd4       Z2d5 Z3d6 Z4ed7        Z5d8 Z6d9 Z7dddd: fd;
Z8 fd<Z9d= Z:d>ed?ede;fd@Z<dA Z=dBdC fdD
Z> xZ?S )I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messager1   r3   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.logrH   rI   rJ   loggingERROR	getLoggerinit_loggerfull_path_fileINFO
get_loggerget_files_dir)r?   
attachmentrH   rI   rJ   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_startrN   r#   sgetrc   ra   )r?   
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)r?   rk   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_loginr.   z"/etc/ssl/certs/ca-certificates.crt)validateversionca_certs_file:)tlsF)userpasswordauthenticationauto_referralsreceive_timeoutu@   Не удалось подключиться к серверу: r/   invalidCredentials)r6   r7   r8   r9   	ext_loginrt   r:   r;   r   sslCERT_OPTIONALPROTOCOL_TLSv1_2r   ext_urlext_portr   r	   r   bind
last_errorr<   r$   r=   r   r>   )r?   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   Подключение к серверу выполнено успешно.Tr/   r.   uO   Подключение к серверу выполнено с ошибкой: F)r   	cmf_alertr$   infor>   strr<   r6   r7   r8   r9   r:   r;   r=   )r?   r   r:   r   r   rB   	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)Nr`   r   r   T)search_basesearch_filter
attributes
paged_size	generatorget_operational_attributes   u"   Загружено записей )r   extendstandardpaged_searchr$   r   )r?   r   r   r   totalr   entry_generatorrk   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:=)rm   z(|(whenCreated>=z)(whenChanged>=))z(|z(&z(|(modifyTimeStamp>=z(modifyTimeStamp>=u%   Фильтр запроса к LDAP: ;,u8   Ошибка загрузки пользователей)r8   r   rt   user_disabled_filterresubr4   r   rq   r$   r   r   splitr   stripr   r>   rC   )
r?   prev_sync_gtry   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(   Ошибка загрузки групп)
r8   r   rt   r   r   r   r   r   r>   rC   )r?   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filterrd   <   u.   Частичная синхронизация     запущенаu-   частичная синхронизацияauth_plugin_iddelta_minutes
sync_titler   r       завершена)r#   listr   ager   rt   r$   r   r'   rc   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   rt   r$   r   r'   rc   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)   Синхронизируем группы)--rc   groupspersonrd   Fz::u-   Обрабатываем группу ext_id=z name=rG   systemext_idLIKE%r   r   u0   Не нашли группу, создадим: )rG   r   codeu5   Игнорируется изменение поля u!    системной группы u   Обработано u    группT)r$   r   setall_raw_datarj   r   rt   itemsaddr   keysrN   CmfPersonGrouprP   r   loadhasattrr   warningsetattr
is_changedrR   
cmf_commitlen)r?   syncedrd   objgroup_idvalr   group_fieldsgroupkeyrt   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)ra   r   
sync_grouprb   re   r   h    пользователей зависла, запускаем форсированно повторно    уже запущена   Запущена u8   : синхронизация групп прерванаuH   Укажите "Домен для логина" в настройках.)dirtyr   F)	person_idr   Nr   r   r  )r   values2   )r  r   Trc   z-ldap_deleted)r   rd   order_byIN)r   rc   loginuM   : обработка данных пользователей прерванаr   u!   : обрабатываем login= (    из uH   : ошибка обработки данных пользователя closedr   u-   : синхронизируем с eva_accountu2   : изменения применены в eva_appr=   u6   : ошибка применения изменений)1mathr   debug license_disable_user_count_hooksrN   r#   rP   ra   r   r   r$   r   
capitalizeset_nowrR   r  r   
ldap_groupr  domainr  CmfAuthPluginDatabulk_updater6   disable_notifyr7   slistrc   r  rangeceilr   rj   r  process_persondprollback	exception
global_varaccount_sync_statusschedule_deferred_job	CmfPersonaccount_sync_usersrf   sleep
CmfLicenserecalc_users_countsr>   cmf_rollback)r   r   _args_kwargsr  r   stepiall_dirty_idscntchunkraw_datarB   s                r   r%   zCmfAuthLdapPlugin.apply;  s>    		00@BC-1*..22nMw2x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   Tra   r   rb   re   u2   Синхронизация уже запущенаu)   Очищаем синхронизациюr   uh   Удаляем данные по пользователям (не самих пользователей)r      r   u:   Очистка синхронизации прервана)zperson.does_not_workzperson.rg_member_ofr   zperson.is_adminzperson.is_support)r   slicerd   u    Блокируем учетку u   Удалено r  u/   Ошибка удаления CmfAuthPluginDatau   Удаляем группы
cmf_import)r   rd   u,   Ошибка удаления CmfPersonGroupr  u!   Очистка завершена)!r   r  r  rN   r#   rP   ra   r$   r   r   r  rR   r  r"  countrj   r   r   is_adminr   does_not_workr   r   rg_member_ofremovert   deleter>   r+  r@  r.  r2  r3  )r   r5  r6  r   r8  r   r7  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   rd   r?  )r  rN   r"  rA  r&  r'  r   )r?   rd   r:  r  r7  r8  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           	      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)0rn   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   rM  rt   
astimezoneutc	timetupler   tm_yearr4   tm_montm_mdaytm_hourtm_mintm_sec)r?   	date_timer   r   rM  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   r5  r6  s      r   r)   zCmfAuthLdapPlugin.sync_new  s;     	n-W 	 	Y 	~W 	  	Yr   c                 `    t         j                  | d       t         j                  | d       y )Nu4   ручная полная синхронизацияr   rd  re  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 }|jE                  ||
      D ]U  }|jG                  |      }|s|d   }|||<   |d   r|jA                  |       8|jH                  sE|jA                  |       W |jK                  ||       tM        |      retC        jB                         |z
  }tM        |      |z  }|j                  j                  |j                          dtM        |       d |d!d"|d#d$       t)               }tC        jB                         }|jN                  r4|jE                  d|%      D ]  }|jG                  |      }|s|||d   <     tM        |      ritC        jB                         |z
  }tM        |      |z  }|j                  j                  |j                          dtM        |       d&d'|d!d"|d#d$z          d}d}d}d}tQ               }tC        jB                         }|rd(nt        jR                  jU                  |       } |r`|jW                  g d)*      D ]H  }!	 |j%                         r.|j                  j                  |j                          d+        y |!jX                  j,                  |vr\|j[                  |!jX                  j,                        }|s|j]                  |!||	       |j_                  |!jX                  j,                         |d,z  }|!j`                  rd-|!_0        |!jX                  |v |!_1        |!jd                  rV|j                  j                  |j                          d.|d/    d'| d0|  d       |d,z  }d|!_3        |!j                  d1       K tC        jB                         |z
  }|r<||z  }|j                  j                  |j                          d6| d7|d!d"|d#d$       |r<||z  }|j                  j                  |j                          d8| d7|d!d"|d#d$       tC        jB                         }|jm                         D ]  \  }#}	 |j%                         r.|j                  j                  |j                          d9        y |j                  j                  d:|d/           t        jS                  |#|;      }$|j]                  |$||	       d|$_3        |$j                          t!                |j_                  |$jX                  j,                         |d,z  } |rStC        jB                         |z
  }||z  }|j                  j                  |j                          d=| d7|d!d"|d#d$       d}%to        ||jH                  |j                  d5k7  f      rA|D ]<  }#t        jR                  j                  ||#>      }!|!s'|jq                  |!       |%d,z  }%> |sW|j                  d5k7  rH|jW                  g d?*      D ]1  }!|!jX                  j,                  |vs|jq                  |!       |%d,z  }%3 |%rStC        jB                         |z
  }|%|z  }|j                  j                  |j                          d@|% d7|d!d"|d#d$       |j                  dk(  rdA|_        |j                          t!                t        jr                  ju                          t        jv                  jy                          t{        ddB      D ]Y  }&t         j|                  j~                  dk7  r%t        t        jr                  j                          ntC        j                  d,       [ |r^|j                  j'                  |j                          dC| dD       t        j                  |j                          dE| dF| dD|G       nM|j                  j                  |j                          dH       ||j                  _        |j                          t        t        j                  j                         y # th        $ rQ}"|j                  jk                  |j                          d2d/    d3|d    d4|        d5|_        |d,z  }Y d }"~"Ed }"~"ww xY w# th        $ rQ}"d5|_        |j                  jk                  |j                          d<|d/    d3|d    d4|        |d,z  }Y d }"~"d }"~"ww xY w# th        $ r}"t        |"       |r|j                  jk                  |j                          dI       d5|_        |j                          t        j                  |j                          dE| dI|G       t        t        j                  j                         t!                 d }"~"ww xY w)JNzStart CmfAuthLdapPlugin.sync(r   T)r   r   zplugin.loginr.   r   r!  zcmf_owner.loginrq   ra   use_user_groups_attrr   rb   re   i0*  r  r  r  )r   rN  u   Загружаем группы)r   u.   : загрузка групп прерванаr   u-   У записи нет аттрибутов: r   entryDNdnr   r   rG   textmembersr-   whenChangedu,   : загружаем сырые данные)r   r   user_groupsu   : загружено u2    изменённых пользователей (z.1fu
    сек., z.0fu    польз./сек.))ry   r   u2    отключенных пользователейr  i  )r   r  rG   
first_name	last_nameemailemployee_numberr   ldap_disabledldap_deletedr  
fields_mapr   u?   : обновление сырых данных прерваноr   Fu;   : синхронизируем учетную запись r  /	only_datauC   : Ошибка синхронизации пользователя (z): r=   u   : проверено u    пользователей (u#   : синхронизировано u/   : импортирование прерваноu$   Импортируем учетку )r   r   uC   : ошибка синхронизации пользователя u   : добавлено )r   r   )r   r  rt  u   : удалено r  r   u)    завершена с ошибками (z). u(    завершена с ошибками()r  u#    успешно завершена.u%    завершена с ошибкой)Hr   r  r  rN   r#   rP   ra   r   r   r$   r   r  rb  r   nowrR   r  r   rj   r   dictrc   rt   group_uid_attris_nullr   
isinstancer   group_name_attrgroup_desc_attrrh  group_users_attrappendrf   r   ldap_user_attributesblock_users_without_groups_delete_users_from_groupr  r   r   r"  rA  r   r   popupdate_raw_datar   rt  rs  r  r  r>   r+  r   all_mark_deletedr/  flush_all_notify_opt_cacheCmfProjectNotifySchemetrigger_reloadr&  r,  r-  r.  r0  r1  r6   admin_alertr2  r3  r4  )'r   r   r   r5  r6  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	ldap_userr   user_ext_iddurationspeedldap_disabled_users_dictsync_errorsusers_addedusers_synchronizedusers_updatedldap_synchronizedr:  r<  rB   r   raw_userusers_deletedr8  s'                                          r   r'   zCmfAuthLdapPlugin.sync  s    	
//?qAB-1*..22 ' 3 
{	&&-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(77\bp7q 7	"77	B"8n/3,&&&t, ;;"))+67 00>RS?#99;3O,x7""'':+@+@+B*CCXY\]lYmXn o--5cN*U3KOd)f g (,v$J//!,!;!;TXd!;!e DI&;;IFD ?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 + 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Hq % )#**44
8M8M8O7P Q99B79K8LAiX`NaMbbefoep6r s29/#q(	)< ! %.5K+&&00J4I4I4K3L M55>w5G4H)T\J]I^^abkal2n o1$K	%x  		O"",,
0E0E0G/HHm-no*1'  "##z'<'<'>&?qMr$s  zE#  F%f&7&7&K&KL		s   	Bt+ D!t+ -Kt+ 9Gt+ <q1t+ q1t+ 'q1t+ Cq1
C t+ <st+ 	BsB&t+ At+ Ht+ 1	s:As t+ st+ 	t(At#t+ #t((t+ +	w"4B)ww"c                 D    d| _         d| _        | j                  d       y )NTrw  )rt  r  rR   )r<  s    r   r  zCmfAuthLdapPlugin._mark_deleted  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   
        Вычисление и блокировка пользователей.
        rc   r  r  zrg_member_of.ext_idr   c              3   N   K   | ]  }|j                   j                  sd   yw)r   N)r   rt   )rR  r	  s     r   rT  z1CmfAuthLdapPlugin._block_users.<locals>.<genexpr>  s      XuU\\EWEW Xs   %%u.   Блокируем пользователя %sT)	from_ldapN)
rN   r/  r   sumrD  r$   r   r  rC  rR   )r?   r  	all_usersr   ext_groups_sums        r   _block_userszCmfAuthLdapPlugin._block_users  s    
 $$))4&8!9:;23 * 
	
  	*D  X0A0A XXN!  !QSWS]S]^%)"		D	)	*r   r  r  c                 .   | j                  ||      }t               }|D ]H  }t        j                  j	                  |dg|       }|s*|j
                  D ch c]*  }|j                  j                  j                  d      d   , }}t        ||         }	||	z
  }
|
s| j                  j                  d||
       |j
                  D cg c].  }|j                  j                  j                  d      d   |
v r|0 }}|D ]B  }|j                  |j                  j                         |j
                  j                  |       D |j
                  |_        |j                  d       K |r| j                  r| j!                  |       y y y c c}w c c}w )N
rg_members)rG   rd   r   @r   uB   Удаляем пользователей из группы %s: %sTrw  )_map_users_groupr   rN   r   rP   r  r  rt   r   r$   r   r   rc   rE  rR   r  r  )r?   r  r  groups_user_mappingr  
group_namer	  r   rg_members_loginsexternal_memberslogins_to_deleteusers_to_deletes               r   r  z*CmfAuthLdapPlugin._delete_users_from_group  s   "33KAUV U. 	+J))--:|nbf-gELQL\L\ ]D!1!1!7!7!<Q!? ] ]"#6z#BC03CC  !egq  tD  E%*%5%5#!zz''--c2159II # #
 , 2D&**477==9$$++D12 $)#3#3 

T
*)	+, $"A"A01 #B# !^
#s   /F	3Fc                     |D ci c]  }|g  }}|D ]N  }t        |j                  dg             }|D ],  }||v s||   j                  |d   j                                . P |S c c}w )Nuser_groups_namesr  )r   rP   r  lower)r?   r  r  r	  resultr   rn  s          r   r  z"CmfAuthLdapPlugin._map_users_group7  s    ?S'Ter	'T'T 	@Ddhh':B?@K- @K'5M((g)<)<)>?@	@  (Us   
A&rn  c                     g }| D ]O  }t        |      }|s|d   }t        |      dk\  s%|d   j                         dk(  s<|j                  |d          Q |S )Nr   rn   CNr   )r   r  upperr  )rn  user_group_namesr	  parsedrdns        r   __get_group_namesz#CmfAuthLdapPlugin.__get_group_namesA  se      	0Ee_F)C3x1}Q4!7 ''A/	0  r   c                    dd l }|j                  d      sy |d   j                  | j                  j                        }t	        |t
              r|d   }t        |d   j                  | j                  j                              }t	        |t
              r|d   }|sJ d       |d   j                  | j                  j                        }t	        |t
              r|d   }|d   j                  | j                  j                        }t	        |t
              r|d   }|d   j                  | j                  j                        }t	        |t
              r|d   }|d   j                  | j                  j                        }t	        |t
              r|d   }|d   j                  | j                  j                  g       }	| j                  |	      }
t        |||||||	|
|d   	      }| j                  rB|d   j                  | j                  j                        }t	        |t
              r|d   }||d<   | j                   rt               |d<   |j#                  | j                   j                        }|j%                         D ]r  \  }}|d   j                  |      }t	        |t
              r|d   |d   |<   6t	        |t              r	||d   |<   O| j&                  j)                  d| d	|d           t |S )
Nr   r   uW   Не удалось получить уникальный ИД пользователяrj  )	r  r   	name_attruser_name_attruser_last_name_attruser_email_attrrn  r  rj  user_employee_number_attrru  u   Аттрибута нет u    в )jsonrP   user_full_name_attrrt   r  r   r   user_uid_attruser_display_name_attrr  r  r  user_groups_attr#_CmfAuthLdapPlugin__get_group_namesr|  r  mapping_fieldsloadsr   r$   r   )r?   r  r  r  r   r  r  r  r  rn  r  r   r  r  	attr_name
field_nameatt_vals                    r   r  z&CmfAuthLdapPlugin.ldap_user_attributesN  s   }}\*,'++D,D,D,J,JKeT"!HEY|,001C1C1I1IJKfd#AYFpppv|,001L1L1R1RS	i&!!I"<044T5H5H5N5NOnd++A.N'599$:R:R:X:XY)40"5a"8#L155d6J6J6P6PQot,-a0O-11$2G2G2M2MrR 22;?%'(;$3 +?P ( ))(1,(?(C(CDDbDbDhDh(i%3T:,Ea,H)0ID,-!%D!ZZ(;(;(A(ABN)7)=)=)? l%	:#L155i@gd+5<QZD&z2,5<D&z2KK$$'A)DQZ[gQhPi%jkl 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  r  r  r  r  ru  rj  rl  r   u9   Добавляем пользователю группу rn  u   Ищем группу u   Не нашли группу T)r  rG   ro  
max_lengthrp  rq  rr  ru  rh  r  r   r$   r   rP   warnr   rt   r   r  r  r  )	r?   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_USErN   r#   r   r  dumpsgen_eva_app_tokencall_eva_account)r  r9   rH  s      r   account_plugin_pushz%CmfAuthLdapPlugin.account_plugin_push  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  r.  rN   r#   r%   rc   rt   r?   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  rt   r   )r?   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_groupsrN   r   
user_groupORG_NAMEorg_name_process_directory_typer  r  superrR   )r?   r  r  r  r   r   	__class__s         r   rR   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)r?   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 )Nrm   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)rq   r  user_object_classr   r   r  user_rdn_attrr  r  r  r  user_password_attruser_password_cryptr  r}  group_object_classr   r  r  r  r  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?   Авторизация через внешнюю систему)r  r  r   rq   r     z(&(ObjectClass=z)(=r   rm   )rs   rp   r   r   )r   Nu>   Неправильный логин или пароль login=u=   Учетная запись заблокирована login=u   Ошибка u-    попытки авторизации login=u7   Не удалось авторизоваться login=Tr  )r6   r7   r8   r&  r   r9   r   rt   r:   r;   r  r  rq   searchr   entriesr|   r!   r  r   SUCCESSr   r$   r=   INVALID_CREDENTIALSUSER_DISABLEDr>   r+  r   UNKNOWN_ERROR)	r?   r  r   r8  r   _filterr   resrB   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pathr4   r]   r   rQ   existsr  
UPLOAD_DIRr$   r   )r?   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  )r.  	recursive)rN   r"  rA  r   r  rF  r  )r?   r.  r   r   has_datar  s        r   rF  zCmfAuthLdapPlugin.deleteC  sX    ++11d1Cefneopx|}ETDVD  "r   )NN)NNN)N)r   )@r   r   r   _CmfAuthLdapPlugin__connectrM   r   r#   ui_meta_skip	api_allowapi_methodsrg   rC   propertyrV   Loggerr$   rj   rK   abstractrk   Entryru   r|   r   r   r+   r   r   r   r   staticmethodcmf_deferred_jobr   r   r  r%   r&   r   rb  r)   r(   r'   r  r   r  r   DictAnyr  r  r  r  r  r  r  r  rR   r   r  r   r%  r*   rF  __classcell__)r  s   @r   r#   r#   "   sK   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|" tVWXY Y Y xZ[\S ] S xZ[\37D` D ] DL & &
*s3x *$2Dc3h4H 2`deh`i 2:Dc3h,@ X\]`Xa fjknptuxpykyfz  
 tCy 
 T#Y 
  
 1f='~ 5 5l !"$T TA,/\,C ,3 ,> ,@0 #( # #r   r#   ))rU  r   gcr2   rf   rV   r   typingr   r   rK   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>rK     st     	 
   	   / 7 7 # 0  1  ' 8 + 
  -9 9 
g#,>> g#r   