U
    f'                     @   s   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                       sV  e Zd ZdZdZejjd Zee	j
dddZd9eedddZddd	d
dZdd ZedddZedddZeedddddd Zdd Zdd Zeedddd Zeeddddd  Zeedddd!d" Zed#d$ Zd%d& Zd'd( Zd)ddd* fd+d,
Z fd-d.Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 fd7d8
Z#  Z$S ):CmfAuthLdapPluginN)logger)returnc                 C   s   | j r| j S tjj| tjd}|s:tj| tjd}|  | j rt	t
j|  }|jddd |tj}|  ddlm}m}m} |tj || td| _ tj| j |tjd nt|  | _ | j S )uE    Журнал логирования процесса импорта )parentnameT)parentsexist_okr   ) set_library_log_activation_levelset_library_log_detail_levelEXTENDEDldap3)level)_CmfAuthLdapPlugin__loggermodelsZCmfAttachmentgetr   LOG_NAMEsavedebugloadr   config
UPLOAD_DIRZjoinpathget_files_dirmkdirZtouchZldap3.utils.logr   r   r   loggingZERRORZ	getLoggerZinit_loggerINFOZ
get_logger)selfZ
attachmentZpath_logZfile_name_logr   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   ext_urlZext_portr   r   r/   ZbindZ
last_errorr   error	Exception)
r(   r+   r,   argskwargsZtls_configurationZserverr5   connerrr)   r)   r*   connect0   s2    

 
 
 zCmfAuthLdapPlugin.connect)r:   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)rF   	cmf_alertr   infor   	exception)r(   r:   r<   rB   rC   er)   r)   r*   test_connectF   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"   Загружено записей )rF   extendZstandardZpaged_searchr   rH   )r(   rM   rN   rP   totalrD   Zentry_generatorentryr)   r)   r*   _paged_searchS   s    

 zCmfAuthLdapPlugin._paged_searchc                 c   s   zn|  dddg | jrR| jdD ]*}| |  d| j | jjE d H  q$n| | jj| jjE d H  W n" tk
