
    @i                     L    d dl  d dlmZ d dlZ G d dej                        Zy)    )*)cmf_answer_templateNc                        e Zd Zej	                         Zej                  j                  ddgz   Z fdZ	dd fd
Z
ed        Zed        Zed	efd
       Zed        Z	 g dZ xZS )CmfAnswerTemplatetemplate_renderget_template_fieldsc                    | j                   st        dd       t        j                  | j                        }| j
                  r|j                  d|d      sd| _        | j                  j                          | j                  dk(  r0d	d
| j                  gdd
| j                   gdd| j                  gg dg}nAd	d
| j                  gdd
| j                   gdd| j                  gg ddd
t        j                  gg}t        j                  j                  |      rt        d| j                   dd       | j
                  r!| j                   st        j                  | _        t#        | H  |i |S )Nue   Внимание! Шаблонный ответ должен быть создан в проекте.T)abortzPPP-PR-ADMINF)objraise_errorprivatecommonname==parentidz!=)answer_typer   r   )r   r   r   person)filteruT   В этом проекте уже есть шаблон с таким именем ())r   	cmf_alertAPPget_cache_project
project_idis_newcheck_project_role_accessr   loadr   r   gcurrent_usermodelsr   getr   supersave)selfargskwargsprojectr   	__class__s        3./modules/servicedesk/models/cmf_answer_template.pyr#   zCmfAnswerTemplate.save   sa   {{}  FJ  K''8;;w@@U\jo@p(Dx'tTYY/(D$++1NQUW[]a]d]dPe  hG  HFtTYY/(D$++1NQUW[]a]d]dPe648XZF ##''v'6lmqmvmvlwwxy  BF  G;;t{{..DKw|T,V,,    T)	recursivec                &    t        |   |d|i|S )Nr+   )r"   delete)r$   r+   r%   r&   r(   s       r)   r-   zCmfAnswerTemplate.delete%   s    w~tCyCFCCr*   c                     | j                   S )uh   Возвращает на фронт список возможных переменных шаблона)_template_fields)clss    r)   r   z%CmfAnswerTemplate.get_template_fields(   s     ###r*   c                    d }| j                   g dz   }t        j                  ||      }t        d      }i }|D ]K  }t	        ||      st	        ||   d      rt        ||   j                        ||<   ;t        ||         ||<   M t        t        j                  j                        |d<   t        |d   j                        |d	<   | |j                   |d
<    |||      |d<   t        |j                  j                        |d<   |S )z	
        c                     | j                   j                  j                  d      r2| d| j                   j                   d| j                   j                   S | | j                   j
                   S )Nzproject.servicedeskzservicedesk//)r   logic_prefix
startswithui_namecodehref)r   urls     r)   
portal_urlz:CmfAnswerTemplate.prepare_template_ctx.<locals>.portal_url1   s^    zz&&112GHl3::+=+=*>a

?PQQszz/00r*   )	cmf_ownerr   zparent.logic_prefix)fieldsT)full_urlr   r   r;   reportertask_urlr:   client_status)r/   cmfutilget_obj_by_idapp_base_hrefhasattrstrr   r   r   r8   status)	r0   obj_idr&   r:   r<   r   r9   ctxfields	            r)   prepare_template_ctxz&CmfAnswerTemplate.prepare_template_ctx-   s   	1 %%(VV##F6#:T* 	1EsE"3u:v.!$SZ__!5CJ!$SZCJ	1 "!.."5"56Nc+.334J E#((,J&sC0L"3::??3O
r*   returnc                 n     t        j                  d      } fd}d}t        j                  |||      }|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                     | j                  d      j                         }|j                  vr&d| d}t        j	                  |       t        |      | j                  d      S )N   u,   Некорректное выражение u    в шаблоне!r   )groupstripr/   loggingerror	Exception)match
expressionrR   r0   s      r)   escape_matchz6CmfAnswerTemplate.clean_template.<locals>.escape_matchU   s[    Q--/J!5!55FzlRefe$&&;;q>!r*   )recompilesub)r0   templatere_expressionsrV   patternescaped_templates   `     r)   clean_templatez CmfAnswerTemplate.clean_templateL   s:     O4	" # 66'<Br*   c                     | j                  |      }| j                  j                  |      } | j                  |fi |} |j                  di |S )N )r^   
_jinja_envfrom_stringrJ   render)r0   rG   textr&   rZ   template_ctxs         r)   r   z!CmfAnswerTemplate.template_rendere   sQ    !!$'>>--d3/s//A&Ax...r*   )
r   responsiblerd   r7   r>   r@   r   r:   rF   r?   )__name__
__module____qualname__jinja2Environmentra   r   r   api_methodsr#   r-   classmethodr   rJ   rE   r^   r   r/   __classcell__)r(   s   @r)   r   r      s    ##%J%77CC!G
 
K
-2 '+ D $ $  <      0 / / Pr*   r   )cmf.includemodules.servicedesk.fieldsr   rW   r   r`   r*   r)   <module>rq      s%     : 	uP+== uPr*   