U
    h                     @   s&  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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 )    )	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                   @   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 ZeejdddZdd ZejjjedddZdmeedddZdddddZdd ZdnedddZdoe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$dpd7d8Z%dqd: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)edEdF Z*e+e dGdHdIZ,e-e.ee/f  e-e dJdKdLZ0e-e.ee/f  e-e e.ee-e f dMdNdOZ1ee-e e-e dPdQdRZ2dSdT Z3dUdV Z4edWdX Z5dYdZ Z6d[d\ Z7dddd] fd^d_
Z8 fd`daZ9dbdc Z:eee;dddedfZ<dgdh Z=didj fdkdl
Z>  Z?S )rCmfAuthLdapPluginN)loggerTapplyclearsyncsync_allsync_newget_log_filenametest_connectr   c              
   C   s   zddl }t }|r~d|j| }t 2 | dg | jj	
 r\|| jj	
 d}W 5 Q R X | j| d|  n| j| W n@ tk
r } z"| jd|  | j| W 5 d}~X Y nX dS )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messager+   r-   Zexc_texter   r   r   _safe_log_exception2   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.logrA   rB   rC   loggingZERRORZ	getLoggerZinit_loggerZfull_path_fileINFOZ
get_loggerget_files_dir)r9   Z
attachmentrA   rB   rC   r   r   r   r   J   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_startrG   r   sgetrQ   rO   )r9   Z
new_statusr   r   r   broken_   s
    
zCmfAuthLdapPlugin.broken)entryr=   c                 C   sB   d}d}t |jj}t||@ }t |d j}t||@ }|p@|S )uK   Проверка, что пользователь заблокирован.      "msDS-User-Account-Control-Computed)intuserAccountControlvaluebool)r9   rX   ZUAC_ACCOUNTDISABLEZUAC_LOCKOUTZuacdisabledZcomputedlockedr   r   r   _is_user_disabledf   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)r0   r1   r2   r3   	ext_loginr^   r4   r5   r   sslZCERT_OPTIONALZPROTOCOL_TLSv1_2r   Zext_urlZext_portr
   r   rg   ZbindZ
last_errorr6   r   r7   r   r8   )r9   rc   rd   argskwargsZtls_configurationZserverrl   connerrZsafe_errr   r   r   connectv   s<    

 
 
 
zCmfAuthLdapPlugin.connect)rm   r4   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)rs   	cmf_alertr   infor8   strr6   r0   r1   r2   r3   r4   r5   r7   )r9   rm   r4   ro   rp   r;   Z	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 )NrN   r   r   T)search_basesearch_filter
attributes
paged_size	generatorZget_operational_attributes   u"   Загружено записей )rs   extendZstandardZpaged_searchr   ru   )r9   rw   rx   rz   totalrq   Zentry_generatorrX   r   r   r   _paged_search   s    

 zCmfAuthLdapPlugin._paged_searchc           	   	   c   s  zt|  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7 }|rd| d| d}n,|r|d| d| d7 }n|d| d7 }|rd
}|rd| d}| j	d|  | j
r^| j
dD ](}| |  d| j |E d H  q2n| | jj|E d H  W n" tk
r   | d  Y nX d S )Nadditional_user_dnuser_object_class_filterbase_dnFr|   &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>adz(|(whenCreated>=z)(whenChanged>=))z(|z(&z(|(modifyTimeStamp>=r   z(modifyTimeStamp>=u%   Фильтр запроса к LDAP: ;,u8   Ошибка загрузки пользователей)r2   r   r^   user_disabled_filterresubr.   directory_typer   ru   r   splitr   stripr   r8   r<   )	r9   prev_sync_gtr`   changed_groupsrx   Zcombine_filtersZfilter_was_not_emptyZor_in_groupsadd_dnr   r   r   ldap_get_users   sP    

