B
    f8              
   @   s  d dl Z d dlZd dlmZmZ d dlZd dlZd dlZd dlZd dl	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mZmZ d dlT d d	lmZ d dlZd dlZd dlZd dlZd d
lmZ d dlZd dl Z d dl!Z!d dl"Z"d dl#m$Z$ d dl%m&Z& d dl'm(Z( dZ)G dd dZ*G dd dZ+G dd dZ,G dd dZ-dd Z.dd Z/dd Z0dd Z1dd  Z2d!d" Z3d#d$d%d&Z4d'd( Z5did)d*Z6d+d, Z7djd-d.Z8dkd0d1Z9dle:e(e: e(e: e:d2d3d4Z;e:e:d5d6d7Z<d8d9 Z=d:d; Z>d<d= Z?d>d? Z@d@dA ZAG dBdC dCZBdmdDdEZCdndFdGZDdHdI ZEe:e:dJdKdLZFe:e:dJdMdNZGdoe:e:dOdPdQZHdRdS ZIdpdUdVdWdXZJdYdZ ZKd[d\ ZLd]d^ ZMd_d` ZNG dadb dbZOdcdd ZPdqdgdhZQdS )r    N)urlparseparse_qs)datetimetimezonedate)Linker)g)Path)timeitProfilerDataCtxprofiler_data_log)*)AES)is_dataclass)OrderedDict)deepcopy)Listz******c               @   s.   e Zd ZdZddddZdd Zdd	 ZdS )
disable_aclut   Отключение проверки прав доступа в ORM для системных частей кодаN)returnc             C   s
   d | _ d S )N)save_acl_flag)self r   ./cmf/util/cmfutil.py__init__   s    zdisable_acl.__init__c             C   s   dt krt j| _dt _d S )Ndisable_permissionsT)r   r   r   )r   r   r   r   	__enter__"   s    zdisable_acl.__enter__c             C   s   | j t_d S )N)r   r   r   )r   excvaluetbr   r   r   __exit__'   s    zdisable_acl.__exit__)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s   r   c               @   s.   e Zd ZdZddddZdd Zdd	 ZdS )

run_systemut   Отключение проверки прав доступа в ORM для системных частей кодаN)r   c             C   s   d | _ d | _d S )N)current_usercurrent_acl_admin_mode)r   r   r   r   r   .   s    zrun_system.__init__c             C   s(   t j| _tjt j t j| _dt _d S )NT)r   r%   cmfappset_current_personZsystem_useracl_admin_moder&   )r   r   r   r   r   2   s    zrun_system.__enter__c             C   s   t j| j | jt_d S )N)r'   r(   r)   r%   r&   r   r*   )r   r   r   r   r   r   r   r   :   s    zrun_system.__exit__)r    r!   r"   r#   r   r   r   r   r   r   r   r$   +   s   r$   c               @   s.   e Zd ZdZddddZdd Zdd	 ZdS )
disable_notifyut   Отключение проверки прав доступа в ORM для системных частей кодаN)r   c             C   s
   d | _ d S )N)save_notify_flag)r   r   r   r   r   A   s    zdisable_notify.__init__c             C   s   dt krt j| _dt _d S )Nr+   T)r   r+   r,   )r   r   r   r   r   D   s    zdisable_notify.__enter__c             C   s   | j t_d S )N)r,   r   r+   )r   r   r   r   r   r   r   r   I   s    zdisable_notify.__exit__)r    r!   r"   r#   r   r   r   r   r   r   r   r+   ?   s   r+   c               @   sJ   e Zd ZedZddddZdd Zdd	 Zed
d Z	edd Z
dS )enable_import_modez/tmp/eva_app_import.lockN)r   c             C   s   d | _ d | _d S )N)save_import_flagsave_cache_flag)r   r   r   r   r   P   s    zenable_import_mode.__init__c             C   sD   dd l }|jdd| _dtkr(tj| _dt_d|jd< |   d S )Nr   NO_CACHE import_modeT1)osenvirongetr/   r   r2   r.   import_heartbeat)r   r4   r   r   r   r   T   s    
zenable_import_mode.__enter__c             C   s4   dd l }| jt_| j|jd< | j r0| j  d S )Nr   r0   )	r4   r.   r   r2   r/   r5   	LOCK_PATHexistsunlink)r   r   r   r   r4   r   r   r   r   ]   s
    
