
    6i                     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                    | j         st          dd           t                              | j                  }| j        r|                    d|d          sd| _        | j                                         | 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   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   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_url1   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)r0   cmfutilget_obj_by_idapp_base_hrefhasattrstrr   r   r    r9   status)	r1   obj_idr'   r;   r=   r   r:   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stripr0   loggingerror	Exception)match
expressionrS   r1   s      r*   escape_matchz6CmfAnswerTemplate.clean_template.<locals>.escape_matchU   sl    Q--//J!555fzfffe$$$&&&;;q>>!r+   )recompilesub)r1   templatere_expressionsrW   patternescaped_templates   `     r*   clean_templatez CmfAnswerTemplate.clean_templateL   sP     O44	" 	" 	" 	" 	" # 6'<BBr+   c                     |                      |          }| j                            |          } | j        |fi |} |j        di |S )N )r_   
_jinja_envfrom_stringrK   render)r1   rH   textr'   r[   template_ctxs         r*   r   z!CmfAnswerTemplate.template_rendere   s\    !!$''>--d33/s/AA&AAx.....r+   )
r    responsiblere   r8   r?   rA   r   r;   rG   r@   )__name__
__module____qualname__jinja2Environmentr   select_jinja_autoescaperb   r   r   api_methodsr$   r.   classmethodr	   rK   rF   r_   r   r0   __classcell__)r)   s   @r*   r   r      s&       ##s/J#KKJ%7C!G
 
K
- - - - -2 '+ D D D D D D D $ $ [$   [<         [ 0 / / [/ P  P  Pr+   r   )cmf.includemodules.servicedesk.fieldsr   rX   r   ra   r+   r*   <module>rs      sx        : : : : : : 				uP uP uP uP uP+= uP uP uP uP uPr+   