mirror of https://github.com/MISP/MISP
chg: [workflow] Jinja template rendering is done automatically based on param options
parent
369f7cdede
commit
fb1c6bb0bc
|
@ -33,7 +33,7 @@ class AppController extends Controller
|
||||||
|
|
||||||
public $helpers = array('OrgImg', 'FontAwesome', 'UserName');
|
public $helpers = array('OrgImg', 'FontAwesome', 'UserName');
|
||||||
|
|
||||||
private $__queryVersion = '155';
|
private $__queryVersion = '156';
|
||||||
public $pyMispVersion = '2.4.178';
|
public $pyMispVersion = '2.4.178';
|
||||||
public $phpmin = '7.2';
|
public $phpmin = '7.2';
|
||||||
public $phprec = '7.4';
|
public $phprec = '7.4';
|
||||||
|
|
|
@ -15,7 +15,8 @@ class Module_blueprint_logic_module extends WorkflowBaseLogicModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
$data = $roamingData->getData();
|
$data = $roamingData->getData();
|
||||||
// Returning true will make the execution flow take the first output of this module. Otherwise, the second output will be used.
|
// Returning true will make the execution flow take the first output of this module. Otherwise, the second output will be used.
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -70,11 +70,11 @@ class Module_misp_module extends WorkflowBaseActionModule
|
||||||
$postData['filteredItems'] = !empty($filteredItems) ? $filteredItems : $rData;
|
$postData['filteredItems'] = !empty($filteredItems) ? $filteredItems : $rData;
|
||||||
}
|
}
|
||||||
|
|
||||||
$indexedParams = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
|
$indexedParams = $this->getParamsWithValues($node, $rData);
|
||||||
$postData['params'] = Hash::combine($indexedParams, '{s}.id', '{s}.value');
|
$postData['params'] = Hash::combine($indexedParams, '{s}.id', '{s}.value');
|
||||||
$params = $this->getParamsWithValues($node);
|
|
||||||
$matchingData = [];
|
$matchingData = [];
|
||||||
foreach ($params as $param) {
|
foreach ($indexedParams as $param) {
|
||||||
if (!empty($param['_isHashPath'])) {
|
if (!empty($param['_isHashPath'])) {
|
||||||
$matchingData[$param['label']] = !empty($param['value']) ? $this->extractData($rData, $param['value']) : $rData;
|
$matchingData[$param['label']] = !empty($param['value']) ? $this->extractData($rData, $param['value']) : $rData;
|
||||||
}
|
}
|
||||||
|
@ -107,6 +107,9 @@ class Module_misp_module extends WorkflowBaseActionModule
|
||||||
} else {
|
} else {
|
||||||
$param['type'] = 'input';
|
$param['type'] = 'input';
|
||||||
}
|
}
|
||||||
|
if (isset($moduleParam['jinja_supported'])) {
|
||||||
|
$param['jinja_supported'] = !empty($moduleParam['jinja_supported']);
|
||||||
|
}
|
||||||
return $param;
|
return $param;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,11 +52,14 @@ class WorkflowBaseModule
|
||||||
return $fullIndexedParams;
|
return $fullIndexedParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getParamsWithValues($node): array
|
protected function getParamsWithValues(array $node, array $rData): array
|
||||||
{
|
{
|
||||||
$indexedParams = $this->mergeNodeConfigIntoParameters($node);
|
$indexedParams = $this->mergeNodeConfigIntoParameters($node);
|
||||||
foreach ($indexedParams as $id => $param) {
|
foreach ($indexedParams as $id => $param) {
|
||||||
$indexedParams[$id]['value'] = $param['value'] ?? ($param['default'] ?? '');
|
$indexedParams[$id]['value'] = $param['value'] ?? ($param['default'] ?? '');
|
||||||
|
if (!empty($param['jinja_supported']) && strlen($param['value']) > 0) {
|
||||||
|
$indexedParams[$id]['value'] = $this->render_jinja_template($param['value'], $rData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return $indexedParams;
|
return $indexedParams;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,9 +58,8 @@ class Module_add_eventblocklist_entry extends WorkflowBaseActionModule
|
||||||
|
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
$params = $this->getParamsWithValues($node);
|
|
||||||
|
|
||||||
$rData = $roamingData->getData();
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
|
|
||||||
$eventUUIDExtractionPath = $params['uuid_hash_path']['value'];
|
$eventUUIDExtractionPath = $params['uuid_hash_path']['value'];
|
||||||
$eventUUID = Hash::get($rData, $eventUUIDExtractionPath);
|
$eventUUID = Hash::get($rData, $eventUUIDExtractionPath);
|
||||||
|
|
|
@ -75,9 +75,8 @@ class Module_assign_country_from_enrichment extends Module_tag_operation
|
||||||
|
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
$params = $this->getParamsWithValues($node);
|
|
||||||
|
|
||||||
$rData = $roamingData->getData();
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
$user = $roamingData->getUser();
|
$user = $roamingData->getUser();
|
||||||
|
|
||||||
$countryExtractionPath = $params['hash_path']['value'];
|
$countryExtractionPath = $params['hash_path']['value'];
|
||||||
|
|
|
@ -54,7 +54,8 @@ class Module_attach_enrichment extends WorkflowBaseActionModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
if (empty($params['modules']['value'])) {
|
if (empty($params['modules']['value'])) {
|
||||||
$errors[] = __('No enrichmnent module selected');
|
$errors[] = __('No enrichmnent module selected');
|
||||||
return false;
|
return false;
|
||||||
|
@ -64,7 +65,6 @@ class Module_attach_enrichment extends WorkflowBaseActionModule
|
||||||
$selectedModules = array_filter($params['modules']['value'], function($module) {
|
$selectedModules = array_filter($params['modules']['value'], function($module) {
|
||||||
return $module !== '';
|
return $module !== '';
|
||||||
});
|
});
|
||||||
$rData = $roamingData->getData();
|
|
||||||
$event_id = $rData['Event']['id'];
|
$event_id = $rData['Event']['id'];
|
||||||
$options = [
|
$options = [
|
||||||
'user' => $roamingData->getUser(),
|
'user' => $roamingData->getUser(),
|
||||||
|
|
|
@ -42,12 +42,12 @@ class Module_attach_warninglist extends WorkflowBaseActionModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
if (empty($params['warninglists']['value'])) {
|
if (empty($params['warninglists']['value'])) {
|
||||||
$errors[] = __('No warninglist module selected');
|
$errors[] = __('No warninglist module selected');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$rData = $roamingData->getData();
|
|
||||||
|
|
||||||
$matchingItems = $this->getMatchingItemsForAttributes($node, $rData);
|
$matchingItems = $this->getMatchingItemsForAttributes($node, $rData);
|
||||||
if ($matchingItems === false) {
|
if ($matchingItems === false) {
|
||||||
|
|
|
@ -25,6 +25,7 @@ class Module_attribute_comment_operation extends Module_attribute_edition_operat
|
||||||
'label' => __('Comment'),
|
'label' => __('Comment'),
|
||||||
'type' => 'textarea',
|
'type' => 'textarea',
|
||||||
'placeholder' => 'Comment to be set',
|
'placeholder' => 'Comment to be set',
|
||||||
|
'jinja_supported' => true,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -32,9 +33,8 @@ class Module_attribute_comment_operation extends Module_attribute_edition_operat
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
|
||||||
|
|
||||||
$rData = $roamingData->getData();
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
$user = $roamingData->getUser();
|
$user = $roamingData->getUser();
|
||||||
|
|
||||||
$matchingItems = $this->getMatchingItemsForAttributes($node, $rData);
|
$matchingItems = $this->getMatchingItemsForAttributes($node, $rData);
|
||||||
|
@ -52,7 +52,7 @@ class Module_attribute_comment_operation extends Module_attribute_edition_operat
|
||||||
{
|
{
|
||||||
$currentRData = $rData;
|
$currentRData = $rData;
|
||||||
$currentRData['__currentAttribute'] = $attribute;
|
$currentRData['__currentAttribute'] = $attribute;
|
||||||
$renderedComment = $this->render_jinja_template($params['comment']['value'], $currentRData);
|
$renderedComment = $params['comment']['value'];
|
||||||
if ($attribute['comment'] !== $params['comment']['value']) {
|
if ($attribute['comment'] !== $params['comment']['value']) {
|
||||||
$attribute['comment'] = $renderedComment;
|
$attribute['comment'] = $renderedComment;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,9 +36,8 @@ class Module_attribute_ids_flag_operation extends Module_attribute_edition_opera
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
|
||||||
|
|
||||||
$rData = $roamingData->getData();
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
$user = $roamingData->getUser();
|
$user = $roamingData->getUser();
|
||||||
|
|
||||||
$matchingItems = $this->getMatchingItemsForAttributes($node, $rData);
|
$matchingItems = $this->getMatchingItemsForAttributes($node, $rData);
|
||||||
|
|
|
@ -42,12 +42,12 @@ class Module_enrich_event extends WorkflowBaseActionModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
if (empty($params['modules']['value'])) {
|
if (empty($params['modules']['value'])) {
|
||||||
$errors[] = __('No enrichmnent module selected');
|
$errors[] = __('No enrichmnent module selected');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$rData = $roamingData->getData();
|
|
||||||
$event_id = $rData['Event']['id'];
|
$event_id = $rData['Event']['id'];
|
||||||
$options = [
|
$options = [
|
||||||
'user' => $roamingData->getUser(),
|
'user' => $roamingData->getUser(),
|
||||||
|
|
|
@ -69,9 +69,8 @@ class Module_event_distribution_operation extends WorkflowBaseModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
|
||||||
|
|
||||||
$rData = $roamingData->getData();
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
$user = $roamingData->getUser();
|
$user = $roamingData->getUser();
|
||||||
|
|
||||||
$matchingItems = $this->getMatchingItemsForAttributes($node, $rData);
|
$matchingItems = $this->getMatchingItemsForAttributes($node, $rData);
|
||||||
|
|
|
@ -30,10 +30,10 @@ class Module_push_zmq extends WorkflowBaseActionModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
$path = $params['data_extraction_path']['value'];
|
$path = $params['data_extraction_path']['value'];
|
||||||
$data = $roamingData->getData();
|
$extracted = $this->extractData($rData, $path);
|
||||||
$extracted = $this->extractData($data, $path);
|
|
||||||
if ($extracted === false) {
|
if ($extracted === false) {
|
||||||
$errors[] = __('Error while trying to extract data with path `%s`', $path);
|
$errors[] = __('Error while trying to extract data with path `%s`', $path);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -39,12 +39,14 @@ class Module_send_mail extends WorkflowBaseActionModule
|
||||||
'label' => 'Mail template subject',
|
'label' => 'Mail template subject',
|
||||||
'type' => 'textarea',
|
'type' => 'textarea',
|
||||||
'placeholder' => __('The **template** will be rendered using *Jinja2*!'),
|
'placeholder' => __('The **template** will be rendered using *Jinja2*!'),
|
||||||
|
'jinja_supported' => true,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'id' => 'mail_template_body',
|
'id' => 'mail_template_body',
|
||||||
'label' => 'Mail template body',
|
'label' => 'Mail template body',
|
||||||
'type' => 'textarea',
|
'type' => 'textarea',
|
||||||
'placeholder' => __('The **template** will be rendered using *Jinja2*!'),
|
'placeholder' => __('The **template** will be rendered using *Jinja2*!'),
|
||||||
|
'jinja_supported' => true,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -60,7 +62,8 @@ class Module_send_mail extends WorkflowBaseActionModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
if (empty($params['recipients']['value'])) {
|
if (empty($params['recipients']['value'])) {
|
||||||
$errors[] = __('No recipient set.');
|
$errors[] = __('No recipient set.');
|
||||||
return false;
|
return false;
|
||||||
|
@ -69,10 +72,9 @@ class Module_send_mail extends WorkflowBaseActionModule
|
||||||
$errors[] = __('The mail template is empty.');
|
$errors[] = __('The mail template is empty.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$rData = $roamingData->getData();
|
|
||||||
|
|
||||||
$renderedBody = $this->render_jinja_template($params['mail_template_body']['value'], $rData);
|
$renderedBody = $params['mail_template_body']['value'];
|
||||||
$renderedSubject = $this->render_jinja_template($params['mail_template_subject']['value'], $rData);
|
$renderedSubject = $params['mail_template_subject']['value'];
|
||||||
|
|
||||||
$users = [];
|
$users = [];
|
||||||
if (in_array('All accounts', $params['recipients']['value'])) {
|
if (in_array('All accounts', $params['recipients']['value'])) {
|
||||||
|
|
|
@ -77,7 +77,8 @@ class Module_splunk_hec_export extends Module_webhook
|
||||||
$errors[] = __('`Security.rest_client_enable_arbitrary_urls` is turned off');
|
$errors[] = __('`Security.rest_client_enable_arbitrary_urls` is turned off');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$params = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
if (empty($params['url']['value'])) {
|
if (empty($params['url']['value'])) {
|
||||||
$errors[] = __('URL not provided.');
|
$errors[] = __('URL not provided.');
|
||||||
return false;
|
return false;
|
||||||
|
@ -87,7 +88,6 @@ class Module_splunk_hec_export extends Module_webhook
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$rData = $roamingData->getData();
|
|
||||||
$event_without_attributes = $rData['Event'];
|
$event_without_attributes = $rData['Event'];
|
||||||
unset($event_without_attributes['Attribute']);
|
unset($event_without_attributes['Attribute']);
|
||||||
unset($event_without_attributes['_AttributeFlattened']);
|
unset($event_without_attributes['_AttributeFlattened']);
|
||||||
|
|
|
@ -90,9 +90,8 @@ class Module_tag_operation extends WorkflowBaseActionModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
|
||||||
|
|
||||||
$rData = $roamingData->getData();
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
$user = $roamingData->getUser();
|
$user = $roamingData->getUser();
|
||||||
|
|
||||||
if ($this->filtersEnabled($node)) {
|
if ($this->filtersEnabled($node)) {
|
||||||
|
|
|
@ -67,9 +67,8 @@ class Module_tag_replacement_generic extends Module_tag_operation
|
||||||
|
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
$params = $this->getParamsWithValues($node);
|
|
||||||
|
|
||||||
$rData = $roamingData->getData();
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
$user = $roamingData->getUser();
|
$user = $roamingData->getUser();
|
||||||
|
|
||||||
if ($this->filtersEnabled($node)) {
|
if ($this->filtersEnabled($node)) {
|
||||||
|
|
|
@ -32,18 +32,19 @@ class Module_telegram_send_alert extends Module_webhook
|
||||||
'label' => 'Message Body Template',
|
'label' => 'Message Body Template',
|
||||||
'type' => 'textarea',
|
'type' => 'textarea',
|
||||||
'placeholder' => __('Template redendered using Jinja2'),
|
'placeholder' => __('Template redendered using Jinja2'),
|
||||||
|
'jinja_supported' => true,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors = []): bool
|
||||||
{
|
{
|
||||||
$params = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
$rData = $roamingData->getData();
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
|
|
||||||
$bot_token = $params['bot_token']['value'];
|
$bot_token = $params['bot_token']['value'];
|
||||||
$chat_id = $params['chat_id']['value'];
|
$chat_id = $params['chat_id']['value'];
|
||||||
$message_body = $this->render_jinja_template($params['message_body_template']['value'], $rData);
|
$message_body = $params['message_body_template']['value'];
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'chat_id' => $chat_id,
|
'chat_id' => $chat_id,
|
||||||
|
|
|
@ -67,6 +67,7 @@ class Module_webhook extends WorkflowBaseActionModule
|
||||||
'type' => 'textarea',
|
'type' => 'textarea',
|
||||||
'default' => '',
|
'default' => '',
|
||||||
'placeholder' => '',
|
'placeholder' => '',
|
||||||
|
'jinja_supported' => true,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'id' => 'headers',
|
'id' => 'headers',
|
||||||
|
@ -103,16 +104,16 @@ class Module_webhook extends WorkflowBaseActionModule
|
||||||
$errors[] = __('`Security.rest_client_enable_arbitrary_urls` is turned off');
|
$errors[] = __('`Security.rest_client_enable_arbitrary_urls` is turned off');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$params = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
if (empty($params['url']['value'])) {
|
if (empty($params['url']['value'])) {
|
||||||
$errors[] = __('URL not provided.');
|
$errors[] = __('URL not provided.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$rData = $roamingData->getData();
|
|
||||||
$payload = '';
|
$payload = '';
|
||||||
if (strlen($params['payload']['value']) > 0) {
|
if (strlen($params['payload']['value']) > 0) {
|
||||||
$payload = $this->render_jinja_template($params['payload']['value'], $rData);
|
$payload = $params['payload']['value'];
|
||||||
} else {
|
} else {
|
||||||
$payload = $rData;
|
$payload = $rData;
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,13 +80,13 @@ class Module_distribution_if extends WorkflowBaseLogicModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$data = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $data);
|
||||||
|
|
||||||
$scope = $params['scope']['value'];
|
$scope = $params['scope']['value'];
|
||||||
$operator = $params['condition']['value'];
|
$operator = $params['condition']['value'];
|
||||||
$selected_distribution = $params['distribution']['value'];
|
$selected_distribution = $params['distribution']['value'];
|
||||||
$selected_sharing_groups = !empty($params['sharing_group_id']['value']) ? $params['sharing_group_id']['value'] : [];
|
$selected_sharing_groups = !empty($params['sharing_group_id']['value']) ? $params['sharing_group_id']['value'] : [];
|
||||||
$data = $roamingData->getData();
|
|
||||||
$final_distribution = $this->__getPropagatedDistribution($data['Event']);
|
$final_distribution = $this->__getPropagatedDistribution($data['Event']);
|
||||||
if ($scope == 'attribute') {
|
if ($scope == 'attribute') {
|
||||||
$final_distribution = $this->__getPropagatedDistribution(
|
$final_distribution = $this->__getPropagatedDistribution(
|
||||||
|
|
|
@ -82,7 +82,8 @@ class Module_generic_filter_data extends WorkflowFilteringLogicModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
$selector = $params['selector']['value'];
|
$selector = $params['selector']['value'];
|
||||||
$path = $params['hash_path']['value'];
|
$path = $params['hash_path']['value'];
|
||||||
$operator = $params['operator']['value'];
|
$operator = $params['operator']['value'];
|
||||||
|
@ -90,7 +91,6 @@ class Module_generic_filter_data extends WorkflowFilteringLogicModule
|
||||||
$value_list = $params['value_list']['value'];
|
$value_list = $params['value_list']['value'];
|
||||||
$valueToEvaluate = $operator == 'in_or' ? $value_list : $value;
|
$valueToEvaluate = $operator == 'in_or' ? $value_list : $value;
|
||||||
$filteringLabel = $params['filtering-label']['value'];
|
$filteringLabel = $params['filtering-label']['value'];
|
||||||
$rData = $roamingData->getData();
|
|
||||||
|
|
||||||
$newRData = $rData;
|
$newRData = $rData;
|
||||||
if (empty($newRData['_unfilteredData'])) {
|
if (empty($newRData['_unfilteredData'])) {
|
||||||
|
|
|
@ -28,9 +28,9 @@ class Module_generic_filter_reset extends WorkflowFilteringLogicModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
|
||||||
$filteringLabel = $params['filtering-label']['value'];
|
|
||||||
$rData = $roamingData->getData();
|
$rData = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $rData);
|
||||||
|
$filteringLabel = $params['filtering-label']['value'];
|
||||||
|
|
||||||
$newRData = $rData['_unfilteredData'];
|
$newRData = $rData['_unfilteredData'];
|
||||||
if (in_array($filteringLabel, array_keys($this->_genFilteringLabels()))) {
|
if (in_array($filteringLabel, array_keys($this->_genFilteringLabels()))) {
|
||||||
|
|
|
@ -64,13 +64,13 @@ class Module_generic_if extends WorkflowBaseLogicModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$data = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $data);
|
||||||
$path = $params['hash_path']['value'];
|
$path = $params['hash_path']['value'];
|
||||||
$operator = $params['operator']['value'];
|
$operator = $params['operator']['value'];
|
||||||
$value = $params['value']['value'];
|
$value = $params['value']['value'];
|
||||||
$value_list = $params['value_list']['value'];
|
$value_list = $params['value_list']['value'];
|
||||||
$valueToEvaluate = $operator == 'in_or' ? $value_list : $value;
|
$valueToEvaluate = $operator == 'in_or' ? $value_list : $value;
|
||||||
$data = $roamingData->getData();
|
|
||||||
$extracted = [];
|
$extracted = [];
|
||||||
if ($operator == 'equals' || $operator == 'not_equals') {
|
if ($operator == 'equals' || $operator == 'not_equals') {
|
||||||
$extracted = Hash::get($data, $path, []);
|
$extracted = Hash::get($data, $path, []);
|
||||||
|
|
|
@ -60,13 +60,13 @@ class Module_organisation_if extends WorkflowBaseLogicModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$data = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $data);
|
||||||
|
|
||||||
$org_type = $params['org_type']['value'];
|
$org_type = $params['org_type']['value'];
|
||||||
$operator = $params['condition']['value'];
|
$operator = $params['condition']['value'];
|
||||||
$selectedOrgs = !empty($params['org_id']['value']) ? $params['org_id']['value'] : [];
|
$selectedOrgs = !empty($params['org_id']['value']) ? $params['org_id']['value'] : [];
|
||||||
$selectedOrgs = is_array($selectedOrgs) ? $selectedOrgs : [$selectedOrgs]; // Backward compatibility for non-multiple `org_id`
|
$selectedOrgs = is_array($selectedOrgs) ? $selectedOrgs : [$selectedOrgs]; // Backward compatibility for non-multiple `org_id`
|
||||||
$data = $roamingData->getData();
|
|
||||||
$path = 'Event.org_id';
|
$path = 'Event.org_id';
|
||||||
if ($org_type == 'orgc') {
|
if ($org_type == 'orgc') {
|
||||||
$path = 'Event.orgc_id';
|
$path = 'Event.orgc_id';
|
||||||
|
|
|
@ -35,10 +35,10 @@ class Module_published_if extends WorkflowBaseLogicModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$data = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $data);
|
||||||
|
|
||||||
$operator = $params['condition']['value'];
|
$operator = $params['condition']['value'];
|
||||||
$data = $roamingData->getData();
|
|
||||||
$path = 'Event.published';
|
$path = 'Event.published';
|
||||||
$is_published = !empty(Hash::get($data, $path));
|
$is_published = !empty(Hash::get($data, $path));
|
||||||
$eval = $this->evaluateCondition($is_published, $operator, true);
|
$eval = $this->evaluateCondition($is_published, $operator, true);
|
||||||
|
|
|
@ -91,7 +91,8 @@ class Module_tag_if extends WorkflowBaseLogicModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$data = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $data);
|
||||||
|
|
||||||
$selectedTags = !empty($params['tags']['value']) ? $params['tags']['value'] : [];
|
$selectedTags = !empty($params['tags']['value']) ? $params['tags']['value'] : [];
|
||||||
$selectedClusters = !empty($params['clusters']['value']) ? $params['clusters']['value'] : [];
|
$selectedClusters = !empty($params['clusters']['value']) ? $params['clusters']['value'] : [];
|
||||||
|
@ -101,7 +102,6 @@ class Module_tag_if extends WorkflowBaseLogicModule
|
||||||
$allSelectedTags = array_merge($selectedTags, $selectedClusters);
|
$allSelectedTags = array_merge($selectedTags, $selectedClusters);
|
||||||
$operator = $params['condition']['value'];
|
$operator = $params['condition']['value'];
|
||||||
$scope = $params['scope']['value'];
|
$scope = $params['scope']['value'];
|
||||||
$data = $roamingData->getData();
|
|
||||||
$extracted = $this->__getTagFromScope($scope, $data);
|
$extracted = $this->__getTagFromScope($scope, $data);
|
||||||
$eval = $this->evaluateCondition($extracted, $operator, $allSelectedTags);
|
$eval = $this->evaluateCondition($extracted, $operator, $allSelectedTags);
|
||||||
return !empty($eval);
|
return !empty($eval);
|
||||||
|
|
|
@ -50,12 +50,12 @@ class Module_threat_level_if extends WorkflowBaseLogicModule
|
||||||
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
public function exec(array $node, WorkflowRoamingData $roamingData, array &$errors=[]): bool
|
||||||
{
|
{
|
||||||
parent::exec($node, $roamingData, $errors);
|
parent::exec($node, $roamingData, $errors);
|
||||||
$params = $this->getParamsWithValues($node);
|
$data = $roamingData->getData();
|
||||||
|
$params = $this->getParamsWithValues($node, $data);
|
||||||
|
|
||||||
$operator = $params['condition']['value'];
|
$operator = $params['condition']['value'];
|
||||||
$selected_threatlevel = $params['threatlevel']['value'];
|
$selected_threatlevel = $params['threatlevel']['value'];
|
||||||
|
|
||||||
$data = $roamingData->getData();
|
|
||||||
$threatlevel_id = $data['Event']['threat_level_id'];
|
$threatlevel_id = $data['Event']['threat_level_id'];
|
||||||
|
|
||||||
if ($operator == 'equals') {
|
if ($operator == 'equals') {
|
||||||
|
|
|
@ -649,7 +649,10 @@ $data_passed_to_if_module = [
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane" id="modal-jinja2">
|
<div class="tab-pane" id="modal-jinja2">
|
||||||
<h3><?= __('Jinja2 Syntax') ?></h3>
|
<h3>
|
||||||
|
<img src="/img/jinja.png" alt="Jinja icon" width="60" height="26">
|
||||||
|
<?= __('Jinja2 Syntax') ?>
|
||||||
|
</h3>
|
||||||
<p><i class="fa-fw <?= $this->FontAwesome->getClass('exclamation-triangle') ?>"></i> <?= __('For these examples, we consider the module received data under the MISP core format.') ?></p>
|
<p><i class="fa-fw <?= $this->FontAwesome->getClass('exclamation-triangle') ?>"></i> <?= __('For these examples, we consider the module received data under the MISP core format.') ?></p>
|
||||||
<p><i class="fa-fw <?= $this->FontAwesome->getClass('link') ?>"></i> <?= __('More documenation available on Jinja2 template designer documentation\'s') ?> <a href="https://jinja.palletsprojects.com/en/3.1.x/templates/"><?= __('website') ?></a></p>
|
<p><i class="fa-fw <?= $this->FontAwesome->getClass('link') ?>"></i> <?= __('More documenation available on Jinja2 template designer documentation\'s') ?> <a href="https://jinja.palletsprojects.com/en/3.1.x/templates/"><?= __('website') ?></a></p>
|
||||||
<h4><?= __('You can use the dot <code>`.` </code> notation or the subscript syntax <code>`[]`</code> to access attributes of a variable') ?></h4>
|
<h4><?= __('You can use the dot <code>`.` </code> notation or the subscript syntax <code>`[]`</code> to access attributes of a variable') ?></h4>
|
||||||
|
|
|
@ -320,6 +320,21 @@
|
||||||
border: 1px solid #ccc;
|
border: 1px solid #ccc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.drawflow_content_node textarea.jinja,
|
||||||
|
.drawflow_content_node input.jinja {
|
||||||
|
border: 1px solid #ae742daa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-body input.jinja {
|
||||||
|
border: 1px solid #ae742daa;
|
||||||
|
box-shadow: 0 1px 3px 0px #ae742d;
|
||||||
|
}
|
||||||
|
.start-codemirror.jinja + .CodeMirror.cm-s-default {
|
||||||
|
border: 1px solid #ae742daa;
|
||||||
|
box-shadow: 0 1px 3px 0px #ae742d;
|
||||||
|
border-top-color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
.dropdown-menu li.disabled a {
|
.dropdown-menu li.disabled a {
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1734,6 +1734,19 @@ function genParameterWarning(options) {
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function genJinjaIconIfSupported(options) {
|
||||||
|
if (!options.jinja_supported) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
return $('<img/>').attr({
|
||||||
|
src: "/img/jinja.png",
|
||||||
|
alt: "Jinja icon",
|
||||||
|
title: "This input supports Jinja2 templating",
|
||||||
|
width: "36",
|
||||||
|
height: "12",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function genSelect(options, forNode = true) {
|
function genSelect(options, forNode = true) {
|
||||||
var $container = $('<div>')
|
var $container = $('<div>')
|
||||||
.addClass('node-param-container')
|
.addClass('node-param-container')
|
||||||
|
@ -1843,6 +1856,7 @@ function genInput(options, isTextArea, forNode = true) {
|
||||||
marginBbottom: 0,
|
marginBbottom: 0,
|
||||||
})
|
})
|
||||||
.append(
|
.append(
|
||||||
|
genJinjaIconIfSupported(options),
|
||||||
$('<span>').text(options.label),
|
$('<span>').text(options.label),
|
||||||
genParameterWarning(options)
|
genParameterWarning(options)
|
||||||
)
|
)
|
||||||
|
@ -1856,6 +1870,9 @@ function genInput(options, isTextArea, forNode = true) {
|
||||||
} else {
|
} else {
|
||||||
$input = $('<input>').attr('type', 'text').css({height: '30px'})
|
$input = $('<input>').attr('type', 'text').css({height: '30px'})
|
||||||
}
|
}
|
||||||
|
if (options['jinja_supported']) {
|
||||||
|
$input.addClass('jinja')
|
||||||
|
}
|
||||||
$input.css({
|
$input.css({
|
||||||
width: '100%',
|
width: '100%',
|
||||||
'box-sizing': 'border-box',
|
'box-sizing': 'border-box',
|
||||||
|
|
Loading…
Reference in New Issue