
    oi                     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	                  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                        }| 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)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 %%(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stripr0   loggingerror	Exception)match
expressionrS   r1   s      r*   escape_matchz6CmfAnswerTemplate.clean_template.<locals>.escape_matchU   s[    Q--/J!5!55FzlRefe$&&;;q>!r+   )recompilesub)r1   templatere_expressionsrW   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_stringrK   render)r1   rH   textr'   r[   template_ctxs         r*   r   z!CmfAnswerTemplate.template_rendere   sQ    !!$'>>--d3/s//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/J#KJ%77CC!G
 
K
-2 '+ D $ $  <      0 / / Pr+   r   )cmf.includemodules.servicedesk.fieldsr   rX   r   ra   r+   r*   <module>rs      s%     : 	uP+== uPr+   