mirror of https://github.com/MISP/MISP
chg: [internal] Speedup checking valid object for attributes
parent
ef20103e68
commit
08cab274a0
|
@ -1261,11 +1261,11 @@ class MispObject extends AppModel
|
|||
'group' => 'ObjectTemplate.id',
|
||||
));
|
||||
|
||||
$templates = $this->ObjectTemplate->find('all', array(
|
||||
$templates = $this->ObjectTemplate->find('all', [
|
||||
'recursive' => -1,
|
||||
'conditions' => array('id' => $potentialTemplateIds),
|
||||
'contain' => 'ObjectTemplateElement'
|
||||
));
|
||||
'conditions' => ['id' => $potentialTemplateIds],
|
||||
'contain' => ['ObjectTemplateElement' => ['fields' => ['object_relation', 'type', 'multiple']]]
|
||||
]);
|
||||
|
||||
foreach ($templates as $i => $template) {
|
||||
$res = $this->ObjectTemplate->checkTemplateConformityBasedOnTypes($template, $attributes);
|
||||
|
|
|
@ -215,10 +215,13 @@ class ObjectTemplate extends AppModel
|
|||
{
|
||||
$to_return = array('valid' => true, 'missingTypes' => array());
|
||||
if (!empty($template['ObjectTemplate']['requirements'])) {
|
||||
// construct array containing ObjectTemplateElement with object_relation as key for faster search
|
||||
$elementsByObjectRelationName = array_column($template['ObjectTemplateElement'], null, 'object_relation');
|
||||
|
||||
// check for all required attributes
|
||||
if (!empty($template['ObjectTemplate']['requirements']['required'])) {
|
||||
foreach ($template['ObjectTemplate']['requirements']['required'] as $requiredField) {
|
||||
$requiredType = Hash::extract($template['ObjectTemplateElement'], sprintf('{n}[object_relation=%s].type', $requiredField))[0];
|
||||
$requiredType = $elementsByObjectRelationName[$requiredField]['type'];
|
||||
$found = false;
|
||||
foreach ($attributes as $attribute) {
|
||||
if ($attribute['Attribute']['type'] === $requiredType) {
|
||||
|
@ -234,11 +237,10 @@ class ObjectTemplate extends AppModel
|
|||
// check for all required one of attributes
|
||||
if (!empty($template['ObjectTemplate']['requirements']['requiredOneOf'])) {
|
||||
$found = false;
|
||||
$all_required_type = array();
|
||||
$allRequiredTypes = array();
|
||||
foreach ($template['ObjectTemplate']['requirements']['requiredOneOf'] as $requiredField) {
|
||||
$requiredType = Hash::extract($template['ObjectTemplateElement'], sprintf('{n}[object_relation=%s].type', $requiredField));
|
||||
$requiredType = empty($requiredType) ? null : $requiredType[0];
|
||||
$all_required_type[] = $requiredType;
|
||||
$requiredType = $elementsByObjectRelationName[$requiredField]['type'] ?? null;
|
||||
$allRequiredTypes[] = $requiredType;
|
||||
foreach ($attributes as $attribute) {
|
||||
if ($attribute['Attribute']['type'] === $requiredType) {
|
||||
$found = true;
|
||||
|
@ -247,7 +249,7 @@ class ObjectTemplate extends AppModel
|
|||
}
|
||||
}
|
||||
if (!$found) {
|
||||
$to_return = array('valid' => false, 'missingTypes' => $all_required_type);
|
||||
$to_return = array('valid' => false, 'missingTypes' => $allRequiredTypes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,30 +1,23 @@
|
|||
<?php
|
||||
|
||||
App::uses('AppModel', 'Model');
|
||||
|
||||
class ObjectTemplateElement extends AppModel
|
||||
{
|
||||
public $actsAs = array(
|
||||
'Containable'
|
||||
);
|
||||
|
||||
public $belongsTo = array(
|
||||
);
|
||||
|
||||
public $validate = array(
|
||||
'Containable'
|
||||
);
|
||||
|
||||
public function afterFind($results, $primary = false)
|
||||
{
|
||||
foreach ($results as $k => $result) {
|
||||
if (isset($results[$k]['ObjectTemplateElement']['categories'])) {
|
||||
$results[$k]['ObjectTemplateElement']['categories'] = json_decode($results[$k]['ObjectTemplateElement']['categories'], true);
|
||||
foreach ($results as &$result) {
|
||||
if (isset($result['ObjectTemplateElement']['categories'])) {
|
||||
$result['ObjectTemplateElement']['categories'] = json_decode($result['ObjectTemplateElement']['categories'], true);
|
||||
}
|
||||
if (isset($results[$k]['ObjectTemplateElement']['values_list'])) {
|
||||
$results[$k]['ObjectTemplateElement']['values_list'] = json_decode($results[$k]['ObjectTemplateElement']['values_list'], true);
|
||||
if (isset($result['ObjectTemplateElement']['values_list'])) {
|
||||
$result['ObjectTemplateElement']['values_list'] = json_decode($result['ObjectTemplateElement']['values_list'], true);
|
||||
}
|
||||
if (isset($results[$k]['ObjectTemplateElement']['sane_default'])) {
|
||||
$results[$k]['ObjectTemplateElement']['sane_default'] = json_decode($results[$k]['ObjectTemplateElement']['sane_default'], true);
|
||||
if (isset($result['ObjectTemplateElement']['sane_default'])) {
|
||||
$result['ObjectTemplateElement']['sane_default'] = json_decode($result['ObjectTemplateElement']['sane_default'], true);
|
||||
}
|
||||
}
|
||||
return $results;
|
||||
|
@ -42,8 +35,8 @@ class ObjectTemplateElement extends AppModel
|
|||
return true;
|
||||
}
|
||||
|
||||
|
||||
public function getAllAvailableTypes() {
|
||||
public function getAllAvailableTypes()
|
||||
{
|
||||
$temp = $this->find('all', array(
|
||||
'recursive' => -1,
|
||||
'fields' => array('object_relation as type', 'description AS desc', 'categories'),
|
||||
|
|
Loading…
Reference in New Issue