U
    c*gS                     @   s   d dl Z d dlZd dl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T d dlmZ d dlmZ d d	lmZ d dlZd d
lmZ G dd dejZdS )    N)LDAPException)TlsServer
ConnectionNTLMSIMPLE)cmf_context)commit_all_ds)*)
log_config)cmf_auth_ldap_plugin)cached_property)Pathc                       s  e Zd ZdZdZejjd ZdZejj	dddddg Z	e
ejd	d
dZdOeedddZdddddZdd ZdPed	ddZdQed	ddZeedddddddd Zeeddddddd d! Zd"d# Zeeddddd$d%d&d'd(Zeeddd)d*d+ ZdRd,d-ZdSd/d0Zeeddddd1dd%d2d3d4Zd5d6 Zd7d8 Z ed9d: Z!d;d< Z"d=d> Z#d?ddd@ fdAdB
Z$ fdCdDZ%dEdF Z&dGdH Z'dIdJ Z(dKdL fdMdN
Z)  Z*S )TCmfAuthLdapPluginN)loggerTapplyclearsyncget_log_filenametest_connect)returnc                 C   s   | j r| j S tjj| tjd}|stj| tjd}|  |jsJ|d ddl	m
}m}m} |tj || td| _ tj| j |jtjd nt|  | _ | j S )uE    Журнал логирования процесса импорта )parentname    r   ) set_library_log_activation_levelset_library_log_detail_levelEXTENDEDldap3)level)_CmfAuthLdapPlugin__loggermodelsZCmfAttachmentgetr   LOG_NAMEsaveZfile_existsZupload_fileZldap3.utils.logr   r   r   loggingZERRORZ	getLoggerZinit_loggerZfull_path_fileINFOZ
get_loggerget_files_dir)selfZ
attachmentr   r   r    r(   1./modules/settings/models/cmf_auth_ldap_plugin.pyr       s    

zCmfAuthLdapPlugin.logger)ldap_user_nameldap_user_pwdc           
   
   O   s   t   | dddddg |s,| jjj}|s<| jj }tt	j
t	jdd}t| jj d| jj |d	}t}t||||d
| jjd}| r|W  5 Q R  S d|j }	| j|	 t|	W 5 Q R X d S )Nplugin.ext_urlplugin.ext_portconnection_timeoutzplugin.ext_loginplugin.ext_passwordz"/etc/ssl/certs/ca-certificates.crt)ZvalidateversionZca_certs_file:)ZtlsF)userpasswordauthenticationZauto_referralsZreceive_timeoutu@   Не удалось подключиться к серверу: )cmfutildisable_aclload_fieldsplugin	ext_loginvalueext_passworddecryptr   sslZCERT_OPTIONALZPROTOCOL_TLSv1_2r   Zext_urlZext_portr   r   r.   ZbindZ
last_errorr   error	Exception)
r'   r*   r+   argskwargsZtls_configurationZserverr4   connerrr(   r(   r)   connect6   s2    

 
 
 zCmfAuthLdapPlugin.connect)r9   r;   c             
   O   sz   z2|  || W 5 Q R X td | jd W dS  tk
rt } z$td|  | jd W Y dS d }~X Y nX d S )NuK   Подключение к серверу выполнено успешно.TuO   Подключение к серверу выполнено с ошибкой: uN   Подключение к серверу выполнено с ошибкой.F)rD   	cmf_alertr   infor   	exception)r'   r9   r;   r@   rA   er(   r(   r)   r   L   s    
zCmfAuthLdapPlugin.test_connectc              	   c   sd   d}d}|   8}|jjj||d|ddd}|D ]}|V  |d7 }q0W 5 Q R X | jd|  d S )N
   r   r
   T)search_basesearch_filter
attributes
paged_size	generatorZget_operational_attributes   u"   Загружено записей )rD   extendZstandardZpaged_searchr   rF   )r'   rJ   rK   rM   totalrB   Zentry_generatorentryr(   r(   r)   _paged_searchY   s    

 zCmfAuthLdapPlugin._paged_searchc              	   c   sN  z"|  dddg | jj}|r6| jr0| jj}nW d S d}d}|rn|d dkrjtddtd	d|}d
}d
}|r| jdkr|d| d| d7 }n|d| d7 }|rd
}|rd| d}| jd|  | j	r| j	
dD ]&}| |  d| j |E d H  qn| | jj|E d H  W n$ tk
rH   | jd  Y nX d S )Nadditional_user_dnuser_object_class_filterbase_dnFrO   &z\)$ z\(&Tadz(|(whenCreated>=z)(whenChanged>=))z(modifyTimeStamp>=)z(&u%   Фильтр запроса к LDAP: ;,u8   Ошибка загрузки пользователей)r7   rU   r:   user_disabled_filterresubdirectory_typer   rF   rT   splitrS   striprV   r?   rG   )r'   prev_sync_gtdisabledrK   Zcombine_filtersZfilter_was_not_emptyadd_dnr(   r(   r)   ldap_get_usersg   s<    