zenable_import_mode.__exit__c          	   C   s6   t | jd }|tjtjdd W d Q R X d S )Nzw+)tzz%Y-%m-%d %H:%M:%S %Z%z)openr8   writer   nowr   utcZstrftime)clsfr   r   r   r7   g   s    z#enable_import_mode.import_heartbeatc          	   C   s`   dd l }tj| jsdS t| jd}|j| }W d Q R X t	j
tjd|  d dk S )Nr   Fr)r;   <      )Zdateutil.parserr4   pathr9   r8   r<   parserparsereadr   r>   r   r?   total_seconds)r@   ZdateutilrA   	lock_timer   r   r   import_is_runningl   s    z$enable_import_mode.import_is_running)r    r!   r"   r	   r8   r   r   r   classmethodr7   rK   r   r   r   r   r-   M   s   	
r-   c             C   s   t tdsd S d|  }|tjkr&d S t }tjjj|dd}|jddd t | }|dkrzt	d|d	d
|  |dkrt
jd|d	d
|  |dkrt tdddkrt
jd|d	d
|  |tj|< t tj|< d S )Nacquired_lockszCmfCacheObjLock:   )timeoutT)Zblockingblocking_timeoutg?zcache_obj_lock_get long time: z0.3zsec    z,DEV: cache_obj_lock_get long time CRITICAL: rD   i  z#DEV: cache_obj_lock_get long time: )hasattrr   rM   timeAPPREDIS_DBredislockacquiredebugr'   include	cmf_alertr   Ztodayacquired_lock_timigns)obj_idZlock_keyst_timerW   Zacquire_timer   r   r   cache_obj_lock_get|   s$    



r_   c              C   s   t tdsd S t } xVtj D ]H}y|  W q" tjjk
rh } zt	d|  W d d }~X Y q"X q"W t |  }|dkrt	d|ddtj
   xDtj D ]6\}}t | }|dkrt	d| d|dd	 qW d S )
NrM   z*cache_obj_lock_release_all release error: g?z%cache_obj_lock_release_all too slow: z0.3zsec. Locks:z(cache_obj_lock_release_all lock >100ms:  Zsec)rR   r   rS   rM   valuesreleaserV   
exceptionsZ	LockErrorrY   keysr\   items)r^   rW   eZunlock_timeZ	lock_nameZlock_strJ   r   r   r   cache_obj_lock_release_all   s    
&rg   c              C   s8   t tdr4tjr4xtjD ]} tjjj|   qW g t_d S )Ndelayed_redis_events)rR   r   rh   rT   rU   rV   Zpublish)Zeventr   r   r   emit_delayed_events   s    ri   c             C   s   t t|  S )N)varsmodels)
class_namer   r   r   get_model_by_name   s    rm   c             C   s   t | }tt| S )N)get_class_name_by_idrj   rk   )idrl   r   r   r   get_model_by_id   s    rp   c             C   s   t | dd }|S )N:r   )strsplit)ro   rl   r   r   r   rn      s    rn   F)simplec            O   sH   t | tjjr| j }n|  }t|}|r0|jn|j}||d|i|S )Nro   )
isinstancer'   rk   	CmfEntityro   rp   sgetr6   )ro   rt   argskwargsZtuuidmodelr6   r   r   r   get_obj_by_id   s    
r{   c             C   s   t |trtt| }n|}t | tjjr@t | tjjs@t| } t | tr| |j	 dr`| S |j
| ddgd}|r||jS |j
| ddgd}|r|jS dS t| jS )u  
    Находим id объекта. Функция для использования в API и bzPython ручек, которые используют клиенты.
    Реализуем максимально универсальную логику, чтобы клиент мог получить объект по:
    - id
    - code
    - name
    - передать сам объект
    - передать field модели со ссылкой наобъект
    Если передается id - функция отрабатывает максимально быстро, т.к. используется в кешах
    Если передается code или name - будут доп.запросы в БД.
    Сначала ищем по code и только если не находим - по name
    В class_name можно передать имя модели или саму модель
    rq   z--ro   )codefields)namer}   N)ru   rr   rj   rk   r'   r}   CmfType
CmfRelBase
startswithrl   rw   ro   )objrl   rz   Z
loaded_objr   r   r   get_obj_id_by_any   s     

r   c             c   sb   ddl m} ddlm} xDt|j D ]2}t||}t||r(|j	rHq(| rT| |r(|V  q(W dS )u`   Последовательность моделей, с возможно фильтрацией.r   )rk   )BaseModelMetaN)
cmf.includerk   cmf.models.base_modelr   sorted__dict__rd   getattrru   Zabstract)Zmodel_filterrk   r   Z
model_namerz   r   r   r   iter_models   s    
r   c             C   s>   ddl m} ddlm} x | D ]}|j| kr"|jS q"W d S )Nr   )rk   )rv   )r   rk   r   rv   Ziter_subclassesui_namerl   )r   rk   rv   rz   r   r   r   get_class_name_by_ui_name   s    

