mirror of https://github.com/MISP/MISP
new: [internal] New model method find('column')
parent
bf27358584
commit
4d4b306b60
|
@ -21,12 +21,11 @@ class ObjectTemplatesController extends AppController
|
|||
|
||||
public function objectMetaChoice($event_id)
|
||||
{
|
||||
$metas = $this->ObjectTemplate->find('all', array(
|
||||
'recursive' => -1,
|
||||
$metas = $this->ObjectTemplate->find('column', array(
|
||||
'conditions' => array('ObjectTemplate.active' => 1),
|
||||
'fields' => array('meta-category'),
|
||||
'group' => array('ObjectTemplate.meta-category'),
|
||||
'order' => array('ObjectTemplate.meta-category asc')
|
||||
'fields' => array('ObjectTemplate.meta-category'),
|
||||
'order' => array('ObjectTemplate.meta-category asc'),
|
||||
'unique' => true,
|
||||
));
|
||||
|
||||
$eventId = h($event_id);
|
||||
|
@ -35,7 +34,6 @@ class ObjectTemplatesController extends AppController
|
|||
'value' => $this->baseurl . "/ObjectTemplates/objectChoice/$eventId/0"
|
||||
]];
|
||||
foreach ($metas as $meta) {
|
||||
$meta = $meta['ObjectTemplate']['meta-category'];
|
||||
$items[] = array(
|
||||
'name' => $meta,
|
||||
'value' => $this->baseurl . "/ObjectTemplates/objectChoice/$eventId/" . h($meta)
|
||||
|
|
|
@ -55,6 +55,7 @@ class AppModel extends Model
|
|||
parent::__construct($id, $table, $ds);
|
||||
|
||||
$this->name = get_class($this);
|
||||
$this->findMethods['column'] = true;
|
||||
}
|
||||
|
||||
// deprecated, use $db_changes
|
||||
|
@ -3017,6 +3018,51 @@ class AppModel extends Model
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find method that allows to fetch just one column from database.
|
||||
* @param $state
|
||||
* @param $query
|
||||
* @param array $results
|
||||
* @return array|mixed
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function _findColumn($state, $query, $results = array())
|
||||
{
|
||||
if ($state === 'before') {
|
||||
if (count($query['fields']) === 1) {
|
||||
if (strpos($query['fields'][0], '.') === false) {
|
||||
$query['fields'][0] = $this->alias . '.' . $query['fields'][0];
|
||||
}
|
||||
|
||||
$query['column'] = $query['fields'][0];
|
||||
if (isset($query['unique']) && $query['unique']) {
|
||||
$query['fields'] = array("DISTINCT {$query['fields'][0]}");
|
||||
} else {
|
||||
$query['fields'] = array($query['fields'][0]);
|
||||
}
|
||||
} else {
|
||||
throw new Exception("Invalid number of column, expected one, " . count($query['fields']) . " given");
|
||||
}
|
||||
|
||||
if (!isset($query['recursive'])) {
|
||||
$query['recursive'] = -1;
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
// Faster version of `Hash::extract`
|
||||
foreach (explode('.', $query['column']) as $part) {
|
||||
$results = array_column($results, $part);
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $field
|
||||
* @param AppModel $model
|
||||
* @param array $conditions
|
||||
*/
|
||||
public function addCountField($field, AppModel $model, array $conditions)
|
||||
{
|
||||
$db = $this->getDataSource();
|
||||
|
|
|
@ -2048,11 +2048,11 @@ class Attribute extends AppModel
|
|||
}
|
||||
}
|
||||
|
||||
$ipList = $this->find('list', array(
|
||||
$ipList = $this->find('column', array(
|
||||
'conditions' => $conditions,
|
||||
'group' => 'value1', // return just unique values
|
||||
'fields' => array('value1'),
|
||||
'order' => false
|
||||
'fields' => ['Attribute.value1'],
|
||||
'unique' => true,
|
||||
'order' => false,
|
||||
));
|
||||
foreach ($ipList as $ipToCheck) {
|
||||
$ipToCheckVersion = filter_var($ipToCheck, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ? 4 : 6;
|
||||
|
@ -3981,13 +3981,13 @@ class Attribute extends AppModel
|
|||
|
||||
private function __getCIDRList()
|
||||
{
|
||||
return $this->find('list', array(
|
||||
return $this->find('column', array(
|
||||
'conditions' => array(
|
||||
'type' => array('ip-src', 'ip-dst'),
|
||||
'value1 LIKE' => '%/%'
|
||||
),
|
||||
'fields' => array('value1'),
|
||||
'group' => array('value1', 'id'), // return just unique value
|
||||
'fields' => array('Attribute.value1'),
|
||||
'unique' => true,
|
||||
'order' => false
|
||||
));
|
||||
}
|
||||
|
|
|
@ -843,18 +843,16 @@ class Event extends AppModel
|
|||
// ii. Atttibute has a distribution between 1-3 (community only, connected communities, all orgs)
|
||||
// iii. Attribute has a sharing group that the user is accessible to view
|
||||
$conditionsCorrelation = $this->__buildEventConditionsCorrelation($user, $eventId, $sgids);
|
||||
$correlations = $this->Correlation->find('list', array(
|
||||
'fields' => array('Correlation.event_id', 'Correlation.event_id'),
|
||||
'conditions' => $conditionsCorrelation,
|
||||
'recursive' => 0,
|
||||
'group' => 'Correlation.event_id',
|
||||
'order' => array('Correlation.event_id DESC')));
|
||||
$relatedEventIds = $this->Correlation->find('column', array(
|
||||
'fields' => array('Correlation.event_id'),
|
||||
'conditions' => $conditionsCorrelation,
|
||||
'unique' => true,
|
||||
));
|
||||
|
||||
if (empty($correlations)) {
|
||||
if (empty($relatedEventIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$relatedEventIds = array_values($correlations);
|
||||
// now look up the event data for these attributes
|
||||
$conditions = $this->createEventConditions($user);
|
||||
$conditions['AND'][] = array('Event.id' => $relatedEventIds);
|
||||
|
|
|
@ -534,22 +534,23 @@ class Organisation extends AppModel
|
|||
$allowedOrgs = [$user['org_id']];
|
||||
|
||||
$eventConditions = $this->Event->createEventConditions($user);
|
||||
$orgsWithEvent = array_column(array_column($this->Event->find('all', [
|
||||
'fields' => ['DISTINCT Event.orgc_id'],
|
||||
'recursive' => -1,
|
||||
$orgsWithEvent = $this->Event->find('column', [
|
||||
'fields' => ['Event.orgc_id'],
|
||||
'conditions' => $eventConditions,
|
||||
]), 'Event'), 'orgc_id');
|
||||
'unique' => true,
|
||||
]);
|
||||
$allowedOrgs = array_merge($allowedOrgs, $orgsWithEvent);
|
||||
|
||||
$proposalConditions = $this->Event->ShadowAttribute->buildConditions($user);
|
||||
// Do not check orgs that we already can see
|
||||
$proposalConditions['AND'][]['NOT'] = ['ShadowAttribute.org_id' => $allowedOrgs];
|
||||
$orgsWithProposal = array_column(array_column($this->Event->ShadowAttribute->find('all', [
|
||||
'fields' => ['DISTINCT ShadowAttribute.org_id'],
|
||||
'recursive' => -1,
|
||||
$orgsWithProposal = $this->Event->ShadowAttribute->find('column', [
|
||||
'fields' => ['ShadowAttribute.org_id'],
|
||||
'conditions' => $proposalConditions,
|
||||
'contain' => ['Event', 'Attribute'],
|
||||
]), 'ShadowAttribute'), 'org_id');
|
||||
'unique' => true,
|
||||
'order' => false,
|
||||
]);
|
||||
|
||||
$allowedOrgs = array_merge($allowedOrgs, $orgsWithProposal);
|
||||
return ['AND' => ['id' => $allowedOrgs]];
|
||||
|
|
|
@ -481,13 +481,13 @@ class ShadowAttribute extends AppModel
|
|||
*/
|
||||
public function getEventContributors($eventId)
|
||||
{
|
||||
$orgs = $this->find('all', array(
|
||||
'fields' => array('DISTINCT(ShadowAttribute.org_id)'),
|
||||
$orgIds = $this->find('column', array(
|
||||
'fields' => array('ShadowAttribute.org_id'),
|
||||
'conditions' => array('event_id' => $eventId),
|
||||
'recursive' => -1,
|
||||
'unique' => true,
|
||||
'order' => false
|
||||
));
|
||||
if (empty($orgs)) {
|
||||
if (empty($orgIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
|
@ -495,8 +495,8 @@ class ShadowAttribute extends AppModel
|
|||
return $this->Organisation->find('list', array(
|
||||
'recursive' => -1,
|
||||
'fields' => array('id', 'name'),
|
||||
'conditions' => array('Organisation.id' => Hash::extract($orgs, "{n}.ShadowAttribute.org_id")))
|
||||
);
|
||||
'conditions' => array('Organisation.id' => $orgIds)
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -145,11 +145,10 @@ class SharingGroup extends AppModel
|
|||
}
|
||||
|
||||
if ($user['Role']['perm_site_admin']) {
|
||||
$ids = array_values($this->find('list', array(
|
||||
'recursive' => -1,
|
||||
$ids = $this->find('column', array(
|
||||
'fields' => array('id'),
|
||||
'conditions' => $conditions
|
||||
)));
|
||||
));
|
||||
} else {
|
||||
$ids = array_unique(array_merge(
|
||||
$this->SharingGroupServer->fetchAllAuthorised(),
|
||||
|
|
Loading…
Reference in New Issue