U
    Af!                     @   s2   d dl T d dlmZ d dlZG dd dejZdS )    )*)cmf_answer_templateNc                
       s   e Zd Ze Zejjddg Z fddZ	e
dd Ze
dd Ze
ed	d
dZe
dd Zddddddddddg
Z  ZS )CmfAnswerTemplatetemplate_renderget_template_fieldsc                    s   | j stddd | jr2| jjd| jdds2d| _| jdkrhd	d
| jgdd
| j gdd| jgdd
dgg}n4d	d
| jgdd
| j gdd| jgdd
dgdd
tj	gg}t
jj|drtddd | jr| jstj	| _t j||S )Nue   Внимание! Шаблонный ответ должен быть создан в проекте.T)abortzPPP-PR-ADMINF)objZraise_errorZprivatecommonnamez==parentidz!=answer_typeperson)filteruR   В этом проекте уже есть шаблон с таким именем)r   Z	cmf_alertZis_newZprojectZcheck_project_role_accessr   r
   r   gcurrent_userZmodelsr   getr   supersave)selfargskwargsr   	__class__ 3./modules/servicedesk/models/cmf_answer_template.pyr      s    
, 
zCmfAnswerTemplate.savec                 C   s   | j S )uh   Возвращает на фронт список возможных переменных шаблона)_template_fieldsclsr   r   r   r   "   s    z%CmfAnswerTemplate.get_template_fieldsc           	      K   s   dd }| j dddg }tj||d}tdd}i }|D ]@}t||r8t|| d	rht|| j||< q8t|| ||< q8ttjj|d
< t|d j|d< | |j	 |d< ||||d< t|j
j|d< |S )z	
        c                 S   s>   | j jdr*| d| j j d| j j S | | j j S d S )Nzproject.servicedeskzservicedesk//)r   Zlogic_prefix
startswithZui_namecodehref)r   urlr   r   r   
portal_url+   s    z:CmfAnswerTemplate.prepare_template_ctx.<locals>.portal_urlZ	cmf_ownerr   zparent.logic_prefix)fieldsT)Zfull_urlr
   r   reportertask_urlr$   client_status)r   ZcmfutilZget_obj_by_idZapp_base_hrefhasattrstrr
   r   r   r"   status)	r   obj_idr   r$   r%   r   r#   ZctxZfieldr   r   r   prepare_template_ctx'   s     

z&CmfAnswerTemplate.prepare_template_ctx)returnc                    s,   t d} fdd}d}t |||}|S )u*  
        Быстрое решение чтобы прикрыть дыру. Обсудить на техкоме!
        Так как шаблоны может создавать любой пользователь, а не только администратор, то возможна SSTI атака на Jinja
        https://bcrm.carbonsoft.ru/project/List/SPR-011412?obj=Task:TEM-1625035715#stp-skb-ssti-v-shablonnyh-otveta-v-devel
        Разрешаем только заранее ограниченный список полей!
        z\{\{(.*?)\}\}c                    s@   |  d }| jkr6d| d}t| t||  dS )N   u,   Некорректное выражение u    в шаблоне!r   )groupstripr   Zloggingerror	Exception)matchZ
expressionr2   r   r   r   escape_matchO   s    

z6CmfAnswerTemplate.clean_template.<locals>.escape_match)recompilesub)r   templateZre_expressionsr5   patternZescaped_templater   r   r   clean_templateF   s
    
	z CmfAnswerTemplate.clean_templatec                 K   s0   |  |}| j|}| j|f|}|jf |S )N)r;   
_jinja_envZfrom_stringr-   Zrender)r   r,   textr   r9   Ztemplate_ctxr   r   r   r   _   s    
z!CmfAnswerTemplate.template_renderr   Zresponsibler=   r!   r&   r(   r
   r$   r+   r'   )__name__
__module____qualname__Zjinja2ZEnvironmentr<   r   r   Zapi_methodsr   classmethodr   r-   r*   r;   r   r   __classcell__r   r   r   r   r      s   


r   )Zcmf.includeZmodules.servicedesk.fieldsr   r6   r   r   r   r   r   <module>   s   