U
    8dj                     @   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T d dlmZ 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ejej dS )    N)LDAPException)TlsServer
ConnectionNTLMSIMPLE)commit_all_ds)*)
log_config)CmfResultSplitter)cmf_auth_ldap_plugin)cached_property)Pathc                       sF  e Zd ZdZdZejjd Zee	j
dddZejd2e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dd Zeejddddd Zeejddddd Zeej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(d) Z"d*d+ Z#d,d- Z$d.d/ fd0d1
Z%  Z&S )3CmfAuthLdapPluginN)logger)returnc                 C   s   | j r| j S ttj|  }|jddd |tj}|	  ddl
m}m}m} |tj || td| _ tj| j |tjd | j S )uE    Журнал логирования процесса импорта T)parentsexist_okr   ) set_library_log_activation_levelset_library_log_detail_levelEXTENDEDldap3)level)_CmfAuthLdapPlugin__loggerr   config
UPLOAD_DIRZjoinpathget_files_dirmkdirr
   LOG_NAMEZtouchZldap3.utils.logr   r   r   loggingZERRORZ	getLoggerZinit_loggerINFO)selfZ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serverr.   connerrr"   r"   r#   connect(   s2    

 
 
 zCmfAuthLdapPlugin.connect)r3   r5   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)r?   	cmf_alertr   infor   	exception)r!   r3   r5   r;   r<   er"   r"   r#   test_connect?   s    
zCmfAuthLdapPlugin.test_connectc              	   c   sf   d}d}|   L}|j||dd||d |jD ]
}|V  q.|jd d d d	 }|sqXqW 5 Q R X d S )
Nd    r	   T)
attributesZget_operational_attributespaged_cookie
paged_sizeZcontrolsz1.2.840.113556.1.4.319r4   Zcookie)r?   searchentriesresult)r!   Zsearch_baseZsearch_filterrI   rH   r=   objr"   r"   r#   _paged_searchL   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   Ошибка загрузки пользователей)r1   rO   splitrN   striprQ   rP   r4   r:   r   rB   r!   Zadd_dnr"   r"   r#   	get_usersZ   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_filterrQ   rR   rS   u(   Ошибка загрузки групп)r1   rX   rT   rN   rU   rQ   rY   r4   r:   r   rB   rV   r"   r"   r#   
get_groupsf   s    *zCmfAuthLdapPlugin.get_groupsc                 C   s\   | j dddgdddggddgd	D ]4}|jr@|jj|jjd
 kr"t| jd|jjid q"d S )Nsync_status!=in_progress	auto_sync==T	sync_datesync_interval)filterfields<   auth_plugin_idr<   )listr`   agera   r4   cmf_deferred_tasksyncid)clsauth_pluginr"   r"   r#   	cron_syncr   s    
zCmfAuthLdapPlugin.cron_syncT)Z	only_onceZsystem_taskc              
      s   fdd}t d|  d tjj| ddgd z< jdkrl jjd	krZ j	d
 n j	d W dS  j	d  j
  d _   t  tjjd d}t R t > t| D ],\}} j	| d|  |  t  qW 5 Q R X W 5 Q R X d _   t  tddD ]<}t jjdkrT j	d ttjj  qbtd q$ 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
        c                  3   sb   d} ddddgddd ggdd gg}t jj|dgd	| gd
}|sDd S |D ]
}|V  qHt  q$d S )N2   ORdirtyr_   TZ	person_idrm   r	   r   )rb   Zfiedlsslice)modelsCmfAuthPluginDatarg   gcZcollect)limit_filterdatarowrm   r"   r#   	paginated   s      z*CmfAuthLdapPlugin.apply.<locals>.paginatedzStart CmfAuthLdapPlugin.apply()r[   r`   rk   rc   r]        Синхронизация пользователей зависла, запускаем форсированно повторно2   Синхронизация уже запущенаN+   Запущена синхронизацияT)rq   rm       из closedr   rd   u+   Синхронизируем с eva_account   u0   Изменения применены в eva_appr9   u4   Ошибка применения изменений)gdebugrs   r   getr[   r`   rh   r   rA   set_nowsavecommit_with_eventrt   countr/   Zdisable_notifyr0   	enumerateZprocess_personrange
global_varaccount_sync_statusri   	CmfPersonaccount_sync_userstimesleepr:   r   rB   )re   _args_kwargsr{   cntiraw_datarC   r"   rz   r#   applyy   sJ    

zCmfAuthLdapPlugin.applyc              	   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}tjj| dD ]X}z2|jd| d|  |  |d	7 }t  W q tk
r   |jd Y qX qd	}tjj| d}|jd tjj| dgdD ]x}zN|jrBd |_|
  W q |  |jd| d|  |d	7 }t  W n" tk
r   |jd Y nX q d|_|
  |jd d S )NzStart CmfAuthLdapPlugin.clear(r|   r[   r`   r}   r]   r   u)   Очищаем синхронизациюr   uh   Удаляем данные по пользователям (не самих пользователей)rz   u   Удалено r   u/   Ошибка удаления CmfAuthPluginDatau   Удаляем группы
