mirror of https://github.com/MISP/MISP
Merge branch 'develop' of github.com:MISP/MISP into develop
commit
b121af4c13
|
@ -33,7 +33,7 @@ class AppController extends Controller
|
|||
|
||||
public $helpers = array('OrgImg', 'FontAwesome', 'UserName');
|
||||
|
||||
private $__queryVersion = '151';
|
||||
private $__queryVersion = '152';
|
||||
public $pyMispVersion = '2.4.172';
|
||||
public $phpmin = '7.2';
|
||||
public $phprec = '7.4';
|
||||
|
@ -1118,7 +1118,7 @@ class AppController extends Controller
|
|||
$user['User'] = $temp;
|
||||
if ($user['User']) {
|
||||
$this->User->updateLoginTimes($user['User']);
|
||||
$this->Session->renew();
|
||||
//$this->Session->renew();
|
||||
$this->Session->write(AuthComponent::$sessionKey, $user['User']);
|
||||
if (Configure::read('MISP.log_auth')) {
|
||||
$this->Log = ClassRegistry::init('Log');
|
||||
|
|
|
@ -192,6 +192,10 @@ class DashboardsController extends AppController
|
|||
'widget_config' => empty($valueConfig['widget_config']) ? array() : $valueConfig['widget_config']
|
||||
);
|
||||
|
||||
if (!empty($this->request->params['named']['exportjson'])) {
|
||||
return $this->RestResponse->viewData($data);
|
||||
}
|
||||
|
||||
$this->layout = false;
|
||||
$this->set('title', $dashboardWidget->title);
|
||||
$this->set('widget_id', $widget_id);
|
||||
|
|
|
@ -38,7 +38,7 @@ class GalaxyClustersController extends AppController
|
|||
public function index($galaxyId)
|
||||
{
|
||||
$galaxyId = $this->Toolbox->findIdByUuid($this->GalaxyCluster->Galaxy, $galaxyId);
|
||||
$filters = $this->IndexFilter->harvestParameters(array('context', 'searchall'));
|
||||
$filters = $this->_harvestParameters(array('context', 'searchall'));
|
||||
$aclConditions = $this->GalaxyCluster->buildConditions($this->Auth->user());
|
||||
$contextConditions = array();
|
||||
if (empty($filters['context'])) {
|
||||
|
|
|
@ -915,30 +915,52 @@ class ServersController extends AppController
|
|||
App::uses('File', 'Utility');
|
||||
App::uses('Folder', 'Utility');
|
||||
App::uses('FileAccessTool', 'Tools');
|
||||
App::uses('SyncTool', 'Tools');
|
||||
if (isset($server['Server'][$subm]['name'])) {
|
||||
if ($this->request->data['Server'][$subm]['size'] != 0) {
|
||||
if (!$this->Server->checkFilename($server['Server'][$subm]['name'])) {
|
||||
throw new Exception(__('Filename not allowed'));
|
||||
}
|
||||
$file = new File($server['Server'][$subm]['name']);
|
||||
$ext = $file->ext();
|
||||
|
||||
if (!is_uploaded_file($server['Server'][$subm]['tmp_name'])) {
|
||||
throw new Exception(__('File not uploaded correctly'));
|
||||
}
|
||||
|
||||
$ext = pathinfo($server['Server'][$subm]['name'], PATHINFO_EXTENSION);
|
||||
if (!in_array($ext, SyncTool::ALLOWED_CERT_FILE_EXTENSIONS)) {
|
||||
$this->Flash->error(__('Invalid extension.'));
|
||||
$this->redirect(array('action' => 'index'));
|
||||
}
|
||||
|
||||
if (!$server['Server'][$subm]['size'] > 0) {
|
||||
$this->Flash->error(__('Incorrect extension or empty file.'));
|
||||
$this->redirect(array('action' => 'index'));
|
||||
}
|
||||
|
||||
// read pem file data
|
||||
$pemData = FileAccessTool::readFromFile($server['Server'][$subm]['tmp_name'], $server['Server'][$subm]['size']);
|
||||
// read certificate file data
|
||||
$certData = FileAccessTool::readFromFile($server['Server'][$subm]['tmp_name'], $server['Server'][$subm]['size']);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
$pemData = base64_decode($server['Server'][$subm]);
|
||||
$ext = 'pem';
|
||||
$certData = base64_decode($server['Server'][$subm]);
|
||||
}
|
||||
|
||||
// check if the file is a valid x509 certificate
|
||||
try {
|
||||
$cert = openssl_x509_parse($certData);
|
||||
if (!$cert) {
|
||||
throw new Exception(__('Invalid certificate.'));
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$this->Flash->error(__('Invalid certificate.'));
|
||||
$this->redirect(array('action' => 'index'));
|
||||
}
|
||||
|
||||
$destpath = APP . "files" . DS . "certs" . DS;
|
||||
$dir = new Folder(APP . "files" . DS . "certs", true);
|
||||
$pemfile = new File($destpath . $id . $ins . '.' . $ext);
|
||||
$result = $pemfile->write($pemData);
|
||||
$result = $pemfile->write($certData);
|
||||
$s = $this->Server->read(null, $id);
|
||||
$s['Server'][$attr] = $s['Server']['id'] . $ins . '.' . $ext;
|
||||
if ($result) {
|
||||
|
|
|
@ -1889,7 +1889,11 @@ class UsersController extends AppController
|
|||
);
|
||||
$writer = new \BaconQrCode\Writer($renderer);
|
||||
$totp->setLabel($user['User']['email']);
|
||||
$totp->setIssuer(Configure::read('MISP.org') . ' MISP');
|
||||
if (Configure::read('Security.otp_issuer')) {
|
||||
$totp->setIssuer(Configure::read('Security.otp_issuer'));
|
||||
} else {
|
||||
$totp->setIssuer(Configure::read('MISP.org') . ' MISP');
|
||||
}
|
||||
$qrcode = $writer->writeString($totp->getProvisioningUri());
|
||||
$qrcode = preg_replace('/^.+\n/', '', $qrcode); // ignore first <?xml version line
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ class APIActivityWidget
|
|||
'limit' => 'Limits the number of displayed APIkeys. (-1 will list all) Default: -1',
|
||||
'days' => 'How many days back should the list go - for example, setting 7 will only show contributions in the past 7 days. (integer)',
|
||||
'month' => 'Who contributed most this month? (boolean)',
|
||||
'previous_month' => 'Who contributed most the previous, finished month? (boolean)',
|
||||
'year' => 'Which contributed most this year? (boolean)',
|
||||
];
|
||||
public $description = 'Basic widget showing some server statistics in regards to MISP.';
|
||||
|
@ -26,16 +27,20 @@ class APIActivityWidget
|
|||
$begin = new DateTime(date('Y-m-d', strtotime(sprintf("-%s days", $options['days']))));
|
||||
} else if (!empty($options['month'])) {
|
||||
$begin = new DateTime(date('Y-m-d', strtotime('first day of this month 00:00:00', time())));
|
||||
} else if (!empty($options['previous_month'])) {
|
||||
$begin = new DateTime(date('Y-m-d', strtotime('first day of last month 00:00:00', time())));
|
||||
$end = new DateTime(date('Y-m-d', strtotime('last day of last month 23:59:59', time())));
|
||||
} else if (!empty($options['year'])) {
|
||||
$begin = new DateTime(date('Y-m-d', strtotime('first day of this year 00:00:00', time())));
|
||||
} else {
|
||||
$begin = new DateTime(date('Y-m-d', strtotime('-7 days', time())));;
|
||||
}
|
||||
$now = new DateTime();
|
||||
|
||||
$end = isset($end) ? $end : new DateTime();
|
||||
$dates = new DatePeriod(
|
||||
$begin,
|
||||
new DateInterval('P1D'),
|
||||
$now
|
||||
$end
|
||||
);
|
||||
$results = [];
|
||||
foreach ($dates as $date) {
|
||||
|
@ -87,6 +92,7 @@ class APIActivityWidget
|
|||
'recursive' => 1
|
||||
]);
|
||||
}
|
||||
$results = [];
|
||||
$baseurl = empty(Configure::read('MISP.external_baseurl')) ? h(Configure::read('MISP.baseurl')) : Configure::read('MISP.external_baseurl');
|
||||
foreach ($counts as $key => $junk) {
|
||||
$data = $temp_apikeys[$key];
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
class AttackWidget
|
||||
{
|
||||
public $title = 'ATT&CK heatmap';
|
||||
public $render = 'Attack';
|
||||
public $description = 'Retrieve an ATT&CK (or ATT&CK like) heatmap for the current instance.';
|
||||
public $width = 3;
|
||||
public $height = 4;
|
||||
public $params = [
|
||||
'filters' => 'A list of restsearch filters to apply to the heatmap. (dictionary, prepending values with ! uses them as a negation)'
|
||||
];
|
||||
public $cacheLifetime = 1200;
|
||||
public $autoRefreshDelay = false;
|
||||
private $validFilterKeys = [
|
||||
'filters'
|
||||
];
|
||||
private $Event = null;
|
||||
public $placeholder =
|
||||
'{
|
||||
"filters": {
|
||||
"attackGalaxy": "mitre-attack-pattern",
|
||||
"timestamp": ["2023-01-01", "2023-03-31"],
|
||||
"published": [0,1]
|
||||
}
|
||||
}';
|
||||
|
||||
public function handler($user, $options = array())
|
||||
{
|
||||
$this->Event = ClassRegistry::init('Event');
|
||||
$data = null;
|
||||
if (!empty($options['filters'])) {
|
||||
$data = $this->Event->restSearch($user, 'attack', $options['filters']);
|
||||
$data = JsonTool::decode($data->intoString());
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
?>
|
|
@ -11,6 +11,7 @@ class LoginsWidget
|
|||
'limit' => 'Limits the number of displayed APIkeys. (-1 will list all) Default: -1',
|
||||
'days' => 'How many days back should the list go - for example, setting 7 will only show contributions in the past 7 days. (integer)',
|
||||
'month' => 'Who contributed most this month? (boolean)',
|
||||
'previous_month' => 'Who contributed most the previous, finished month? (boolean)',
|
||||
'year' => 'Which contributed most this year? (boolean)',
|
||||
];
|
||||
public $description = 'Basic widget showing some server statistics in regards to MISP.';
|
||||
|
@ -26,12 +27,22 @@ class LoginsWidget
|
|||
$begin = date('Y-m-d H:i:s', strtotime(sprintf("-%s days", $options['days'])));
|
||||
} else if (!empty($options['month'])) {
|
||||
$begin = date('Y-m-d H:i:s', strtotime('first day of this month 00:00:00', time()));
|
||||
} else if (!empty($options['previous_month'])) {
|
||||
$begin = date('Y-m-d H:i:s', strtotime('first day of last month 00:00:00', time()));
|
||||
$end = date('Y-m-d H:i:s', strtotime('last day of last month 23:59:59', time()));
|
||||
} else if (!empty($options['year'])) {
|
||||
$begin = date('Y-m-d', strtotime('first day of this year 00:00:00', time()));
|
||||
} else {
|
||||
$begin = date('Y-m-d H:i:s', strtotime('-7 days', time()));
|
||||
}
|
||||
return $begin ? ['Log.created >=' => $begin] : [];
|
||||
$params = [];
|
||||
if (!empty($end)) {
|
||||
$params['Log.created <='] = $end;
|
||||
}
|
||||
if (!empty($begin)) {
|
||||
$params['Log.created >='] = $begin;
|
||||
}
|
||||
return $params;
|
||||
}
|
||||
|
||||
public function handler($user, $options = array())
|
||||
|
|
|
@ -15,6 +15,7 @@ class NewOrgsWidget
|
|||
'filter' => 'A list of filters by organisation meta information (nationality, sector, type, name, uuid) to include. (dictionary, prepending values with ! uses them as a negation)',
|
||||
'days' => 'How many days back should the list go - for example, setting 7 will only show the organisations that were added in the past 7 days. (integer)',
|
||||
'month' => 'Which organisations have been added this month? (boolean)',
|
||||
'previous_month' => 'Who contributed most the previous, finished month? (boolean)',
|
||||
'year' => 'Which organisations have been added this year? (boolean)',
|
||||
'local' => 'Should the list only show local organisations? (boolean or list of booleans, defaults to 1. To get both sets, use [0,1])',
|
||||
'fields' => 'Which fields should be displayed, by default all are selected. Pass a list with the following options: [id, uuid, name, sector, type, nationality, creation_date]'
|
||||
|
@ -51,6 +52,10 @@ class NewOrgsWidget
|
|||
} else if (!empty($options['month'])) {
|
||||
$condition = strtotime('first day of this month 00:00:00', time());
|
||||
$this->tableDescription = __('The %d newest organisations created during the current month', $limit);
|
||||
} else if (!empty($options['previous_month'])) {
|
||||
$condition = strtotime('first day of last month 00:00:00', time());
|
||||
$end_condition = strtotime('last day of last month 23:59:59', time());
|
||||
$this->tableDescription = __('The %d newest organisations created during the previous month', $limit);
|
||||
} else if (!empty($options['year'])) {
|
||||
$condition = strtotime('first day of this year 00:00:00', time());
|
||||
$this->tableDescription = __('The %d newest organisations created during the current year', $limit);
|
||||
|
@ -58,9 +63,18 @@ class NewOrgsWidget
|
|||
$this->tableDescription = __('The %d newest organisations created', $limit);
|
||||
return null;
|
||||
}
|
||||
$datetime = new DateTime();
|
||||
$datetime->setTimestamp($condition);
|
||||
return $datetime->format('Y-m-d H:i:s');
|
||||
$conditions = [];
|
||||
if (!empty($condition)) {
|
||||
$datetime = new DateTime();
|
||||
$datetime->setTimestamp($condition);
|
||||
$conditions['Organisation.date_created >='] = $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
if (!empty($end_condition)) {
|
||||
$datetime = new DateTime();
|
||||
$datetime->setTimestamp($end_condition);
|
||||
$conditions['Organisation.date_created <='] = $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
return $conditions;
|
||||
}
|
||||
|
||||
public function handler($user, $options = array())
|
||||
|
|
|
@ -15,6 +15,7 @@ class NewUsersWidget
|
|||
'filter' => 'A list of filters for the organisations (nationality, sector, type, name, uuid) to include. (dictionary, prepending values with ! uses them as a negation)',
|
||||
'days' => 'How many days back should the list go - for example, setting 7 will only show the organisations that were added in the past 7 days. (integer)',
|
||||
'month' => 'Which organisations have been added this month? (boolean)',
|
||||
'previous_month' => 'Who contributed most the previous, finished month? (boolean)',
|
||||
'year' => 'Which organisations have been added this year? (boolean)',
|
||||
'fields' => 'Which fields should be displayed, by default all are selected. Pass a list with the following options: [id, email, Organisation.name, Role.name, date_created]'
|
||||
];
|
||||
|
@ -57,6 +58,10 @@ class NewUsersWidget
|
|||
} else if (!empty($options['month'])) {
|
||||
$condition = strtotime('first day of this month 00:00:00', time());
|
||||
$this->tableDescription = __('The %d newest users created during the current month', $limit);
|
||||
} else if (!empty($options['previous_month'])) {
|
||||
$condition = strtotime('first day of last month 00:00:00', time());
|
||||
$end_condition = strtotime('last day of last month 23:59:59', time());
|
||||
$this->tableDescription = __('The %d newest organisations created during the previous month', $limit);
|
||||
} else if (!empty($options['year'])) {
|
||||
$condition = strtotime('first day of this year 00:00:00', time());
|
||||
$this->tableDescription = __('The %d newest users created during the current year', $limit);
|
||||
|
@ -64,7 +69,18 @@ class NewUsersWidget
|
|||
$this->tableDescription = __('The %d newest users created', $limit);
|
||||
return null;
|
||||
}
|
||||
return $condition;
|
||||
$conditions = [];
|
||||
if (!empty($condition)) {
|
||||
$datetime = new DateTime();
|
||||
$datetime->setTimestamp($condition);
|
||||
$conditions['Organisation.date_created >='] = $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
if (!empty($end_condition)) {
|
||||
$datetime = new DateTime();
|
||||
$datetime->setTimestamp($end_condition);
|
||||
$conditions['Organisation.date_created <='] = $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
return $conditions;
|
||||
}
|
||||
|
||||
public function handler($user, $options = array())
|
||||
|
@ -123,7 +139,7 @@ class NewUsersWidget
|
|||
}
|
||||
$timeConditions = $this->timeConditions($options);
|
||||
if ($timeConditions) {
|
||||
$params['conditions']['AND'][] = ['User.date_created >=' => $timeConditions];
|
||||
$params['conditions']['AND'][] = $timeConditions;
|
||||
}
|
||||
if (isset($options['fields'])) {
|
||||
$fields = [];
|
||||
|
|
|
@ -9,6 +9,7 @@ class OrgContributionToplistWidget
|
|||
public $params = [
|
||||
'days' => 'How many days back should the list go - for example, setting 7 will only show contributions in the past 7 days. (integer)',
|
||||
'month' => 'Who contributed most this month? (boolean)',
|
||||
'previous_month' => 'Who contributed most the previous, finished month? (boolean)',
|
||||
'year' => 'Which contributed most this year? (boolean)',
|
||||
'filter' => 'A list of filters by organisation meta information (nationality, sector, type, name, uuid, local (- expects a boolean or a list of boolean values)) to include. (dictionary, prepending values with ! uses them as a negation)',
|
||||
'limit' => 'Limits the number of displayed tags. Default: 10'
|
||||
|
@ -41,12 +42,26 @@ class OrgContributionToplistWidget
|
|||
$condition = strtotime(sprintf("-%s days", $options['days']));
|
||||
} else if (!empty($options['month'])) {
|
||||
$condition = strtotime('first day of this month 00:00:00', time());
|
||||
} else if (!empty($options['previous_month'])) {
|
||||
$condition = strtotime('first day of previous month 00:00:00', time());
|
||||
$end_condition = strtotime('last day of last month 23:59:59', time());
|
||||
} else if (!empty($options['year'])) {
|
||||
$condition = strtotime('first day of this year 00:00:00', time());
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
return $condition;
|
||||
$conditions = [];
|
||||
if (!empty($condition)) {
|
||||
$datetime = new DateTime();
|
||||
$datetime->setTimestamp($condition);
|
||||
$conditions['Event.timestamp >='] = $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
if (!empty($end_condition)) {
|
||||
$datetime = new DateTime();
|
||||
$datetime->setTimestamp($end_condition);
|
||||
$conditions['Event.timestamp <='] = $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
return $conditions;
|
||||
}
|
||||
|
||||
|
||||
|
@ -55,7 +70,7 @@ class OrgContributionToplistWidget
|
|||
$params = ['conditions' => []];
|
||||
$timeConditions = $this->timeConditions($options);
|
||||
if ($timeConditions) {
|
||||
$params['conditions']['AND'][] = ['Event.timestamp >=' => $timeConditions];
|
||||
$params['conditions']['AND'][] = $timeConditions;
|
||||
}
|
||||
if (!empty($options['filter']) && is_array($options['filter'])) {
|
||||
foreach ($this->validFilterKeys as $filterKey) {
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
class OrganisationListWidget
|
||||
{
|
||||
public $title = 'Organisation list';
|
||||
public $render = 'BarChart';
|
||||
public $description = 'The countries represented via organisations on the current instance.';
|
||||
public $width = 3;
|
||||
public $height = 4;
|
||||
public $params = [
|
||||
'filter' => 'A list of filters by organisation meta information (sector, type, local (- expects a boolean or a list of boolean values)) to include. (dictionary, prepending values with ! uses them as a negation)',
|
||||
'limit' => 'Limits the number of displayed tags. Default: 10'
|
||||
];
|
||||
public $cacheLifetime = null;
|
||||
public $autoRefreshDelay = false;
|
||||
private $validFilterKeys = [
|
||||
'sector',
|
||||
'type',
|
||||
'local'
|
||||
];
|
||||
public $placeholder =
|
||||
'{
|
||||
"filter": {
|
||||
"type": "Member",
|
||||
"local": [0,1]
|
||||
}
|
||||
}';
|
||||
private $Organisation = null;
|
||||
|
||||
public $countryCodes = [];
|
||||
|
||||
public function handler($user, $options = array())
|
||||
{
|
||||
App::uses('WidgetToolkit', 'Lib/Dashboard/Tools');
|
||||
$WidgetToolkit = new WidgetToolkit();
|
||||
$this->countryCodes = $WidgetToolkit->getCountryCodeMapping();
|
||||
$params = [
|
||||
'conditions' => [
|
||||
'Nationality !=' => ''
|
||||
]
|
||||
];
|
||||
if (!empty($options['filter']) && is_array($options['filter'])) {
|
||||
foreach ($this->validFilterKeys as $filterKey) {
|
||||
if (!empty($options['filter'][$filterKey])) {
|
||||
if (!is_array($options['filter'][$filterKey])) {
|
||||
$options['filter'][$filterKey] = [$options['filter'][$filterKey]];
|
||||
}
|
||||
$tempConditionBucket = [];
|
||||
foreach ($options['filter'][$filterKey] as $value) {
|
||||
if ($value[0] === '!') {
|
||||
$tempConditionBucket['Organisation.' . $filterKey . ' NOT IN'][] = mb_substr($value, 1);
|
||||
} else {
|
||||
$tempConditionBucket['Organisation.' . $filterKey . ' IN'][] = $value;
|
||||
}
|
||||
}
|
||||
if (!empty($tempConditionBucket)) {
|
||||
$params['conditions']['AND'][] = $tempConditionBucket;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->Organisation = ClassRegistry::init('Organisation');
|
||||
$orgs = $this->Organisation->find('all', [
|
||||
'recursive' => -1,
|
||||
'fields' => ['Organisation.nationality', 'COUNT(Organisation.nationality) AS frequency'],
|
||||
'conditions' => $params['conditions'],
|
||||
'group' => ['Organisation.nationality']
|
||||
]);
|
||||
$results = [];
|
||||
foreach($orgs as $org) {
|
||||
$country = $org['Organisation']['nationality'];
|
||||
$count = $org['0']['frequency'];
|
||||
if (isset($this->countryCodes[$country])) {
|
||||
$countryCode = $this->countryCodes[$country];
|
||||
$results[$countryCode] = $count;
|
||||
}
|
||||
}
|
||||
arsort($results);
|
||||
return ['data' => $results];
|
||||
}
|
||||
}
|
||||
?>
|
|
@ -26,188 +26,13 @@ class OrganisationMapWidget
|
|||
}';
|
||||
private $Organisation = null;
|
||||
|
||||
public $countryCodes = array(
|
||||
'Afghanistan' => 'AF',
|
||||
'Albania' => 'AL',
|
||||
'Algeria' => 'DZ',
|
||||
'Angola' => 'AO',
|
||||
'Argentina' => 'AR',
|
||||
'Armenia' => 'AM',
|
||||
'Australia' => 'AU',
|
||||
'Austria' => 'AT',
|
||||
'Azerbaijan' => 'AZ',
|
||||
'Bahamas' => 'BS',
|
||||
'Bangladesh' => 'BD',
|
||||
'Belarus' => 'BY',
|
||||
'Belgium' => 'BE',
|
||||
'Belize' => 'BZ',
|
||||
'Benin' => 'BJ',
|
||||
'Bhutan' => 'BT',
|
||||
'Bolivia' => 'BO',
|
||||
'Bosnia and Herz.' => 'BA',
|
||||
'Botswana' => 'BW',
|
||||
'Brazil' => 'BR',
|
||||
'Brunei' => 'BN',
|
||||
'Bulgaria' => 'BG',
|
||||
'Burkina Faso' => 'BF',
|
||||
'Burundi' => 'BI',
|
||||
'Cambodia' => 'KH',
|
||||
'Cameroon' => 'CM',
|
||||
'Canada' => 'CA',
|
||||
'Central African Rep.' => 'CF',
|
||||
'Chad' => 'TD',
|
||||
'Chile' => 'CL',
|
||||
'China' => 'CN',
|
||||
'Colombia' => 'CO',
|
||||
'Congo' => 'CG',
|
||||
'Costa Rica' => 'CR',
|
||||
'Croatia' => 'HR',
|
||||
'Cuba' => 'CU',
|
||||
'Cyprus' => 'CY',
|
||||
'Czech Rep.' => 'CZ',
|
||||
'Czech Republic' => 'CZ',
|
||||
'Côte d\'Ivoire' => 'CI',
|
||||
'Dem. Rep. Congo' => 'CD',
|
||||
'Dem. Rep. Korea' => 'KP',
|
||||
'Denmark' => 'DK',
|
||||
'Djibouti' => 'DJ',
|
||||
'Dominican Rep.' => 'DO',
|
||||
'Ecuador' => 'EC',
|
||||
'Egypt' => 'EG',
|
||||
'El Salvador' => 'SV',
|
||||
'Eq. Guinea' => 'GQ',
|
||||
'Eritrea' => 'ER',
|
||||
'Estonia' => 'EE',
|
||||
'Ethiopia' => 'ET',
|
||||
'Falkland Is.' => 'FK',
|
||||
'Fiji' => 'FJ',
|
||||
'Finland' => 'FI',
|
||||
'Fr. S. Antarctic Lands' => 'TF',
|
||||
'France' => 'FR',
|
||||
'Gabon' => 'GA',
|
||||
'Gambia' => 'GM',
|
||||
'Georgia' => 'GE',
|
||||
'Germany' => 'DE',
|
||||
'Ghana' => 'GH',
|
||||
'Greece' => 'GR',
|
||||
'Greenland' => 'GL',
|
||||
'Guatemala' => 'GT',
|
||||
'Guinea' => 'GN',
|
||||
'Guinea-Bissau' => 'GW',
|
||||
'Guyana' => 'GY',
|
||||
'Haiti' => 'HT',
|
||||
'Honduras' => 'HN',
|
||||
'Hungary' => 'HU',
|
||||
'Iceland' => 'IS',
|
||||
'India' => 'IN',
|
||||
'Indonesia' => 'ID',
|
||||
'Iran' => 'IR',
|
||||
'Iraq' => 'IQ',
|
||||
'Ireland' => 'IE',
|
||||
'Ireland {Republic}' => 'IE',
|
||||
'Israel' => 'IL',
|
||||
'Italy' => 'IT',
|
||||
'Jamaica' => 'JM',
|
||||
'Japan' => 'JP',
|
||||
'Jordan' => 'JO',
|
||||
'Kazakhstan' => 'KZ',
|
||||
'Kenya' => 'KE',
|
||||
'Korea' => 'KR',
|
||||
'Kuwait' => 'KW',
|
||||
'Kyrgyzstan' => 'KG',
|
||||
'Lao PDR' => 'LA',
|
||||
'Latvia' => 'LV',
|
||||
'Lebanon' => 'LB',
|
||||
'Lesotho' => 'LS',
|
||||
'Liberia' => 'LR',
|
||||
'Libya' => 'LY',
|
||||
'Lithuania' => 'LT',
|
||||
'Luxembourg' => 'LU',
|
||||
'Macedonia' => 'MK',
|
||||
'Madagascar' => 'MG',
|
||||
'Mainland China' => 'CN',
|
||||
'Malawi' => 'MW',
|
||||
'Malaysia' => 'MY',
|
||||
'Mali' => 'ML',
|
||||
'Malta' => 'MT',
|
||||
'Mauritania' => 'MR',
|
||||
'Mexico' => 'MX',
|
||||
'Moldova' => 'MD',
|
||||
'Mongolia' => 'MN',
|
||||
'Montenegro' => 'ME',
|
||||
'Morocco' => 'MA',
|
||||
'Mozamb' => 'MZ',
|
||||
'Myanmar' => 'MM',
|
||||
'Namibia' => 'NA',
|
||||
'Nepal' => 'NP',
|
||||
'Netherlands' => 'NL',
|
||||
'New Caledonia' => 'NC',
|
||||
'New Zealand' => 'NZ',
|
||||
'Nicaragua' => 'NI',
|
||||
'Niger' => 'NE',
|
||||
'Nigeria' => 'NG',
|
||||
'Norway' => 'NO',
|
||||
'Oman' => 'OM',
|
||||
'Pakistan' => 'PK',
|
||||
'Palestine' => 'PS',
|
||||
'Panama' => 'PA',
|
||||
'Papua New Guinea' => 'PG',
|
||||
'Paraguay' => 'PY',
|
||||
'Peru' => 'PE',
|
||||
'Philippines' => 'PH',
|
||||
'Poland' => 'PL',
|
||||
'Portugal' => 'PT',
|
||||
'Puerto Rico' => 'PR',
|
||||
'Qatar' => 'QA',
|
||||
'Romania' => 'RO',
|
||||
'Russia' => 'RU',
|
||||
'Rwanda' => 'RW',
|
||||
'S. Sudan' => 'SS',
|
||||
'Saudi Arabia' => 'SA',
|
||||
'Senegal' => 'SN',
|
||||
'Serbia' => 'RS',
|
||||
'Sierra Leone' => 'SL',
|
||||
'Slovakia' => 'SK',
|
||||
'Slovenia' => 'SI',
|
||||
'Solomon Is.' => 'SB',
|
||||
'Somalia' => 'SO',
|
||||
'South Africa' => 'ZA',
|
||||
'Spain' => 'ES',
|
||||
'Sri Lanka' => 'LK',
|
||||
'Sudan' => 'SD',
|
||||
'Suriname' => 'SR',
|
||||
'Swaziland' => 'SZ',
|
||||
'Sweden' => 'SE',
|
||||
'Switzerland' => 'CH',
|
||||
'Syria' => 'SY',
|
||||
'Taiwan' => 'TW',
|
||||
'Tajikistan' => 'TJ',
|
||||
'Tanzania' => 'TZ',
|
||||
'Thailand' => 'TH',
|
||||
'Timor-Leste' => 'TL',
|
||||
'Togo' => 'TG',
|
||||
'Trinidad and Tobago' => 'TT',
|
||||
'Tunisia' => 'TN',
|
||||
'Turkey' => 'TR',
|
||||
'Turkmenistan' => 'TM',
|
||||
'Uganda' => 'UG',
|
||||
'Ukraine' => 'UA',
|
||||
'United Arab Emirates' => 'AE',
|
||||
'United Kingdom' => 'GB',
|
||||
'United States' => 'US',
|
||||
'Uruguay' => 'UY',
|
||||
'Uzbekistan' => 'UZ',
|
||||
'Vanuatu' => 'VU',
|
||||
'Venezuela' => 'VE',
|
||||
'Vietnam' => 'VN',
|
||||
'W. Sahara' => 'EH',
|
||||
'Yemen' => 'YE',
|
||||
'Zambia' => 'ZM',
|
||||
'Zimbabwe' => 'ZW'
|
||||
);
|
||||
public $countryCodes = [];
|
||||
|
||||
public function handler($user, $options = array())
|
||||
{
|
||||
App::uses('WidgetToolkit', 'Lib/Dashboard/Tools');
|
||||
$WidgetToolkit = new WidgetToolkit();
|
||||
$this->countryCodes = $WidgetToolkit->getCountryCodeMapping();
|
||||
$params = [
|
||||
'conditions' => [
|
||||
'Nationality !=' => ''
|
||||
|
|
|
@ -0,0 +1,189 @@
|
|||
<?php
|
||||
|
||||
class WidgetToolkit
|
||||
{
|
||||
|
||||
public function getCountryCodeMapping(): array
|
||||
{
|
||||
return [
|
||||
'Afghanistan' => 'AF',
|
||||
'Albania' => 'AL',
|
||||
'Algeria' => 'DZ',
|
||||
'Angola' => 'AO',
|
||||
'Argentina' => 'AR',
|
||||
'Armenia' => 'AM',
|
||||
'Australia' => 'AU',
|
||||
'Austria' => 'AT',
|
||||
'Azerbaijan' => 'AZ',
|
||||
'Bahamas' => 'BS',
|
||||
'Bangladesh' => 'BD',
|
||||
'Belarus' => 'BY',
|
||||
'Belgium' => 'BE',
|
||||
'Belize' => 'BZ',
|
||||
'Benin' => 'BJ',
|
||||
'Bhutan' => 'BT',
|
||||
'Bolivia' => 'BO',
|
||||
'Bosnia and Herz.' => 'BA',
|
||||
'Botswana' => 'BW',
|
||||
'Brazil' => 'BR',
|
||||
'Brunei' => 'BN',
|
||||
'Bulgaria' => 'BG',
|
||||
'Burkina Faso' => 'BF',
|
||||
'Burundi' => 'BI',
|
||||
'Cambodia' => 'KH',
|
||||
'Cameroon' => 'CM',
|
||||
'Canada' => 'CA',
|
||||
'Central African Rep.' => 'CF',
|
||||
'Chad' => 'TD',
|
||||
'Chile' => 'CL',
|
||||
'China' => 'CN',
|
||||
'Colombia' => 'CO',
|
||||
'Congo' => 'CG',
|
||||
'Costa Rica' => 'CR',
|
||||
'Croatia' => 'HR',
|
||||
'Cuba' => 'CU',
|
||||
'Cyprus' => 'CY',
|
||||
'Czech Rep.' => 'CZ',
|
||||
'Czech Republic' => 'CZ',
|
||||
'Côte d\'Ivoire' => 'CI',
|
||||
'Dem. Rep. Congo' => 'CD',
|
||||
'Dem. Rep. Korea' => 'KP',
|
||||
'Denmark' => 'DK',
|
||||
'Djibouti' => 'DJ',
|
||||
'Dominican Rep.' => 'DO',
|
||||
'Ecuador' => 'EC',
|
||||
'Egypt' => 'EG',
|
||||
'El Salvador' => 'SV',
|
||||
'Eq. Guinea' => 'GQ',
|
||||
'Eritrea' => 'ER',
|
||||
'Estonia' => 'EE',
|
||||
'Ethiopia' => 'ET',
|
||||
'Falkland Is.' => 'FK',
|
||||
'Fiji' => 'FJ',
|
||||
'Finland' => 'FI',
|
||||
'Fr. S. Antarctic Lands' => 'TF',
|
||||
'France' => 'FR',
|
||||
'Gabon' => 'GA',
|
||||
'Gambia' => 'GM',
|
||||
'Georgia' => 'GE',
|
||||
'Germany' => 'DE',
|
||||
'Ghana' => 'GH',
|
||||
'Greece' => 'GR',
|
||||
'Greenland' => 'GL',
|
||||
'Guatemala' => 'GT',
|
||||
'Guinea' => 'GN',
|
||||
'Guinea-Bissau' => 'GW',
|
||||
'Guyana' => 'GY',
|
||||
'Haiti' => 'HT',
|
||||
'Honduras' => 'HN',
|
||||
'Hungary' => 'HU',
|
||||
'Iceland' => 'IS',
|
||||
'India' => 'IN',
|
||||
'Indonesia' => 'ID',
|
||||
'Iran' => 'IR',
|
||||
'Iraq' => 'IQ',
|
||||
'Ireland' => 'IE',
|
||||
'Ireland {Republic}' => 'IE',
|
||||
'Israel' => 'IL',
|
||||
'Italy' => 'IT',
|
||||
'Jamaica' => 'JM',
|
||||
'Japan' => 'JP',
|
||||
'Jordan' => 'JO',
|
||||
'Kazakhstan' => 'KZ',
|
||||
'Kenya' => 'KE',
|
||||
'Korea' => 'KR',
|
||||
'Kuwait' => 'KW',
|
||||
'Kyrgyzstan' => 'KG',
|
||||
'Lao PDR' => 'LA',
|
||||
'Latvia' => 'LV',
|
||||
'Lebanon' => 'LB',
|
||||
'Lesotho' => 'LS',
|
||||
'Liberia' => 'LR',
|
||||
'Libya' => 'LY',
|
||||
'Lithuania' => 'LT',
|
||||
'Luxembourg' => 'LU',
|
||||
'Macedonia' => 'MK',
|
||||
'Madagascar' => 'MG',
|
||||
'Mainland China' => 'CN',
|
||||
'Malawi' => 'MW',
|
||||
'Malaysia' => 'MY',
|
||||
'Mali' => 'ML',
|
||||
'Malta' => 'MT',
|
||||
'Mauritania' => 'MR',
|
||||
'Mexico' => 'MX',
|
||||
'Moldova' => 'MD',
|
||||
'Mongolia' => 'MN',
|
||||
'Montenegro' => 'ME',
|
||||
'Morocco' => 'MA',
|
||||
'Mozamb' => 'MZ',
|
||||
'Myanmar' => 'MM',
|
||||
'Namibia' => 'NA',
|
||||
'Nepal' => 'NP',
|
||||
'Netherlands' => 'NL',
|
||||
'New Caledonia' => 'NC',
|
||||
'New Zealand' => 'NZ',
|
||||
'Nicaragua' => 'NI',
|
||||
'Niger' => 'NE',
|
||||
'Nigeria' => 'NG',
|
||||
'Norway' => 'NO',
|
||||
'Oman' => 'OM',
|
||||
'Pakistan' => 'PK',
|
||||
'Palestine' => 'PS',
|
||||
'Panama' => 'PA',
|
||||
'Papua New Guinea' => 'PG',
|
||||
'Paraguay' => 'PY',
|
||||
'Peru' => 'PE',
|
||||
'Philippines' => 'PH',
|
||||
'Poland' => 'PL',
|
||||
'Portugal' => 'PT',
|
||||
'Puerto Rico' => 'PR',
|
||||
'Qatar' => 'QA',
|
||||
'Romania' => 'RO',
|
||||
'Russia' => 'RU',
|
||||
'Russian Federation' => 'RU',
|
||||
'Rwanda' => 'RW',
|
||||
'S. Sudan' => 'SS',
|
||||
'Saudi Arabia' => 'SA',
|
||||
'Senegal' => 'SN',
|
||||
'Serbia' => 'RS',
|
||||
'Sierra Leone' => 'SL',
|
||||
'Slovakia' => 'SK',
|
||||
'Slovenia' => 'SI',
|
||||
'Solomon Is.' => 'SB',
|
||||
'Somalia' => 'SO',
|
||||
'South Africa' => 'ZA',
|
||||
'Spain' => 'ES',
|
||||
'Sri Lanka' => 'LK',
|
||||
'Sudan' => 'SD',
|
||||
'Suriname' => 'SR',
|
||||
'Swaziland' => 'SZ',
|
||||
'Sweden' => 'SE',
|
||||
'Switzerland' => 'CH',
|
||||
'Syria' => 'SY',
|
||||
'Taiwan' => 'TW',
|
||||
'Tajikistan' => 'TJ',
|
||||
'Tanzania' => 'TZ',
|
||||
'Thailand' => 'TH',
|
||||
'Timor-Leste' => 'TL',
|
||||
'Togo' => 'TG',
|
||||
'Trinidad and Tobago' => 'TT',
|
||||
'Tunisia' => 'TN',
|
||||
'Turkey' => 'TR',
|
||||
'Turkmenistan' => 'TM',
|
||||
'Uganda' => 'UG',
|
||||
'Ukraine' => 'UA',
|
||||
'United Arab Emirates' => 'AE',
|
||||
'United Kingdom' => 'GB',
|
||||
'United States' => 'US',
|
||||
'Uruguay' => 'UY',
|
||||
'Uzbekistan' => 'UZ',
|
||||
'Vanuatu' => 'VU',
|
||||
'Venezuela' => 'VE',
|
||||
'Vietnam' => 'VN',
|
||||
'W. Sahara' => 'EH',
|
||||
'Yemen' => 'YE',
|
||||
'Zambia' => 'ZM',
|
||||
'Zimbabwe' => 'ZW'
|
||||
];
|
||||
}
|
||||
}
|
|
@ -38,7 +38,7 @@ class TrendingAttributesWidget
|
|||
$organisationModel = ClassRegistry::init('Organisation');
|
||||
if (!empty($options['org_filter']) && is_array($options['org_filter'])) {
|
||||
foreach ($this->validOrgFilters as $filterKey) {
|
||||
if (!empty($options['org_filter'][$filterKey])) {
|
||||
if (isset($options['org_filter'][$filterKey])) {
|
||||
if ($filterKey === 'local') {
|
||||
$tempConditionBucket['Organisation.local'] = $options['org_filter']['local'];
|
||||
} else {
|
||||
|
@ -72,9 +72,10 @@ class TrendingAttributesWidget
|
|||
/** @var Event $eventModel */
|
||||
$attributeModel = ClassRegistry::init('Attribute');
|
||||
$threshold = empty($options['threshold']) ? 10 : $options['threshold'];
|
||||
$time_window = empty($options['time_window']) ? (7 * 24 * 60 * 60) : (int)$options['time_window'];
|
||||
if (is_string($time_window) && substr($time_window, -1) === 'd') {
|
||||
$time_window = ((int)substr($time_window, 0, -1)) * 24 * 60 * 60;
|
||||
if (is_string($options['time_window']) && substr($options['time_window'], -1) === 'd') {
|
||||
$time_window = ((int)substr($options['time_window'], 0, -1)) * 24 * 60 * 60;
|
||||
} else {
|
||||
$time_window = empty($options['time_window']) ? (7 * 24 * 60 * 60) : (int)$options['time_window'];
|
||||
}
|
||||
$conditions = $time_window === -1 ? [] : ['Attribute.timestamp >=' => time() - $time_window];
|
||||
$conditions['Attribute.deleted'] = 0;
|
||||
|
|
|
@ -30,9 +30,10 @@ class TrendingTagsWidget
|
|||
/** @var Event $eventModel */
|
||||
$eventModel = ClassRegistry::init('Event');
|
||||
$threshold = empty($options['threshold']) ? 10 : $options['threshold'];
|
||||
$time_window = empty($options['time_window']) ? (7 * 24 * 60 * 60) : $options['time_window'];
|
||||
if (is_string($time_window) && substr($time_window, -1) === 'd') {
|
||||
$time_window = ((int)substr($time_window, 0, -1)) * 24 * 60 * 60;
|
||||
if (is_string($options['time_window']) && substr($options['time_window'], -1) === 'd') {
|
||||
$time_window = ((int)substr($options['time_window'], 0, -1)) * 24 * 60 * 60;
|
||||
} else {
|
||||
$time_window = empty($options['time_window']) ? (7 * 24 * 60 * 60) : (int)$options['time_window'];
|
||||
}
|
||||
$params = $time_window === -1 ? [] : ['timestamp' => time() - $time_window];
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ class UserContributionToplistWidget
|
|||
public $params = [
|
||||
'days' => 'How many days back should the list go - for example, setting 7 will only show contributions in the past 7 days. (integer)',
|
||||
'month' => 'Who contributed most this month? (boolean)',
|
||||
'previous_month' => 'Who contributed most the previous, finished month? (boolean)',
|
||||
'year' => 'Which contributed most this year? (boolean)',
|
||||
'filter' => 'A list of filters by organisation meta information (nationality, sector, type, name, uuid, local (- expects a boolean or a list of boolean values)) to include. (dictionary, prepending values with ! uses them as a negation)',
|
||||
'limit' => 'Limits the number of displayed tags. Default: 10'
|
||||
|
@ -41,12 +42,26 @@ class UserContributionToplistWidget
|
|||
$condition = strtotime(sprintf("-%s days", $options['days']));
|
||||
} else if (!empty($options['month'])) {
|
||||
$condition = strtotime('first day of this month 00:00:00', time());
|
||||
} else if (!empty($options['previous_month'])) {
|
||||
$condition = strtotime('first day of previous month 00:00:00', time());
|
||||
$end_condition = strtotime('last day of last month 23:59:59', time());
|
||||
} else if (!empty($options['year'])) {
|
||||
$condition = strtotime('first day of this year 00:00:00', time());
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
return $condition;
|
||||
$conditions = [];
|
||||
if (!empty($condition)) {
|
||||
$datetime = new DateTime();
|
||||
$datetime->setTimestamp($condition);
|
||||
$conditions['Event.timestamp >='] = $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
if (!empty($end_condition)) {
|
||||
$datetime = new DateTime();
|
||||
$datetime->setTimestamp($end_condition);
|
||||
$conditions['Event.timestamp <='] = $datetime->format('Y-m-d H:i:s');
|
||||
}
|
||||
return $conditions;
|
||||
}
|
||||
|
||||
|
||||
|
@ -55,7 +70,7 @@ class UserContributionToplistWidget
|
|||
$params = ['conditions' => []];
|
||||
$timeConditions = $this->timeConditions($options);
|
||||
if ($timeConditions) {
|
||||
$params['conditions']['AND'][] = ['Event.timestamp >=' => $timeConditions];
|
||||
$params['conditions']['AND'][] = $timeConditions;
|
||||
}
|
||||
if (!empty($options['filter']) && is_array($options['filter'])) {
|
||||
foreach ($this->validFilterKeys as $filterKey) {
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
class SyncTool
|
||||
{
|
||||
|
||||
const ALLOWED_CERT_FILE_EXTENSIONS = ['pem', 'crt'];
|
||||
|
||||
/**
|
||||
* Take a server as parameter and return a HttpSocket object using the ssl options defined in the server settings
|
||||
* @param array|null $server
|
||||
|
@ -15,10 +18,10 @@ class SyncTool
|
|||
$params = ['compress' => true];
|
||||
if (!empty($server)) {
|
||||
if (!empty($server[$model]['cert_file'])) {
|
||||
$params['ssl_cafile'] = APP . "files" . DS . "certs" . DS . $server[$model]['id'] . '.pem';
|
||||
$params['ssl_cafile'] = APP . "files" . DS . "certs" . DS . $server[$model]['cert_file'];
|
||||
}
|
||||
if (!empty($server[$model]['client_cert_file'])) {
|
||||
$params['ssl_local_cert'] = APP . "files" . DS . "certs" . DS . $server[$model]['id'] . '_client.pem';
|
||||
$params['ssl_local_cert'] = APP . "files" . DS . "certs" . DS . $server[$model]['client_cert_file'];
|
||||
}
|
||||
if (!empty($server[$model]['self_signed'])) {
|
||||
$params['ssl_allow_self_signed'] = true;
|
||||
|
|
|
@ -6108,7 +6108,7 @@ class Server extends AppModel
|
|||
],
|
||||
'thumbnail_in_redis' => [
|
||||
'level' => self::SETTING_OPTIONAL,
|
||||
'description' => __('Store image thumbnails in Redis insteadof file system.'),
|
||||
'description' => __('Store image thumbnails in Redis instead of file system.'),
|
||||
'value' => false,
|
||||
'test' => 'testBool',
|
||||
'type' => 'boolean',
|
||||
|
@ -6406,6 +6406,14 @@ class Server extends AppModel
|
|||
'type' => 'boolean',
|
||||
'null' => true
|
||||
),
|
||||
'otp_issuer' => array(
|
||||
'level' => 2,
|
||||
'description' => __('If OTP is enabled, set the issuer string to an arbitrary value. Otherwise, MISP will default to "[MISP.org] MISP".'),
|
||||
'value' => false,
|
||||
'test' => 'testForEmpty',
|
||||
'type' => 'string',
|
||||
'null' => true
|
||||
),
|
||||
'email_otp_enabled' => array(
|
||||
'level' => 2,
|
||||
'description' => __('Enable two step authentication with a OTP sent by email. Requires e-mailing to be enabled. Warning: You cannot use it in combination with external authentication plugins.'),
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
<div style="position:relative;margin-top:20px;">
|
||||
<?php
|
||||
echo $this->element('view_galaxy_matrix', $data);
|
||||
?>
|
||||
</div>
|
||||
|
|
@ -10,14 +10,18 @@
|
|||
empty($widget['config']) ? '[]' : h(json_encode($widget['config'])),
|
||||
h($widget['widget']),
|
||||
sprintf(
|
||||
'<div class="grid-stack-item-content"><div class="widgetTitle"><span class="widgetTitleText">%s</span> %s %s</div><div class="widgetContent">%s</div></div>',
|
||||
'<div class="grid-stack-item-content"><div class="widgetTitle"><span class="widgetTitleText">%s</span> %s %s %s</div><div class="widgetContent">%s</div></div>',
|
||||
empty($widget['config']['alias']) ? h($widget['title']) : h($widget['config']['alias']),
|
||||
sprintf(
|
||||
'<span class="fas fa-edit edit-widget" title="%s"></span>',
|
||||
'<span class="fas fa-download export-widget useCursorPointer" title="%s"></span>',
|
||||
__('Export raw data')
|
||||
),
|
||||
sprintf(
|
||||
'<span class="fas fa-edit edit-widget useCursorPointer" title="%s"></span>',
|
||||
__('Configure widget')
|
||||
),
|
||||
sprintf(
|
||||
'<span class="fas fa-trash remove-widget" title="%s"></span>',
|
||||
'<span class="fas fa-trash remove-widget useCursorPointer" title="%s"></span>',
|
||||
__('Remove widget')
|
||||
),
|
||||
' '
|
||||
|
|
|
@ -91,16 +91,19 @@ echo $this->element('/genericElements/IndexTable/index_table', [
|
|||
],
|
||||
[
|
||||
'name' => __('Nationality'),
|
||||
'sort' => 'Organisation.nationality',
|
||||
'data_path' => 'Organisation',
|
||||
'class' => 'short',
|
||||
'element' => 'country',
|
||||
],
|
||||
[
|
||||
'name' => __('Sector'),
|
||||
'sort' => 'Organisation.sector',
|
||||
'data_path' => 'Organisation.sector',
|
||||
],
|
||||
[
|
||||
'name' => __('Type'),
|
||||
'sort' => 'Organisation.type',
|
||||
'data_path' => 'Organisation.type',
|
||||
],
|
||||
[
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 734d57edf5e76900cd0c8d5d48d6f5910e29b84e
|
||||
Subproject commit 7028860c0aa8c471324008d3dc651b7ea9e07c0a
|
|
@ -1 +1 @@
|
|||
Subproject commit 2ca2667d7668067f906e9601e0c97a79d4c7ccf1
|
||||
Subproject commit da801ab146fb622a6447c8d2922a95b6049bb70a
|
|
@ -1 +1 @@
|
|||
Subproject commit 911aafb91a38a68bbf6f5474c06e77a039469c93
|
||||
Subproject commit 1a94fcd666bbf7eb505d4fbbc47ef6170c375706
|
|
@ -5515,6 +5515,26 @@ function resetDashboardGrid(grid, save = true) {
|
|||
grid.removeWidget(el);
|
||||
saveDashboardState();
|
||||
});
|
||||
$('.export-widget').click(function() {
|
||||
var $element = $(this).parent().parent().parent();
|
||||
var container_id = $element.attr('id').substring(7);
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: baseurl + '/dashboards/renderWidget/' + container_id + '/exportjson:1',
|
||||
data: {
|
||||
config: $element.attr('config'),
|
||||
widget: $element.attr('widget')
|
||||
},
|
||||
success:function (data) {
|
||||
data = JSON.stringify(data, null, 2);
|
||||
var blob=new Blob([data], {type: 'application/json'});
|
||||
var link=window.document.createElement('a');
|
||||
link.href=window.URL.createObjectURL(blob);
|
||||
link.download=$element.attr('widget') + "_" + container_id + "_export.json";
|
||||
link.click();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function setHomePage() {
|
||||
|
|
Loading…
Reference in New Issue