r   | j	
d  Y nX d S )Nadditional_user_dnuser_object_class_filterbase_dn;,u8   Ошибка загрузки пользователей)r8   rW   splitrV   striprY   rX   r;   rA   r   rI   r(   Zadd_dnr)   r)   r*   	get_usersa   s    *zCmfAuthLdapPlugin.get_usersc                 c   s   zn|  dddg | jrR| jdD ]*}| |  d| j | jjE d H  q$n| | jj| jjE d H  W n" tk
r   | j	
d  Y nX d S )Nadditional_group_dngroup_object_class_filterrY   rZ   r[   u(   Ошибка загрузки групп)r8   r`   r\   rV   r]   rY   ra   r;   rA   r   rI   r^   r)   r)   r*   
get_groupsm   s    *zCmfAuthLdapPlugin.get_groupsTz	@minutely)	only_once
system_jobZschedulec                  C   sL   t jdddgddgdD ].} | jr6| jj| jjd krt j| jjd qd S )	N	auto_sync==T	sync_datesync_intervalfilterfields<   )auth_plugin_id)r   listrg   agerh   r;   syncidauth_pluginr)   r)   r*   	cron_syncy   s
    
zCmfAuthLdapPlugin.cron_syncc                 C   s   d}t dd t  t  | }|dkrB| jd qtjj|dgd}zF| jd|j	  |
  | jd	|   |j  t  W q$   |j  |d
7 }| jd|  Y q$X q$W 5 Q R X W 5 Q R X W 5 Q R X || d S )Nr   F)Zinit_views_and_dsDONEu   Все обработаноr
   rq   rk   u   Обрабатываем login=u&   Осталось обработать rR   uF   Ошибка обработки данных пользователя )r   r6   disable_notifyr7   r   r   rH   r   CmfAuthPluginDataloginZprocess_personZqsizedpcommitcommit_with_eventZrollbackrI   put)r(   	queue_rawqueue_errorserrorsZraw_idraw_datar)   r)   r*   _fork_process_raw   s$     


8z#CmfAuthLdapPlugin._fork_process_rawc           	      C   s  t  }| jd tjjdd| gdddgdD ]}|jD ]}|j| ||< q8q.| jdt|   |	 D ]\}}d	| d	}| jd
|  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 ]0\}}|dkrRq<t||r<t||| q<|jrp|  |j  qpd S )Nu)   Синхронизируем группыrs   rf   --rq   groupsri   u   Найдено z::u-   Обрабатываем группу ext_id=ext_idLIKE%r   u0   Не нашли группу, создадим: )r   r   )dictr   rH   r   rx   slistr   lenkeysitemsCmfPersonGroupr   r   r!   hasattrsetattr
is_changedr   rz   r{   )	r(   r   objZgroup_idvalr   groupkeyr;   r)   r)   r*   process_groups   s:     
"
z CmfAuthLdapPlugin.process_groups)rd   c              
   O   s  ddl }ddl}td|  d tjj| ddgd}zz|jdkrp|jj	d	kr^|j
d
 n|j
d W dS |j
d |j  d|_|  t  tj  |  |j  |jstdtjjdddgdddgdd|ggddid dddgdd|gg}d}| }| }	g }
ttjD ]H}|j|jd| ||	dd}|
| |  |j
d|  q&tjj |d}|j
d| d tjj!|ddgdD ]}|"|j# q|j
d |
D ]}|"d  q|$ s|
D ] }|j
d!|  |%  q|j
d" |	$ s2||	 7 }q|rHt&d#| d$d%|_|  t  tdd&D ]<}tj'j(dkr|j
d' t)tj*j+  qt,-d( qf|j
d) W nN t&k
r  } z.t.| d*|_|  t  |j
/d+  W 5 d}~X Y nX dS ),uP   
        Сохраняем данные в CmfPerson и CmfPersonGroup
        r   NzStart CmfAuthLdapPlugin.apply()sync_statusrg   rv   in_progressi     Синхронизация пользователей зависла, запускаем форсированно повторно2   Синхронизация уже запущена+   Запущена синхронизацияuH   Укажите "Домен для логина" в настройках.dirtyrf   FZ	person_idrs   T)rj   valuesr   )r~   r   )targetr   rC   u    Запустили задачу rj   u-   Отправляем на обработку u    пользователейr   rq   ri   uD   Все пользователи в очереди обработкиru   u   Ждем завершения u+   Закончили обрабатыватьu   Обнаружено u    ошибокclosedrl   u+   Синхронизируем с eva_accountrR   u0   Изменения применены в eva_appr@   u4   Ошибка применения изменений)0	threadingqueuegr    r   r   r   r   rg   ro   r   rH   set_nowr   r|   r   Z
ldap_groupr   rz   r{   domainAssertionErrorrx   Zbulk_updateZQueueranger"   ZIMPORT_THREADSThreadr   appendstartcountr   r}   rq   emptyjoinrA   
global_varaccount_sync_statusschedule_deferred_job	CmfPersonaccount_sync_userstimesleepr	   rI   )rm   _args_kwargsr   r   rs   _filterr   r~   r   Zprocsiproccntr   rJ   r)   r)   r*   apply   s    






zCmfAuthLdapPlugin.apply)rc   rd   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 r&tjj| d|gdD ]^}z6|jd| d|  |  |d	7 }|j  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rxd |	_|	
  W qV|	  |jd| d|  |d	7 }t  W n" tk
r   |jd Y nX qVd|_|
  |jd d S )NzStart CmfAuthLdapPlugin.clear(r   r   rg   rv   r   r   u)   Очищаем синхронизациюrR   uh   Удаляем данные по пользователям (не самих пользователей)rr   d   r   )rs   sliceu   Удалено u    из u/   Ошибка удаления CmfAuthPluginDatau   Удаляем группы
cmf_import)rs   rk   u,   Ошибка удаления CmfPersonGroupr   u!   Очистка завершена)r   r    r   r   r   r   r   rH   rg   r   r   r|   rx   r   rn   deleterz   r{   rA   rI   r   r   rs   )
rm   r   r   rs   r   rT   stepndatar   r)   r)   r*   clear  sV    



zCmfAuthLdapPlugin.clearc           "      O   s  t d|  d tjj| ddddddd	d
dddgd}zf|jdkrr|jjdkr`|j	d n|j	d W d S |j	d |j
  d|_|  t  |j	d i }| D ]*}|ds|jd|  qt|jjd}|jdks|jjrt|d |d< nt|d |jj|d< t|d trF|d d |d< |d |jj}t|trl|d }|rz||d< |d |jj}t|tr|d }|r||d< |d |jjg |d< |||d < |j	|  q|j	d d}	d}
