mirror of https://github.com/MISP/MISP
chg: [internal] Move methods to specific controllers
parent
5968fc78b9
commit
861fdffada
|
@ -411,7 +411,7 @@ class AppController extends Controller
|
|||
$authKey = trim($authKey);
|
||||
if (preg_match('/^[a-zA-Z0-9]{40}$/', $authKey)) {
|
||||
$foundMispAuthKey = true;
|
||||
$temp = $this->checkAuthUser($authKey);
|
||||
$temp = $this->_checkAuthUser($authKey);
|
||||
if ($temp) {
|
||||
$user = $temp;
|
||||
break;
|
||||
|
@ -895,7 +895,7 @@ class AppController extends Controller
|
|||
{
|
||||
if (strlen($key) === 40) {
|
||||
// check if the key is valid -> search for users based on key
|
||||
$user = $this->checkAuthUser($key);
|
||||
$user = $this->_checkAuthUser($key);
|
||||
if (!$user) {
|
||||
$exception = $this->RestResponse->throwException(
|
||||
401,
|
||||
|
@ -992,7 +992,7 @@ class AppController extends Controller
|
|||
return $data;
|
||||
}
|
||||
|
||||
public function checkAuthUser($authkey)
|
||||
protected function _checkAuthUser($authkey)
|
||||
{
|
||||
if (Configure::read('Security.advanced_authkeys')) {
|
||||
$user = $this->User->AuthKey->getAuthUserByAuthKey($authkey);
|
||||
|
@ -1010,7 +1010,7 @@ class AppController extends Controller
|
|||
return $user;
|
||||
}
|
||||
|
||||
public function checkExternalAuthUser($authkey)
|
||||
private function _checkExternalAuthUser($authkey)
|
||||
{
|
||||
$user = $this->User->getAuthUserByExternalAuth($authkey);
|
||||
if (empty($user)) {
|
||||
|
@ -1019,153 +1019,6 @@ class AppController extends Controller
|
|||
return $user;
|
||||
}
|
||||
|
||||
public function generateCount()
|
||||
{
|
||||
if (!self::_isSiteAdmin() || !$this->request->is('post')) {
|
||||
throw new NotFoundException();
|
||||
}
|
||||
// do one SQL query with the counts
|
||||
// loop over events, update in db
|
||||
$this->loadModel('Attribute');
|
||||
$events = $this->Attribute->find('all', array(
|
||||
'recursive' => -1,
|
||||
'fields' => array('event_id', 'count(event_id) as attribute_count'),
|
||||
'group' => array('Attribute.event_id'),
|
||||
'order' => array('Attribute.event_id ASC'),
|
||||
));
|
||||
foreach ($events as $k => $event) {
|
||||
$this->Event->read(null, $event['Attribute']['event_id']);
|
||||
$this->Event->set('attribute_count', $event[0]['attribute_count']);
|
||||
$this->Event->save();
|
||||
}
|
||||
$this->Flash->success(__('All done. attribute_count generated from scratch for ' . (isset($k) ? $k : 'no') . ' events.'));
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
}
|
||||
|
||||
public function pruneDuplicateUUIDs()
|
||||
{
|
||||
if (!$this->_isSiteAdmin() || !$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
$this->loadModel('Attribute');
|
||||
$duplicates = $this->Attribute->find('all', array(
|
||||
'fields' => array('Attribute.uuid', 'count(*) as occurance'),
|
||||
'recursive' => -1,
|
||||
'group' => array('Attribute.uuid HAVING COUNT(*) > 1'),
|
||||
));
|
||||
$counter = 0;
|
||||
foreach ($duplicates as $duplicate) {
|
||||
$attributes = $this->Attribute->find('all', array(
|
||||
'recursive' => -1,
|
||||
'conditions' => array('uuid' => $duplicate['Attribute']['uuid'])
|
||||
));
|
||||
foreach ($attributes as $k => $attribute) {
|
||||
if ($k > 0) {
|
||||
$this->Attribute->delete($attribute['Attribute']['id']);
|
||||
$counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->Server->updateDatabase('makeAttributeUUIDsUnique');
|
||||
$this->Flash->success('Done. Deleted ' . $counter . ' duplicate attribute(s).');
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
}
|
||||
|
||||
public function removeDuplicateEvents()
|
||||
{
|
||||
if (!$this->_isSiteAdmin() || !$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
$this->loadModel('Event');
|
||||
$duplicates = $this->Event->find('all', array(
|
||||
'fields' => array('Event.uuid', 'count(*) as occurance'),
|
||||
'recursive' => -1,
|
||||
'group' => array('Event.uuid HAVING COUNT(*) > 1'),
|
||||
));
|
||||
$counter = 0;
|
||||
|
||||
// load this so we can remove the blocklist item that will be created, this is the one case when we do not want it.
|
||||
if (Configure::read('MISP.enableEventBlocklisting') !== false) {
|
||||
$this->EventBlocklist = ClassRegistry::init('EventBlocklist');
|
||||
}
|
||||
|
||||
foreach ($duplicates as $duplicate) {
|
||||
$events = $this->Event->find('all', array(
|
||||
'recursive' => -1,
|
||||
'conditions' => array('uuid' => $duplicate['Event']['uuid'])
|
||||
));
|
||||
foreach ($events as $k => $event) {
|
||||
if ($k > 0) {
|
||||
$uuid = $event['Event']['uuid'];
|
||||
$this->Event->delete($event['Event']['id']);
|
||||
$counter++;
|
||||
// remove the blocklist entry that we just created with the event deletion, if the feature is enabled
|
||||
// We do not want to block the UUID, since we just deleted a copy
|
||||
if (Configure::read('MISP.enableEventBlocklisting') !== false) {
|
||||
$this->EventBlocklist->deleteAll(array('EventBlocklist.event_uuid' => $uuid));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->Server->updateDatabase('makeEventUUIDsUnique');
|
||||
$this->Flash->success('Done. Removed ' . $counter . ' duplicate events.');
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
}
|
||||
|
||||
public function updateDatabase($command)
|
||||
{
|
||||
if (!$this->_isSiteAdmin() || !$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
$this->loadModel('Server');
|
||||
if (is_numeric($command)) {
|
||||
$command = intval($command);
|
||||
}
|
||||
$this->Server->updateDatabase($command);
|
||||
$this->Flash->success('Done.');
|
||||
if ($liveOff) {
|
||||
$this->redirect(array('controller' => 'servers', 'action' => 'updateProgress'));
|
||||
} else {
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
}
|
||||
}
|
||||
|
||||
public function upgrade2324()
|
||||
{
|
||||
if (!$this->_isSiteAdmin() || !$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
$this->loadModel('Server');
|
||||
if (!Configure::read('MISP.background_jobs')) {
|
||||
$this->Server->upgrade2324($this->Auth->user('id'));
|
||||
$this->Flash->success('Done. For more details check the audit logs.');
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
} else {
|
||||
$job = ClassRegistry::init('Job');
|
||||
$job->create();
|
||||
$data = array(
|
||||
'worker' => 'default',
|
||||
'job_type' => 'upgrade_24',
|
||||
'job_input' => 'Old database',
|
||||
'status' => 0,
|
||||
'retries' => 0,
|
||||
'org_id' => 0,
|
||||
'message' => 'Job created.',
|
||||
);
|
||||
$job->save($data);
|
||||
$jobId = $job->id;
|
||||
$process_id = CakeResque::enqueue(
|
||||
'default',
|
||||
'AdminShell',
|
||||
array('jobUpgrade24', $jobId, $this->Auth->user('id')),
|
||||
true
|
||||
);
|
||||
$job->saveField('process_id', $process_id);
|
||||
$this->Flash->success(__('Job queued. You can view the progress if you navigate to the active jobs view (administration -> jobs).'));
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
}
|
||||
}
|
||||
|
||||
private function __preAuthException($message)
|
||||
{
|
||||
$this->set('me', array());
|
||||
|
@ -1206,7 +1059,7 @@ class AppController extends Controller
|
|||
$this->Log->save($log);
|
||||
$this->__preAuthException($authName . ' authentication failed. Contact your MISP support for additional information at: ' . Configure::read('MISP.contact'));
|
||||
}
|
||||
$temp = $this->checkExternalAuthUser($server[$headerNamespace . $header]);
|
||||
$temp = $this->_checkExternalAuthUser($server[$headerNamespace . $header]);
|
||||
$user['User'] = $temp;
|
||||
if ($user['User']) {
|
||||
$this->User->updateLoginTimes($user['User']);
|
||||
|
@ -1252,17 +1105,6 @@ class AppController extends Controller
|
|||
return $result;
|
||||
}
|
||||
|
||||
public function cleanModelCaches()
|
||||
{
|
||||
if (!$this->_isSiteAdmin() || !$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
$this->loadModel('Server');
|
||||
$this->Server->cleanCacheFiles();
|
||||
$this->Flash->success('Caches cleared.');
|
||||
$this->redirect(array('controller' => 'servers', 'action' => 'serverSettings', 'diagnostics'));
|
||||
}
|
||||
|
||||
private function __sessionMassage()
|
||||
{
|
||||
if (empty(Configure::read('Session.cookie')) && !empty(Configure::read('MISP.uuid'))) {
|
||||
|
@ -1282,7 +1124,8 @@ class AppController extends Controller
|
|||
}
|
||||
}
|
||||
|
||||
private function _redirectToLogin() {
|
||||
private function _redirectToLogin()
|
||||
{
|
||||
$targetRoute = $this->Auth->loginAction;
|
||||
$targetRoute['admin'] = false;
|
||||
$this->redirect($targetRoute);
|
||||
|
|
|
@ -1784,12 +1784,12 @@ class AttributesController extends AppController
|
|||
public function downloadAttachment($key='download', $id)
|
||||
{
|
||||
if ($key != null && $key != 'download') {
|
||||
$user = $this->checkAuthUser($key);
|
||||
$user = $this->_checkAuthUser($key);
|
||||
} else {
|
||||
if (!$this->Auth->user()) {
|
||||
throw new UnauthorizedException(__('You are not authorized. Please send the Authorization header with your auth key along with an Accept header for application/xml.'));
|
||||
}
|
||||
$user = $this->checkAuthUser($this->Auth->user('authkey'));
|
||||
$user = $this->_checkAuthUser($this->Auth->user('authkey'));
|
||||
}
|
||||
// if the user is authorised to use the api key then user will be populated with the user's account
|
||||
// in addition we also set a flag indicating whether the user is a site admin or not.
|
||||
|
@ -1927,7 +1927,7 @@ class AttributesController extends AppController
|
|||
}
|
||||
if ($key != 'download') {
|
||||
// check if the key is valid -> search for users based on key
|
||||
$user = $this->checkAuthUser($key);
|
||||
$user = $this->_checkAuthUser($key);
|
||||
if (!$user) {
|
||||
throw new UnauthorizedException(__('This authentication key is not authorized to be used for exports. Contact your administrator.'));
|
||||
}
|
||||
|
|
|
@ -15,17 +15,9 @@ class ACLComponent extends Component
|
|||
private $__aclList = array(
|
||||
'*' => array(
|
||||
'blackhole' => array(),
|
||||
'checkAuthUser' => array(),
|
||||
'checkExternalAuthUser' => array(),
|
||||
'cleanModelCaches' => array(),
|
||||
'debugACL' => array(),
|
||||
'generateCount' => array(),
|
||||
'pruneDuplicateUUIDs' => array(),
|
||||
'queryACL' => array(),
|
||||
'removeDuplicateEvents' => array(),
|
||||
'restSearch' => array('*'),
|
||||
'updateDatabase' => array(),
|
||||
'upgrade2324' => array(),
|
||||
),
|
||||
'attributes' => array(
|
||||
'add' => array('perm_add'),
|
||||
|
@ -273,6 +265,7 @@ class ACLComponent extends Component
|
|||
'xml' => array('*'),
|
||||
'addEventLock' => ['perm_auth'],
|
||||
'removeEventLock' => ['perm_auth'],
|
||||
'generateCount' => array(),
|
||||
),
|
||||
'favouriteTags' => array(
|
||||
'toggle' => array('*'),
|
||||
|
@ -561,6 +554,11 @@ class ACLComponent extends Component
|
|||
'viewDeprecatedFunctionUse' => array(),
|
||||
'killAllWorkers' => ['perm_site_admin'],
|
||||
'cspReport' => ['*'],
|
||||
'pruneDuplicateUUIDs' => array(),
|
||||
'removeDuplicateEvents' => array(),
|
||||
'upgrade2324' => array(),
|
||||
'cleanModelCaches' => array(),
|
||||
'updateDatabase' => array(),
|
||||
),
|
||||
'shadowAttributes' => array(
|
||||
'accept' => array('perm_add'),
|
||||
|
|
|
@ -3224,7 +3224,7 @@ class EventsController extends AppController
|
|||
$this->layout = 'text/default';
|
||||
|
||||
if ($key != 'download') {
|
||||
$user = $this->checkAuthUser($key);
|
||||
$user = $this->_checkAuthUser($key);
|
||||
if (!$user) {
|
||||
throw new UnauthorizedException(__('This authentication key is not authorized to be used for exports. Contact your administrator.'));
|
||||
}
|
||||
|
@ -5799,6 +5799,29 @@ class EventsController extends AppController
|
|||
return $this->RestResponse->viewData($allConflicts);
|
||||
}
|
||||
|
||||
public function generateCount()
|
||||
{
|
||||
if (!$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
// do one SQL query with the counts
|
||||
// loop over events, update in db
|
||||
$this->loadModel('Attribute');
|
||||
$events = $this->Attribute->find('all', array(
|
||||
'recursive' => -1,
|
||||
'fields' => array('event_id', 'count(event_id) as attribute_count'),
|
||||
'group' => array('Attribute.event_id'),
|
||||
'order' => array('Attribute.event_id ASC'),
|
||||
));
|
||||
foreach ($events as $k => $event) {
|
||||
$this->Event->read(null, $event['Attribute']['event_id']);
|
||||
$this->Event->set('attribute_count', $event[0]['attribute_count']);
|
||||
$this->Event->save();
|
||||
}
|
||||
$this->Flash->success(__('All done. attribute_count generated from scratch for ' . (isset($k) ? $k : 'no') . ' events.'));
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $event
|
||||
* @return CakeResponseTmp
|
||||
|
|
|
@ -2472,4 +2472,136 @@ misp.direct_call(relative_path, body)
|
|||
|
||||
public function openapi() {
|
||||
}
|
||||
|
||||
public function pruneDuplicateUUIDs()
|
||||
{
|
||||
if (!$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
$this->loadModel('Attribute');
|
||||
$duplicates = $this->Attribute->find('all', array(
|
||||
'fields' => array('Attribute.uuid', 'count(*) as occurance'),
|
||||
'recursive' => -1,
|
||||
'group' => array('Attribute.uuid HAVING COUNT(*) > 1'),
|
||||
));
|
||||
$counter = 0;
|
||||
foreach ($duplicates as $duplicate) {
|
||||
$attributes = $this->Attribute->find('all', array(
|
||||
'recursive' => -1,
|
||||
'conditions' => array('uuid' => $duplicate['Attribute']['uuid'])
|
||||
));
|
||||
foreach ($attributes as $k => $attribute) {
|
||||
if ($k > 0) {
|
||||
$this->Attribute->delete($attribute['Attribute']['id']);
|
||||
$counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->Server->updateDatabase('makeAttributeUUIDsUnique');
|
||||
$this->Flash->success('Done. Deleted ' . $counter . ' duplicate attribute(s).');
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
}
|
||||
|
||||
public function removeDuplicateEvents()
|
||||
{
|
||||
if (!$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
$this->loadModel('Event');
|
||||
$duplicates = $this->Event->find('all', array(
|
||||
'fields' => array('Event.uuid', 'count(*) as occurance'),
|
||||
'recursive' => -1,
|
||||
'group' => array('Event.uuid HAVING COUNT(*) > 1'),
|
||||
));
|
||||
$counter = 0;
|
||||
|
||||
// load this so we can remove the blocklist item that will be created, this is the one case when we do not want it.
|
||||
if (Configure::read('MISP.enableEventBlocklisting') !== false) {
|
||||
$this->EventBlocklist = ClassRegistry::init('EventBlocklist');
|
||||
}
|
||||
|
||||
foreach ($duplicates as $duplicate) {
|
||||
$events = $this->Event->find('all', array(
|
||||
'recursive' => -1,
|
||||
'conditions' => array('uuid' => $duplicate['Event']['uuid'])
|
||||
));
|
||||
foreach ($events as $k => $event) {
|
||||
if ($k > 0) {
|
||||
$uuid = $event['Event']['uuid'];
|
||||
$this->Event->delete($event['Event']['id']);
|
||||
$counter++;
|
||||
// remove the blocklist entry that we just created with the event deletion, if the feature is enabled
|
||||
// We do not want to block the UUID, since we just deleted a copy
|
||||
if (Configure::read('MISP.enableEventBlocklisting') !== false) {
|
||||
$this->EventBlocklist->deleteAll(array('EventBlocklist.event_uuid' => $uuid));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->Server->updateDatabase('makeEventUUIDsUnique');
|
||||
$this->Flash->success('Done. Removed ' . $counter . ' duplicate events.');
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
}
|
||||
|
||||
public function upgrade2324()
|
||||
{
|
||||
if (!$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
if (!Configure::read('MISP.background_jobs')) {
|
||||
$this->Server->upgrade2324($this->Auth->user('id'));
|
||||
$this->Flash->success('Done. For more details check the audit logs.');
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
} else {
|
||||
$job = ClassRegistry::init('Job');
|
||||
$job->create();
|
||||
$data = array(
|
||||
'worker' => 'default',
|
||||
'job_type' => 'upgrade_24',
|
||||
'job_input' => 'Old database',
|
||||
'status' => 0,
|
||||
'retries' => 0,
|
||||
'org_id' => 0,
|
||||
'message' => 'Job created.',
|
||||
);
|
||||
$job->save($data);
|
||||
$jobId = $job->id;
|
||||
$process_id = CakeResque::enqueue(
|
||||
'default',
|
||||
'AdminShell',
|
||||
array('jobUpgrade24', $jobId, $this->Auth->user('id')),
|
||||
true
|
||||
);
|
||||
$job->saveField('process_id', $process_id);
|
||||
$this->Flash->success(__('Job queued. You can view the progress if you navigate to the active jobs view (administration -> jobs).'));
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
}
|
||||
}
|
||||
|
||||
public function cleanModelCaches()
|
||||
{
|
||||
if (!$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
$this->Server->cleanCacheFiles();
|
||||
$this->Flash->success('Caches cleared.');
|
||||
$this->redirect(array('controller' => 'servers', 'action' => 'serverSettings', 'diagnostics'));
|
||||
}
|
||||
|
||||
public function updateDatabase($command)
|
||||
{
|
||||
if (!$this->request->is('post')) {
|
||||
throw new MethodNotAllowedException();
|
||||
}
|
||||
if (is_numeric($command)) {
|
||||
$command = intval($command);
|
||||
}
|
||||
$this->Server->updateDatabase($command);
|
||||
$this->Flash->success('Done.');
|
||||
if ($liveOff) {
|
||||
$this->redirect(array('controller' => 'servers', 'action' => 'updateProgress'));
|
||||
} else {
|
||||
$this->redirect(array('controller' => 'pages', 'action' => 'display', 'administration'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -466,7 +466,7 @@
|
|||
</p>
|
||||
<h3><?php echo __('Clean model cache');?></h3>
|
||||
<p><?php echo __('If you ever run into issues with missing database fields / tables, please run the following script to clean the model cache.');?></p>
|
||||
<?php echo $this->Form->postLink('<span class="btn btn-inverse" style="padding-top:1px;padding-bottom:1px;">' . __('Clean cache') . '</span>', $baseurl . '/events/cleanModelCaches', array('escape' => false));?>
|
||||
<?php echo $this->Form->postLink('<span class="btn btn-inverse" style="padding-top:1px;padding-bottom:1px;">' . __('Clean cache') . '</span>', $baseurl . '/servers/cleanModelCaches', array('escape' => false));?>
|
||||
<?php
|
||||
echo sprintf(
|
||||
'<h3>%s</h3><p>%s</p><div id="deprecationResults"></div>%s',
|
||||
|
|
Loading…
Reference in New Issue