cmf_import)rm   rc   u,   Ошибка удаления CmfPersonGroupr   u!   Очистка завершена)r   r   rs   r   r   r[   r   rA   r`   r   r   r   rt   r   rg   deleter:   rB   ZCmfPersonGroupr   rm   )re   r   r   rm   r   totalrx   groupr"   r"   r#   clear   sN    



zCmfAuthLdapPlugin.clearc           !      O   sR  t d|  d tjj| ddddddd	d
dddgd}z|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 ]}t|jjd}|jdks|jjrt|j|d< ntt||jjj|d< t||jjd }|r |j|d< t||jjd }|r@|j|d< t||jjd }	g |d< |	rh|	j|d< |||j< |j	|  q|j	d d}
d}d}d}g }| D ]<}|d7 }d }d }d }zt||jjj}tt||jjj}|| t||jjd }t||jjd }t||jjd }t||j jd }d }|j!rRt||j!jd }tj"j||dgd}|s|j	d |  d!}tj"||d"}||_#|r|j|_$|r|jr|jd |j%j& |_%|r|jr|jd |j'j& |_'|r|jr|j|_(|r|jr|j|_)t||j*jg }g }|j+r|D ]d}|| }|j|d kr4||d  |d |j,kr4|j	d#|  ||j,|d < |j,|_,q4nv|D ]p}|j	d$|  ||}|r||d  |d |j,kr||j,|d < |j,|_,n|j-d%|  qt.|j,j/ D ] }||kr"|j,|= |j,|_,q"|j0sT|j1r|sl|j	d&|  |  t  |r|
d7 }
n|d7 }W nP t2k
r } z0d'|_|j3d(| d)| d*|  |d7 }W 5 d }~X Y nX qd}|jd'ks0tj"j.d+d,|gdd-|ggd.D ]}|d7 }|4  q|j	d/| d0|
 d1| d2| d3| d4 |jdkrvd5|_|  t  t5dd6D ]0} t j6j7dkrt8tj9j:  qt;<d q|r|j=d7| d8 n|j	d9 W nj t2k
rL } zJt>| |r:|j3d: d'|_|  t?j@d;| d<|d= t   W 5 d }~X Y nX d S )>NzStart CmfAuthLdapPlugin.sync(r|   r&   r'   zplugin.loginr)   rQ   domainzcmf_owner.logindirectory_typer[   use_user_groups_attrr`   r}   r]   r~   r   r   r   u   Грузим группыrz   ZentryDNext_idnametextmembersu5   Синхронизация пользователейr   r   **)r   rm   rc   u$   Импортируем учетку T)r   rm   u9   Добавляем пользователю группу u   Ищем группу u   Не нашли группу u9   Синхронизируем учетную запись r9   uA   Ошибка синхронизации пользователя (z): rm   r_   zNOT INrb   u!   Синхронизировано u    учетных записей(u    новых, u    обновлено, u    удалено, u    ошибок)r   rd   uB   Синхронизация завершена с ошибками(z).u=   Синхронизация успешно завершена.u?   Синхронизация завершена с ошибкойu   Синхронизация u%    завершена с ошибкой)rM   )Ar   r   rs   r   r   r[   r`   rh   r   rA   r   r   r   rZ   dictrk   r4   group_uid_attrZis_nullstrentry_dngetattrgroup_name_attrgroup_desc_attrgroup_users_attrrW   user_full_name_attruser_uid_attrappenduser_display_name_attruser_name_attruser_last_name_attruser_email_attruser_employee_number_attrrt   loginr   Z
first_nameZ
max_length	last_nameZemailZemployee_numberuser_groups_attrr   groupswarnrg   keys
is_changedrq   r:   rB   r   r   r   r   ri   r   r   r   r   Zwarningr   r/   Zadmin_alert)!re   r   r   rm   Z
cached_grpgrpr   Zgrp_nameZgrp_attrZgroup_membersZusers_addedZusers_updatedZ	users_allZsync_errorsZldap_users_idr,   Znew_userr   r   Z	name_attrr   r   r   r   Zuser_rawZuser_groupsZcurrent_user_groupsZ	group_uidr   rC   Zuser_deletedZ	user_datar   r"   r"   r#   rj      s6           










"zCmfAuthLdapPlugin.syncc                  C   sx   t jdkrdS g } tjjddgdD ]2}t|ddd}|  |j|j }}| 	| q$t
 | dd	d
}td| dS )u=   
        Отправляем в аккаунт 1к1
        FalseNr   plugin.*)rc   T)Zno_metaZno_acl)Zeva_app_tokenauth_pluginsZrpc_account_plugin_push)r<   methodz/auth/sync_accounts)r   ZEVA_ACCOUNT_USErs   r   rg   r   rT   metarL   r   Zgen_eva_app_tokenZcall_eva_account)r   r2   Zsplitterr   Zresult_dictrx   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 )Nre   rf   )r^   r   ri   rs   r   r   rk   r4   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):\/\/(.+\..*)\/*rk   r\   r&   ZLIKE%r   r   u)   Интеграция с сервером u    уже естьTabort)r2   r8   r   refindallr4   rs   r   r   rk   r@   )r!   rJ   resr   r"   r"   r#   
_check_url  s    zCmfAuthLdapPlugin._check_urlr   depthnotifyemitc                   sT   t jstddd |   t j| _|   |   |   t	 j
||||d|S )NuE   Модуль доступен только в версии On-PremiseTr   r   )r   ZIS_BOX_VERSIONr@   r   ZORG_NAMEZorg_name_process_directory_typer   r   superr   )r!   r   r   r   r;   r<   	__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adr,   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_classrP   r   Zuser_rdn_attrr   r   r   r   Zuser_password_attrZuser_password_cryptr   r   Zgroup_object_classrY   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   rQ   r      z(&(ObjectClass=z)(=z))r	   )rG   u   Ошибка u&    попытки авторизацииu0   Не удалось авторизоватьсяTr   N)r/   r0   r1   r   r?   r2   r3   r4   r5   r6   r   r   rJ   rQ   rK   r   r   rB   r@   )r!   r   r-   r   r=   rw   r   Z
_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pathjoinr   r
   r   existsr   r   r   rA   )r!   r;   r<   Z	file_pathr"   r"   r#   get_log_filename  s    z"CmfAuthLdapPlugin.get_log_filenameF)forcec                   sJ   t jj| d}|r(td| dd d S t j|d|i| |   d S )Nrz   uM   Сначала очистите интегрированные данные: Tr   r   )rs   rt   r   r@   r   r   r   )r!   r   r;   r<   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/   Zmemoizedr   r?   rD   rN   rg   rW   rZ   classmethodrn   staticmethodZ
celery_appZtaskr   r   rj   r   r   r   r   r   r   r   r   r   __classcell__r"   r"   r   r#   r      sB   
7) /


,r   )ru   r   r   Zldap3.core.exceptionsr   r   r   r   r   r   r   Zcmf.data_providers.baser   Zcmf.includeZcmf.modules.logsr
   Zmodules.api.views.indexr   Zmodules.settings.fieldsr   r   r7   pathlibr   r   ZAPPZHOOK_CRON_MINUTELYr   rn   r"   r"   r"   r#   <module>   s"      x