(
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   | 	d  Y nX d S )Nadditional_group_dngroup_object_class_filterr   r   r   u(   Ошибка загрузки групп)
r2   r   r^   r   r   r   r   r   r8   r<   )r9   r   rx   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filterrR   <   u.   Частичная синхронизация     запущенаu-   частичная синхронизацияauth_plugin_iddelta_minutes
sync_titler   r       завершена)r   listr   ager   r^   r   ru   r"   rQ   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   ru   r"   rQ   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 ]}|  r< dS |jj D ]n\}}||kr\qH|| 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r4|j | |_| D ]f\}	}
|	dkrRq<t||	r<|jr|	d
ksz|	dkr| j d|	 d|  nt||	|
 q<|jrH|  t  qHq(| j dt| d dS )Nu)   Синхронизируем группы--rQ   groupsrR   Fz::u-   Обрабатываем группу ext_id=z name=r?   systemext_idZLIKE%r   r   u0   Не нашли группу, создадим: )r?   r   codeu5   Игнорируется изменение поля u!    системной группы u   Обработано u    группT)r   ru   setall_raw_datarW   r   r^   itemsaddr   keysrG   CmfPersonGrouprH   r   loadhasattrr   warningsetattr
is_changedrJ   
cmf_commitlen)r9   ZsyncedrR   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gd}z |jd	kr|jj	d
krf|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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 } zDt/| 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   TrO   r   rP   rS   r   h    пользователей зависла, запускаем форсированно повторно    уже запущена   Запущена u8   : синхронизация групп прерванаuH   Укажите "Домен для логина" в настройках.dirtyr   FZ	person_idr   )r   values2   c                 S   s   g | ]
}|j qS r   )rQ   )r   ir   r   r   r   X  s     z+CmfAuthLdapPlugin.apply.<locals>.<listcomp>rQ   z-ldap_deleted)r   rR   Zorder_byINr   loginuM   : обработка данных пользователей прерванаr|   u!   : обрабатываем login= (    из uH   : ошибка обработки данных пользователя closedr   u-   : синхронизируем с eva_accountu2   : изменения применены в eva_appr7   u6   : ошибка применения изменений)0mathr   debug license_disable_user_count_hooksrG   r   rH   rO   r   r   r   ru   
capitalizeset_nowrJ   r   r   
ldap_groupr   domainAssertionErrorCmfAuthPluginDataZbulk_updater0   Zdisable_notifyr1   Zslistr   rangeceilr   rW   r   Zprocess_personZdpZrollback	exception
global_varaccount_sync_statusschedule_deferred_job	CmfPersonaccount_sync_usersrT   sleep
CmfLicenserecalc_users_countsr8   cmf_rollback)r   r   _args_kwargsr   r   stepZall_dirty_idscntr   chunkraw_datar;   r   r   r   r    4  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   TrO   r   rP   rS   u2   Синхронизация уже запущенаu)   Очищаем синхронизациюr|   uh   Удаляем данные по пользователям (не самих пользователей)r      r   u:   Очистка синхронизации прерванаzperson.does_not_workzperson.rg_member_ofr   zperson.is_adminzperson.is_support)r   slicerR   u    Блокируем учетку u   Удалено r   u/   Ошибка удаления CmfAuthPluginDatau   Удаляем группы
cmf_import)r   rR   u,   Ошибка удаления CmfPersonGroupr   u!   Очистка завершена)!r   r   r   rG   r   rH   rO   r   ru   r   r   rJ   r   r   countrW   r   ZpersonZis_adminr   does_not_workr   r   rg_member_ofremover^   deleter8   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   rR   r   )r   rG   r   r   r   r   r   )r9   rR   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   )r   timezoneZminutesr'   c                 s   s*   | ]"}d dt t|  t| V  qdS )0rY   N)r   rv   )r   itemr   r   r   	<genexpr>  s   z6CmfAuthLdapPlugin._generalized_time.<locals>.<genexpr>z.0Z)datetimer   r  r^   Z
astimezoneZutcZ	timetuplerv   tm_yearr.   tm_montm_mdaytm_hourtm_mintm_sec)r9   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}	zn|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r|r|jt|d n|j}|j }d|_|  t  |j	
d i }	g }
g }|j|dD ]}| rF|j	
|  d  W d S |dsh|j	d|  qt|jjd}|jdks|jjrt|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r2|d  }|r@||d"< |jrb|d |jjg |d#< nd$|d#< |d d%}|r|jr||kr|
 |d  | | ||	|d < |j	