&z CmfAuthLdapPlugin.ldap_get_usersc                 c   s   zn|  dddg | jj}| jrV| jdD ]&}| |  d| j |E d H  q,n| | jj|E d H  W n" tk
r   | j	
d  Y nX d S )Nadditional_group_dngroup_object_class_filterrV   r\   r]   u(   Ошибка загрузки групп)r7   ri   r:   rh   rb   rS   rc   rV   r?   r   rG   )r'   rd   rK   rf   r(   r(   r)   ldap_get_groups   s    &z!CmfAuthLdapPlugin.ldap_get_groupsz	@minutely  	   )	only_once
system_jobZschedulesoft_time_limitpriorityc                  C   s   t jdddgddgdD ]l} | jr6| jj| jjd kr| jd|  d	 t j| j	jd
dd t j
| j	jdd | jd|  d qd S )N	auto_sync==T	sync_datesync_intervalfilterfields<   u.   Частичная синхронизация     запущенаu-   частичная синхронизацияauth_plugin_iddelta_minutes
sync_titler|   r~       завершена)r   listrs   agert   r:   r   rF   r   idr   auth_pluginr(   r(   r)   	cron_sync   s    
zCmfAuthLdapPlugin.cron_syncz	H 4 * * *ip  c                  C   s   t jdddgddgdD ]} | jr>| jj| jjd d d kr| jd	|  d
 t j| j	jd dd t j
| j	jdd | jd	|  d q| jd	|  d| jjd  d qd S )Nrq   rr   Tsync_all_datesync_all_intervalru   rx      u(   Полная синхронизация ry   u'   полная синхронизацияr{   r   r   u/    пропускается: sync_all_date.age = u    мин.)r   r   r   r   r   r:   r   rF   r   r   r   r   r(   r(   r)   cron_full_sync   s    
"z CmfAuthLdapPlugin.cron_full_syncc              	   C   s  | j d t }dddg}| j|dD ]}|jj D ]l\}}||krNq:|| d| d}| j d| d|d	   t|	 d
g }t
jjddd| dg|d}|st
jjd	d|d	 g|d}|s| j d|  t
j|d	 |d}|j s||_||jkr$|j | |_| D ]f\}	}
|	dkrBq,t||	r,|jr|	d	ksj|	dkr| j d|	 d|  nt||	|
 q,|jr:|  t  q:q(| j dt| d d S )Nu)   Синхронизируем группы--r   groupsrw   z::u-   Обрабатываем группу ext_id=z name=r   systemext_idZLIKE%ru   rr   u0   Не нашли группу, создадим: )r   r   codeu5   Игнорируется изменение поля u!    системной группы u   Обработано u    групп)r   rF   setall_raw_datar   r:   itemsaddr   keysr    CmfPersonGroupr!   r   loadhasattrr   warningsetattr
is_changedr#   
cmf_commitlen)r'   Zsyncedrw   objZgroup_idvalr   Zgroup_fieldsgroupkeyr:   r(   r(   r)   process_groups   s@    



