U
    [cIV                     @   s   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                       s(  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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 ).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}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_timeout)Zvalidateversion:)ZtlsF)userpasswordauthenticationZauto_referralsZreceive_timeoutux   Не удалось подключиться к серверу, неправильный логин или пароль.)load_fieldsplugin	ext_loginvalueext_passwordr   sslZCERT_OPTIONALZPROTOCOL_TLSv1_2r   Z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_connect-   s    
zCmfAuthLdapPlugin.test_connectc              	   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_user_dnuser_object_class_filterbase_dn;,r
   Z
attributesu8   Ошибка загрузки пользователей)r!   r-   r3   splitsearchstripr5   r4   r$   entriesr(   r   r0   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_filterr5   r6   r7   r
   r8   u(   Ошибка загрузки групп)r!   r-   r@   r9   r:   r;   r5   rA   r$   r<   r(   r   r0   r=   r   r   r   
get_groupsK   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_statusz!=in_progress	auto_sync==T	sync_datesync_interval)filterfields<   auth_plugin_idr*   )listrG   agerH   r$   cmf_deferred_tasksyncid)clsauth_pluginr   r   r   	cron_sync\   s    
zCmfAuthLdapPlugin.cron_syncT)Z	only_onceZsystem_taskc              
   O   s  t d|  d tjj| ddgd}z |jdkr`|jjdkrN|j	d n|j	d	 W d
S |j	d |j
  d|_|  t  tjjd|d}ttjjd|dgdD ],\}}|j	| d|  |  t  qd|_|  t  tddD ]:}t jjdkr.|j	d ttjj  q:t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
        zStart CmfAuthLdapPlugin.apply()rC   rG   rR   rJ   rD        Синхронизация пользователей зависла, запускаем форсированно повторно2   Синхронизация уже запущенаN+   Запущена синхронизацияT)dirtyrT   r
   )r\   rT   Zfiedls    из closedr   rK   u+   Синхронизируем с eva_account   u0   Изменения применены в eva_appr'   u4   Ошибка применения изменений)gdebugmodelsr   getrC   rG   rO   r   r/   set_nowsavecommit_with_eventCmfAuthPluginDatacount	enumeraterN   Zprocess_personr	   range
global_varaccount_sync_statusrP   	CmfPersonaccount_sync_userstimesleepr(   r0   )rL   _args_kwargsrT   Zcntiraw_datar1   r   r   r   applyc   sF    

 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D ]\}z2|jd| d|  |d	7 }|  t  W n" tk
rt   |jd Y nX qd|_|
  |jd d S )NzStart CmfAuthLdapPlugin.clear(rV   rC   rG   rW   rD   rZ   u)   Очищаем синхронизациюr_   uh   Удаляем данные по пользователям (не самих пользователей)rT   u   Удалено r]   u/   Ошибка удаления CmfAuthPluginDatau   Удаляем группыu,   Ошибка удаления CmfPersonGroupr^   u!   Очистка завершена)r`   ra   rb   r   rc   rC   r   r/   rG   rd   re   rf   rg   rh   rN   deleter(   r0   CmfPersonGroup)rL   rq   rr   rT   rs   totaldatagroupr   r   r   clear   sF    



zCmfAuthLdapPlugin.clearc           !      O   s  t d|  d tjj| ddddddd	d
dg	d}z|jdkrn|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}t||jjd }|r|j|d< ntd|jj dt||jjd }|r|j|d< t||jjd }	|	r6|	j|d< |||j< |j	|  tjj|d d}
|
r|D ]"}t|
|rht|
|||  qh|
jr|
  q|j	d d}d}d}d}g }| D ]}|d7 }d }d }d }zt||jjj}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}|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|_*t||j+jg }g }|D ]p}|j	d"|  ||}|rl||d  |d |j,kr~||j,|d < |j,|_,n|j-d#|  qt.|j,j/ D ] }||kr|j,|= |j,|_,q|jr|s|j	d$|  |  t  |r|d7 }n|d7 }W nP tk