|  q|j	
|  d& t!! }t }t!! }g }g }|j"||
d'D ]R}|#|}|s q|d }|||< |d( rF| | n|j$r| | q|%|| t&|rt!! | }t&|| }|j	
|  d)t&| d*|d+d,|d-d. t }t!! }|j'r|j"d|d/D ]&}|#|}|sq|||d < qt&|r^t!! | }t&|| }|j	
|  d)t&| d0d1|d+d,|d-d.  d }d }d }d }t( }t!! }|rd2ntj)j*| d} |r|j+dd3d!d4d5d6d7d8d9d:d;d<gd=D ]P}!z| r|j	
|  d> W  W d S |!j,j|krW q|-|!j,j}|sW q|.|!||	 |/|!j,j |d?7 }|!j0rPd@|!_0|!j,|k|!_1|!j2r|j	
|  dA|d3  d1| dB|  d |d?7 }d|!_3|!jddC W n` t4k
r }" z@|j	5|  dD|d3  dE|d  dF|  dG|_|d?7 }W 5 d }"~"X Y nX qt!! | }|rX|| }|j	
|  dH| dI|d+d,|d-d. |r|| }|j	
|  dJ| dI|d+d,|d-d. t!! }|6 D ]\}#}z| r|j	
|  dK W  W d S |j	
dL|d3   tj)|#|dM}$|.|$||	 d|$_3|$  t  |/|$j,j |d?7 }W n` t4k
r }" z@dG|_|j	5|  dN|d3  dE|d  dF|  |d?7 }W 5 d }"~"X Y nX q|rt!! | }|| }|j	
|  dO| dI|d+d,|d-d. d }%t7||j$|jdGkfr0|D ].}#tj)j||#dP}!|!r |8|! |%d?7 }%q |s||jdGkr||j+dd;d:gd=D ]&}!|!j,j|krT|8|! |%d?7 }%qT|%rt!! | }|%| }|j	
|  dQ|% dI|d+d,|d-d. |jdkrdR|_|  t  tj9:  tj;<  t=d dSD ]0}&t j>j?dk	r$t@tj9jA  	q2t!Bd? 	q |	rz|j	|  dT| dU tCjD|  dV| dW| dU|dX n&|j	
|  dY ||j_|  t@tjEjF W n t4k

r6 }" zhtG|" |
r$|j	5|  dZ dG|_|  tCjD|  dV| dZ|dX t@tjEjF t   W 5 d }"~"X Y nX d S )[NzStart CmfAuthLdapPlugin.sync(r   Tre   rf   zplugin.loginr(   r   r   zcmf_owner.loginr   rO   use_user_groups_attrr   rP   rS   i0*  r   r   r   )r   r  u   Загружаем группы)r   u.   : загрузка групп прерванаry   u-   У записи нет аттрибутов: r   ZentryDNdnr   r   r?   textmembersr'   ZwhenChangedu,   : загружаем сырые данные)r   r   user_groupsu   : загружено 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?   : обновление сырых данных прерваноr|   Fu;   : синхронизируем учетную запись /Z	only_datauC   : Ошибка синхронизации пользователя (z): r7   u   : проверено u    пользователей (u#   : синхронизировано u/   : импортирование прерваноu$   Импортируем учетку )r   r   uC   : ошибка синхронизации пользователя u   : добавлено )r   r   u   : удалено r   r   u)    завершена с ошибками (z). u(    завершена с ошибками()r   u#    успешно завершена.u%    завершена с ошибкой)Hr   r   r   rG   r   rH   rO   r   r   r   ru   r   r  r   ZnowrJ   r   r   rW   r   dictrQ   r^   group_uid_attrZis_nullrv   
isinstancer   group_name_attrgroup_desc_attrr  group_users_attrappendrT   r   ldap_user_attributesblock_users_without_groups_delete_users_from_groupr   r   r   r   r   r   r   popupdate_raw_datar   r  r  r   r   r8   r   r   all_mark_deletedr   Zflush_all_notify_opt_cacheZCmfProjectNotifySchemeZtrigger_reloadr   r   r   r   r   r   r0   Zadmin_alertr   r   r   )'r   r   r   r   r   r   r   Zprev_sync_dateZ
sync_start
cached_grpr   changed_groups_namesgrpr   Zgrp_nameZgrp_attrZwhen_changedZ
start_timeZldap_users_dictgroup_usersZblock_user_ids	ldap_userrj   Zuser_ext_idZdurationZspeedZldap_disabled_users_dictZsync_errorsZusers_addedZusers_synchronizedZusers_updatedZldap_synchronizedr   r   r;   r   raw_userZusers_deletedr   r   r   r   r"     s           
 