z CmfAuthLdapPlugin.process_groups)rn   rm   ro   rp   u   синхронизация)r~   c                 O   sZ  ddl }td|  d tjj| ddgd}z|jdkr||jjd	kr`|j	
|  d
 n|j	
|  d W dS |j	
d|  |j  d|_|  t  tj  |  t  |jstdtjjdddgdddgdd|ggddid t p t Z d}dd tjjdd|gdddggdgdD }t|}d}	td||| D ] }
tjjdd|gdddgdd||
| |
| |  ggdddgdD ]}tjj| dgdj}|dkr|j	
|  d  qf|	d7 }	z<|j	
|  d|j d |	 d!| d |   t  W n0   |j!"  |j	#|  d"|  Y nX qqfW 5 Q R X W 5 Q R X d#|_|  t  tdd$D ]F}	tj$j%dkr|j	
|  d% t&tj'j(  qt)*d q|j	
|  d& W nX t+k
rT } z8t,| d'|_|  t  |j	#|  d(  W 5 d}~X Y nX dS ))uP   
        Сохраняем данные в CmfPerson и CmfPersonGroup
        r   NzStart CmfAuthLdapPlugin.apply(r[   sync_statusrs   r   rw   in_progressrk   h    пользователей зависла, запускаем форсированно повторно    уже запущена   Запущена uH   Укажите "Домен для логина" в настройках.dirtyrr   FZ	person_idr   T)rv   values2   c                 S   s   g | ]
}|j qS r(   )r   ).0ir(   r(   r)   
<listcomp>   s     z+CmfAuthLdapPlugin.apply.<locals>.<listcomp>r   ru   INr   loginuM   : обработка данных пользователей прерванаrO   u!   : обрабатываем login= (    из uH   : ошибка обработки данных пользователя closedrx   u-   : синхронизируем с eva_accountu2   : изменения применены в eva_appr>   u6   : ошибка применения изменений)-mathgdebugr    r   r!   r   rs   r   r   rF   
capitalizeset_nowr#   r   r   
ldap_groupr   domainAssertionErrorCmfAuthPluginDataZbulk_updater5   Zdisable_notifyr6   Zslistr   rangeceilr   sgetr   Zprocess_personZdpZrollbackrG   
global_varaccount_sync_statusschedule_deferred_job	CmfPersonaccount_sync_userstimesleepr?   cmf_rollback)r|   r~   _args_kwargsr   r   stepZall_dirty_idscntr   chunkraw_data
new_statusrH   r(   r(   r)   r      s    





*

<zCmfAuthLdapPlugin.apply)rm   rn   c              	   O   s\  t d|  d tjj| ddgd}|jdkr@|jd d S |jd |j	  d|_|
  t  d	}|jd
 tjj| d}d}d}||k r|| |k rtjj| d|gdddddgdD ]}z|jr4|jjs|jjd|j  d|j_tj }	|	|jjkr"|jj|	 |jj
  d |_|  |d	7 }t  |jd| d|  W q tk
r   |jd Y qX q|d	7 }qd	}tjj| d}|jd tjj| dgdD ]x}
zN|
jrd |
_|

  W q|
  |jd| d|  |d	7 }t  W n" tk
r8   |jd Y nX qd|_|
  |jd d S )NzStart CmfAuthLdapPlugin.clear(r[   r   rs   r   r   u2   Синхронизация уже запущенаu)   Очищаем синхронизациюrO   uh   Удаляем данные по пользователям (не самих пользователей)r      r   zperson.does_not_workzperson.rg_member_ofr   zperson.is_adminzperson.is_support)r   slicerw   u    Блокируем учетку Tu   Удалено r   u/   Ошибка удаления CmfAuthPluginDatau   Удаляем группы
cmf_import)r   rw   u,   Ошибка удаления CmfPersonGroupr   u!   Очистка завершена)r   r   r    r   r!   r   r   rF   rs   r   r#   r   r   countr   ZpersonZis_adminr   Zdoes_not_workr   r   Zrg_member_ofremover:   deleter?   rG   r   )r|   r   r   r   r   rQ   r   ndataZldap_grpr   r(   r(   r)   r   '  sl    





zCmfAuthLdapPlugin.clearc                 c   sp   ddl }d}tjjdd| gd}t||| D ]8}tjjdd| g||| || | gdD ]
}|V  q^q2dS )uB  Частями загружаем в память и отдаем, иначе будет утечка памяти

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

        Yields:
            CmfAuthPluginData: загруженные сырые данные
        r   Nr   r   rr   )rv   )rv   rw   r   )r   r    r   r   r   r   r   )r'   rw   r   r   r   r   rowr(   r(   r)   r   a  s    	
zCmfAuthLdapPlugin.all_raw_datarz   c              	   C   sp   ddl m}m} |jsd S |j||d |j }t|jd	dd |j
|j|j|j|jfD  }|d S )Nr   )	timedeltatimezone)ZminutesrX   c                 s   s*   | ]"}d dt t|  t| V  qdS )0   N)r   str)r   itemr(   r(   r)   	<genexpr>w  s   z6CmfAuthLdapPlugin._generalized_time.<locals>.<genexpr>z.0Z)Zdatetimer   r   r:   Z
astimezoneZutcZ	timetupler   tm_yearjointm_montm_mdaytm_hourtm_mintm_sec)r'   Z	date_timer}   r   r   ZdtZgtimer(   r(   r)   _generalized_timer  s    
z#CmfAuthLdapPlugin._generalized_time)rm   rn   ro   rp   )r}   r~   c           !      O   s	  t d|  d tjj| ddddddd	d
dddgd}zV|jdkr|jjdkrj|j	|
  d n|j	|
  d W d S |j	d|  |r|j|j|dnd }|j }d|_|  t  |j	d i }|j|dD ].}	|	ds|jd|	  qt|jjd}
|jdks4|jjrFt|	d |
d< nt|	d |jj|
d< t|
d tr|
d d |
d< |	d |jj}t|tr|d }|r||
d< |	d |jj}t|tr|d }|r||
d< |	d |jjg |
d < |
||	d < |j	|
  q|j	|
  d! t }t }t }|j|dD ]&}||}|slqT|||d < qTt|rt | }t|| }|j	|
  d"t| d#|d$d%|d&d' t }t }|j r|jd(|d)D ]&}||}|s
q|||d < qt|rrt | }t|| }|j	|
  d"t| d*d+|d$d%|d&d'  d}d}d}d}t! }t }tj"j#| d}|r*|j$dd,dd-d.d/d0d1d2d3d4gd5D ]`}ztjj%| dgdj}|dkr