d}d}g }g }| D ]}|ds6|jd|  q|d 7 }d }d }d }zx|d |jj}t|trt|d }t|d |jj}t|tr|d }|st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rN|d }d }|j#r|d |j#j}t|tr|d }tj$j||d"gd#}|s|j	d$|  d%}tj$||d&}||_%|r||_&|r|r|d |j'j( |_'|r|r|d |j)j( |_)|r||_*|r$||_+|d |j,jg }g }|j-r|D ]f}|| }|d |d krH||d  |d |j.krH|j	d'|  ||j.|d < |j.|_.qHnv|D ]p}|j	d(|  ||}|r||d  |d |j.kr$||j.|d < |j.|_.n|j/d)|  qt|j.j0 D ] }||kr8|j.|= |j.|_.q8|j1pf|j2|_1|j1r|s|j	d*|  |jd%d+ |j34  || |r|	d 7 }	n|
d 7 }
W nP t5k
r } z0d,|_|j6d-| d.| d/|  |d 7 }W 5 d }~X Y nX qt78 P |D ]D}tj$j|d0}|sbd,|_|j6d1|  |d 7 }n|  q(W 5 Q R X d}|jd,krtj$jd2d3|gdd4|ggd5D ]} |d 7 }| 9  q|j	d6| d7|	 d8|
 d9| d:| d; |jdkrd<|_|  t  tj:;  tj<=  t>dd=D ]0}!t j?j@dkrLtAtj:jB  qZtCDd  q(|r|jd>| d? t7jEd@| dA| d?|dB n|j	dC W nj t5k
r
 } zJtF| |r|j6dD d,|_|  t7jEd@| dE|dB t   W 5 d }~X Y nX d S )FNzStart CmfAuthLdapPlugin.sync(r   r-   r.   zplugin.loginr0   rY   r   zcmf_owner.logindirectory_typer   use_user_groups_attrrg   rv   r   i0*  r   r   r   u   Грузим группыrO   u-   У записи нет аттрибутов: rr   ZentryDNZdnr   r   r   textmembersu5   Синхронизация пользователейrR   uW   Не удалось получить уникальный ИД пользователя**)r   rs   rk   u$   Импортируем учетку T)r   rs   u9   Добавляем пользователю группу u   Ищем группу u   Не нашли группу u9   Синхронизируем учетную запись )Z	only_datar@   uA   Ошибка синхронизации пользователя (z): )r   u*   Не найдены raw данные по rs   rf   zNOT INr   u!   Синхронизировано u    учетных записей(u    новых, u    обновлено, u    удалено, u    ошибок)r   rl   uB   Синхронизация завершена с ошибками(z).u   Синхронизация u(    завершена с ошибками()r   u=   Синхронизация успешно завершена.u?   Синхронизация завершена с ошибкойu%    завершена с ошибкой)Gr   r    r   r   r   r   rg   ro   r   rH   r   r   r|   rb   Zwarningr   rq   r;   group_uid_attrZis_nullstr
