U
    |)i                     @   s   d dl 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 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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 d dlmZ G dd deZG dd deZ G dd dej!Z!dS )    N)LDAPException)TlsServer
ConnectionNTLMSIMPLEescape_filter_chars)cmf_context)commit_all_ds)*)
log_config)cmf_auth_ldap_plugin)cached_property)Path)LdapStatusCodec                   @   s   e Zd ZdS )LdapCredentialsErrorN__name__
__module____qualname__ r   r   1./modules/settings/models/cmf_auth_ldap_plugin.pyr      s   r   c                   @   s   e Zd ZdS )LdapUserDisableErrorNr   r   r   r   r   r      s   r   c                       s<  e Zd ZdZdZejjd ZdZejj	dddddd	d
g Z	dZ
d_ddZeejdddZdd ZejjjedddZd`eedddZdddddZdd ZdaedddZdbe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/d0d1d2d3Z#eeddd4d5d6 Z$dcd7d8Z%ddd:d;Z&eeddd#d$d<d=d> Z'eeddd)d$d<d?d@ Z(eedddAd$d<dd0dBdCdDZ)dEdF Z*dGdH Z+edIdJ Z,dKdL Z-dMdN Z.ddddO fdPdQ
Z/ fdRdSZ0dTdU Z1eee2dVdWdXZ3dYdZ Z4d[d\ fd]d^
Z5  Z6S )eCmfAuthLdapPluginN)loggerTapplyclearsyncsync_allsync_newget_log_filenametest_connectr   c              	   C   s   zddl }|dkrt }|rd|j| }t 2 | dg | jj	
 rd|| jj	
 d}W 5 Q R X | j| d|  n| j| W n  tk
r   | j| Y nX dS )um   Безопасное логирование исключений с маскированием паролейr   NT plugin.ext_password***
)	tracebacksysexc_infojoinformat_exceptioncmfutildisable_aclload_fieldspluginext_passworddecryptreplacer   error	Exception)selfmessager)   r'   Zexc_textr   r   r   _safe_log_exception/   s    
z%CmfAuthLdapPlugin._safe_log_exception)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)r5   Z
attachmentr<   r=   r>   r   r   r   r   G   s    

zCmfAuthLdapPlugin.loggerc                 C   s>   t   | j dkr:t   | _tjj| jdgdj}|dkS dS )N
   sync_statusidfieldsin_progressF)timebroken_startrB   r   sgetrL   rJ   )r5   Z
new_statusr   r   r   broken\   s
    
zCmfAuthLdapPlugin.broken)entryr8   c                 C   sP   | j dkrdS d}d}t|jj}t||@ }t|d j}t||@ }|pN|S )uK   Проверка, что пользователь заблокирован.adF      "msDS-User-Account-Control-Computed)directory_typeintuserAccountControlvaluebool)r5   rS   ZUAC_ACCOUNTDISABLEZUAC_LOCKOUTZuacdisabledZcomputedlockedr   r   r   _is_user_disabledc   s    
z#CmfAuthLdapPlugin._is_user_disabled)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 }	|	}
|r|
|d}
| j|
 |jdkrt|
t|
W 5 Q R X d S )Nplugin.ext_urlplugin.ext_portconnection_timeoutzplugin.ext_loginr$   z"/etc/ssl/certs/ca-certificates.crt)ZvalidateversionZca_certs_file:)ZtlsF)userpasswordauthenticationZauto_referralsZreceive_timeoutu@   Не удалось подключиться к серверу: r%   ZinvalidCredentials)r,   r-   r.   r/   	ext_loginr[   r0   r1   r   sslZCERT_OPTIONALZPROTOCOL_TLSv1_2r   Zext_urlZext_portr   r   rd   ZbindZ
last_errorr2   r   r3   r   r4   )r5   r`   ra   argskwargsZtls_configurationZserverri   connerrZsafe_errr   r   r   connectv   s<    

 
 
 
zCmfAuthLdapPlugin.connect)rj   r0   c                O   s   z2|  || W 5 Q R X td | jd W dS  tk
r } zt|}|r\||d}t 2 | 	dg | j
j r|| j
j d}W 5 Q R X td|  | jd|  W Y dS d }~X Y nX d S )NuK   Подключение к серверу выполнено успешно.Tr%   r$   uO   Подключение к серверу выполнено с ошибкой: F)rp   	cmf_alertr   infor4   strr2   r,   r-   r.   r/   r0   r1   r3   )r5   rj   r0   rl   rm   eZ	error_msgr   r   r   r"      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 )NrI   r   r   T)search_basesearch_filter
attributes
paged_size	generatorZget_operational_attributes   u"   Загружено записей )rp   extendZstandardZpaged_searchr   rr   )r5   ru   rv   rx   totalrn   Zentry_generatorrS   r   r   r   _paged_search   s    

 zCmfAuthLdapPlugin._paged_searchc           	   	   c   s  zb|  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|rddd |D nd}| jdkr|d| d| d| d7 }n,|r|d| d| d7 }n|d| d7 }|rd
}|rd| d}| j	d|  | j
rL| j
dD ](}| |  d| j |E d H  q n| | jj|E d H  W n& tk
r   | jdd
d  Y nX d S )Nadditional_user_dnuser_object_class_filterbase_dnFrz   &z\)$r#   z\(&Tc                 S   s   g | ]}d t | dqS )z#(memberof:1.2.840.113556.1.4.1941:=)r   ).0gr   r   r   
<listcomp>   s   z4CmfAuthLdapPlugin.ldap_get_users.<locals>.<listcomp>rT   z(|(whenCreated>=z)(whenChanged>=r   z(|(modifyTimeStamp>=z(modifyTimeStamp>=z(&u%   Фильтр запроса к LDAP: ;,u8   Ошибка загрузки пользователейr)   )r.   r   r[   user_disabled_filterresubr*   rX   r   rr   r~   splitr}   stripr   r4   r7   )	r5   prev_sync_gtr]   changed_groupsrv   Zcombine_filtersZfilter_was_not_emptyZor_in_groupsadd_dnr   r   r   ldap_get_users   sL    

(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dd  Y nX d S )	Nadditional_group_dngroup_object_class_filterr   r   r   u(   Ошибка загрузки группTr   )
r.   r   r[   r   r   r}   r   r   r4   r7   )r5   r   rv   r   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filterrM   <   u.   Частичная синхронизация     запущенаu-   частичная синхронизацияauth_plugin_iddelta_minutes
sync_titler   r       завершена)r   listr   ager   r[   r   rr   r   rL   r   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 )Nr   r   Tsync_all_datesync_all_intervalr   r      u(   Полная синхронизация r   u'   полная синхронизацияr   r   r   u/    пропускается: sync_all_date.age = u    мин.)r   r   r   r   r   r[   r   rr   r   rL   r   r   r   r   r   cron_full_sync   s    
"z CmfAuthLdapPlugin.cron_full_syncc              	   C   s  | j d t }ddddg}| j|dD ]}|  r> dS |jj D ]n\}}||kr^qJ|| 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r6|j | |_| D ]f\}	}
|	dkrTq>t||	r>|jr|	dks||	dkr| j d|	 d|  nt||	|
 q>|jrJ|  t  qJq*| j dt| d dS )Nu)   Синхронизируем группы--rL   groupspersonrM   Fz::u-   Обрабатываем группу ext_id=z name=r:   systemext_idZLIKE%r   r   u0   Не нашли группу, создадим: )r:   r   codeu5   Игнорируется изменение поля u!    системной группы u   Обработано u    группT)r   rr   setall_raw_datarR   r   r[   itemsaddr   keysrB   CmfPersonGrouprC   r   loadhasattrr   warningsetattr
is_changedrE   
cmf_commitlen)r5   ZsyncedrM   objZgroup_idvalr   Zgroup_fieldsgroupkeyr[   r   r   r   process_groups	  sF    


z CmfAuthLdapPlugin.process_groupsi@8  )r   r   r   r   u   синхронизация)r   c                 O   s  ddl }td|  d dt_tjj| dddgd	}z|jd
kr|jj	dkrh|j
|  d n|j
|  d W dS |j
d|  |j  d
|_|  t  tj  | s|j
|  d W dS t  |jstd|js*tjjdddgdddgdd|ggddid t | t f d}dd tjjdd|gdddggd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gdD ]}|  r$|j
|  d    W 5 Q R  W 5 Q R  W dS |	d!7 }	z<|j
|  d"|j! d#|	 d$| d |"  t  W n0   |j#$  |j
%|  d%|  Y nX qqW 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*  qt+,d! q|j
|  d) t(tj-j. W nd t/k
r } zDt0| d*|_|  t(tj-j. t  |j
%|  d+  W 5 d}~X Y nX dS ),uP   
        Сохраняем данные в CmfPerson и CmfPersonGroup
        r   NzStart CmfAuthLdapPlugin.apply(r   TrJ   r   
sync_grouprK   rN   r   h    пользователей зависла, запускаем форсированно повторно    уже запущена   Запущена u8   : синхронизация групп прерванаuH   Укажите "Домен для логина" в настройках.dirtyr   FZ	person_idr   )r   values2   c                 S   s   g | ]
}|j qS r   )rL   )r   ir   r   r   r   Z  s     z+CmfAuthLdapPlugin.apply.<locals>.<listcomp>rL   z-ldap_deleted)r   rM   Zorder_byINr   loginuM   : обработка данных пользователей прерванаrz   u!   : обрабатываем login= (    из uH   : ошибка обработки данных пользователя closedr   u-   : синхронизируем с eva_accountu2   : изменения применены в eva_appr3   u6   : ошибка применения изменений)1mathr   debug license_disable_user_count_hooksrB   r   rC   rJ   r   r   r   rr   
capitalizeset_nowrE   r   r   
ldap_groupr   domainAssertionErrorr   CmfAuthPluginDataZbulk_updater,   Zdisable_notifyr-   Zslistr   rangeceilr   rR   r   Zprocess_personZdpZrollback	exception
global_varaccount_sync_statusschedule_deferred_job	CmfPersonaccount_sync_usersrO   sleep
CmfLicenserecalc_users_countsr4   cmf_rollback)r   r   _args_kwargsr   r   stepZall_dirty_idscntr   chunkraw_datart   r   r   r   r   5  s    


 
 