r   c             O   s   |st ddd t|tkr$t|}|j|ddd| gi|}|s| d k	rd| kr| dd }| rt|d	kr|j|ddd
d| gi|}|S )Nu|   TODO: сделать автоматическое обнаружение моделей и объекта как в bzPythonT)abortfilterr|   =-   ZLIKEz%-)r[   typerr   rm   r6   rs   isdigitlen)r|   rz   rx   ry   resZcode_numberr   r   r   get_obj_by_code  s     r   _c                s(   t j| ddd}d fdd|D S )NruT)Zlanguage_codereversedr1   c             3   s*   | ]"}|  s|d kr| n V  qdS )r   N)isalnumlower).0c)sepr   r   	<genexpr>  s    z!translit_strip.<locals>.<genexpr>)transliterateZtranslitjoin)textr   r   r   )r   r   translit_strip  s    r   )r   tags_extendprotocols_extendr   c             C   s   |r d|kr |  dd dd} tj}dddg|d	< d
g|d< dddg|d< dddg|d< tj}|d	 |d |d |d |d |d |d |d |d |d |r|| tj}|r|| tj| tj||ddS )NZdivz<div>z<p>z</div>z</p>srcwidthZheightZimgr   rS   Zcontrolsr|   ZaudioZvideopbrZinsdelZfigureZ
figcaptionT)r   tags
attributes	protocolsstrip)replacebleachZALLOWED_ATTRIBUTESZALLOWED_TAGSappendextendZALLOWED_PROTOCOLSZclean)r   r   r   r   r   r   r   r   r   
html_strip  s0    












r   )r   r   c             C   s    ddd}t |gd}|| S )NFc             S   s.   |  ds| S t| d }d| d< d| d< | S )N)NZhrefZ_blank)NtargetZexternal)Nclass)r6   r   )Zattrsnewr   r   r   r   
set_target:  s    
zlinkify.<locals>.set_target)Z	callbacks)F)r   linkify)r   r   Zlinkerr   r   r   r   9  s    
r   c                s   i  fdd}|S )Nc                 s4   t | t| f}|kr, | ||< | S )N)pickledumpsr   re   )rx   ry   hash)funcmemoryr   r   memoH  s    zmemoized.<locals>.memor   )r   r   r   )r   r   r   memoizedF  s    r   c             K   s   t jj}d|  }|jddd}| s<tjjddd dS ||sb|	  t
d	 t| d
S t||}t
jj|d kr|	  tjjddd dS ttj|d< ||t| |	  dS )Nz	obj_lock-zobj_lock.lock
   )rO   z(DEV: FATAL lock(): if not lock.acquire()T)r   FuR   DEV: FATAL Попытка lock_ping() на отсутствующую записьi  	locked_byuJ   DEV: FATAL Попытка lock_ping() на чужую блокировку	ping_time)rT   rU   rV   rW   rX   r'   rZ   r[   r9   rb   r   rY   r   loadsr6   current_personro   r   r>   r   r?   setr   )keyry   redis_db_key_lock	lock_infor   r   r   	lock_pingP  s&    



r   c             C   sD   | st dtjj}d|  }||r@t||}|r@|S dS )uh   
    Из редиса заберём структуру, где есть данные
    :return:
    uL   Блокировка объектов без key не реализованаz	obj_lock-N)
ValueErrorrT   rU   rV   r9   r   r   r6   )r   r   r   r   r   r   r   r   i  s    

r   c             C   s  t jj}d|  }|jddd}tjjjt	t
jt	t
j|d}| s`tjjddd d	S ||rt||}t	t
j|d
   |k rtjj|d kr|  tjj|d d}tjd|j  d	S tjd |  dS ||t| |  dS )uT   
    Захват объекта на редактирование
    :return:
    z	obj_lock-zobj_lock.lockr   )rO   )r   Z
lock_startr   lock_timoutz(DEV: FATAL lock(): if not lock.acquire()T)r   Fr   r   )ro   u[   Редактирование временно невозможно.
Редактирует u`   DEV: WARNING lock() попытка захватить свою блокировку дважды)rT   rU   rV   rW   r   r   ro   r   r   r>   r   r?   rX   r'   rZ   r[   r9   r   r   r6   rI   rb   rk   Z	CmfPersonr~   r   r   )r   Zlock_timeoutr   r   rW   r   personr   r   r   rW   z  s0    



rW   c             K   s   t jj}d|  }|jddd}| s<tjjddd dS ||s^tjd	 |	  dS t
||}ttj|d
   |d k rtjj|d kr|	  dS || |	  dS n|| |	  dS dS )u2   
    Снятие захвата
    :return:
    z	obj_lock-zobj_lock.lockr   )rO   z*DEV: FATAL unlock(): if not lock.acquire()T)r   Fus   DEV: WARNING unlock() попытка разблокировать несуществующую блокировкуr   r   r   )rT   rU   rV   rW   rX   r'   rZ   r[   r9   rb   r   r   r6   r   r>   r   r?   rI   r   r   ro   delete)r   ry   r   r   rW   r   r   r   r   unlock  s,    

 