0

     

,.,,

.,

,

&zCmfAuthLdapPlugin.syncc                 C   s   d| _ d| _| jdd d S )NTr  )r  r   rJ   )r   r   r   r   r.    s    zCmfAuthLdapPlugin._mark_deleted)affected_users_idsc                 C   sh   t jjddt|ggddgd}|D ]>}tdd |jD }|s$| jd|j d	|_|j	d	d
 q$dS )uZ   
        Вычисление и блокировка пользователей.
        rQ   r   r   zrg_member_of.ext_idr   c                 s   s   | ]}|j jrd V  qdS )r|   N)r   r^   r   r   r   r   r   r    s      z1CmfAuthLdapPlugin._block_users.<locals>.<genexpr>u.   Блокируем пользователя %sT)Z	from_ldapN)
rG   r   r   sumr   r   ru   r   r   rJ   )r9   r5  Z	all_usersrj   Zext_groups_sumr   r   r   _block_users   s    zCmfAuthLdapPlugin._block_users)r2  r0  c                    s   |  ||}t }|D ]}tjj|dg| d}|s4qdd |jD }t|| }||   r| jd|   fdd|jD }	|	D ]}
||
j	j
 |j|
 q|j|_|jdd	 q|r| jr| | d S )
N
rg_members)r?   rR   r   c                 S   s   h | ]}|j jd d qS @r   r   r^   r   r   rj   r   r   r   	<setcomp>  s     z=CmfAuthLdapPlugin._delete_users_from_group.<locals>.<setcomp>uB   Удаляем пользователей из группы %s: %sc                    s&   g | ]}|j jd d  kr|qS r:  r<  r=  Zlogins_to_deleter   r   r      s   z>CmfAuthLdapPlugin._delete_users_from_group.<locals>.<listcomp>Tr  )_map_users_groupr   rG   r   rH   r9  r   ru   r   rQ   r^   r   rJ   r)  r8  )r9   r2  r0  Zgroups_user_mappingr5  Z
group_namer   Zrg_members_loginsZexternal_membersZusers_to_deleterj   r   r?  r   r*    s*    