*

<zCmfAuthLdapPlugin.apply)r   r   c              	   O   s  t d|  d dt _tjj| ddgd}|jdkrF|jd d S |jd	 |j	
  d|_|  t  d
}|jd tjj| d}d}d}||k r|| |k r| r|jd d S tjj| d|gdddddgdD ]}z|jrT|jjs|jjd|j  d|j_tj }	|	|jjkrB|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rd |
_|
  W q|
  |jd| d|  |d
7 }t  W n" tk
rX   |jd Y nX qd|_|  |jd ttjj  d S ) NzStart CmfAuthLdapPlugin.clear(r   TrJ   r   rK   rN   u2   Синхронизация уже запущенаu)   Очищаем синхронизациюrz   uh   Удаляем данные по пользователям (не самих пользователей)r      r   u:   Очистка синхронизации прерванаzperson.does_not_workzperson.rg_member_ofr   zperson.is_adminzperson.is_support)r   slicerM   u    Блокируем учетку u   Удалено r   u/   Ошибка удаления CmfAuthPluginDatau   Удаляем группы
cmf_import)r   rM   u,   Ошибка удаления CmfPersonGroupr   u!   Очистка завершена)!r   r   r   rB   r   rC   rJ   r   rr   r   r   rE   r   r   countrR   r   r   Zis_adminr   Zdoes_not_workr   r   Zrg_member_ofremover[   deleter4   r   r   r   r   r   )r   r   r   r   r   r|   r   ndataZldap_grpr   r   r   r   r     sv    






