U
    W"dGb                     @   s   d dl Z d dlZd dlm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G dd dejZejej dS )    N)Logger)LDAPException)TlsServer
ConnectionNTLMSIMPLE)commit_all_ds)*)
log_config)CmfResultSplitter)cmf_auth_ldap_plugin)cached_propertyc                       s0  e Zd ZdZejjd ZeedddZ	e
jd/ee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d-d.
Z"  Z#S )0CmfAuthLdapPluginN)logger)returnc                 C   s   t |  S )uE    Журнал логирования процесса импорта )r   Z
get_loggerget_files_dirself r   1./modules/settings/models/cmf_auth_ldap_plugin.pyr      s    zCmfAuthLdapPlugin.logger)ldap_user_nameldap_user_pwdc           
      O   s   |  dddg |s| jjj}|s,| jjj}ttjtjdd}t	| jj
 d| jj |d}t}t||||d| jjd	}| r|S d
}	| j|	 t|	d S )Nplugin.ext_urlplugin.ext_portconnection_timeoutz"/etc/ssl/certs/ca-certificates.crt)ZvalidateversionZca_certs_file:)ZtlsF)userpasswordauthenticationZauto_referralsZreceive_timeoutux   Не удалось подключиться к серверу, неправильный логин или пароль.)load_fieldsplugin	ext_loginvalueext_passwordr   sslZCERT_OPTIONALZPROTOCOL_TLSv1_2r   ext_urlZext_portr   r   r   Zbindr   error	Exception)
r   r   r   argskwargsZtls_configurationZserverr    connerrr   r   r   connect   s*    

 
 zCmfAuthLdapPlugin.connectc              
   O   s   zL|  ddg | | jjj| jjj W 5 Q R X td | jd W dS  t	k
r } z$td|  | j
d W Y dS d }~X Y nX d S )Nzplugin.ext_loginzplugin.ext_passworduK   Подключение к серверу выполнено успешно.TuO   Подключение к серверу выполнено с ошибкой: uN   Подключение к серверу выполнено с ошибкой.F)r!   r.   r"   r#   r$   r%   	cmf_alertr   infor   	exception)r   r*   r+   er   r   r   test_connect0   s    
zCmfAuthLdapPlugin.test_connectc              	   c   s   z|  dddg |  }| jrn| jdD ]<}|j|  d| j | jjddd |j	D ]
}|V  q^q.n,|j| jj| jjddd |j	D ]
}|V  qW 5 Q R X W n" t
k
r   | jd	  Y nX d S )
Nadditional_user_dnuser_object_class_filterbase_dn;,r
   T)
attributesZget_operational_attributesu8   Ошибка загрузки пользователей)r!   r.   r4   splitsearchstripr6   r5   r$   entriesr)   r   r1   r   r,   Zadd_dnobjr   r   r   	get_users=   s    
&

zCmfAuthLdapPlugin.get_usersc              	   c   s   z|  dddg |  }| jrl| jdD ]:}|j|  d| j | jjdd |j	D ]
}|V  q\q.n*|j| jj| jjdd |j	D ]
}|V  qW 5 Q R X W n" t
k
r   | jd  Y nX d S )	Nadditional_group_dngroup_object_class_filterr6   r7   r8   r
   r9   u(   Ошибка загрузки групп)r!   r.   rA   r:   r;   r<   r6   rB   r$   r=   r)   r   r1   r>   r   r   r   
get_groupsN   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+   )listrJ   agerK   r$   cmf_deferred_tasksyncid)clsauth_pluginr   r   r   	cron_sync_   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dirtyrI   TZ	person_idrW   r
   r   )rL   Zfiedlsslice)modelsCmfAuthPluginDatarQ   gcZcollect)limit_filterdatarowrW   r   r   	paginatedl   s      z*CmfAuthLdapPlugin.apply.<locals>.paginatedzStart CmfAuthLdapPlugin.apply()rE   rJ   rU   rM   rG        Синхронизация пользователей зависла, запускаем форсированно повторно2   Синхронизация уже запущенаN+   Запущена синхронизацияT)r[   rW       из closedr   rN   u+   Синхронизируем с eva_account   u0   Изменения применены в eva_appr(   u4   Ошибка применения изменений)gdebugr]   r   getrE   rJ   rR   r   r0   set_nowsavecommit_with_eventr^   countcmfutilZdisable_notifyZdisable_acl	enumerateZprocess_personrange
global_varaccount_sync_statusrS   	CmfPersonaccount_sync_userstimesleepr)   r	   r1   )rO   _args_kwargsre   cntiraw_datar2   r   rd   r   applyf   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(rf   rE   rJ   rg   rG   rj   u)   Очищаем синхронизациюrn   uh   Удаляем данные по пользователям (не самих пользователей)rd   u   Удалено rl   u/   Ошибка удаления CmfAuthPluginDatau   Удаляем группы
cmf_import)rW   rM   u,   Ошибка удаления CmfPersonGrouprm   u!   Очистка завершена)ro   rp   r]   r   rq   rE   r   r0   rJ   rr   rs   rt   r^   ru   rQ   deleter)   r1   ZCmfPersonGroupr   rW   )rO   r   r   rW   r   totalrb   groupr   r   r   clear   sN    