rL } z0d%|_|j0d&| d'| d(|  |d7 }W 5 d }~X Y nX qd}tj$j.d)d*|gdd+|ggd,D ]}|d7 }|1  qt|j	d-| d.| d/| d0| d1| d2 d3|_|  t  t2dd4D ]0} t j3j4dkrt5tj6j7  qt89d q|r$|j:d5| d6 n|j	d7 W nT tk
r } z4t;| |rt|j0d8 d%|_|  t   W 5 d }~X Y nX d S )9NzStart CmfAuthLdapPlugin.sync(rV   r   r   zplugin.loginzplugin.passwordr5   domainzcmf_owner.logindirectory_typerC   rW   rD   rX   rY   rZ   r[   u   Грузим группыrv   ext_idu   Укажите u+    для уникальности группnametext)r   u5   Синхронизация пользователейr   r_   **)r   rT   rJ   u$   Импортируем учетку T)r   rT   u   Ищем группу u   Не нашли группу u9   Синхронизируем учетную запись r'   uA   Ошибка синхронизации пользователя (z): rT   rF   zNOT IN)rI   u!   Синхронизировано u    учетных записей(u    новых, u    обновлено, u    удалено, u    ошибок)r^   rK   uB   Синхронизация завершена с ошибками(z).u=   Синхронизация успешно завершена.u?   Синхронизация завершена с ошибкой)<r`   ra   rb   r   rc   rC   rG   rO   r   r/   rd   re   rf   rB   dictrR   r$   getattrgroup_uid_attrr(   Zcaptiongroup_name_attrgroup_desc_attrentry_dnrx   hasattrsetattr
is_changedr?   user_full_name_attruser_uid_attrappenduser_display_name_attruser_name_attruser_last_name_attruser_email_attrrg   loginr   Z
first_nameZ
max_length	last_nameZemailuser_groups_attrgroupswarnrN   keysr0   rw   rj   rk   rl   rP   rm   rn   ro   rp   Zwarningr	   )!rL   rq   rr   rT   Z
cached_grpgrpr{   Zgrp_idZgrp_nameZgrp_attrZeva_app_groupkeyZ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_groupsr   r1   Zuser_deletedZ	user_datars   r   r   r   rQ      s          










"zCmfAuthLdapPlugin.syncc                  C   sh   g } t jjddgdD ]0}t|dd}|  |j|j }}| | qt | ddd}t	d	| d
S )u=   
        Отправляем в аккаунт 1к1
        r   plugin.*)rJ   T)Zno_meta)Zeva_app_tokenauth_pluginsZrpc_account_plugin_push)r*   methodz/auth/sync_accountsN)
rb   r   rN   r   r9   metaresultr   Zgen_eva_app_tokenZcall_eva_account)r   r"   Zsplitterr   Zresult_dictrz   r   r   r   account_plugin_pushK  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 )NrL   rM   )rE   r   rP   rb   r   ru   rR   r$   r   r   r   r   _process_auto_sync[  s    z$CmfAuthLdapPlugin._process_auto_syncr   depthnotifyemitc                   sL   t jstddd t j| _|   |   |   t j	||||d|S )NuE   Модуль доступен только в версии On-PremiseT)abortr   )
configZIS_BOX_VERSIONr.   ZORG_NAMEZorg_name_process_directory_typer   r   superre   )r   r   r   r   r)   r*   	__class__r   r   re   a  s    zCmfAuthLdapPlugin.savec                    s   t   ddg S )Nr
   r   )r   save_preload_fieldsr   r   r   r   r   j  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_classr4   r   Zuser_rdn_attrr   r   r   r   Zuser_password_attrZuser_password_cryptr   r   Zgroup_object_classrA   r   r   Zgroup_users_attrr   r   r   r   r   r   m  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
   r8   N)r-   r"   r#   r$   r%   r   r   r:   r5   r<   r   )r   r   r   r+   Z_filterresZ
_test_connr   r   r   signin  s    
2zCmfAuthLdapPlugin.signinc                 O   s8   |    tj }tjtj | s4| j	d |S )NZinit)
r   r   ZLOG_NAMEospathexistsr   Z
UPLOAD_DIRr   r/   )r   r)   r*   Z	file_pathr   r   r   get_log_filename  s    z"CmfAuthLdapPlugin.get_log_filenameF)forcec                   s"   t  j|d|i| |   d S )Nr   )r   rw   r   )r   r   r)   r*   r   r   r   rw     s    zCmfAuthLdapPlugin.delete)NN)#__name__
__module____qualname__Z_CmfAuthLdapPlugin__connectr   r   Zui_meta_skipr   r   r   ZcmfutilZmemoizedstrr-   r2   rN   r?   rB   classmethodrU   staticmethodZ
celery_appZtaskru   r|   rQ   r   r   re   r   r   r   r   rw   __classcell__r   r   r   r   r      s<   
*% 
	,
r   )ro   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   rU   r   r   r   r   <module>   s       