r   c               @   s0   e Zd ZdZdddddZdd Zd	d
 ZdS )CmfLockuJ   Глобальная блокировка аппа на основе redis  N)r   c             C   s$   ddl m} |jj|||d| _d S )Nr   )rU   )rO   rP   )r   rU   rV   rW   
redis_lock)r   r   rO   rP   rU   r   r   r   r     s    zCmfLock.__init__c             C   s    | j  std| j j d S )NzCannot lock )r   rX   ZCmfGetLockErrorr~   )r   r   r   r   r     s    
zCmfLock.__enter__c             C   s   | j   d S )N)r   rb   )r   r   r   r   r   r   r   r     s    zCmfLock.__exit__)r   N)r    r!   r"   r#   r   r   r   r   r   r   r   r     s   r   c             K   s  t js
dS | s|sdS ttdd }dt_dt_ddlm}m}m}m	}	 t
t }
||
d< ||
d< ||
d< ||
d< |	|
d	< tjj|
d
< |r|
| yh|rt|}|dr|dd  }|dr|dd  }td| d}| } W d Q R X t| |d}t||
 |
d |}n| rtj| dd}d}x.|jD ]$}t|tjr6|jdkr6d}q6W |s|jtjtjddddddd tjd|jtjg tj ddddgg d g d g dddg d}|g|_t|dd}t||
 |
d |}ntddd W nv t!k
rr } zV|t_dt_t|tj"j#r0|dd l$}|% }tjjd| d| d| dd W d d }~X Y nX |t_dt_|S )NTdisable_raise_lazyloadr   )r   r   	timedeltar   r   r   r   r   r   r[   z/opt/eva-app/   /rD   rB   execrun)modeF)r   lineno
col_offset)r   r   )Zposonlyargsrx   defaultsZvarargZ
kwonlyargsZkwargZkw_defaults)r~   bodyrx   r   r   Zdecorator_listz<string>uC   Попытка вызова несуществующего bzPython)r   uT   Произошла ошибка при выполнении bzPython объекта z: 
)&configZBZPYTHON_ENABLEDr   r   r   Zrelaxed_bz_python_moder   r   r   r   dictglobalsr'   rZ   r[   updaterr   r   r<   rH   compiler   astrG   r   ru   ZFunctionDefr~   r   ZReturnZConstantZ	argumentsarg	ExceptionZ
base_errorZCmfAbortError	traceback
format_exc)r|   r   Zcode_src_objZeval_file_pathry   Zprev_disable_raise_lazyloadr   r   r   r   lrA   Z
code_blockresultZcode_astZhave_fnstfnrf   r   Ztracer   r   r   exec_bzpython  s~    







r   c       
      C   s  t | }|jd}|r$|d dkr(d S t|jddgd }|rL|sLd S |d }|s\d S d|krx|jddd	\}}n d
|kr|jd
dd	\}}nd S |dkrtj}n&|dkrtj	}n|dkrtj
}ntj}i }	|r||	d< d
|krtf d|j d| i|	S tf d| i|	S )Nr   rD   )ZshareZdocsr   r1   r   r   rq   )maxsplitr   )docZDOCCmfDocument)ZflZFLZIN_WORK	CmfFolder)CmfListZEPIZsharelink_hashro   r|   )r   rE   rs   r   Zqueryr6   rsplitrk   r   r   r   r{   rl   r   )
Zurl_strZcheck_sharelinkZurl
path_partsZ
hash_paramZobj_keyZobj_typeZobj_codeZ	obj_modelZ
get_kwargsr   r   r   get_url_path_obj3  s8    
r   c              C   s6   t jd\} }}t|}t|}t|tj|S )Nrq   )r   ZEVA_INSTANCE_KEYrs   binasciiZ	unhexlifyr   r   ZMODE_CBC)r   Ziv_hexZkey_hexr   Zivr   r   r   
get_cipherh  s    

