
    SIg                     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                                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           | j        r)| j                            d| j        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is_newprojectcheck_project_role_accessr   r   r   gcurrent_usermodelsr   getr   supersave)selfargskwargsr   	__class__s       3./modules/servicedesk/models/cmf_answer_template.pyr    zCmfAnswerTemplate.save   s   { 	K}  FJ  K  K  K  K; 	)t|EEnZ^ZftyEzz 	)(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_url.   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   r7   reportertask_urlr6   client_status)r+   cmfutilget_obj_by_idapp_base_hrefhasattrstrr   r   r   r4   status)	r,   obj_idr#   r6   r8   r   r5   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
expressionrN   r,   s      r%   escape_matchz6CmfAnswerTemplate.clean_template.<locals>.escape_matchR   sl    Q--//J!555fzfffe$$$&&&;;q>>!r&   )recompilesub)r,   templatere_expressionsrR   patternescaped_templates   `     r%   clean_templatez CmfAnswerTemplate.clean_templateI   sP     O44	" 	" 	" 	" 	" # 6'<BBr&   c                     |                      |          }| j                            |          } | j        |fi |} |j        di |S )N )rZ   
_jinja_envfrom_stringrF   render)r,   rC   textr#   rV   template_ctxs         r%   r   z!CmfAnswerTemplate.template_renderb   s\    !!$''>--d33/s/AA&AAx.....r&   )
r   responsibler`   r3   r:   r<   r   r6   rB   r;   )__name__
__module____qualname__jinja2Environmentr]   r   r   api_methodsr    r)   classmethodr   rF   rA   rZ   r   r+   __classcell__)r$   s   @r%   r   r      s       ##%%J%7C!G
 
K
- - - - -, '+ D D D D D D D $ $ [$   [<         [ 0 / / [/ P  P  Pr&   r   )cmf.includemodules.servicedesk.fieldsr   rS   r   r\   r&   r%   <module>rm      sx        : : : : : : 				rP rP rP rP rP+= rP rP rP rP rPr&   