z*CmfAuthLdapPlugin._delete_users_from_group)r2  r0  r=   c                 C   sT   dd |D }|D ]<}t |dg }|D ]"}||kr*|| |d   q*q|S )Nc                 S   s   i | ]
}|g qS r   r   r6  r   r   r   
<dictcomp>0  s      z6CmfAuthLdapPlugin._map_users_group.<locals>.<dictcomp>user_groups_namesr   )r   rH   r'  lower)r9   r2  r0  resultrj   r  r   r   r   r   r@  /  s    z"CmfAuthLdapPlugin._map_users_group)r  r=   c                 C   sR   g }| D ]D}t |}|sq|d }t|dkr|d  dkr||d  q|S )Nr   rY   ZCNr|   )r   r   upperr'  )r  Zuser_group_namesr   parsedZrdnr   r   r   Z__get_group_names9  s    z#CmfAuthLdapPlugin.__get_group_namesc                 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rp|d | jj}t|trh|d }||d< | jrt |d< || jj}| D ]l\}}|d |}t|tr|d |d |< n6t|tr||d |< n| jd| d	|d   q|S )
Nr   ry   uW   Не удалось получить уникальный ИД пользователяr  )	r   r   	name_attruser_name_attruser_last_name_attruser_email_attrr  rB  r  user_employee_number_attrr  u   Аттрибута нет u    в )jsonrH   user_full_name_attrr^   r#  r   rv   user_uid_attrr   user_display_name_attrrH  rI  rJ  user_groups_attr#_CmfAuthLdapPlugin__get_group_namesr!  rK  mapping_fieldsloadsr   r   ru   )r9   r3  rL  r   r   rG  rH  rI  rJ  r  rB  rj   rK  rR  Z	attr_nameZ
field_nameZatt_valr   r   r   r(  F  sb    







  
 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
|_
qt| j|j
fr|j
|_
d|_d S )Nr   rG  rH  rI  rJ  rK  r  r  r  r   u9   Добавляем пользователю группу r  u   Ищем группу u   Не нашли группу T)r   r?   r  Z
max_lengthr  r  r  r  r  r'  r   r   ru   rH   warnr   r^   r   r-  r)  r   )	r9   r4  r3  r/  Zcurrent_user_groupsZ	group_uidr   entry_dnZ	gr_ext_idr   r   r   r,  y  s^    




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)rp   methodzauth/sync_accounts)	configZEVA_ACCOUNT_USErG   r   r   r'  dumpsZgen_eva_app_tokenZcall_eva_account)rX  r3   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   )rp   )r   r   r   rG   r   r    rQ   r^   r9   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)rL  rR  r   rS  r^   rt   )r9   rL  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_  rb  )rZ  ZIS_BOX_VERSIONrt   Zis_newZdefault_groupsrG   r   Z
user_groupZORG_NAMEZorg_name_process_directory_typer\  ra  superrJ   )r9   rc  rd  re  ro   rp   	__class__r   r   rJ     s    zCmfAuthLdapPlugin.savec                    s   t   ddg S )Nr   rW  )rg  save_preload_fieldsr]  rh  r   r   rj    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 )Nr   rj   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)r   r   user_object_classr   r   rM  Zuser_rdn_attrrH  rI  rO  rJ  Zuser_password_attrZuser_password_cryptrN  r"  Zgroup_object_classr   r$  r%  r&  rP  r]  r   r   r   rf    sT    
z)CmfAuthLdapPlugin._process_directory_type)r   rk   r=   c                 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dgdr|jD ]\}| |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
r.   | jd|  tj Y   W  5 Q R  S  tk
rj   | jd|  tj Y   W  5 Q R  S  tk
r } z| jd| d|  W 5 d}~X Y q&X q&td| dd W 5 Q R X tjS )u?   Авторизация через внешнюю системуrm  rM  r   rW     z(&(ObjectClass=z)(=r   r]   r[   r   )ry   u>   Неправильный логин или пароль login=u=   Учетная запись заблокирована login=u   Ошибка u-    попытки авторизации login=Nu7   Не удалось авторизоваться login=Tr_  )r0   r1   r2   r   rs   r3   rm   r^   r4   r5   rm  rM  searchr   entriesrb   r   rU  r   SUCCESSr   r   r7   ZINVALID_CREDENTIALSZUSER_DISABLEDr8   r   rt   ZUNKNOWN_ERROR)r9   r   rk   r   rq   Z_filterresr;   r   r   r   signin  s,    

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.   rM   r   rI   existsrZ  Z
UPLOAD_DIRr   ru   )r9   ro   rp   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_  )rz  	recursive)rG   r   r   rt   rg  r   r\  )r9   rz  ro   rp   Zhas_datarh  r   r   r   5  s    zCmfAuthLdapPlugin.delete)NN)NNN)N)NN)r   )@r   r   r   Z_CmfAuthLdapPlugin__connectrF   r   r   Zui_meta_skipZ	api_allowZapi_methodsrU   r<   propertyrK   ZLoggerr   rW   rD   ZabstractrX   ZEntryr_   rb   rv   rs   r&   r   r   r   r   staticmethodZcmf_deferred_jobr   r   r   r    r!   r   r  r$   r#   r"   r.  r   r8  r   ZDictZAnyr*  r@  rQ  r(  r,  r\  r^  ra  rJ   rj  rf  r   rt  r%   r   __classcell__r   r   rh  r   r   "   s   	,(Q
>

	  
 .
3?
.r   ))r  r   gcr,   rT   rK   r   typingr   r   rD   Zldap3.core.exceptionsr   r   r   r   r	   r
   Zldap3.utils.dnr   Zldap3.utils.convr   Zcmf.appr   Zcmf.data_providers.baser   Zcmf.includeZcmf.modules.logsr   Zmodules.settings.fieldsr   r   rn   pathlibr   Zmodules.auth.enumsr   r8   r   r   r   r   r   r   r   <module>   s.   