isinstancern   group_name_attrgroup_desc_attrgroup_users_attrr_   user_full_name_attruser_uid_attrr   r   user_display_name_attruser_name_attruser_last_name_attruser_email_attruser_employee_number_attrrx   ry   r   Z
first_nameZ
max_length	last_nameZemailZemployee_numberuser_groups_attrr   r   warnr   r   r   rz   r{   rA   rI   r6   rw   r   r   Zflush_all_notify_opt_cacheZCmfProjectNotifySchemeZtrigger_reloadr   r   r   r   r   r   r   Zadmin_alertr	   )"rm   r   r   rs   Z
cached_grpgrpr   Zgrp_nameZgrp_attrZusers_addedZusers_updatedZ	users_allZsync_errorsZldap_users_idZ	processedr3   Znew_userry   r   Z	name_attrr   r   r   r   Zuser_rawZuser_groupsZcurrent_user_groupsZ	group_uidentry_dnZ	gr_ext_idrJ   Zuser_deletedZ	user_datar   r)   r)   r*   rp   5  s~           











"

zCmfAuthLdapPlugin.syncc                  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
        FalseNr   plugin.*)rk   r   )Zeva_app_tokenauth_pluginsZrpc_account_plugin_push)rC   methodz/auth/sync_accounts)	r"   ZEVA_ACCOUNT_USEr   r   rn   r   dumpsZgen_eva_app_tokenZcall_eva_account)r   r9   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 )Nrm   )rC   )re   r   r   r   r   r   rq   r;   r(   r)   r)   r*   _process_auto_sync  s    z$CmfAuthLdapPlugin._process_auto_syncc                 C   s   | j s| j js| j jjsd S td| j jj}|D ]L}tjjdd| j	gddd|d  dggd}|r2t
d	|d  d
dd q2d S )Nz(ldap|ldaps):\/\/(.+\..*)\/*rq   z!=r-   r   r   rR   r   u)   Интеграция с сервером u    уже естьTabort)r9   r?   r   refindallr;   r   r   r   rq   rG   )r(   searchresr   r)   r)   r*   
_check_url#  s    zCmfAuthLdapPlugin._check_urlr   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_VERSIONrG   Zis_newZdefault_groupsr   r   Z
user_groupZORG_NAMEZorg_name_process_directory_typer   r   superr   )r(   r   r   r   rB   rC   	__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| _nv| j dkrd| _d| _d| _d| _d| _d| _d| _d	| _	d| _
d| _d| _d| _d| _d| _d| _d| _d| _d| _d S )NZadr3   z,(&(objectCategory=Person)(sAMAccountName=*))ZsAMAccountNameZcnZ	givenNameZsnZdisplayNameZmailZ
unicodePwdZ	plaintextZ
objectGUIDr   z6(&(objectCategory=group)(!(isCriticalSystemObject=*)))descriptionmemberZmemberOfZldapZinetorgpersonz(objectclass=inetorgperson)ZuserPasswordZshaZ	entryUUIDZgroupOfUniqueNamesz (objectclass=groupOfUniqueNames)ZuniqueMember)r   r   user_object_classrX   r   Zuser_rdn_attrr   r   r   r   Zuser_password_attrZuser_password_cryptr   r   Zgroup_object_classra   r   r   r   r   r   r)   r)   r*   r   =  sP    

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   rY   r      z(&(ObjectClass=z)(=z))r
   )rO   u   Ошибка u-    попытки авторизации login=u7   Не удалось авторизоваться login=Tr   N)r6   r7   r8   r   rF   r9   r:   r;   r<   r=   r   r   r   rY   entriesr   r   rI   rG   )r(   ry   r4   r   rD   r   r   Z
_test_connr)   r)   r*   signini  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"   r#   r   rH   )r(   rB   rC   Z	file_pathr)   r)   r*   get_log_filenamez  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 )Nrr   uM   Сначала очистите интегрированные данные: Tr   )r   	recursive)r   rx   r   rG   r   r   r   )r(   r   rB   rC   Zhas_datar   r)   r*   r     s    zCmfAuthLdapPlugin.delete)NN)%__name__
__module____qualname__Z_CmfAuthLdapPlugin__connectr   r   r   Zui_meta_skippropertyr&   ZLoggerr   r   rF   rK   rV   rn   r_   rb   staticmethodZcmf_deferred_jobrt   r   r   r   r   rp   r   r   r   r   r   r   r   r   r   __classcell__r)   r)   r   r*   r      sF    L
-
 Y

,r   )gcr   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   