r   )messager   c             C   s@   t  }| dtjt| tj    }|| }t|dS )Nr`   zutf-8)	r   r   Z
block_sizer   Zencryptencodebase64Z	b64encodedecode)r   cipherZpadded_messageZencrypted_messager   r   r   crypto  s    r   c             C   s   t  }|t|   S )N)r   decryptr   Z	b64decoder   r   )r   r   r   r   r   r   v  s    r   )r   r   c          	   C   s^   t j }xN|j D ]@}|r<t jj||d| |p2| dd qt jj|d| |pN| dd qW d S )Nu   ОшибкаrD   )r   r   r~   msgr   priority)r   r~   r  r   r  )rk   ZCmfPersonGroupZadmin_groupZ
rg_membersZ
all_nestedZ	CmfNotifyZplace_notify)r   r   r   Z	admin_grpr   r   r   r   admin_alertz  s     

r  c              C   st   dd l } |  }tjrpd }tj}d|kr6|d\}}d| d| d|_|rp|d\}}| j|||_|S )Nr   @zhttp://)ZhttpZhttpsrq   )requestsZSessionr   ZEGRESS_PROXYrs   ZproxiesZauthZHTTPProxyAuth)r  requests_sessionZ
auth_proxyZproxy_settingsZusernameZpasswordr   r   r   r    s    r  r=   zlist|CmfModel|SimpleModel)r   c             C   s6   t | tr&x&| D ]}t||d qW nt| d| dS )u   
    Маркируем объект проверенный бизнес логикой политикой по умолчанию.
    Сейчас маркировка проверяется только в api(eva-app)
    )policy_acl_policyN)ru   listacl_set_policysetattr)r   r  r   r   r   r   r
    s    

r
  c             C   s@   ddl m} t| ddd}t| |jjr2|  n|  |jS )Nr   )baseT)no_metano_acl)	cmf.data_providersr  CmfResultSplitterru   SimpleMapperSimpleModelsplit_simplers   r   )r   r  Zsplitterr   r   r   
dumps_dict  s    
r  c             C   s8   ddl m} t| }t| |jjr*t|S t|S d S )Nr   )r  )	r  r  r  ru   r  r  	cmf_dumpsujsonr   )r   r  Zres_dictr   r   r   
dumps_json  s
    r  c             C   s   t | tjrt| S t | tjr(t| S t | tjjrdd | j	
 D }x4| j	
 D ]&\}}t |tjrV|jrV| ||< qVW | j|d< |S t| | jd S )Nc             S   s0   i | ](\}}t |tjjr|jd k	r|j|qS ).)ru   r'   r}   r   _value)r   attrfieldr   r   r   
<dictcomp>  s   z%cmf_dumps_default.<locals>.<dictcomp>rl   )ru   	ipaddressIPv4Addressrr   decimalDecimalr'   rk   	BaseModelr   re   ZfieldsCmfTypeZvirtualZvirtual_getterrl   	TypeError	__class__)r   r   r  r  r   r   r   cmf_dumps_default  s    
r#  c          
   C   sT   yt j| tt jdS  tk
rN } ztd| d|   |W d d }~X Y nX d S )N)defaultoptionzorjson.dumps error e=z, obj=)orjsonr   r#  ZOPT_NON_STR_KEYSr!  r   rY   )r   rf   r   r   r   r    s
    r  c               @   s   e Zd Zd%ddZdd Zdd Zd&d	d
Zd'ddZd(ddZdd Z	ed)e
jjdddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ ZdS )*r  NFc             C   sP   || _ i | _t | _d | _d | _d | _d| _t | _d| _	|| _
i | _|| _d S )Nr   )_objmetar   meta_fields_keepr   startendnumber_of_objectsm2m_id_cachedepthr  3_CmfResultSplitter__project_perm_add_comments_cacher  )r   r   r  r  r   r   r   r     s    zCmfResultSplitter.__init__c                s    fdd}|S )Nc                sL   |  j d7  _ | j dkrd S  | f||}|  j d8  _ | j dksHt|S )NrD   r   r   )r.  AssertionError)r   rx   ry   ret)r   r   r   wrap  s    
z,CmfResultSplitter._check_depth.<locals>.wrapr   )r   r2  r   )r   r   _check_depth  s    zCmfResultSplitter._check_depthc             C   s"   |j | jkrt|j| j|j < d S )N)rl   r(  r   Zui_meta)r   or   r   r   _add_class_to_meta  s    z$CmfResultSplitter._add_class_to_metac             C   sZ  | d}| d}| d}| d}| d}| d}| d}	tt|}
i }d}d}|
jsx t|D ]}|d	krzql||= qlW d
|d< |S tjj|||d||||	|d	pt }t|
t	jj
rL|
jrL|rL|dd }tt|d}|j |
j}| d}| d}|r|jsLtjj||||
j|||d|d	}t|t|@ }|dkr|| dr|tj||s|d}t }| ddrt|}d|kr|d t|}d|krd|krdnd
}t| }tjdstjdrd|
jkrd|kr|d x$|D ]}|tjkr6||= q|d	krDq|
j |}|r|jrbq|js|||= d
||< qt|t	jjrt||< d}tjj||||||||	d|d
pt }|dkr|rt }|dkr|r|dr|| jkr(| j| sd|krt|}|d nt|}t|ddgdd }|jjpR|j j}|sd|krvt|}|d d| j|< nH|j!d!|dd"dkrd|krt|}|d d| j|< n
d| j|< |d#kr|d$krt|}|"d d|krd|krdnd
}|r|||< |d
kr||kr||= qW |rH||d%< |rV||d< |S )&u;  
        Чтобы код не дблировать для модели, простой модели и дикта, можно проверять итоговый json
        Правда в таком случае, мы обходим все данные, даже если они не доступны.
        Zperm_effective_acl_idZcmf_owner_idro   	parent_idrl   perm_parent_id%perm_security_level_allowed_ids_cacheN)ro   rl   ZdenyZ_acl_objF)	initial_acl_keyobject_modelobject_owner_idraise_error	object_idobject_parent_idobject_dictperm_security_level_allowed_idschecked_policyrq   r   perm_inherit_acl_idperm_parent_owner_id)	r9  r:  r;  object_fieldr=  r>  r?  r<  rA  
CmfCommentZprivateTZcmf_deletedr=   rH   readonlyz.getz.ui_getZcomments)
r9  r:  rD  r;  r=  r?  r>  r@  r<  rA  zCmfProject:
project_id)r}   Zinclude_deletedzPPP-COM-ADD)r   r<  r|   Z
CmfProjectZ_acl_fields)#r6   r   rk   Z	api_allowr	  ZCmfAccessListZcheck_accessr   
issubclassr'   rv   Zacl_parent_field	partitionr}   r  rE  Zcheck_visibilityremovetuplerd   r   Z
api_methodendswithr   Zapi_hack_fieldsZCmfPassword_PASSWORD_MASKr   r/  r{   rG  r   r6  Zcheck_project_role_accessadd)r   Zobj_dict
acl_policyr9  Zobj_owner_idr]   Zobj_parent_idrl   r7  r8  rz   Z
acl_fieldsZacl_objZcomment_deny
field_nameZaccess_levelsZparent_class_nameZparent_modelZparent_fieldrB  rC  Zparent_access_levelsZ_tmpZobj_keysr  Z	acl_fieldZfield_access_levelsZproject_Zobj_Zproject_id_r   r   r   _acl_obj_dict
  s    






















zCmfResultSplitter._acl_obj_dictr   c             C   s   |  j d7  _ | js| | d|ji}x4|jddD ]$}|jsBq6| j||d d||j< q6W | js|jdkr| j	|t
|dd d}|S )	NrD   rl   T)
is_defined)r.  Zpublic_readr  )rO  )r,  r  r5  rl   ra   rR  _process_cmf_typer  Zacl_typerQ  r   )r   r4  r.  r   vr   r   r   _process_cmf_model  s    

z$CmfResultSplitter._process_cmf_modelc             C   s   |  j d7  _ | js*tt|j}| | i }x<|j D ].\}}| jsZ| j	|j|f | 
|||< q:W | js| j|t|dd d}|S )NrD   r  )rO  )r,  r  r   rk   rl   r5  r   re   r)  rN  _processr  rQ  )r   r   r.  rz   r   r  r   r   r   r   _process_simple_model  s    
z'CmfResultSplitter._process_simple_modelc                s    fdd  |S )Nc                s   t | tr fdd| D S t | tr| d} fdd|  D }t |trd|krȈ jd7  _tjj	
|}js| x| D ]}j|j|f qW |j|d< jsȈj|| d	d
}|S | S )Nc                s   g | ]} |qS r   r   )r   el)proccess_jsonr   r   
<listcomp>  s    zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<listcomp>ro   c                s   i | ]\}} ||qS r   r   )r   krT  )rY  r   r   r    s    zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<dictcomp>rq   rD   rl   r  )rO  )ru   r	  r   r6   re   rr   r,  r'   r}   ZCmfTUUIDZget_cls_by_tuuid_strr  r5  r)  rN  rl   r  rQ  )r   r]   datarz   rP  )rY  r   r   r   rY    s"    





z?CmfResultSplitter._process_json_as_model.<locals>.proccess_jsonr   )r   r4  r   )rY  r   r   _process_json_as_model  s    z(CmfResultSplitter._process_json_as_model)r4  c             C   sf  |  j d7  _ | js*| j|jj|jf t|tjj	rD| 
|jS t|tjjr^| |jS t|tjjrx| |jS t|tjjrt|| jkrd S | jt| |jrd S | j|j|d d}| jt| |S t|tjjrJt|| jkrg S | jt| g }x$|jD ]}| |}|| qW | jt| |S |j}|dkr`|jS |jS )NrD   )r.  .)r,  r  r)  rN  instancerl   ru   r'   r}   ZCmfObjectJsonr]  r   ZCmfObjectList_process_listZ	CmfObjectrU  ZCmfRelationBasero   r-  Zis_nullrJ  r   r   Zjsonr$  )r   r4  r.  r   r   ir   r   r   r   rS    s@    