zCmfAuthLdapPlugin.clearc                 c   sx   ddl }d}|r|ntjjdd| gd}t||| D ]8}tjjdd| g||| || | gdD ]
}|V  qfq:dS )uB  Частями загружаем в память и отдаем, иначе будет утечка памяти

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

        Yields:
            CmfAuthPluginData: загруженные сырые данные
        r   Nr   r   r   )r   )r   rM   r   )r   rB   r   r   r   r   r   )r5   rM   r   r   r   r   rowr   r   r   r     s    	
zCmfAuthLdapPlugin.all_raw_datar   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minutesr#   c                 s   s*   | ]"}d dt t|  t| V  qdS )0rU   N)r   rs   )r   itemr   r   r   	<genexpr>  s   z6CmfAuthLdapPlugin._generalized_time.<locals>.<genexpr>z.0Z)Zdatetimer   r   r[   Z
astimezoneZutcZ	timetuplers   tm_yearr*   tm_montm_mdaytm_hourtm_mintm_sec)r5   Z	date_timer   r   r   ZdtZgtimer   r   r   _generalized_time  s    
z#CmfAuthLdapPlugin._generalized_time)r   r   r   r   c                 O   s"   t j| ddd t j| dd d S )Niu:   ручная частичная синхронизацияr   r   r   r   r   r   r   r   r   r   r   r      s    zCmfAuthLdapPlugin.sync_newc                 O   s    t j| dd t j| dd d S )Nu4   ручная полная синхронизацияr   r
  r  r   r   r   r     s    zCmfAuthLdapPlugin.sync_alli   )r   r   c           "      O   s	  t d|  d dt _tjj| dddddd	d