|j	|
  d6 W  q*|j&j|krW q|'|j&j}|s8W q|(||| |)|j&j |d77 }d8|_*|j&|krtd(|_+|j,r|j	|
  d9|d,  d+| d:| d |d77 }d(|_-|jd(d; W n` t.k
r$ } z@|j/|
  d<|d,  d=|d  d>|  d?|_|d77 }W 5 d }~X Y nX qt | }|rp|| }|j	|
  d@| dA|d$d%|d&d' |r|| }|j	|
  dB| dA|d$d%|d&d' t }|0 D ]\}}ztjj%| dgdj}|dkr|j	|
  dC W  q|j	dD|d,   tj"||dE}|(||| d(|_-|  t  |)|j&j |d77 }W n` t.k
r } z@d?|_|j/|
  dF|d,  d=|d  d>|  |d77 }W 5 d }~X Y nX q|rt | }|| }|j	|
  dG| dA|d$d%|d&d' d}|sj|jd?krj|j$dd3dHgd5D ]4}|j&j|kr4d(|_*d(|_-|jd(d; |d77 }q4|rt | }|| }|j	|
  dI| dA|d$d%|d&d' |jdkrdJ|_|  t  tj12  tj34  t5ddKD ]0} t j6j7dkrt8tj1j9  q t:d7 q|rh|j|
  dL| dM t;j<|
  dN| dO| dM|dP n&|j	|
  dQ ||j_|  W n| t.k
	r } z\t=| |r|j/|
  dR d?|_|  t;j<|
  dN| dR|dP t   W 5 d }~X Y nX d S )SNzStart CmfAuthLdapPlugin.sync(r[   r,   r-   zplugin.loginr/   rV   r   zcmf_owner.loginra   r   use_user_groups_attrrs   r   r   i0*  r   r   r   )r}   u   Загружаем группы)rd   rL   u-   У записи нет аттрибутов: r   ZentryDNdnr   r   r   textmembersu,   : загружаем сырые данныеu   : загружено u2    изменённых пользователей (z.1fu
    сек., z.0fu    польз./сек.)T)re   rd   u2    отключенных пользователейr   r   