z#CmfResultSplitter._process_cmf_typec                s$     j d7  _  fdd|D }|S )NrD   c                s   g | ]}  |qS r   )rV  )r   rf   )r   r   r   rZ    s    z3CmfResultSplitter._process_list.<locals>.<listcomp>)r,  )r   r4  r   r   )r   r   r_    s    zCmfResultSplitter._process_listc             C   s   |  j d7  _ t }x| D ]z\}}| |||< | js|dkr|rt|trtt|	dd d }|r| 
| x"| D ]}| j|j|f q~W qW |dr|dr| js| j||dd}|S )NrD   ro   rq   r   rl   r  )rO  )r,  r   re   rV  r  ru   rr   r   rk   rs   r5  rd   r)  rN  rl   r6   r  rQ  )r   r4  r   r[  rT  mrP  r   r   r   _process_dict  s    
zCmfResultSplitter._process_dictc             C   s   |  j d7  _ t|tr"| |S t|tjjr:| |S t|tjj	rR| 
|S t|rd| |S t|trx| |S t|tjtjfrt|S t|ttfr| S |S )NrD   )r,  ru   r	  r_  r'   r}   r   rS  rk   r   rU  r   rW  r   rb  r  r  r  r  rr   r   r   Z	isoformat)r   r   r   r   r   rV  !  s     