ddddgd}z|jdkr|jjdkrp|j	
|  d n|j	
|  d W d S |j	
d|  |r|j|j|dnd }|j }d|_|  t  |j	
d i }g }	|j|dD ]}
| r"|j	
|  d  W d S |
dsB|j	d|
  qt|jjd}|jdksf|jjrxt|
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!< |jr<|
d |jjg |d"< nd#|d"< |
d d$}|rz|jrz||jkrz|	|
d  |||
d < |j	
|  q|j	
|  d% t   }t }t   }|j!||	d&D ]&}|"|}|sq|||d < qt#|rJt   | }t#|| }|j	
|  d't#| d(|d)d*|d+d, t }t   }|j$r|j!d|d-D ]&}|"|}|sqn|||d < qnt#|rt   | }t#|| }|j	
|  d't#| d.d/|d)d*|d+d,  d}d}d}d}t% }t   }|rd0ntj&j'| d}|r|j(dd1d d2d3d4d5d6d7d8d9d:gd;D ]P}z| r|j	
|  d< W  W d S |j)j|krW qN|*|j)j}|sW qN|+||| |,|j)j |d=7 }|j-rd>|_-|j)|k|_.|j/r:|j	
|  d?|d1  d/| d@| d |d=7 }d|_0|jddA W n` t1k
r } z@|j	2|  dB|d1  dC|d  dD|  dE|_|d=7 }W 5 d }~X Y nX qNt   | }|r|| }|j	
|  dF| dG|d)d*|d+d, |r"|| }|j	
|  dH| dG|d)d*|d+d, t   }|3 D ]\}}z| rf|j	
|  dI W  W d S |j	
dJ|d1   tj&||dK}|+||| d|_0|  t  |,|j)j |d=7 }W n` t1k
r$ } z@dE|_|j	2|  dL|d1  dC|d  dD|  |d=7 }W 5 d }~X Y nX q2|rpt   | }|| }|j	
|  dM| dG|d)d*|d+d, d} |s|jdEkr|j(dd9d8gd;D ]4}|j)j|krd|_-d|_0|jddA | d=7 } q| rt   | }| | }|j	
|  dN|  dG|d)d*|d+d, |jdkr.dO|_|  t  tj45  tj67  t8ddPD ]0}!t j9j:dkrvt;tj4j<  qt =d= qR|r|j	|  dQ| dR t>j?|  dS| dT| dR|dU n&|j	
|  dV ||j_|  t;tj@jA W n t1k
	r } zhtB| |	rv|j	2|  dW dE|_|  t>j?|  dS| dW|dU t;tj@jA t   W 5 d }~X Y nX d S )XNzStart CmfAuthLdapPlugin.sync(r   Trb   rc   zplugin.loginr$   r   r   zcmf_owner.loginrX   rJ   use_user_groups_attrr   rK   rN   i0*  r   r   r   )r   u   Загружаем группы)r   u.   : загрузка групп прерванаrw   u-   У записи нет аттрибутов: r   ZentryDNdnr   r   r:   textmembersr#   ZwhenChangedu,   : загружаем сырые данные)r   r   u   : загружено u2    изменённых пользователей (z.1fu
    сек., z.0fu    польз./сек.))r]   r   u2    отключенных пользователейr   i  r   