first_name	last_nameemailemployee_numberr   ldap_disabledr   
fields_mapr   u?   : обновление сырых данных прерваноrO   Fu;   : синхронизируем учетную запись /)Z	only_datauC   : Ошибка синхронизации пользователя (z): r>   u   : проверено u    пользователей (u#   : синхронизировано u/   : импортирование прерваноu$   Импортируем учетку )r   r   uC   : ошибка синхронизации пользователя u   : добавлено ldap_deletedu   : удалено r   rx   u)    завершена с ошибками (z). u(    завершена с ошибками()r   u#    успешно завершена.u%    завершена с ошибкой)>r   r   r    r   r!   r   rs   r   r   rF   r   r   Znowr#   r   rj   r   dictr   r:   group_uid_attrZis_nullr   
isinstancer   group_name_attrgroup_desc_attrgroup_users_attrr   rg   ldap_user_attributesr   r^   r   r   r   r   r   r   popupdate_raw_datar   r   r   r   r   r?   rG   r   r   Zflush_all_notify_opt_cacheZCmfProjectNotifySchemeZtrigger_reloadr   r   r   r   r   r   r5   Zadmin_alertr   )!r|   r}   r~   r   r   r   rd   Z
sync_start
cached_grpgrpr   Zgrp_nameZgrp_attrZ
start_timeZldap_users_dict	ldap_userr2   ZdurationZspeedZldap_disabled_users_dictZsync_errorsZusers_addedZusers_synchronizedZusers_updatedZldap_synchronizedr   r   r   rH   r   raw_userZusers_deletedr   r(   r(   r)   r   {  sx           



0

    
,.,,
.,,

&zCmfAuthLdapPlugin.syncc              
   C   s  dd l }|dsd S |d | jj}t|tr:|d }t|d | jj}t|trb|d }|sntd|d | j	j}t|tr|d }|d | j