zCmfResultSplitter._processc             C   sJ   xD| j  D ]6\}}x,t|d D ]}||f| jkr"|d |= q"W qW d S )Nr}   )r(  re   r	  r)  )r   rl   class_valuerP  r   r   r   _process_meta4  s    zCmfResultSplitter._process_metac                sd   d fdd	  j  xDj D ]6\}}x,t|d D ]}||fjkr<|d |= q<W q&W d S )Nr   c       	         s   j d7  _ t| rhtt| j}| x6| j D ](\}}j	|j|f  ||d  q8W n.t
| tjjrtt| j}| xL| j D ]>\}}t
|tr|jdk	rj	|j|f  |j|d  qW nt
| trx| D ]} ||d  qW nt
| trd }| d}|rXt
|trXtt|dd d }|rX| x<|  D ]0\}}|rj	|j|f  ||d  qbW d S )NrD   .ro   rq   r   )r,  r   r   rk   rl   r5  r   re   r)  rN  ru   r'   r   r   r  r	  r   r6   rr   rI  )	r   r.  rz   Zsub_attrZ	sub_valueZ	sub_fieldsubr]   Zsub_key)process_jsonr   r   r   rf  <  s8    




z<CmfResultSplitter._process_simple_meta.<locals>.process_jsonr}   )r   )r'  r(  re   r	  r)  )r   rl   rc  rP  r   )rf  r   r   _process_simple_meta;  s    
z&CmfResultSplitter._process_simple_metac             C   s$   | j r| jsd S t| j| j  d S )Ni  )r*  r+  int)r   r   r   r   msb  s    zCmfResultSplitter.msc             C   s4   t   | _| | j| _| js&|   t   | _d S )N)rS   r*  rV  r'  r   r(  rd  r+  )r   r   r   r   rs   h  s
    
zCmfResultSplitter.splitc             C   s4   t   | _| | j| _| js&|   t   | _d S )N)rS   r*  rV  r'  r   r  rg  r+  )r   r   r   r   r  o  s
    
zCmfResultSplitter.split_simple)NF)N)r   )r   )r   )r    r!   r"   r   r3  r5  rQ  rU  rW  r]  r'   r}   r   rS  r_  rb  rV  rd  rg  ri  rs   r  r   r   r   r   r    s$   

  

