mirror of https://github.com/MISP/MISP
chg: initial migration of attributes/index view to factory
parent
fe548afdea
commit
82ec738770
|
@ -1,189 +0,0 @@
|
|||
<div class="attributes <?php if (!isset($ajax) || !$ajax) echo 'form';?>">
|
||||
<?php
|
||||
$url_params = $action == 'add' ? 'add/' . $event_id : 'edit/' . $attribute['Attribute']['id'];
|
||||
echo $this->Form->create('Attribute', array('id', 'url' => '/attributes/' . $url_params));
|
||||
?>
|
||||
<fieldset>
|
||||
<legend><?php echo $action == 'add' ? __('Add Attribute') : __('Edit Attribute'); ?></legend>
|
||||
<div id="formWarning" class="message ajaxMessage"></div>
|
||||
<div id="compositeWarning" class="message <?php echo !empty($ajax) ? 'ajaxMessage' : '';?>" style="display:none;">Did you consider adding an object instead of a composite attribute?</div>
|
||||
<div class="add_attribute_fields">
|
||||
<?php
|
||||
echo $this->Form->hidden('event_id');
|
||||
echo $this->Form->input('category', array(
|
||||
'empty' => __('(choose one)'),
|
||||
'label' => __('Category ') . $this->element('formInfo', array('type' => 'category')),
|
||||
));
|
||||
echo $this->Form->input('type', array(
|
||||
'empty' => __('(first choose category)'),
|
||||
'label' => __('Type ') . $this->element('formInfo', array('type' => 'type')),
|
||||
));
|
||||
|
||||
$initialDistribution = 5;
|
||||
if (Configure::read('MISP.default_attribute_distribution') != null) {
|
||||
if (Configure::read('MISP.default_attribute_distribution') === 'event') {
|
||||
$initialDistribution = 5;
|
||||
} else {
|
||||
$initialDistribution = Configure::read('MISP.default_attribute_distribution');
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
<div class="input clear"></div>
|
||||
<?php
|
||||
$distArray = array(
|
||||
'options' => array($distributionLevels),
|
||||
'label' => __('Distribution ') . $this->element('formInfo', array('type' => 'distribution')),
|
||||
);
|
||||
|
||||
if ($action == 'add') {
|
||||
$distArray['selected'] = $initialDistribution;
|
||||
}
|
||||
|
||||
echo $this->Form->input('distribution', $distArray);
|
||||
?>
|
||||
<div id="SGContainer" style="display:none;">
|
||||
<?php
|
||||
if (!empty($sharingGroups)) {
|
||||
echo $this->Form->input('sharing_group_id', array(
|
||||
'options' => array($sharingGroups),
|
||||
'label' => __('Sharing Group'),
|
||||
));
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<?php
|
||||
echo $this->Form->input('value', array(
|
||||
'type' => 'textarea',
|
||||
'error' => array('escape' => false),
|
||||
'div' => 'input clear',
|
||||
'class' => 'input-xxlarge'
|
||||
));
|
||||
?>
|
||||
<div class="input clear"></div>
|
||||
<?php
|
||||
echo $this->Form->input('comment', array(
|
||||
'type' => 'text',
|
||||
'label' => __('Contextual Comment'),
|
||||
'error' => array('escape' => false),
|
||||
'div' => 'input clear',
|
||||
'class' => 'input-xxlarge'
|
||||
));
|
||||
?>
|
||||
<div class="input clear"></div>
|
||||
<?php
|
||||
echo $this->Form->input('to_ids', array(
|
||||
'label' => __('for Intrusion Detection System'),
|
||||
'type' => 'checkbox'
|
||||
));
|
||||
echo $this->Form->input('batch_import', array(
|
||||
'type' => 'checkbox'
|
||||
));
|
||||
echo '<div class="input clear"></div>';
|
||||
echo $this->Form->input('disable_correlation', array(
|
||||
'type' => 'checkbox'
|
||||
));
|
||||
?>
|
||||
</div>
|
||||
</fieldset>
|
||||
<p id="notice_message" style="display:none;"></p>
|
||||
<?php if ($ajax): ?>
|
||||
<div class="overlay_spacing">
|
||||
<span id="submitButton" class="btn btn-primary" style="margin-bottom:5px;float:left;" title="<?php echo __('Submit'); ?>" role="button" tabindex="0" aria-label="<?php echo __('Submit'); ?>" onClick="submitPopoverForm('<?php echo $action == 'add' ? $event_id : $attribute['Attribute']['id'];?>', '<?php echo $action; ?>')"><?php echo __('Submit'); ?></span>
|
||||
<span class="btn btn-inverse" style="float:right;" title="<?php echo __('Cancel'); ?>" role="button" tabindex="0" aria-label="<?php echo __('Cancel'); ?>" id="cancel_attribute_add"><?php echo __('Cancel'); ?></span>
|
||||
</div>
|
||||
<?php
|
||||
else:
|
||||
?>
|
||||
<?php
|
||||
echo $this->Form->button('Submit', array('class' => 'btn btn-primary'));
|
||||
endif;
|
||||
echo $this->Form->end();
|
||||
?>
|
||||
</div>
|
||||
<?php
|
||||
if (!$ajax) {
|
||||
$event['Event']['id'] = $event_id;
|
||||
$event['Event']['published'] = $published;
|
||||
echo $this->element('/genericElements/SideMenu/side_menu', array('menuList' => 'event', 'menuItem' => 'addAttribute', 'event' => $event));
|
||||
}
|
||||
?>
|
||||
<script type="text/javascript">
|
||||
var notice_list_triggers = <?php echo $notice_list_triggers; ?>;
|
||||
var fieldsArray = new Array('AttributeCategory', 'AttributeType', 'AttributeValue', 'AttributeDistribution', 'AttributeComment', 'AttributeToIds', 'AttributeBatchImport', 'AttributeSharingGroupId');
|
||||
<?php
|
||||
$formInfoTypes = array('distribution' => 'Distribution', 'category' => 'Category', 'type' => 'Type');
|
||||
echo 'var formInfoFields = ' . json_encode($formInfoTypes) . PHP_EOL;
|
||||
foreach ($formInfoTypes as $formInfoType => $humanisedName) {
|
||||
echo 'var ' . $formInfoType . 'FormInfoValues = {' . PHP_EOL;
|
||||
foreach ($info[$formInfoType] as $key => $formInfoData) {
|
||||
echo '"' . $key . '": "<span class=\"blue bold\">' . h($formInfoData['key']) . '</span>: ' . h($formInfoData['desc']) . '<br />",' . PHP_EOL;
|
||||
}
|
||||
echo '}' . PHP_EOL;
|
||||
}
|
||||
?>
|
||||
|
||||
//
|
||||
//Generate Category / Type filtering array
|
||||
//
|
||||
var category_type_mapping = new Array();
|
||||
<?php
|
||||
foreach ($categoryDefinitions as $category => $def) {
|
||||
echo "category_type_mapping['" . addslashes($category) . "'] = {";
|
||||
$first = true;
|
||||
foreach ($def['types'] as $type) {
|
||||
if ($first) $first = false;
|
||||
else echo ', ';
|
||||
echo "'" . addslashes($type) . "' : '" . addslashes($type) . "'";
|
||||
}
|
||||
echo "}; \n";
|
||||
}
|
||||
?>
|
||||
|
||||
var composite_types = <?php echo json_encode($compositeTypes); ?>;
|
||||
|
||||
$(document).ready(function() {
|
||||
<?php
|
||||
if ($action == 'edit'):
|
||||
?>
|
||||
checkNoticeList('attribute');
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
initPopoverContent('Attribute');
|
||||
$('#AttributeDistribution').change(function() {
|
||||
if ($('#AttributeDistribution').val() == 4) $('#SGContainer').show();
|
||||
else $('#SGContainer').hide();
|
||||
});
|
||||
|
||||
$("#AttributeCategory").on('change', function(e) {
|
||||
formCategoryChanged('Attribute');
|
||||
if ($(this).val() === 'Internal reference') {
|
||||
$("#AttributeDistribution").val('0');
|
||||
$('#SGContainer').hide();
|
||||
}
|
||||
});
|
||||
|
||||
$("#AttributeCategory, #AttributeType").change(function() {
|
||||
checkNoticeList('attribute');
|
||||
});
|
||||
|
||||
$("#AttributeCategory, #AttributeType, #AttributeDistribution").change(function() {
|
||||
var start = $("#AttributeType").val();
|
||||
initPopoverContent('Attribute');
|
||||
$("#AttributeType").val(start);
|
||||
if ($.inArray(start, composite_types) > -1) {
|
||||
$('#compositeWarning').show();
|
||||
} else {
|
||||
$('#compositeWarning').hide();
|
||||
}
|
||||
});
|
||||
<?php if ($ajax): ?>
|
||||
$('#cancel_attribute_add').click(function() {
|
||||
cancelPopoverForm();
|
||||
});
|
||||
|
||||
<?php endif; ?>
|
||||
});
|
||||
</script>
|
||||
<?php echo $this->Js->writeBuffer(); // Write cached scripts
|
|
@ -1,193 +1,93 @@
|
|||
<div class="attributes index">
|
||||
<h2><?php echo __('Attributes'); ?></h2>
|
||||
<?php
|
||||
if ($isSearch == 1) {
|
||||
// The following block should serve as an example and food
|
||||
// for thought on how to optimize i18n & l10n (especially for languages that are not SOV)
|
||||
$filterOptions = array(
|
||||
'value' => __(" with the value containing "),
|
||||
'tags' => __(" being tagged with "),
|
||||
'id' => __(" from the events "),
|
||||
'tag' => __(" carrying the tag(s) "),
|
||||
'type' => __(" of type "),
|
||||
'category' => __(" of category "),
|
||||
'org' => __(" created by organisation ")
|
||||
);
|
||||
$temp = '';
|
||||
foreach ($filterOptions as $fo => $text) {
|
||||
if (!empty($filters[$fo])) {
|
||||
$filter_options_string = $filters[$fo];
|
||||
if (is_array($filter_options_string)) {
|
||||
$filter_options_string = implode(' OR ', $filter_options_string);
|
||||
}
|
||||
$temp .= sprintf('%s <b>%s</b>', $text, h($filter_options_string));
|
||||
}
|
||||
}
|
||||
echo sprintf("<h4>%s%s</h4>", __("Results for all attributes"), $temp);
|
||||
}
|
||||
?>
|
||||
<div class="pagination">
|
||||
<ul>
|
||||
<?php
|
||||
$paginator = $this->Paginator->prev('« ' . __('previous'), array('tag' => 'li', 'escape' => false), null, array('tag' => 'li', 'class' => 'prev disabled', 'escape' => false, 'disabledTag' => 'span'));
|
||||
$paginator .= $this->Paginator->numbers(array('modulus' => 20, 'separator' => '', 'tag' => 'li', 'currentClass' => 'active', 'currentTag' => 'span'));
|
||||
$paginator .= $this->Paginator->next(__('next') . ' »', array('tag' => 'li', 'escape' => false), null, array('tag' => 'li', 'class' => 'next disabled', 'escape' => false, 'disabledTag' => 'span'));
|
||||
echo $paginator;
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php
|
||||
$headers = array(
|
||||
$this->Paginator->sort('timestamp', __('Date')),
|
||||
$this->Paginator->sort('event_id'),
|
||||
$this->Paginator->sort('Event.orgc_id', __('Org')),
|
||||
$this->Paginator->sort('category'),
|
||||
$this->Paginator->sort('type'),
|
||||
$this->Paginator->sort('value'),
|
||||
__('Tags'),
|
||||
__('Galaxies'),
|
||||
$this->Paginator->sort('comment'),
|
||||
__('Correlate'),
|
||||
__('Related Events'),
|
||||
__('Feed hits'),
|
||||
sprintf('<span title="%s">%s', $attrDescriptions['signature']['desc'], $this->Paginator->sort('IDS')),
|
||||
sprintf('<span title="%s">%s', $attrDescriptions['distribution']['desc'], $this->Paginator->sort('distribution')),
|
||||
__('Sightings'),
|
||||
__('Activity'),
|
||||
__('Actions')
|
||||
);
|
||||
foreach ($headers as $k => &$header) {
|
||||
$header = "<th>$header</th>";
|
||||
}
|
||||
?>
|
||||
<table class="table table-striped table-hover table-condensed">
|
||||
<tr><?= implode('', $headers) ?></tr>
|
||||
<?php
|
||||
$currentCount = 0;
|
||||
if ($isSearch == 1) {
|
||||
// sanitize data
|
||||
$toHighlight = array('value', 'comment');
|
||||
$keywordArray = array();
|
||||
foreach ($toHighlight as $highlightedElement) {
|
||||
if (!empty($filters[$highlightedElement])) {
|
||||
if (!is_array($filters[$highlightedElement])) {
|
||||
$filters[$highlightedElement] = array($filters[$highlightedElement]);
|
||||
}
|
||||
foreach ($filters[$highlightedElement] as $highlightedString) {
|
||||
$keywordArray[] = $highlightedString;
|
||||
}
|
||||
}
|
||||
}
|
||||
// build the $replacePairs variable used to highlight the keywords
|
||||
$replacePairs = $this->Highlight->build_replace_pairs($keywordArray);
|
||||
}
|
||||
foreach ($attributes as $k => $attribute) {
|
||||
$event = array(
|
||||
'Event' => $attribute['Event'],
|
||||
'Orgc' => $attribute['Event']['Orgc'],
|
||||
);
|
||||
$mayModify = ($isSiteAdmin || ($isAclModify && $event['Event']['user_id'] == $me['id'] && $attribute['Event']['orgc_id'] == $me['org_id']) || ($isAclModifyOrg && $attribute['Event']['orgc_id'] == $me['org_id']));
|
||||
$mayPublish = ($isAclPublish && $attribute['Event']['orgc_id'] == $me['org_id']);
|
||||
$mayChangeCorrelation = !Configure::read('MISP.completely_disable_correlation') && ($isSiteAdmin || ($mayModify && Configure::read('MISP.allow_disabling_correlation')));
|
||||
if (!empty($attribute['Attribute']['RelatedAttribute'])) {
|
||||
$event['RelatedAttribute'] = array($attribute['Attribute']['id'] => $attribute['Attribute']['RelatedAttribute']);
|
||||
}
|
||||
$attribute['Attribute']['objectType'] = 'attribute';
|
||||
echo $this->element('/Events/View/row_attribute', array(
|
||||
'object' => $attribute['Attribute'],
|
||||
'k' => $k,
|
||||
'mayModify' => $mayModify,
|
||||
'mayChangeCorrelation' => $mayChangeCorrelation,
|
||||
'page' => 1,
|
||||
'fieldCount' => 11,
|
||||
'includeRelatedTags' => 0,
|
||||
'event' => $event,
|
||||
'me' => $me,
|
||||
'extended' => 1,
|
||||
'disable_multi_select' => 1,
|
||||
'context' => 'list'
|
||||
));
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
<?php
|
||||
// Generate form for adding sighting just once, generation for every attribute is surprisingly too slow
|
||||
echo $this->Form->create('Sighting', ['id' => 'SightingForm', 'url' => $baseurl . '/sightings/add/', 'style' => 'display:none;']);
|
||||
echo $this->Form->input('id', ['label' => false, 'type' => 'number']);
|
||||
echo $this->Form->input('type', ['label' => false]);
|
||||
echo $this->Form->end();
|
||||
?>
|
||||
<p>
|
||||
<?php
|
||||
echo $this->Paginator->counter(array(
|
||||
'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}')
|
||||
));
|
||||
?>
|
||||
</p>
|
||||
<div class="pagination">
|
||||
<ul>
|
||||
<?= $paginator ?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
if ($isSearch == 1) {
|
||||
$class = 'searchAttributes2';
|
||||
} else {
|
||||
$class = 'listAttributes';
|
||||
}
|
||||
echo '<div class="index">';
|
||||
echo $this->element('/genericElements/IndexTable/index_table', [
|
||||
'data' => [
|
||||
'title' => __('Attributes'),
|
||||
'data' => $attributes,
|
||||
'fields' => [
|
||||
[
|
||||
'name' => __('Date'),
|
||||
'sort' => 'Attribute.timestamp',
|
||||
'class' => 'short',
|
||||
'element' => 'timestamp',
|
||||
'time_format' => 'Y-m-d',
|
||||
'data_path' => 'Attribute.timestamp',
|
||||
],
|
||||
[
|
||||
'name' => __('Event'),
|
||||
'sort' => 'Attribute.event_id',
|
||||
'class' => 'short',
|
||||
'data_path' => 'Attribute.event_id',
|
||||
],
|
||||
[
|
||||
'name' => __('Org'),
|
||||
'sort' => 'Event.Orgc.name',
|
||||
'class' => 'short',
|
||||
'data_path' => 'Event.Orgc',
|
||||
'element' => 'org'
|
||||
],
|
||||
[
|
||||
'name' => __('Category'),
|
||||
'sort' => 'Attribute.category',
|
||||
'class' => 'short',
|
||||
'data_path' => 'Attribute.category',
|
||||
],
|
||||
[
|
||||
'name' => __('Type'),
|
||||
'sort' => 'Attribute.type',
|
||||
'class' => 'short',
|
||||
'data_path' => 'Attribute.type',
|
||||
],
|
||||
[
|
||||
'name' => __('Value'),
|
||||
'sort' => 'Attribute.value',
|
||||
'class' => 'short',
|
||||
'data_path' => 'Attribute.value',
|
||||
],
|
||||
[
|
||||
'name' => __('Tags'),
|
||||
'class' => 'short',
|
||||
'data_path' => 'Attribute.AttributeTag',
|
||||
],
|
||||
[
|
||||
'name' => __('Galaxies'),
|
||||
'class' => 'short',
|
||||
'data_path' => 'Attribute.Galaxy',
|
||||
],
|
||||
[
|
||||
'name' => __('Comment'),
|
||||
'class' => 'shortish',
|
||||
'data_path' => 'Attribute.comment',
|
||||
],
|
||||
[
|
||||
'name' => __('Correlate'),
|
||||
'class' => 'shortish',
|
||||
'data_path' => 'Attribute.disable_correlation',
|
||||
'data' => [
|
||||
'object' => [
|
||||
'value_path' => 'Attribute'
|
||||
],
|
||||
],
|
||||
'element' => 'correlate',
|
||||
'scope' => 'Attribute',
|
||||
],
|
||||
],
|
||||
]
|
||||
]);
|
||||
echo '</div>';
|
||||
|
||||
$class = $isSearch == 1 ? 'searchAttributes2' : 'listAttributes';
|
||||
echo $this->element('/genericElements/SideMenu/side_menu', array('menuList' => 'event-collection', 'menuItem' => $class));
|
||||
|
||||
?>
|
||||
<?= $this->element('/genericElements/SideMenu/side_menu', array('menuList' => 'event-collection', 'menuItem' => $class)); ?>
|
||||
|
||||
<script type="text/javascript">
|
||||
// tooltips
|
||||
$(function () {
|
||||
$("td, div").tooltip({
|
||||
'placement': 'top',
|
||||
'container' : 'body',
|
||||
delay: { show: 500, hide: 100 }
|
||||
// tooltips
|
||||
$(function() {
|
||||
$('.correlation-toggle').click(function() {
|
||||
var attribute_id = $(this).data('attribute-id');
|
||||
getPopup(attribute_id, 'attributes', 'toggleCorrelation', '', '#confirmation_box');
|
||||
return false;
|
||||
});
|
||||
});
|
||||
$('.screenshot').click(function() {
|
||||
screenshotPopup($(this).attr('src'), $(this).attr('title'));
|
||||
});
|
||||
$('.addGalaxy').click(function() {
|
||||
addGalaxyListener(this);
|
||||
});
|
||||
$('.sightings_advanced_add').click(function() {
|
||||
var selected = [];
|
||||
var object_context = $(this).data('object-context');
|
||||
var object_id = $(this).data('object-id');
|
||||
if (object_id == 'selected') {
|
||||
$(".select_attribute").each(function() {
|
||||
if ($(this).is(":checked")) {
|
||||
selected.push($(this).data("id"));
|
||||
}
|
||||
});
|
||||
object_id = selected.join('|');
|
||||
}
|
||||
url = "<?php echo $baseurl; ?>" + "/sightings/advanced/" + object_id + "/" + object_context;
|
||||
genericPopup(url, '#popover_box');
|
||||
});
|
||||
$('.correlation-toggle').click(function() {
|
||||
var attribute_id = $(this).data('attribute-id');
|
||||
getPopup(attribute_id, 'attributes', 'toggleCorrelation', '', '#confirmation_box');
|
||||
return false;
|
||||
});
|
||||
$('.toids-toggle').click(function() {
|
||||
var attribute_id = $(this).data('attribute-id');
|
||||
getPopup(attribute_id, 'attributes', 'toggleToIDS', '', '#confirmation_box');
|
||||
return false;
|
||||
});
|
||||
popoverStartup();
|
||||
$(document).on('click', function (e) {
|
||||
//did not click a popover toggle or popover
|
||||
if ($(e.target).data('toggle') !== 'popover'
|
||||
&& $(e.target).parents('.popover.in').length === 0) {
|
||||
// filter for only defined popover
|
||||
var definedPopovers = $('[data-toggle="popover"]').filter(function(i, e) {
|
||||
return $(e).data('popover') !== undefined;
|
||||
});
|
||||
definedPopovers.popover('hide');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
$data = $this->DataPathCollector->extract($row, $field['data_path']);
|
||||
$object = Hash::extract($row, $field['data']['object']['value_path']);
|
||||
$event = Hash::extract($row, 'Event');
|
||||
$mayModify = ($isSiteAdmin || ($isAclModify && $event['user_id'] == $me['id'] && $event['orgc_id'] == $me['org_id']) || ($isAclModifyOrg && $event['orgc_id'] == $me['org_id']));
|
||||
$mayChangeCorrelation = !Configure::read('MISP.completely_disable_correlation') && ($isSiteAdmin || ($mayModify && Configure::read('MISP.allow_disabling_correlation')));
|
||||
|
||||
?>
|
||||
|
||||
<input
|
||||
id="correlation_toggle_<?= $object['id'] ?>"
|
||||
class="correlation-toggle"
|
||||
aria-label="<?php echo __('Toggle correlation');?>"
|
||||
title="<?php echo __('Toggle correlation');?>"
|
||||
type="checkbox"
|
||||
data-attribute-id="<?= $object['id'] ?>"
|
||||
<?php
|
||||
echo $object['disable_correlation'] ? '' : ' checked';
|
||||
echo ($mayChangeCorrelation && empty($event['disable_correlation'])) ? '' : ' disabled';
|
||||
?>
|
||||
/>
|
Loading…
Reference in New Issue