j}t|tr|d }|d | jj}t|tr|d }|d | jj}t|tr|d }|d | jjg }	t|||||||	|d d}
| jrd|d | jj}t|tr\|d }||
d< | jrt |
d< || jj}| D ]l\}}|d |}t|tr|d |
d |< n6t|tr||
d |< n| jd| d	|d   q|
S )
Nr   rL   uW   Не удалось получить уникальный ИД пользователяr   )r   r   	name_attruser_name_attruser_last_name_attruser_email_attruser_groupsr   user_employee_number_attrr   u   Аттрибута нет u    в )jsonr!   user_full_name_attrr:   r   r   r   user_uid_attrr   user_display_name_attrr  r  r  user_groups_attrr   r  mapping_fieldsloadsr   r   rF   )r'   r  r	  r   r   r  r  r  r  r  r2   r  r  Z	attr_nameZ
field_nameZatt_valr(   r(   r)   r   X  s^    






  
 z&CmfAuthLdapPlugin.ldap_user_attributesc           	      C   s  |d |_ d|kr|d |_nd |_d|krL|d rL|d d |jj |_nd |_d|krz|d rz|d d |jj |_nd |_d|kr|d |_nd |_d|kr|d |_nd |_d|kr|d |_g }| jr:|D ]`}|| }|d |d	 kr|	|d
  |d
 |j
kr| jd|  ||j
|d
 < |j
|_
qnz|d D ]p}| jd|  ||}|r|	|d
  |d
 |j
kr||j
|d
 < |j
|_
n| jd|  qBt|j
j D ] }||kr|j
|= |j
|_
qd S )Nr   r  r  r  r  r  r   r   r   r   u9   Добавляем пользователю группу r  u   Ищем группу u   Не нашли группу )r   r   r   Z
max_lengthr   r   r   r   r   appendr   r   rF   r!   warnr   r:   r   )	r'   r  r  r   Zcurrent_user_groupsZ	group_uidr   entry_dnZ	gr_ext_idr(   r(   r)   r     sR    




z!CmfAuthLdapPlugin.update_raw_datac                  C   sZ   t jdkrdS g } tjjddgdD ]}| |d q$t | ddd	}td
| dS )u=   
        Отправляем в аккаунт 1к1
        FalseNz**plugin.*r   r   )Zeva_app_tokenauth_pluginsZrpc_account_plugin_push)rA   methodzauth/sync_accounts)	configZEVA_ACCOUNT_USEr    r   r   r  dumpsZgen_eva_app_tokenZcall_eva_account)r  r8   r   r(   r(   r)   account_plugin_push  s    

z%CmfAuthLdapPlugin.account_plugin_pushc                 C   s.   | j jsd S | j r*ttjjd| jjid d S )Nr|   )rA   )rq   r   r   r    r   r   r   r:   r'   r(   r(   r)   _process_auto_sync  s    z$CmfAuthLdapPlugin._process_auto_syncc                 C   sJ   dd l }| jjr| jsd S z|| jj W n   tddd Y nX d S )Nr   uY   Не правильный формат маппинга. прим {"description": "text"}Tabort)r	  r  r   r  r:   rE   )r'   r	  r(   r(   r)   _validate_mapping_fields  s    z*CmfAuthLdapPlugin._validate_mapping_fieldsr   depthnotifyemitc                   sf   t jstddd | jr,| js,tj g| _t j| _	| 
  |   |   t j||||d|S )NuE   Модуль доступен только в версии On-PremiseTr  r  )r  ZIS_BOX_VERSIONrE   Zis_newZdefault_groupsr    r   Z
user_groupZORG_NAMEZorg_name_process_directory_typer  r  superr#   )r'   r   r!  r"  r@   rA   	__class__r(   r)   r#     s    zCmfAuthLdapPlugin.savec                    s   t   ddg S )Nr
   r  )r$  save_preload_fieldsr  r%  r(   r)   r'    s    z%CmfAuthLdapPlugin.save_preload_fieldsc                 C   s  | j jsd S | j dkrd| _d| _d| _d| _d| _d| _d| _d	| _	d
| _
d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _n~| j dkrd| _d| _d| _d| _d| _d| _d| _d	| _	d
| _
d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d S )NrY   r2   z,(&(objectCategory=Person)(sAMAccountName=*))zZ(&(objectCategory=Person)(sAMAccountName=*)(userAccountControl:1.2.840.113556.1.4.803:=2))ZsAMAccountNameZcnZ	givenNameZsnZdisplayNameZmailZ
unicodePwdZ	plaintextZ
objectGUIDr   z6(&(objectCategory=group)(!(isCriticalSystemObject=*)))descriptionmemberZmemberOfZldapZinetorgpersonz(objectclass=inetorgperson)rX   ZuserPasswordZshaZ	entryUUIDZgroupOfUniqueNamesz (objectclass=groupOfUniqueNames)ZuniqueMember)ra   r   user_object_classrU   r^   r
  Zuser_rdn_attrr  r  r  r  Zuser_password_attrZuser_password_cryptr  r   Zgroup_object_classri   r   r   r   r  r  r(   r(   r)   r#    sT    
z)CmfAuthLdapPlugin._process_directory_typec                 C   s   t   | ddddg tdD ]}z| | jjj| jj	 }d| j
 d| j d| d	}|j| jj|d
dr|jD ]L}| |j|4}|W  5 Q R    W  5 Q R  W   W  5 Q R  S Q R X q~W 5 Q R X W q&   | jd| d|  Y q&X q&td| dd W 5 Q R X dS )u?   Авторизация через внешнюю системуr*  r
  rV   r     z(&(ObjectClass=z)(=rZ   r
   )rL   u   Ошибка u-    попытки авторизации login=u7   Не удалось авторизоваться login=Tr  N)r5   r6   r7   r   rD   r8   r9   r:   r;   r<   r*  r
  searchrV   entriesr  r   rG   rE   )r'   r   r3   r   rB   Z_filterresZ
_test_connr(   r(   r)   signin  s    
H zCmfAuthLdapPlugin.signinc                 O   sF   t j|  tj}t jt jtj|s8| j	
d t jd|S )NZinitfiles)ospathr   r&   r   r"   existsr  Z
UPLOAD_DIRr   rF   )r'   r@   rA   Z	file_pathr(   r(   r)   r   .  s    z"CmfAuthLdapPlugin.get_log_filenameF)forcec                   sL   t jj| d}|r(td| dd d S t j||dd| |   d S )Nr   uM   Сначала очистите интегрированные данные: Tr  )r5  	recursive)r    r   r   rE   r$  r   r  )r'   r5  r@   rA   Zhas_datar%  r(   r)   r   4  s    zCmfAuthLdapPlugin.delete)NN)NN)N)N)rz   )+__name__
__module____qualname__Z_CmfAuthLdapPlugin__connectr   r   r   Zui_meta_skipZ	api_allowZapi_methodspropertyr$   ZLoggerr   r   rD   r   rS   r   rg   rj   staticmethodZcmf_deferred_jobr   r   r   r   r   r   r   r   r   r   r  r  r  r#   r'  r#  r0  r   r   __classcell__r(   r(   r%  r)   r      sb   $%L
8

	 \17
.r   )gcr   r$   r_   Zldap3.core.exceptionsr   r   r   r   r   r   r   Zcmf.appr   Zcmf.data_providers.baser	   Zcmf.includeZcmf.modules.logsr   Zmodules.settings.fieldsr   r   r=   pathlibr   r   r(   r(   r(   r)   <module>   s   