0'r  c             C   s6   dd l }y|| }| S  |jk
r0   dS X d S )Nr   F)psutilZProcessZ
is_runningZNoSuchProcess)pidrj  Zprocessr   r   r   check_process_running{  s    
rl  r   avscanc          
   C   sL  |s(t tjjd\}}}|r(t|}|r4t|nd}ddt | dt |dt |d|dg
}|r|d	 |r|d
 || |	r|d |r|d || |r|d |t | n|d |t | tj|ddddd}d|j	krdS d|p| d|  d| d| d|j	 
}t
d| |
rHt||dS )u{  
    !!! import icapclient - похоже ломает gevent
        Либа читает файл только с диска (


    Используем cli клиент:
    /usr/bin/c-icap-client [-V ] [-VV ]
     [-i icap_servername] [-p port] [-s service] [-tls ] [-tls-method tls_method] [-tls-no-verify ]
     [-f filename] [-o filename] [-method method] [-req url] [-resp url]
     [-d level] [-noreshdr ] [-nopreview ] [-no204 ] [-206 ]
     [-x xheader] [-hx xheader] [-rhx xheader] [-w preview] [-v ]

    -V                      : Print version and exits
    -VV                     : Print version and build informations and exits
    -i icap_servername              : The icap server name
    -p port         : The server port
    -s service              : The service name
    -tls                    : Use TLS
    -tls-method tls_method          : Use TLS method
    -tls-no-verify                  : Disable server certificate verify
    -f filename             : Send this file to the icap server.
    Default is to send an options request
    -o filename             : Save output to this file.
    Default is to send to stdout
    -method method          : Use 'method' as method of the request modification
    -req url                : Send a request modification instead of response modification
    -resp url               : Send a responce modification request with request url the 'url'
    -d level                : debug level info to stdout
    -noreshdr                       : Do not send reshdr headers
    -nopreview                      : Do not send preview data
    -no204                  : Do not allow204 outside preview
    -206                    : Support allow206
    -x xheader              : Include xheader in icap request headers
    -hx xheader             : Include xheader in http request headers
    -rhx xheader            : Include xheader in http response headers
    -w preview              : Sets the maximum preview data size
    -v                      : Print response headers

    Valid:
    root@crm:/opt/eva-app# c-icap-client -f uwsgi.ini -req / -i 10.50.17.68 -s avscan -method POST -v >/dev/null
    ICAP server:10.50.17.68, ip:192.168.0.33, port:1344

    No modification needed (Allow 204 response)

    ICAP HEADERS:
            ICAP/1.0 204 Unmodified
            Server: C-ICAP/0.5.6
            Connection: keep-alive
            ISTag: CI0001-B5sZ3i1I3+P4H3at/XZ4mQAA

    REQMOD HEADERS:
            POST / HTTP/1.0
            Last-Modified: Tue Apr  9 10:46:16 2024
            Content-Length: 1426
            Content-Length: 1426
            User-Agent: C-ICAP-Client/x.xx

    Virus:
    root@crm:/opt/eva-app# c-icap-client -f xf-mccs6.exe -req / -i 10.50.17.68 -s avscan -method POST -v >/dev/null
    ICAP server:10.50.17.68, ip:192.168.0.33, port:1344


    ICAP HEADERS:
            ICAP/1.0 200 OK
            Server: C-ICAP/0.5.6
            Connection: keep-alive
            ISTag: CI0001-B5sZ3i1I3+P4H3at/XZ4mQAA
            X-Infection-Found: Type=0; Resolution=2; Threat=Win.Tool.Genkryptik-9939783-0;
            X-Violations-Found: 1
            -
            Win.Tool.Genkryptik-9939783-0
            0
            0
            Encapsulated: res-hdr=0, res-body=108

    RESPMOD HEADERS:
            HTTP/1.0 403 Forbidden
            Server: C-ICAP
            Connection: close
            Content-Type: text/html
            Content-Language: en

    rq   i@  z/usr/bin/c-icap-clientz-fz-iz-pz-sz-vz-tlsz-tls-methodz-tls-no-verifyz-methodz-reqz-respT   )Zcapture_outputrO   Zcheckr   zNo modification neededzicap_check(): failed, url=z, file_path=z
, service=z	, method=z
, result:
z%sF)rr   r   Zglobal_settingsZicap_serverrI  rh  r   
subprocessr   stderrZloggingZwarningZCmfIcapCheckError)Z	file_pathZresp_urlZreq_urlmethodZserviceZhostZportZtlsZ
tls_methodZtls_no_verifyr<  r   rx   procr   r   r   r   
icap_check  s>    Y$







*
rs  )N)N)r   )NN)NN)F)NN)r=   )
r   NNrm  NNNNNF)Rr   ro  Zurllib.parser   r   r   r'   r   r   r   r   r   r   Zflaskr   Zpathlibr	   Zcmf.cmf_profiler
   r   r   r   ZCrypto.Cipherr   r   r   Zredis.exceptionsrV   rS   Zdataclassesr   r  r  r&  r  collectionsr   copyr   typingr   rM  r   r$   r+   r-   r_   rg   ri   rm   rp   rn   r{   r   r   r   r   r   rr   r   r   r   r   r   rW   r   r   r   r   r   r   r   r  r  r
  r  r  r#  r  r  rl  rs  r   r   r   r   <module>   s    /	
&
	

!
'#
`
5	   
  