zCmfAuthLdapPlugin.clearc                  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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 }tj!j||dgd}|st|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|_'t||j(jg }g }|j)rj|D ]d}|| }|j|d kr||d  |d |j*kr|j	d#|  ||j*|d < |j*|_*qnv|D ]p}|j	d$|  ||}|r||d  |d |j*kr||j*|d < |j*|_*n|j+d%|  qnt,|j*j- D ] }||kr|j*|= |j*|_*q|j.s"|j/r`|s:|j	d&|  |  t  |rX|
d7 }
n|d7 }W nP t0k
r } z0d'|_|j1d(| d)| d*|  |d7 }W 5 d }~X Y nX qd}|jd'kstj!j,d+d,|gdd-|ggd.D ]}|d7 }|2  q|j	d/| d0|
 d1| d2| d3| d4 |jdkrDd5|_|  t  t3dd6D ]0}t j4j5dkrxt6tj7j8  qt9:d qT|r|j;d7| d8 n|j	d9 W nT t0k
r } z4t<| |r|j1d: d'|_|  t   W 5 d }~X Y nX d S );NzStart CmfAuthLdapPlugin.sync(rf   r   r   zplugin.loginzplugin.passwordr6   domainzcmf_owner.logindirectory_typerE   use_user_groups_attrrJ   rg   rG   rh   ri   rj   rk   u   Грузим группыrd   ZentryDNext_idnametextmembersu5   Синхронизация пользователейr   rn   **)r   rW   rM   u$   Импортируем учетку T)r   rW   u9   Добавляем пользователю группу u   Ищем группу u   Не нашли группу u9   Синхронизируем учетную запись r(   uA   Ошибка синхронизации пользователя (z): rW   rI   zNOT INrL   u!   Синхронизировано u    учетных записей(u    новых, u    обновлено, u    удалено, u    ошибок)rm   rN   uB   Синхронизация завершена с ошибками(z).u=   Синхронизация успешно завершена.u?   Синхронизация завершена с ошибкой)=ro   rp   r]   r   rq   rE   rJ   rR   r   r0   rr   rs   rt   rD   dictrU   r$   group_uid_attrZis_nullstrentry_dngetattrgroup_name_attrgroup_desc_attrgroup_users_attrr@   user_full_name_attruser_uid_attrappenduser_display_name_attruser_name_attruser_last_name_attruser_email_attrr^   loginr   Z
first_nameZ
max_length	last_nameZemailuser_groups_attrr   groupswarnrQ   keys
is_changedr[   r)   r1   r   rx   ry   rz   rS   r{   r|   r}   r~   Zwarningr	   ) rO   r   r   rW   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   Zuser_rawZuser_groupsZcurrent_user_groupsZ	group_uidr   r2   Zuser_deletedZ	user_datar   r   r   r   rT      s*           










"zCmfAuthLdapPlugin.syncc                  C   sj   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
        r   plugin.*)rM   T)Zno_metaZno_acl)Zeva_app_tokenauth_pluginsZrpc_account_plugin_push)r+   methodz/auth/sync_accountsN)
r]   r   rQ   r   r:   metaresultr   Zgen_eva_app_tokenZcall_eva_account)r   r"   Zsplitterr   Zresult_dictrb   r   r   r   account_plugin_pusht  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 )NrO   rP   )rH   r   rS   r]   r   r   rU   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):\/\/(.+\..*)\/*rU   rF   r   ZLIKE%rn   r   u)   Интеграция с сервером u    уже естьTabort)r"   r'   r   refindallr$   r]   r   ru   rU   r/   )r   r;   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   )configZIS_BOX_VERSIONr/   r   ZORG_NAMEZorg_name_process_directory_typer   r   superrs   )r   r   r   r   r*   r+   	__class__r   r   rs     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_classr5   r   Zuser_rdn_attrr   r   r   r   Zuser_password_attrZuser_password_cryptr   r   Zgroup_object_classrB   r   r   r   r   r   r   r   r   r     sP    

z)CmfAuthLdapPlugin._process_directory_typec                 C   s   |  | jjj| jjjx}d| j d| j d| d}|j| jj|ddr|j	D ]:}|  |j
|"}|W  5 Q R    W  5 Q R  S Q R X qPW 5 Q R X dS )u?   Авторизация через внешнюю системуz(&(ObjectClass=z)(=z))r
   rC   N)r.   r"   r#   r$   r%   r   r   r;   r6   r=   r   )r   r   r   r,   ra   r   Z
_test_connr   r   r   signin  s    
2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   ZLOG_NAMEexistsr   Z
UPLOAD_DIRr   r0   )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 )Nrd   uM   Сначала очистите интегрированные данные: Tr   r   )r]   r^   ru   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   Zui_meta_skipr   r   r   rv   Zmemoizedr   r.   r3   rQ   r@   rD   classmethodrX   staticmethodZ
celery_appZtaskr   r   rT   r   r   r   rs   r   r   r   r   r   __classcell__r   r   r   r   r      s>   
7) )


,
r   )r_   r}   Zloggingr   Zldap3.core.exceptionsr   Zldap3r   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   r&   r   ZAPPZHOOK_CRON_MINUTELYr   rX   r   r   r   r   <module>   s       W