mirror of https://github.com/MISP/MISP
new: [API] rework of the searchall/quickFilter parameters
Now it correctly works as intended on both attribute and event contextspull/3766/head
parent
9af6e5676b
commit
43558a9610
|
@ -1673,7 +1673,7 @@ class AppModel extends Model
|
|||
}
|
||||
|
||||
// take filters in the {"OR" => [foo], "NOT" => [bar]} format along with conditions and set the conditions
|
||||
public function generic_add_filter($conditions, &$filter, $keys, $searchall = false)
|
||||
public function generic_add_filter($conditions, &$filter, $keys)
|
||||
{
|
||||
$operator_composition = array(
|
||||
'NOT' => 'AND',
|
||||
|
@ -1711,11 +1711,7 @@ class AppModel extends Model
|
|||
}
|
||||
}
|
||||
}
|
||||
if ($searchall && $operator === 'OR') {
|
||||
$conditions['AND']['OR'][] = array($operator_composition[$operator] => $temp);
|
||||
} else {
|
||||
$conditions['AND'][] = array($operator_composition[$operator] => $temp);
|
||||
}
|
||||
$conditions['AND'][] = array($operator_composition[$operator] => $temp);
|
||||
if ($operator !== 'NOT') {
|
||||
unset($filter[$operator]);
|
||||
}
|
||||
|
|
|
@ -2121,11 +2121,6 @@ class Attribute extends AppModel
|
|||
$temp,
|
||||
$this->subQueryGenerator($tag->AttributeTag, $subquery_options, $lookup_field)
|
||||
);
|
||||
if (!empty($params['searchall'])) {
|
||||
$conditions['AND']['OR'][] = array('OR' => $temp);
|
||||
} else {
|
||||
$conditions['AND'][] = array('OR' => $temp);
|
||||
}
|
||||
}
|
||||
$temp = array();
|
||||
if (!empty($tagArray[1])) {
|
||||
|
@ -3667,53 +3662,64 @@ class Attribute extends AppModel
|
|||
public function buildFilterConditions($user, &$params)
|
||||
{
|
||||
$conditions = $this->buildConditions($user);
|
||||
$attribute_conditions = array();
|
||||
$object_conditions = array();
|
||||
if (isset($params['ignore'])) {
|
||||
$params['to_ids'] = array(0, 1);
|
||||
$params['published'] = array(0, 1);
|
||||
}
|
||||
$simple_params = array(
|
||||
'Attribute' => array(
|
||||
'value' => array('function' => 'set_filter_value'),
|
||||
'category' => array('function' => 'set_filter_simple_attribute'),
|
||||
'type' => array('function' => 'set_filter_simple_attribute'),
|
||||
'tags' => array('function' => 'set_filter_tags'),
|
||||
'uuid' => array('function' => 'set_filter_uuid'),
|
||||
'deleted' => array('function' => 'set_filter_deleted'),
|
||||
'timestamp' => array('function' => 'set_filter_timestamp'),
|
||||
'to_ids' => array('function' => 'set_filter_to_ids'),
|
||||
'comment' => array('function' => 'set_filter_comment')
|
||||
),
|
||||
'Event' => array(
|
||||
'eventid' => array('function' => 'set_filter_eventid'),
|
||||
'eventinfo' => array('function' => 'set_filter_eventinfo'),
|
||||
'ignore' => array('function' => 'set_filter_ignore'),
|
||||
'from' => array('function' => 'set_filter_timestamp'),
|
||||
'to' => array('function' => 'set_filter_timestamp'),
|
||||
'last' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'timestamp' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'event_timestamp' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'publish_timestamp' => array('function' => 'set_filter_timestamp'),
|
||||
'org' => array('function' => 'set_filter_org'),
|
||||
'uuid' => array('function' => 'set_filter_uuid'),
|
||||
'published' => array('function' => 'set_filter_published')
|
||||
),
|
||||
'Object' => array(
|
||||
'object_name' => array('function' => 'set_filter_object_name'),
|
||||
'deleted' => array('function' => 'set_filter_deleted')
|
||||
)
|
||||
);
|
||||
foreach ($params as $param => $paramData) {
|
||||
foreach ($simple_params as $scope => $simple_param_scoped) {
|
||||
if (isset($simple_param_scoped[$param]) && $params[$param] !== false) {
|
||||
$options = array(
|
||||
'filter' => $param,
|
||||
'scope' => $scope,
|
||||
'pop' => !empty($simple_param_scoped[$param]['pop']),
|
||||
'context' => 'Attribute'
|
||||
);
|
||||
$conditions = $this->Event->{$simple_param_scoped[$param]['function']}($params, $conditions, $options);
|
||||
if (isset($params['wildcard'])) {
|
||||
$temp = array();
|
||||
$options = array(
|
||||
'filter' => 'wildcard',
|
||||
'scope' => 'Attribute',
|
||||
'pop' => false,
|
||||
'context' => 'Event'
|
||||
);
|
||||
$conditions['AND'][] = array('OR' => $this->Event->set_filter_wildcard_attributes($params, $temp, $options));
|
||||
} else {
|
||||
$attribute_conditions = array();
|
||||
$object_conditions = array();
|
||||
if (isset($params['ignore'])) {
|
||||
$params['to_ids'] = array(0, 1);
|
||||
$params['published'] = array(0, 1);
|
||||
}
|
||||
$simple_params = array(
|
||||
'Attribute' => array(
|
||||
'value' => array('function' => 'set_filter_value'),
|
||||
'category' => array('function' => 'set_filter_simple_attribute'),
|
||||
'type' => array('function' => 'set_filter_simple_attribute'),
|
||||
'tags' => array('function' => 'set_filter_tags'),
|
||||
'uuid' => array('function' => 'set_filter_uuid'),
|
||||
'deleted' => array('function' => 'set_filter_deleted'),
|
||||
'timestamp' => array('function' => 'set_filter_timestamp'),
|
||||
'to_ids' => array('function' => 'set_filter_to_ids'),
|
||||
'comment' => array('function' => 'set_filter_comment')
|
||||
),
|
||||
'Event' => array(
|
||||
'eventid' => array('function' => 'set_filter_eventid'),
|
||||
'eventinfo' => array('function' => 'set_filter_eventinfo'),
|
||||
'ignore' => array('function' => 'set_filter_ignore'),
|
||||
'from' => array('function' => 'set_filter_timestamp'),
|
||||
'to' => array('function' => 'set_filter_timestamp'),
|
||||
'last' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'timestamp' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'event_timestamp' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'publish_timestamp' => array('function' => 'set_filter_timestamp'),
|
||||
'org' => array('function' => 'set_filter_org'),
|
||||
'uuid' => array('function' => 'set_filter_uuid'),
|
||||
'published' => array('function' => 'set_filter_published')
|
||||
),
|
||||
'Object' => array(
|
||||
'object_name' => array('function' => 'set_filter_object_name'),
|
||||
'deleted' => array('function' => 'set_filter_deleted')
|
||||
)
|
||||
);
|
||||
foreach ($params as $param => $paramData) {
|
||||
foreach ($simple_params as $scope => $simple_param_scoped) {
|
||||
if (isset($simple_param_scoped[$param]) && $params[$param] !== false) {
|
||||
$options = array(
|
||||
'filter' => $param,
|
||||
'scope' => $scope,
|
||||
'pop' => !empty($simple_param_scoped[$param]['pop']),
|
||||
'context' => 'Attribute'
|
||||
);
|
||||
$conditions = $this->Event->{$simple_param_scoped[$param]['function']}($params, $conditions, $options);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3735,6 +3741,20 @@ class Attribute extends AppModel
|
|||
$filters['published'] = 1;
|
||||
}
|
||||
}
|
||||
if (!empty($filters['quickFilter'])) {
|
||||
$filters['searchall'] = $filters['quickFilter'];
|
||||
if (!empty($filters['value'])) {
|
||||
unset($filters['value']);
|
||||
}
|
||||
}
|
||||
if (isset($filters['searchall'])) {
|
||||
if (!empty($filters['value'])) {
|
||||
$filters['wildcard'] = $filters['value'];
|
||||
unset($filters['value']);
|
||||
} else {
|
||||
$filters['wildcard'] = $filters['searchall'];
|
||||
}
|
||||
}
|
||||
$conditions = $this->buildFilterConditions($user, $filters);
|
||||
$params = array(
|
||||
'conditions' => $conditions,
|
||||
|
|
|
@ -1304,67 +1304,145 @@ class Event extends AppModel
|
|||
return $conditions;
|
||||
}
|
||||
|
||||
public function set_filter_wildcard(&$params, $conditions, $options)
|
||||
{
|
||||
$tempConditions = array();
|
||||
$tempConditions[] = array('Event.info LIKE' => $params['wildcard']);
|
||||
$attributeParams = array('value1', 'value2', 'comment');
|
||||
foreach ($attributeParams as $attributeParam) {
|
||||
$subQueryOptions = array(
|
||||
'conditions' => array('Attribute.' . $attributeParam . ' LIKE' => $params['wildcard']),
|
||||
'fields' => array('event_id')
|
||||
);
|
||||
$tempConditions[] = $this->subQueryGenerator($this->Attribute, $subQueryOptions, 'Event.id');
|
||||
}
|
||||
$tagScopes = array('Event', 'Attribute');
|
||||
$this->AttributeTag = ClassRegistry::init('AttributeTag');
|
||||
$tagIds = $this->AttributeTag->Tag->find('list', array(
|
||||
'recursive' => -1,
|
||||
'conditions' => array('Tag.name LIKE' => $params['wildcard']),
|
||||
'fields' => array('Tag.id')
|
||||
));
|
||||
if (!empty($tagIds)) {
|
||||
foreach ($tagScopes as $tagScope) {
|
||||
$subQueryOptions = array(
|
||||
'conditions' => array(
|
||||
'tag_id' => $tagIds,
|
||||
),
|
||||
'fields' => array('event_id')
|
||||
);
|
||||
$tempConditions[] = $this->subQueryGenerator($this->{$tagScope . 'Tag'}, $subQueryOptions, 'Event.id');
|
||||
}
|
||||
}
|
||||
return $tempConditions;
|
||||
}
|
||||
|
||||
public function set_filter_wildcard_attributes(&$params, $conditions, $options)
|
||||
{
|
||||
$tempConditions = array();
|
||||
$tempConditions[] = array('Event.info LIKE' => $params['wildcard']);
|
||||
$attributeParams = array('value1', 'value2', 'comment');
|
||||
foreach ($attributeParams as $attributeParam) {
|
||||
$tempConditions[] = array('Attribute.' . $attributeParam . ' LIKE' => $params['wildcard']);
|
||||
}
|
||||
$tagScopes = array('Event', 'Attribute');
|
||||
$this->AttributeTag = ClassRegistry::init('AttributeTag');
|
||||
$tagIds = $this->AttributeTag->Tag->find('list', array(
|
||||
'recursive' => -1,
|
||||
'conditions' => array('Tag.name LIKE' => $params['wildcard']),
|
||||
'fields' => array('Tag.id')
|
||||
));
|
||||
if (!empty($tagIds)) {
|
||||
$subQueryOptions = array(
|
||||
'conditions' => array(
|
||||
'tag_id' => $tagIds,
|
||||
),
|
||||
'fields' => array('event_id')
|
||||
);
|
||||
$tempConditions[] = $this->subQueryGenerator($this->EventTag, $subQueryOptions, 'Attribute.event_id');
|
||||
$subQueryOptions = array(
|
||||
'conditions' => array(
|
||||
'tag_id' => $tagIds,
|
||||
),
|
||||
'fields' => array('attribute_id')
|
||||
);
|
||||
$tempConditions[] = $this->subQueryGenerator($this->AttributeTag, $subQueryOptions, 'Attribute.id');
|
||||
}
|
||||
return $tempConditions;
|
||||
}
|
||||
|
||||
public function filterEventIds($user, &$params = array())
|
||||
{
|
||||
$conditions = $this->createEventConditions($user);
|
||||
$simple_params = array(
|
||||
'Event' => array(
|
||||
'eventid' => array('function' => 'set_filter_eventid', 'pop' => true),
|
||||
'eventinfo' => array('function' => 'set_filter_eventinfo'),
|
||||
'ignore' => array('function' => 'set_filter_ignore'),
|
||||
'tags' => array('function' => 'set_filter_tags'),
|
||||
'from' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'to' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'last' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'timestamp' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'event_timestamp' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'publish_timestamp' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'org' => array('function' => 'set_filter_org', 'pop' => true),
|
||||
'uuid' => array('function' => 'set_filter_uuid', 'pop' => true),
|
||||
'published' => array('function' => 'set_filter_published', 'pop' => true)
|
||||
),
|
||||
'Object' => array(
|
||||
'object_name' => array('function' => 'set_filter_object_name'),
|
||||
'deleted' => array('function' => 'set_filter_deleted')
|
||||
),
|
||||
'Attribute' => array(
|
||||
'value' => array('function' => 'set_filter_value', 'pop' => true),
|
||||
'category' => array('function' => 'set_filter_simple_attribute'),
|
||||
'type' => array('function' => 'set_filter_simple_attribute'),
|
||||
'tags' => array('function' => 'set_filter_tags', 'pop' => true),
|
||||
'uuid' => array('function' => 'set_filter_uuid'),
|
||||
'deleted' => array('function' => 'set_filter_deleted'),
|
||||
'to_ids' => array('function' => 'set_filter_to_ids'),
|
||||
'comment' => array('function' => 'set_filter_comment')
|
||||
)
|
||||
);
|
||||
foreach ($params as $param => $paramData) {
|
||||
foreach ($simple_params as $scope => $simple_param_scoped) {
|
||||
if (isset($simple_param_scoped[$param]) && $params[$param] !== false) {
|
||||
$options = array(
|
||||
'filter' => $param,
|
||||
'scope' => $scope,
|
||||
'pop' => !empty($simple_param_scoped[$param]['pop']),
|
||||
'context' => 'Event'
|
||||
);
|
||||
if ($scope === 'Event') {
|
||||
$conditions = $this->{$simple_param_scoped[$param]['function']}($params, $conditions, $options);
|
||||
} else {
|
||||
$temp = array();
|
||||
$temp = $this->{$simple_param_scoped[$param]['function']}($params, $temp, $options);
|
||||
if (!empty($temp)) {
|
||||
$subQueryOptions = array(
|
||||
'conditions' => $temp,
|
||||
'fields' => array(
|
||||
'event_id'
|
||||
)
|
||||
);
|
||||
$conditions['AND'][] = $this->subQueryGenerator($this->{$scope}, $subQueryOptions, 'Event.id');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isset($params['wildcard'])) {
|
||||
$temp = array();
|
||||
$options = array(
|
||||
'filter' => 'wildcard',
|
||||
'scope' => 'Event',
|
||||
'pop' => false,
|
||||
'context' => 'Event'
|
||||
);
|
||||
$conditions['AND'][] = array('OR' => $this->set_filter_wildcard($params, $temp, $options));
|
||||
} else {
|
||||
$simple_params = array(
|
||||
'Event' => array(
|
||||
'eventid' => array('function' => 'set_filter_eventid', 'pop' => true),
|
||||
'eventinfo' => array('function' => 'set_filter_eventinfo'),
|
||||
'ignore' => array('function' => 'set_filter_ignore'),
|
||||
'tags' => array('function' => 'set_filter_tags'),
|
||||
'from' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'to' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'last' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'timestamp' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'event_timestamp' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'publish_timestamp' => array('function' => 'set_filter_timestamp', 'pop' => true),
|
||||
'org' => array('function' => 'set_filter_org', 'pop' => true),
|
||||
'uuid' => array('function' => 'set_filter_uuid', 'pop' => true),
|
||||
'published' => array('function' => 'set_filter_published', 'pop' => true)
|
||||
),
|
||||
'Object' => array(
|
||||
'object_name' => array('function' => 'set_filter_object_name'),
|
||||
'deleted' => array('function' => 'set_filter_deleted')
|
||||
),
|
||||
'Attribute' => array(
|
||||
'value' => array('function' => 'set_filter_value', 'pop' => true),
|
||||
'category' => array('function' => 'set_filter_simple_attribute'),
|
||||
'type' => array('function' => 'set_filter_simple_attribute'),
|
||||
'tags' => array('function' => 'set_filter_tags', 'pop' => true),
|
||||
'uuid' => array('function' => 'set_filter_uuid'),
|
||||
'deleted' => array('function' => 'set_filter_deleted'),
|
||||
'to_ids' => array('function' => 'set_filter_to_ids'),
|
||||
'comment' => array('function' => 'set_filter_comment')
|
||||
)
|
||||
);
|
||||
foreach ($params as $param => $paramData) {
|
||||
foreach ($simple_params as $scope => $simple_param_scoped) {
|
||||
if (isset($simple_param_scoped[$param]) && $params[$param] !== false) {
|
||||
$options = array(
|
||||
'filter' => $param,
|
||||
'scope' => $scope,
|
||||
'pop' => !empty($simple_param_scoped[$param]['pop']),
|
||||
'context' => 'Event'
|
||||
);
|
||||
if ($scope === 'Event') {
|
||||
$conditions = $this->{$simple_param_scoped[$param]['function']}($params, $conditions, $options);
|
||||
} else {
|
||||
$temp = array();
|
||||
$temp = $this->{$simple_param_scoped[$param]['function']}($params, $temp, $options);
|
||||
if (!empty($temp)) {
|
||||
$subQueryOptions = array(
|
||||
'conditions' => $temp,
|
||||
'fields' => array(
|
||||
'event_id'
|
||||
)
|
||||
);
|
||||
$conditions['AND'][] = $this->subQueryGenerator($this->{$scope}, $subQueryOptions, 'Event.id');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$fields = array('Event.id');
|
||||
if (!empty($params['include_attribute_count'])) {
|
||||
$fields[] = 'Event.attribute_count';
|
||||
|
@ -2027,8 +2105,7 @@ class Event extends AppModel
|
|||
{
|
||||
if (!empty($params['eventinfo'])) {
|
||||
$params['eventinfo'] = $this->convert_filters($params['eventinfo']);
|
||||
$searchall = empty($params['searchall']) ? false : $params['searchall'];
|
||||
$conditions = $this->generic_add_filter($conditions, $params['eventinfo'], 'Event.info', $searchall);
|
||||
$conditions = $this->generic_add_filter($conditions, $params['eventinfo'], 'Event.info');
|
||||
}
|
||||
return $conditions;
|
||||
}
|
||||
|
@ -2120,8 +2197,7 @@ class Event extends AppModel
|
|||
{
|
||||
if (!empty($params['value'])) {
|
||||
$params[$options['filter']] = $this->convert_filters($params[$options['filter']]);
|
||||
$searchall = empty($params['searchall']) ? false : $params['searchall'];
|
||||
$conditions = $this->generic_add_filter($conditions, $params[$options['filter']], array('Attribute.value1', 'Attribute.value2'), $searchall);
|
||||
$conditions = $this->generic_add_filter($conditions, $params[$options['filter']], array('Attribute.value1', 'Attribute.value2'));
|
||||
}
|
||||
return $conditions;
|
||||
}
|
||||
|
@ -2130,8 +2206,7 @@ class Event extends AppModel
|
|||
{
|
||||
if (!empty($params['comment'])) {
|
||||
$params['comment'] = $this->convert_filters($params['comment']);
|
||||
$searchall = empty($params['searchall']) ? false : $params['searchall'];
|
||||
$conditions = $this->generic_add_filter($conditions, $params['comment'], 'Attribute.comment', $searchall);
|
||||
$conditions = $this->generic_add_filter($conditions, $params['comment'], 'Attribute.comment');
|
||||
}
|
||||
return $conditions;
|
||||
}
|
||||
|
@ -5292,16 +5367,18 @@ class Event extends AppModel
|
|||
$filters['to_ids'] = array(0, 1);
|
||||
$filters['published'] = array(0, 1);
|
||||
}
|
||||
if (isset($filters['searchall'])) {
|
||||
$filters['tags'] = $filters['searchall'];
|
||||
$filters['eventinfo'] = $filters['searchall'];
|
||||
$filters['value'] = $filters['searchall'];
|
||||
$filters['comment'] = $filters['searchall'];
|
||||
if (!empty($filters['quickFilter'])) {
|
||||
$filters['searchall'] = $filters['quickFilter'];
|
||||
if (!empty($filters['value'])) {
|
||||
unset($filters['value']);
|
||||
}
|
||||
}
|
||||
if (!empty($filters['quickfilter']) && !empty($filters['value'])) {
|
||||
$filters['tags'] = $filters['value'];
|
||||
$filters['eventinfo'] = $filters['value'];
|
||||
$filters['comment'] = $filters['value'];
|
||||
if (isset($filters['searchall'])) {
|
||||
if (!empty($filters['value'])) {
|
||||
$filters['wildcard'] = $filters['value'];
|
||||
} else {
|
||||
$filters['wildcard'] = $filters['searchall'];
|
||||
}
|
||||
}
|
||||
$filters['include_attribute_count'] = 1;
|
||||
$eventid = $this->filterEventIds($user, $filters);
|
||||
|
|
Loading…
Reference in New Issue