first_name	last_nameemailemployee_numberr   ldap_disabledldap_deletedr   
fields_mapr   u?   : обновление сырых данных прерваноrz   Fu;   : синхронизируем учетную запись /)Z	only_datauC   : Ошибка синхронизации пользователя (z): r3   u   : проверено u    пользователей (u#   : синхронизировано u/   : импортирование прерваноu$   Импортируем учетку )r   r   uC   : ошибка синхронизации пользователя u   : добавлено u   : удалено r   r   u)    завершена с ошибками (z). u(    завершена с ошибками()r   u#    успешно завершена.u%    завершена с ошибкой)Cr   r   r   rB   r   rC   rJ   r   r   r   rr   r   r	  ZnowrE   r   r   rR   r   dictrL   r[   group_uid_attrZis_nullrs   
isinstancer   group_name_attrgroup_desc_attrr  group_users_attrappendrO   r   ldap_user_attributesr   r   r   r   r   r   r   popupdate_raw_datar   r  r  r   r   r4   r   r   r   Zflush_all_notify_opt_cacheZCmfProjectNotifySchemeZtrigger_reloadr   r   r   r   r   r   r,   Zadmin_alertr   r   r   )"r   r   r   r   r   r   r   Z
sync_start
cached_grpr   grpr   Zgrp_nameZgrp_attrZwhen_changedZ
start_timeZldap_users_dict	ldap_userrg   ZdurationZspeedZldap_disabled_users_dictZsync_errorsZusers_addedZusers_synchronizedZusers_updatedZldap_synchronizedr   r   rt   r   raw_userZusers_deletedr   r   r   r   r     s           




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   rw   uW   Не удалось получить уникальный ИД пользователяr  )r   r   	name_attruser_name_attruser_last_name_attruser_email_attruser_groupsr  user_employee_number_attrr  u   Аттрибута нет u    в )jsonrC   user_full_name_attrr[   r  r   rs   user_uid_attrr   user_display_name_attrr)  r*  r+  user_groups_attrr  r-  mapping_fieldsloadsr   r   rr   )r5   r&  r.  r   r   r(  r)  r*  r+  r,  rg   r-  r3  Z	attr_nameZ
field_nameZatt_valr   r   r   r!    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  r   r   r   rr   rC   warnr   r[   r   )	r5   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)rm   methodzauth/sync_accounts)	configZEVA_ACCOUNT_USErB   r   r   r   dumpsZgen_eva_app_tokenZcall_eva_account)r9  r/   r   r   r   r   account_plugin_pushH  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   )rm   )r   r   r   rB   r   r   rL   r[   r5   r   r   r   _process_auto_syncV  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.  r3  r   r4  r[   rq   )r5   r.  r   r   r   _validate_mapping_fields\  s    z*CmfAuthLdapPlugin._validate_mapping_fields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@  rC  )r;  ZIS_BOX_VERSIONrq   Zis_newZdefault_groupsrB   r   Z
user_groupZORG_NAMEZorg_name_process_directory_typer=  rB  superrE   )r5   rD  rE  rF  rl   rm   	__class__r   r   rE   g  s    zCmfAuthLdapPlugin.savec                    s   t   ddg S )Nr   r8  )rH  save_preload_fieldsr>  rI  r   r   rK  t  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 )NrT   rg   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)r#   ZuserPasswordZshaZ	entryUUIDZgroupOfUniqueNamesz (objectclass=groupOfUniqueNames)ZuniqueMember)rX   r   user_object_classr   r   r/  Zuser_rdn_attrr)  r*  r1  r+  Zuser_password_attrZuser_password_cryptr0  r  Zgroup_object_classr   r  r  r  r2  r>  r   r   r   rG  w  sT    
z)CmfAuthLdapPlugin._process_directory_type)r   rh   r8   c                 C   s  t   | dddddg tdD ]}z| | jjj| jj	 }d| j
 d| j d	| d
}| jdkr~dddg}ndg}|j| jj||dr|jD ]f}| jdkr| |rt| |j|6 tjW  5 Q R    W  5 Q R  W   W  5 Q R  S Q R X qW 5 Q R X W q( tk
rR   | jd|  tj Y   W  5 Q R  S  tk
r   | jd|  tj Y   W  5 Q R  S  tk
r   | jd| d|  Y q(X q(td| dd W 5 Q R X tjS )u?   Авторизация через внешнюю системуrN  r/  r   rX   r8     z(&(ObjectClass=z)(=z))rT   rZ   rW   r   )rw   u>   Неправильный логин или пароль login=u=   Учетная запись заблокирована login=u   Ошибка u-    попытки авторизации login=u7   Не удалось авторизоваться login=Tr@  )r,   r-   r.   r   rp   r/   rj   r[   r0   r1   rN  r/  rX   searchr   entriesr_   r   r6  r   SUCCESSr   r   r3   ZINVALID_CREDENTIALSZUSER_DISABLEDr4   rq   ZUNKNOWN_ERROR)r5   r   rh   r   rn   Z_filterrw   resr   r   r   signin  s2    

