
    1*)i
                     H    d dl T d dlmZ d dlZ G d dej                  ZdS )    )*)cmf_answer_templateNc                        e Zd Ze                    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)
autoescapetemplate_renderget_template_fieldsc                 V   | j         st          dd           t                              | j                  }| j        r|                    d|d          sd| _        | j        dk    r!d	d
| j        gdd
| j         gdd| j	        gg dg}n.d	d
| j        gdd
| j         gdd| j	        gg ddd
t          j        gg}t          j                            |          rt          d| j         dd           | j        r| j        st          j        | _         t!                      j        |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   r   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   s   { 	K}  FJ  K  K  K  K''88; 	)w@@U\jo@pp 	)(D x''tTY/(D$+1NQUW[]a]dPe  hG  hG  hG  HFFtTY/(D$+1NQUW[]a]dPe66648XZF #''v'66 	Gymqmvyyy  BF  G  G  G  G; 	)t{ 	).DKuww|T,V,,,    T)	recursivec                :     t                      j        |d|i|S )Nr+   )r"   delete)r$   r+   r%   r&   r(   s       r)   r-   zCmfAnswerTemplate.delete$   s#    uww~tCyCFCCCr*   c                     | j         S )uh   Возвращает на фронт список возможных переменных шаблона)_template_fields)clss    r)   r	   z%CmfAnswerTemplate.get_template_fields'   s     ##r*   c                 0   d }| j         g dz   }t                              ||          }t          d          }i }|D ]^}t	          ||          rLt	          ||         d          rt          ||         j                  ||<   Ft          ||                   ||<   _t          t          j        j                  |d<   t          |d         j                  |d	<   | |j	         |d
<    |||          |d<   t          |j
        j                  |d<   |S )z	
        c                     | j         j                            d          r| 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_url0   sX    z&112GHH 1QQ3:+=QQ
QQQ0sz0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 	1 	1 %(V(V(VV##F6#::T*** 	1 	1EsE"" 13u:v.. 1!$SZ_!5!5CJJ!$SZCJ!!."566Nc+.344J ,#(,,J&JsC00L"3:?33O
r*   returnc                 j     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                     |                      d                                          }|j        vr/d| d}t                              |           t          |          |                      d          S )N   u,   Некорректное выражение u    в шаблоне!r   )groupstripr/   loggingerror	Exception)match
expressionrR   r0   s      r)   escape_matchz6CmfAnswerTemplate.clean_template.<locals>.escape_matchT   sl    Q--//J!555fzfffe$$$&&&;;q>>!r*   )recompilesub)r0   templatere_expressionsrV   patternescaped_templates   `     r)   clean_templatez CmfAnswerTemplate.clean_templateK   sP     O44	" 	" 	" 	" 	" # 6'<BBr*   c                     |                      |          }| 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_renderd   s\    !!$''>--d33/s/AA&AAx.....r*   )
r   responsiblerd   r7   r>   r@   r   r:   rF   r?   )__name__
__module____qualname__jinja2Environmentr   select_jinja_autoescapera   r   r   api_methodsr#   r-   classmethodr	   rJ   rE   r^   r   r/   __classcell__)r(   s   @r)   r   r      s&       ##s/J#KKJ%7C!G
 
K
- - - - -0 '+ D D D D D D D $ $ [$   [<         [ 0 / / [/ P  P  Pr*   r   )cmf.includemodules.servicedesk.fieldsr   rW   r   r`   r*   r)   <module>rr      sx        : : : : : : 				tP tP tP tP tP+= tP tP tP tP tPr*   