Merge branch 'pr-5295' into 2.4

pull/5559/head
mokaddem 2020-01-27 12:50:00 +01:00
commit 04a5d2a31f
No known key found for this signature in database
GPG Key ID: 164C473F627A06FA
2 changed files with 113 additions and 91 deletions

View File

@ -110,8 +110,13 @@ class ServersController extends AppController
if (empty($combinedArgs['limit'])) {
$combinedArgs['limit'] = 60;
}
$total_count = 0;
$events = $this->Server->previewIndex($id, $this->Auth->user(), $combinedArgs, $total_count);
try {
list($events, $total_count) = $this->Server->previewIndex($id, $this->Auth->user(), $combinedArgs);
} catch (Exception $e) {
$this->Flash->error(__('Download failed.') . ' ' . $e->getMessage());
$this->redirect(array('action' => 'index'));
}
$this->loadModel('Event');
$threat_levels = $this->Event->ThreatLevel->find('all');
$this->set('threatLevels', Set::combine($threat_levels, '{n}.ThreatLevel.id', '{n}.ThreatLevel.name'));
@ -122,11 +127,9 @@ class ServersController extends AppController
$params['pageCount'] = ceil($total_count / $params['limit']);
}
$this->params->params['paging'] = array($this->modelClass => $params);
if (is_array($events)) {
if (count($events) > 60) {
$customPagination->truncateByPagination($events, $params);
}
} else ($events = array());
if (count($events) > 60) {
$customPagination->truncateByPagination($events, $params);
}
$this->set('events', $events);
$this->set('eventDescriptions', $this->Event->fieldDescriptions);
$this->set('analysisLevels', $this->Event->analysisLevels);
@ -150,12 +153,15 @@ class ServersController extends AppController
if (empty($server)) {
throw new NotFoundException('Invalid server ID.');
}
$event = $this->Server->previewEvent($serverId, $eventId);
// work on this in the future to improve the feedback
// 2 = wrong error code
if (is_numeric($event)) {
throw new NotFoundException('Invalid event.');
try {
$event = $this->Server->previewEvent($serverId, $eventId);
} catch (NotFoundException $e) {
throw new NotFoundException(__("Event '$eventId' not found."));
} catch (Exception $e) {
$this->Flash->error(__('Download failed.') . ' ' . $e->getMessage());
$this->redirect(array('action' => 'previewIndex', $serverId));
}
$this->loadModel('Event');
$params = $this->Event->rearrangeEventForView($event, $this->passedArgs, $all);
$this->params->params['paging'] = array('Server' => $params);

View File

@ -5131,23 +5131,16 @@ class Server extends AppModel
return 2;
}
/* returns an array with the events
* error codes:
* 1: received non json response
* 2: no route to host
* 3: empty result set
/**
* Returns an array with the events
* @param int $id
* @param $user - not used
* @param array $passedArgs
* @return array
* @throws Exception
*/
public function previewIndex($id, $user, $passedArgs, &$total_count = 0)
public function previewIndex($id, $user, array $passedArgs)
{
$server = $this->find('first', array(
'conditions' => array('Server.id' => $id),
));
if (empty($server)) {
return 2;
}
$HttpSocket = $this->setupHttpSocket($server);
$request = $this->setupSyncRequest($server);
$validArgs = array_merge(array('sort', 'direction', 'page', 'limit'), $this->validEventIndexFilters);
$urlParams = '';
foreach ($validArgs as $v) {
@ -5155,80 +5148,56 @@ class Server extends AppModel
$urlParams .= '/' . $v . ':' . $passedArgs[$v];
}
}
$uri = $server['Server']['url'] . '/events/index' . $urlParams;
$response = $HttpSocket->get($uri, $data = '', $request);
if (!empty($response->headers['X-Result-Count'])) {
$temp = $response->headers['X-Result-Count'];
$total_count = $temp;
}
if ($response->code == 200) {
try {
$events = json_decode($response->body, true);
} catch (Exception $e) {
return 1;
$relativeUri = '/events/index' . $urlParams;
list($events, $response) = $this->serverGetRequest($id, $relativeUri);
$totalCount = $response->getHeader('X-Result-Count') ?: 0;
foreach ($events as $k => $event) {
if (!isset($event['Orgc'])) {
$event['Orgc']['name'] = $event['orgc'];
}
if (!empty($events)) {
foreach ($events as $k => $event) {
if (!isset($event['Orgc'])) {
$event['Orgc']['name'] = $event['orgc'];
}
if (!isset($event['Org'])) {
$event['Org']['name'] = $event['org'];
}
if (!isset($event['EventTag'])) {
$event['EventTag'] = array();
}
$events[$k] = array('Event' => $event);
}
} else {
return 3;
if (!isset($event['Org'])) {
$event['Org']['name'] = $event['org'];
}
return $events;
if (!isset($event['EventTag'])) {
$event['EventTag'] = array();
}
$events[$k] = array('Event' => $event);
}
return 2;
return array($events, $totalCount);
}
/* returns an array with the events
* error codes:
* 1: received non-json response
* 2: no route to host
/**
* Returns an array with the event.
* @param int $serverId
* @param int $eventId
* @return array
* @throws Exception
*/
public function previewEvent($serverId, $eventId)
{
$server = $this->find('first', array(
'conditions' => array('Server.id' => $serverId),
));
if (empty($server)) {
return 2;
$relativeUri = '/events/' . $eventId;
list($event) = $this->serverGetRequest($serverId, $relativeUri);
if (!isset($event['Event']['Orgc'])) {
$event['Event']['Orgc']['name'] = $event['Event']['orgc'];
}
$HttpSocket = $this->setupHttpSocket($server);
$request = $this->setupSyncRequest($server);
$uri = $server['Server']['url'] . '/events/' . $eventId;
$response = $HttpSocket->get($uri, $data = '', $request);
if ($response->code == 200) {
try {
$event = json_decode($response->body, true);
} catch (Exception $e) {
return 1;
}
if (!isset($event['Event']['Orgc'])) {
$event['Event']['Orgc']['name'] = $event['Event']['orgc'];
}
if (isset($event['Event']['Orgc'][0])) {
$event['Event']['Orgc'] = $event['Event']['Orgc'][0];
}
if (!isset($event['Event']['Org'])) {
$event['Event']['Org']['name'] = $event['Event']['org'];
}
if (isset($event['Event']['Org'][0])) {
$event['Event']['Org'] = $event['Event']['Org'][0];
}
if (!isset($event['Event']['EventTag'])) {
$event['Event']['EventTag'] = array();
}
return $event;
if (isset($event['Event']['Orgc'][0])) {
$event['Event']['Orgc'] = $event['Event']['Orgc'][0];
}
return 2;
if (!isset($event['Event']['Org'])) {
$event['Event']['Org']['name'] = $event['Event']['org'];
}
if (isset($event['Event']['Org'][0])) {
$event['Event']['Org'] = $event['Event']['Org'][0];
}
if (!isset($event['Event']['EventTag'])) {
$event['Event']['EventTag'] = array();
}
return $event;
}
// Loops through all servers and checks which servers' push rules don't conflict with the given event.
@ -5789,6 +5758,53 @@ class Server extends AppModel
return $success;
}
/**
* @param int $serverId
* @param string $relativeUri
* @param HttpSocket|null $HttpSocket
* @return array
* @throws Exception
*/
private function serverGetRequest($serverId, $relativeUri, HttpSocket $HttpSocket = null)
{
$server = $this->find('first', array(
'conditions' => array('Server.id' => $serverId),
));
if ($server === null) {
throw new Exception(__("Server with ID '$serverId' not found."));
}
if (!$HttpSocket) {
$HttpSocket = $this->setupHttpSocket($server);
}
$request = $this->setupSyncRequest($server);
$uri = $server['Server']['url'] . $relativeUri;
$response = $HttpSocket->get($uri, array(), $request);
if ($response === false) {
throw new Exception(__("Could not reach '$uri'."));
} else if ($response->code == 404) { // intentional !=
throw new NotFoundException(__("Fetching the '$uri' failed with HTTP error 404: Not Found"));
} else if ($response->code == 405) { // intentional !=
$responseText = json_decode($response->body, true);
if ($responseText !== null) {
throw new Exception(sprintf(__("Fetching the '$uri' failed with HTTP error %s: %s"), $response->code, $responseText['message']));
}
}
if ($response->code != 200) { // intentional !=
throw new Exception(sprintf(__("Fetching the '$uri' failed with HTTP error %s: %s"), $response->code, $response->reasonPhrase));
}
$data = json_decode($response->body, true);
if ($data === null) {
throw new Exception(__('Could not parse JSON: ') . json_last_error_msg(), json_last_error());
}
return array($data, $response);
}
public function getRemoteUser($id)
{
$server = $this->find('first', array(