J zCmfAuthLdapPlugin.signinc                 O   sF   t j|  tj}t jt jtj|s8| j	
d t jd|S )Ninitfiles)ospathr*   rH   r   rD   existsr;  Z
UPLOAD_DIRr   rr   )r5   rl   rm   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@  )r[  	recursive)rB   r   r   rq   rH  r   r=  )r5   r[  rl   rm   Zhas_datarI  r   r   r     s    zCmfAuthLdapPlugin.delete)N)NN)NNN)N)NN)r   )7r   r   r   Z_CmfAuthLdapPlugin__connectrA   r   r   Zui_meta_skipZ	api_allowZapi_methodsrP   r7   propertyrF   ZLoggerr   rR   r?   ZabstractrS   ZEntryr\   r_   rs   rp   r"   r}   r   r   r   staticmethodZcmf_deferred_jobr   r   r   r   r   r   r	  r    r   r   r!  r#  r=  r?  rB  rE   rK  rG  r   rU  r!   r   __classcell__r   r   rI  r   r      sz   	
),R
>

	 k17
. r   )"gcr(   rO   rF   r   r?   Zldap3.core.exceptionsr   r   r   r   r   r   Zldap3.utils.convr	   Zcmf.appr
   Zcmf.data_providers.baser   Zcmf.includeZcmf.modules.logsr   Zmodules.settings.fieldsr   r   rk   pathlibr   Zmodules.auth.enumsr   r4   r   r   r   r   r   r   r   <module>   s(   