From d72f9fdac0c0aaa20e146ef089577548d9f03d83 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 16 Dec 2020 17:38:40 +0100 Subject: [PATCH 01/22] SAML login in mobile console --- pandora_console/mobile/include/user.class.php | 59 ++++++++++++++++++- pandora_console/mobile/operation/home.php | 7 +++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/pandora_console/mobile/include/user.class.php b/pandora_console/mobile/include/user.class.php index 61267f2023..eb1af4c10d 100644 --- a/pandora_console/mobile/include/user.class.php +++ b/pandora_console/mobile/include/user.class.php @@ -86,6 +86,36 @@ class User { $system = System::getInstance(); + if ((bool) $system->getRequest('saml', false) === true) { + if ($system->getConfig('auth', 'mysql') !== 'saml') { + // Ignore. + return false; + } else { + \enterprise_include_once('include/auth/saml.php'); + $saml_user_id = enterprise_hook('saml_process_user_login'); + if (!$saml_user_id) { + $this->logged = false; + } else { + $this->logged = true; + $this->user = $saml_user_id; + $this->loginTime = time(); + $this->errorLogin = false; + } + + $this->saveLogin(); + return $this->logged; + } + } else if ($system->getConfig('auth', 'mysql') === 'saml') { + // Maybe back from SAML login. + $saml_session = $system->getSession('samlid', null); + if ($saml_session !== null) { + $this->user = $system->getSession('id_usuario', null); + $this->loginTime = time(); + $this->errorLogin = false; + $this->logged = true; + } + } + if (($user == null) && ($password == null)) { $user = $system->getRequest('user', null); $password = $system->getRequest('password', null); @@ -205,6 +235,12 @@ class User public function logout() { + $system = System::getInstance(); + if ($system->getConfig('auth', 'mysql') === 'saml') { + \enterprise_include_once('include/auth/saml.php'); + \enterprise_hook('saml_logout'); + } + $this->user = null; $this->logged = false; $this->loginTime = false; @@ -213,7 +249,6 @@ class User $this->needDoubleAuth = false; $this->errorDoubleAuth = false; - $system = System::getInstance(); $system->setSession('user', null); $system->sessionDestroy(); } @@ -286,7 +321,29 @@ class User 'name' => 'login_btn', ]; $ui->formAddSubmitButton($options); + $ui->endForm(); + + if ($system->getConfig('auth', 'mysql') === 'saml') { + // Add SAML login button. + $ui->beginForm(''); + $ui->formAddHtml( + html_print_input_hidden('action', 'login', true) + ); + $ui->formAddHtml( + html_print_input_hidden('saml', '1', true) + ); + $ui->formAddSubmitButton( + [ + 'value' => __('Login with SAML'), + 'icon' => 'arrow-r', + 'icon_pos' => 'right', + 'name' => 'login_button_saml', + ] + ); + $ui->endForm(''); + } + $ui->contentAddHtml(''); $ui->endContent(); $ui->showPage(); diff --git a/pandora_console/mobile/operation/home.php b/pandora_console/mobile/operation/home.php index b172d16021..d49f42eb0b 100644 --- a/pandora_console/mobile/operation/home.php +++ b/pandora_console/mobile/operation/home.php @@ -59,6 +59,12 @@ class Home 'menu_item' => true, 'icon' => 'groups', ]; + $items['console'] = [ + 'name' => __('Visual consoles'), + 'filename' => 'vconsole.php', + 'menu_item' => true, + 'icon' => 'consoles', + ]; if (!$system->getConfig('metaconsole')) { $items['alerts'] = [ @@ -74,6 +80,7 @@ class Home 'menu_item' => true, 'icon' => 'agents', ]; + $items['modules'] = [ 'name' => __('Modules'), 'filename' => 'modules.php', From 03569f79b6a41b6af643c971a09ce183168bd19d Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 16 Dec 2020 18:06:12 +0100 Subject: [PATCH 02/22] Avoid users with success login in SAML access console if not in console --- pandora_console/mobile/include/user.class.php | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/pandora_console/mobile/include/user.class.php b/pandora_console/mobile/include/user.class.php index eb1af4c10d..749233df99 100644 --- a/pandora_console/mobile/include/user.class.php +++ b/pandora_console/mobile/include/user.class.php @@ -86,34 +86,41 @@ class User { $system = System::getInstance(); - if ((bool) $system->getRequest('saml', false) === true) { - if ($system->getConfig('auth', 'mysql') !== 'saml') { - // Ignore. - return false; - } else { + if ($system->getConfig('auth', 'mysql') === 'saml') { + if ((bool) $system->getRequest('saml', false) === true) { \enterprise_include_once('include/auth/saml.php'); $saml_user_id = enterprise_hook('saml_process_user_login'); if (!$saml_user_id) { $this->logged = false; + $this->errorLogin = $system->getConfig('auth_error'); + \enterprise_hook('saml_logout', [true]); } else { $this->logged = true; $this->user = $saml_user_id; $this->loginTime = time(); $this->errorLogin = false; } - - $this->saveLogin(); - return $this->logged; } - } else if ($system->getConfig('auth', 'mysql') === 'saml') { + // Maybe back from SAML login. $saml_session = $system->getSession('samlid', null); if ($saml_session !== null) { $this->user = $system->getSession('id_usuario', null); - $this->loginTime = time(); - $this->errorLogin = false; - $this->logged = true; + if ($this->user !== null) { + $this->loginTime = time(); + $this->errorLogin = false; + $this->logged = true; + } else { + // SAML Session OK but not in DB. + $this->logged = false; + $this->errorLogin = __( + 'User cannot log in into this console, please contact administrator' + ); + } } + + $this->saveLogin(); + return $this->logged; } if (($user == null) && ($password == null)) { @@ -265,7 +272,12 @@ class User if ($this->errorLogin) { $options['type'] = 'onStart'; $options['title_text'] = __('Login Failed'); - $options['content_text'] = __('User not found in database or incorrect password.'); + if ($this->errorLogin !== false) { + $options['content_text'] = $this->errorLogin; + } else { + $options['content_text'] = __('User not found in database or incorrect password.'); + } + $ui->addDialog($options); } From 5b176d9370e2921714591c111ada5b9fa49f41c3 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 16 Dec 2020 18:30:21 +0100 Subject: [PATCH 03/22] minor fixes --- pandora_console/mobile/include/user.class.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pandora_console/mobile/include/user.class.php b/pandora_console/mobile/include/user.class.php index 749233df99..3a46ebac1d 100644 --- a/pandora_console/mobile/include/user.class.php +++ b/pandora_console/mobile/include/user.class.php @@ -100,6 +100,9 @@ class User $this->loginTime = time(); $this->errorLogin = false; } + + $this->saveLogin(); + return $this->logged; } // Maybe back from SAML login. @@ -117,10 +120,10 @@ class User 'User cannot log in into this console, please contact administrator' ); } - } - $this->saveLogin(); - return $this->logged; + $this->saveLogin(); + return $this->logged; + } } if (($user == null) && ($password == null)) { From b7e64f14776a62616617ea290033e652dfae7217 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 18 Dec 2020 13:23:35 +0100 Subject: [PATCH 04/22] Visual console list mobile view --- .../images/visual_console.menu.png | Bin 0 -> 8400 bytes pandora_console/mobile/include/style/main.css | 6 + .../mobile/include/system.class.php | 2 +- pandora_console/mobile/index.php | 12 ++ pandora_console/mobile/operation/home.php | 16 +- .../mobile/operation/visualmaps.php | 187 +++++++++++------- 6 files changed, 150 insertions(+), 73 deletions(-) create mode 100644 pandora_console/images/visual_console.menu.png diff --git a/pandora_console/images/visual_console.menu.png b/pandora_console/images/visual_console.menu.png new file mode 100644 index 0000000000000000000000000000000000000000..818beae6f2355799893dd2be8baaca5fa5239824 GIT binary patch literal 8400 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
'.__('Please remember that any attempts to access this page will be recorded on the %s System Database.', get_product_name()); } diff --git a/pandora_console/mobile/index.php b/pandora_console/mobile/index.php index 71b6db82ac..6cb2b4a56c 100644 --- a/pandora_console/mobile/index.php +++ b/pandora_console/mobile/index.php @@ -349,6 +349,18 @@ switch ($action) { $agent = new Agent(); $agent->show(); break; + + case 'visualmap': + $id = $system->getRequest('id', null); + if ($id !== null) { + $vc = new Visualmap(); + $vc->show(); + } else { + // Show a list ov VC. + $vc_list = new Visualmaps(); + $vc_list->show(); + } + break; } break; } diff --git a/pandora_console/mobile/operation/home.php b/pandora_console/mobile/operation/home.php index d49f42eb0b..1fd8a79a47 100644 --- a/pandora_console/mobile/operation/home.php +++ b/pandora_console/mobile/operation/home.php @@ -59,12 +59,16 @@ class Home 'menu_item' => true, 'icon' => 'groups', ]; - $items['console'] = [ - 'name' => __('Visual consoles'), - 'filename' => 'vconsole.php', - 'menu_item' => true, - 'icon' => 'consoles', - ]; + + if ((bool) $system->getConfig('legacy_vc', false) === false) { + // Show Visual consoles only if new system is enabled. + $items['visualmap'] = [ + 'name' => __('Visual consoles'), + 'filename' => 'visualmaps.php', + 'menu_item' => true, + 'icon' => 'visual_console', + ]; + } if (!$system->getConfig('metaconsole')) { $items['alerts'] = [ diff --git a/pandora_console/mobile/operation/visualmaps.php b/pandora_console/mobile/operation/visualmaps.php index 632f0ff1a9..1159e14409 100644 --- a/pandora_console/mobile/operation/visualmaps.php +++ b/pandora_console/mobile/operation/visualmaps.php @@ -1,56 +1,107 @@ checkACL($this->acl)) { - $this->correct_acl = true; + $this->allowed = true; } else { - $this->correct_acl = false; + $this->allowed = false; } } + /** + * Prepare filters for current view. + * + * @return void + */ private function getFilters() { $system = System::getInstance(); $user = User::getInstance(); - $this->default_filters['group'] = true; - $this->default_filters['type'] = true; + $this->defaultFilters['group'] = true; + $this->defaultFilters['type'] = true; $this->group = (int) $system->getRequest('group', __('Group')); if (!$user->isInGroup($this->acl, $this->group)) { @@ -61,7 +112,7 @@ class Visualmaps $this->group = 0; } else { $this->default = false; - $this->default_filters['group'] = false; + $this->defaultFilters['group'] = false; } $this->type = $system->getRequest('type', __('Type')); @@ -69,14 +120,19 @@ class Visualmaps $this->type = '0'; } else { $this->default = false; - $this->default_filters['type'] = false; + $this->defaultFilters['type'] = false; } } + /** + * Run view. + * + * @return void + */ public function show() { - if (!$this->correct_acl) { + if (!$this->allowed) { $this->show_fail_acl(); } else { $this->getFilters(); @@ -85,12 +141,19 @@ class Visualmaps } + /** + * Show a message about failed ACL access. + * + * @return void + */ private function show_fail_acl() { $error['type'] = 'onStart'; $error['title_text'] = __('You don\'t have access to this page'); $error['content_text'] = System::getDefaultACLFailText(); - if (class_exists('HomeEnterprise')) { + + // Redirect to main page. + if (class_exists('HomeEnterprise') === true) { $home = new HomeEnterprise(); } else { $home = new Home(); @@ -100,6 +163,11 @@ class Visualmaps } + /** + * Show visual console list header. + * + * @return void + */ private function show_visualmaps() { $ui = Ui::getInstance(); @@ -124,57 +192,44 @@ class Visualmaps } + /** + * Show list of visual consoles. + * + * @return void + */ private function listVisualmapsHtml() { $system = System::getInstance(); $ui = Ui::getInstance(); - // Create filter - $where = []; - // Order by type field - $where['order'] = 'type'; + $visualmaps = visual_map_get_user_layouts(); - if ($this->group != '0') { - $where['id_group'] = $this->group; - } - - if ($this->type != '0') { - $where['type'] = $this->type; - } - - // Only display maps of "All" group if user is administrator - // or has "RR" privileges, otherwise show only maps of user group - $id_user = $system->getConfig('id_user'); - $own_info = get_user_info($id_user); - if ($own_info['is_admin'] || $system->checkACL($this->acl)) { - $maps = visual_map_get_user_layouts(); - } else { - $maps = visual_map_get_user_layouts($id_user, false, false, false); - } - - if (empty($maps)) { - $maps = []; - } - - $list = []; - foreach ($maps as $map) { - $row = []; - $row[__('Name')] = ''.io_safe_output($map['name']).''; - // $row[__('Type')] = $map['type']; - $row[__('Group')] = ui_print_group_icon($map['id_group'], true, 'groups_small', '', false); - $list[] = $row; - } - - if (count($maps) == 0) { + if (empty($visualmaps) === true) { $ui->contentAddHtml('

'.__('No maps defined').'

'); } else { $table = new Table(); + // Without header jquery.mobile crashes. + $table->addHeader(['']); $table->id = 'list_visualmaps'; - $table->importFromHash($list); - $ui->contentAddHtml($table->getHTML()); - } + foreach ($visualmaps as $map) { + $link = ''.io_safe_output($map['name']).''; - $ui->contentAddLinkListener('list_visualmaps'); + $row = $link; + $row .= ui_print_group_icon( + $map['id_group'], + true, + 'groups_small', + '', + false + ); + $table->addRow([ $map['id'].' flex-center' => $row]); + } + + $ui->contentAddHtml($table->getHTML()); + $ui->contentAddLinkListener('list_visualmaps'); + } } From bc3616e6c5e28fe0db33f878457da90cba8283bd Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 18 Dec 2020 13:40:00 +0100 Subject: [PATCH 05/22] visual console mobile wip --- pandora_console/mobile/index.php | 17 ++++++++--------- pandora_console/mobile/operation/home.php | 2 +- pandora_server/util/recon_scripts/ipmi-recon.pl | 0 3 files changed, 9 insertions(+), 10 deletions(-) mode change 100644 => 100755 pandora_server/util/recon_scripts/ipmi-recon.pl diff --git a/pandora_console/mobile/index.php b/pandora_console/mobile/index.php index 6cb2b4a56c..bfeb6fe538 100644 --- a/pandora_console/mobile/index.php +++ b/pandora_console/mobile/index.php @@ -350,16 +350,15 @@ switch ($action) { $agent->show(); break; + case 'visualmaps': + // Show a list ov VC. + $vc_list = new Visualmaps(); + $vc_list->show(); + break; + case 'visualmap': - $id = $system->getRequest('id', null); - if ($id !== null) { - $vc = new Visualmap(); - $vc->show(); - } else { - // Show a list ov VC. - $vc_list = new Visualmaps(); - $vc_list->show(); - } + $vc = new Visualmap(); + $vc->show(); break; } break; diff --git a/pandora_console/mobile/operation/home.php b/pandora_console/mobile/operation/home.php index 1fd8a79a47..59b16683a7 100644 --- a/pandora_console/mobile/operation/home.php +++ b/pandora_console/mobile/operation/home.php @@ -62,7 +62,7 @@ class Home if ((bool) $system->getConfig('legacy_vc', false) === false) { // Show Visual consoles only if new system is enabled. - $items['visualmap'] = [ + $items['visualmaps'] = [ 'name' => __('Visual consoles'), 'filename' => 'visualmaps.php', 'menu_item' => true, diff --git a/pandora_server/util/recon_scripts/ipmi-recon.pl b/pandora_server/util/recon_scripts/ipmi-recon.pl old mode 100644 new mode 100755 From f72dabb04c948e9dca1b93b4d98e3000b76ca9f2 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 21 Dec 2020 14:23:50 +0100 Subject: [PATCH 06/22] New VC in mobile view (RC1) --- pandora_console/include/styles/dashboards.css | 11 + pandora_console/mobile/include/ui.class.php | 121 +++++ .../mobile/operation/visualmap.php | 416 ++++++++++++++---- 3 files changed, 471 insertions(+), 77 deletions(-) diff --git a/pandora_console/include/styles/dashboards.css b/pandora_console/include/styles/dashboards.css index bbbf993112..02263d7463 100644 --- a/pandora_console/include/styles/dashboards.css +++ b/pandora_console/include/styles/dashboards.css @@ -530,3 +530,14 @@ div#main_pure { #select_multiple_modules_filtered > div > div > * { flex: auto; } + +/* Mobile trick */ +.ui-mobile-viewport.ui-overlay-c > #main_page > .ui-content { + overflow: visible; + overflow-x: visible; + margin: 0 !important; + padding: 0 !important; +} +.ui-mobile-viewport.ui-overlay-c > #main_page > .ui-content div.label > p { + margin: 0; +} diff --git a/pandora_console/mobile/include/ui.class.php b/pandora_console/mobile/include/ui.class.php index 1992268990..f87319b66b 100755 --- a/pandora_console/mobile/include/ui.class.php +++ b/pandora_console/mobile/include/ui.class.php @@ -1,4 +1,5 @@ \n"; echo " \n"; + $loaded = []; + foreach ($this->cssList as $filename) { + if (in_array($filename, $loaded) === true) { + continue; + } + + array_push($loaded, $filename); + + $url_css = ui_get_full_url($filename, false, false, false); + echo ''."\n\t"; + } + + $js_loaded = []; + foreach ($this->jsList as $filename) { + if (in_array($filename, $js_loaded) === true) { + continue; + } + + array_push($js_loaded, $filename); + + $url_css = ui_get_full_url($filename, false, false, false); + echo ''."\n\t"; + } + echo " \n"; echo " \n"; echo include_javascript_dependencies_flot_graph(false, false); @@ -857,6 +896,88 @@ class Ui } + /** + * Add CSS file to be loaded. + * + * @param string $name Css file name, as in ui_require_css. + * @param string $path Path where search for css file. + * + * @return boolean True if success, False if not. + */ + public function require_css( + string $name, + string $path='include/styles/' + ):bool { + $filename = $path.$name.'.css'; + $system = System::getInstance(); + + if (file_exists($filename) === false + && file_exists($system->getConfig('homedir').'/'.$filename) === false + && file_exists($system->getConfig('homedir').'/'.ENTERPRISE_DIR.'/'.$filename) === false + ) { + return false; + } + + if (in_array($filename, $this->cssList) === false) { + $this->cssList[] = $filename; + } + + return true; + } + + + /** + * Add JS file to be loaded. + * + * @param string $name JAvascript file name, as in + * \ui_require_javascript_file. + * @param string $path Path where search for Javascript file. + * + * @return boolean True if success, False if not. + */ + public function require_javascript( + string $name, + string $path='include/javascript/' + ):bool { + $filename = $path.$name.'.js'; + $system = System::getInstance(); + + if (file_exists($filename) === false + && file_exists($system->getConfig('homedir').'/'.$filename) === false + && file_exists($system->getConfig('homedir').'/'.ENTERPRISE_DIR.'/'.$filename) === false + ) { + return false; + } + + if (in_array($filename, $this->jsList) === false) { + $this->jsList[] = $filename; + } + + return true; + } + + + /** + * Forces reload to retrieve with and height. + * + * @return void + */ + public function retrieveViewPort() + { + ?> + + + checkACL($this->acl)) { - $this->correct_acl = true; + $this->validAcl = true; } else { - $this->correct_acl = false; + $this->validAcl = false; } } + /** + * Retrieve filters. + * + * @return void + */ private function getFilters() { $system = System::getInstance(); $this->id = (int) $system->getRequest('id', 0); + $this->width = (int) $system->getRequest('width', 0); + $this->height = (int) $system->getRequest('height', 0); + + if ($this->width < $this->height) { + $w = $this->width; + $this->width = $this->height; + $this->height = $w; + $this->rotate = true; + } } + /** + * Renders the view. + * + * @return void + */ public function show() { $this->getFilters(); + if (empty($this->width) === true + && empty($this->height) === true + ) { + // Reload forcing user to send width and height. + $ui = Ui::getInstance(); + $ui->retrieveViewPort(); + } + $this->visualmap = db_get_row( 'tlayout', 'id', @@ -65,7 +164,7 @@ class Visualmap } $this->checkVisualmapACL($this->visualmap['id_group']); - if (!$this->correct_acl) { + if (!$this->validAcl) { $this->show_fail_acl(); } @@ -73,12 +172,25 @@ class Visualmap } - private function show_fail_acl() + /** + * Shows an error if ACL fails. + * + * @param string $msg Optional message. + * + * @return void + */ + private function show_fail_acl(string $msg='') { $error['type'] = 'onStart'; - $error['title_text'] = __('You don\'t have access to this page'); - $error['content_text'] = System::getDefaultACLFailText(); - if (class_exists('HomeEnterprise')) { + if (empty($msg) === false) { + $error['title_text'] = __('Error'); + $error['content_text'] = $msg; + } else { + $error['title_text'] = __('You don\'t have access to this page'); + $error['content_text'] = System::getDefaultACLFailText(); + } + + if (class_exists('HomeEnterprise') === true) { $home = new HomeEnterprise(); } else { $home = new Home(); @@ -88,11 +200,18 @@ class Visualmap } - public function ajax($parameter2=false) + /** + * Ajax call manager. + * + * @param string $parameter2 Not sure why is doing this stuff. + * + * @return void + */ + public function ajax(string $parameter2='') { $system = System::getInstance(); $this->checkVisualmapACL($this->visualmap['id_group']); - if (!$this->correct_acl) { + if ((bool) $this->validAcl === false) { $this->show_fail_acl(); } else { switch ($parameter2) { @@ -100,18 +219,55 @@ class Visualmap $map_id = $system->getRequest('map_id', '0'); $width = $system->getRequest('width', '400'); $height = $system->getRequest('height', '400'); - visual_map_print_visual_map($map_id, false, true, $width, $height); + visual_map_print_visual_map( + $map_id, + false, + true, + $width, + $height + ); + exit; + + default: exit; } } } + /** + * Generates HTML code to view target Visual console. + * + * @return void + */ private function show_visualmap() { $ui = Ui::getInstance(); $system = System::getInstance(); + include_once $system->getConfig('homedir').'/vendor/autoload.php'; + + // Query parameters. + $visualConsoleId = (int) $system->getRequest('id'); + + // Refresh interval in seconds. + $refr = (int) get_parameter('refr', $system->getConfig('vc_refr')); + + // Check groups can access user. + $aclUserGroups = []; + if (!users_can_manage_group_all('AR')) { + $aclUserGroups = array_keys(users_get_groups(false, 'AR')); + } + + // Load Visual Console. + $visualConsole = null; + try { + $visualConsole = VisualConsole::fromDB(['id' => $visualConsoleId]); + } catch (Throwable $e) { + $this->show_fail_acl($e->getMessage()); + exit; + } + $ui->createPage(); $ui->createDefaultHeader( sprintf( @@ -127,61 +283,167 @@ class Visualmap ] ) ); + + $ui->require_css('visual_maps'); + $ui->require_css('register'); + $ui->require_css('dashboards'); + $ui->require_javascript('pandora_visual_console'); + $ui->require_javascript('pandora_dashboards'); + $ui->require_javascript('jquery.cookie'); + $ui->require_css('modal'); + $ui->require_css('form'); + $ui->showFooter(false); $ui->beginContent(); - - ob_start(); - $rendered_map = '
'; - $rendered_map .= html_print_image('images/spinner.gif', true); - $rendered_map .= '
'; - ob_clean(); - - $ui->contentAddHtml($rendered_map); $ui->contentAddHtml( - "" + include_javascript_d3(true) ); + + $size = [ + 'width' => $this->width, + 'height' => $this->height, + ]; + + $visualConsoleData = $visualConsole->toArray(); + $ratio_visualconsole = ($visualConsoleData['height'] / $visualConsoleData['width']); + $ratio_t = ($size['width'] / $visualConsoleData['width']); + $radio_h = ($size['height'] / $visualConsoleData['height']); + + $visualConsoleData['width'] = $size['width']; + $visualConsoleData['height'] = ($size['width'] * $ratio_visualconsole); + + if ($visualConsoleData['height'] > $size['height']) { + $ratio_t = $radio_h; + + $visualConsoleData['height'] = $size['height']; + $visualConsoleData['width'] = ($size['height'] / $ratio_visualconsole); + } + + $uniq = uniqid(); + + $output = '
'; + // Style. + $style = 'width:'.$visualConsoleData['width'].'px;'; + $style .= 'height:'.$visualConsoleData['height'].'px;'; + $style .= 'background-size: cover;'; + + // Class. + $class = 'visual-console-container-dashboard c-'.$uniq; + // Id. + $id = 'visual-console-container-'.$uniq; + $output .= '
'; + $output .= '
'; + $output .= '
'; + + // Check groups can access user. + $aclUserGroups = []; + if (users_can_manage_group_all('AR') === true) { + $aclUserGroups = array_keys( + users_get_groups(false, 'AR') + ); + } + + $ignored_params['refr'] = ''; + \ui_require_javascript_file( + 'tiny_mce', + 'include/javascript/tiny_mce/' + ); + \ui_require_javascript_file( + 'pandora_visual_console', + 'include/javascript/', + true + ); + \include_javascript_d3(); + \visual_map_load_client_resources(); + + // Load Visual Console Items. + $visualConsoleItems = VisualConsole::getItemsFromDB( + $visualConsoleId, + $aclUserGroups, + $ratio_t + ); + + // Horrible trick! due to the use of tinyMCE + // it is necessary to modify specific classes of each + // of the visual consoles. + $output .= ''; + + $visualConsoleItems = array_reduce( + $visualConsoleItems, + function ($carry, $item) use ($ratio_t) { + $carry[] = $item->toArray(); + return $carry; + }, + [] + ); + + $settings = \json_encode( + [ + 'props' => $visualConsoleData, + 'items' => $visualConsoleItems, + 'baseUrl' => ui_get_full_url('/', false, false, false), + 'ratio' => $ratio_t, + 'size' => $size, + 'cellId' => $uniq, + ] + ); + + $output .= ''; + + $ui->contentAddHtml($output); + + // Load Visual Console Items. + $visualConsoleItems = VisualConsole::getItemsFromDB( + $visualConsoleId, + $aclUserGroups + ); + + $javascript = ob_get_clean(); + $ui->contentAddHtml($javascript); + $ui->endContent(); $ui->showPage(); } From 025288d9fe5282b1fe35fc7ab2b058c62541e931 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 21 Dec 2020 18:10:46 +0100 Subject: [PATCH 07/22] Fixes on VC navigation (mobile) --- pandora_console/include/functions.php | 6 +++++- pandora_console/mobile/include/user.class.php | 17 +++++++++++++++-- pandora_console/mobile/operation/visualmap.php | 2 ++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index f79c56b764..c63b928049 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -2249,12 +2249,16 @@ function check_login($output=true) return true; } } else { + include_once $config['homedir'].'/mobile/include/db.class.php'; + include_once $config['homedir'].'/mobile/include/system.class.php'; include_once $config['homedir'].'/mobile/include/user.class.php'; if (isset($_SESSION['user'])) { - $user = $_SESSION['user']; + $user = User::getInstance(); $id_user = $user->getIdUser(); if (is_user($id_user)) { + $_SESSION['id_usuario'] = $id_user; + $config['id_user'] = $id_user; return true; } } diff --git a/pandora_console/mobile/include/user.class.php b/pandora_console/mobile/include/user.class.php index 3a46ebac1d..e6ef007206 100644 --- a/pandora_console/mobile/include/user.class.php +++ b/pandora_console/mobile/include/user.class.php @@ -38,8 +38,15 @@ class User $system = System::getInstance(); $user = $system->getSession('user', null); + if (is_object($user) === false) { + $user = json_decode($user, true); + } + if (!empty($user)) { - self::$instance = $user; + self::$instance = new self(); + foreach ($user as $k => $v) { + self::$instance->{$k} = $v; + } } else { self::$instance = new self(); } @@ -49,6 +56,12 @@ class User } + public function jsonSerialize() + { + return get_object_vars($this); + } + + public function saveLogin() { if ($this->logged) { @@ -59,7 +72,7 @@ class User $config['id_user'] = $this->user; $system->setSessionBase('id_usuario', $this->user); - $system->setSession('user', $this); + $system->setSession('user', json_encode($this->jsonSerialize())); config_user_set_custom_config(); } diff --git a/pandora_console/mobile/operation/visualmap.php b/pandora_console/mobile/operation/visualmap.php index 1667e8caf0..1313fc0f24 100644 --- a/pandora_console/mobile/operation/visualmap.php +++ b/pandora_console/mobile/operation/visualmap.php @@ -153,6 +153,8 @@ class Visualmap $ui->retrieveViewPort(); } + $this->height -= 39; + $this->visualmap = db_get_row( 'tlayout', 'id', From ac8af7ee527df8ec08260ec3fae63e52411b7be6 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 22 Dec 2020 14:40:04 +0100 Subject: [PATCH 08/22] Use mobile navitagion in VC items while using mobile view --- .../rest-api/models/VisualConsole/Item.php | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/pandora_console/include/rest-api/models/VisualConsole/Item.php b/pandora_console/include/rest-api/models/VisualConsole/Item.php index 13ddc6590f..31d17b55c5 100644 --- a/pandora_console/include/rest-api/models/VisualConsole/Item.php +++ b/pandora_console/include/rest-api/models/VisualConsole/Item.php @@ -1058,6 +1058,16 @@ class Item extends CachedModel { global $config; + $mobile_navigation = false; + + if (isset($_SERVER['PHP_SELF']) === true + && (strstr($_SERVER['PHP_SELF'], 'mobile/') !== false + || strstr($_SERVER['HTTP_REFERER'], 'mobile/') !== false) + ) { + $mobile_navigation = true; + } + + error_log(obhd($_SERVER['PHP_SELF'])); // Load side libraries. include_once $config['homedir'].'/include/functions_ui.php'; if (\is_metaconsole()) { @@ -1070,6 +1080,7 @@ class Item extends CachedModel $linkedAgent = static::extractLinkedAgent($data); $baseUrl = \ui_get_full_url('index.php'); + $mobileUrl = \ui_get_full_url('mobile/index.php'); // TODO: There's a feature to get the link from the label. if (static::$useLinkedVisualConsole === true @@ -1117,6 +1128,15 @@ class Item extends CachedModel * We are in a regular console. */ + if ($mobile_navigation === true) { + return $mobileUrl.'?'.http_build_query( + [ + 'page' => 'visualmap', + 'id' => $vcId, + ] + ); + } + return $baseUrl.'?'.http_build_query( [ 'sec' => 'network', @@ -1190,6 +1210,15 @@ class Item extends CachedModel ]; } + if ($mobile_navigation === true) { + return $mobileUrl.'?'.http_build_query( + [ + 'page' => 'module_graph', + 'id' => $moduleId, + ] + ); + } + return $baseUrl.'?'.http_build_query($queryParams); } else if (\is_metaconsole() && \can_user_access_node()) { /* @@ -1265,6 +1294,15 @@ class Item extends CachedModel * We are in a regular console. */ + if ($mobile_navigation === true) { + return $mobileUrl.'?'.http_build_query( + [ + 'page' => 'agent', + 'id' => $agentId, + ] + ); + } + return $baseUrl.'?'.http_build_query( [ 'sec' => 'estado', From 79ac7f43f7964f1777af94325c1ea6289a3426da Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 22 Dec 2020 17:01:49 +0100 Subject: [PATCH 09/22] Style fixes (minor) event details --- pandora_console/mobile/include/style/main.css | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pandora_console/mobile/include/style/main.css b/pandora_console/mobile/include/style/main.css index 347dce6732..2b29f6025a 100755 --- a/pandora_console/mobile/include/style/main.css +++ b/pandora_console/mobile/include/style/main.css @@ -349,6 +349,22 @@ tr.events { font-size: 12px !important; } +table.event_details { + height: 14px; + color: #424242; +} + +table.event_details tr th { + text-align: left; +} + +table.event_details td:not(:first-child) { + display: flex; + flex-direction: row; + align-items: center; + justify-items: start; +} + table#list_events th { font-size: 12px !important; font-weight: bolder !important; From c429ec59d5a5c36b59709efca640d8f77bc65bde Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 22 Dec 2020 17:04:29 +0100 Subject: [PATCH 10/22] module status ball css fix --- pandora_console/mobile/include/style/main.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pandora_console/mobile/include/style/main.css b/pandora_console/mobile/include/style/main.css index 2b29f6025a..60dd6f625d 100755 --- a/pandora_console/mobile/include/style/main.css +++ b/pandora_console/mobile/include/style/main.css @@ -1363,6 +1363,12 @@ span.nobold * { display: block !important; } +.status_rounded_rectangles.forced_title { + width: 1em; + height: 1em; + border-radius: 50%; +} + #list_Modules *, #list_agent_Modules *, #list_agents *, From 6ada7d46c85ba0210d1b51acbc9ebde37cfe85e5 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 22 Dec 2020 17:09:21 +0100 Subject: [PATCH 11/22] event select list margin issue css --- pandora_console/mobile/include/style/main.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pandora_console/mobile/include/style/main.css b/pandora_console/mobile/include/style/main.css index 60dd6f625d..81d6ce7af1 100755 --- a/pandora_console/mobile/include/style/main.css +++ b/pandora_console/mobile/include/style/main.css @@ -1369,6 +1369,11 @@ span.nobold * { border-radius: 50%; } +.ui-content .ui-listview, +.ui-panel-inner > .ui-listview { + margin: 0 !important; +} + #list_Modules *, #list_agent_Modules *, #list_agents *, From c55bdb6e6d4add120779c85dac2d55ffccfba722 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Tue, 22 Dec 2020 17:16:38 +0100 Subject: [PATCH 12/22] Changed global to agent search because is only searching for agents... --- pandora_console/mobile/operation/home.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/mobile/operation/home.php b/pandora_console/mobile/operation/home.php index 59b16683a7..c2afb324ed 100644 --- a/pandora_console/mobile/operation/home.php +++ b/pandora_console/mobile/operation/home.php @@ -165,7 +165,7 @@ class Home $options = [ 'name' => 'free_search', 'value' => $this->global_search, - 'placeholder' => __('Global search'), + 'placeholder' => __('Agent search'), ]; $ui->formAddInputSearch($options); $ui->endForm(); From d4b8916c54b733e4a941e4b3723a7bedcc943ca5 Mon Sep 17 00:00:00 2001 From: Junichi Satoh Date: Fri, 26 Mar 2021 17:11:10 +0900 Subject: [PATCH 13/22] Fixed following problems. - alert actions cannot be copied/removed by any users - alert actions cannot be modified by users with 'LM' even if alerts belong to the same group of users. And users with 'LM' can now copy alert actions/templates in All group to the group to which the user belongs. --- .../godmode/alerts/alert_actions.php | 115 +++++++----------- .../godmode/alerts/alert_commands.php | 19 +-- .../godmode/alerts/alert_templates.php | 35 +++--- .../godmode/alerts/configure_alert_action.php | 69 ++++++----- .../alerts/configure_alert_template.php | 109 +++++++++-------- pandora_console/include/functions_alerts.php | 14 ++- 6 files changed, 179 insertions(+), 182 deletions(-) diff --git a/pandora_console/godmode/alerts/alert_actions.php b/pandora_console/godmode/alerts/alert_actions.php index cdff3dbe2b..9fa04651dc 100644 --- a/pandora_console/godmode/alerts/alert_actions.php +++ b/pandora_console/godmode/alerts/alert_actions.php @@ -61,6 +61,11 @@ if (defined('METACONSOLE')) { $sec = 'galertas'; } +$can_edit_all = false; +if (check_acl_restricted_all($config['id_user'], 0, 'LM')) { + $can_edit_all = true; +} + // Header. if (defined('METACONSOLE')) { alerts_meta_print_header(); @@ -79,30 +84,13 @@ if ($copy_action) { $al_action = alerts_get_alert_action($id); - if (!check_acl_restricted_all($config['id_user'], $al_action['id_group'], 'LM')) { - db_pandora_audit( - 'ACL Violation', - 'Trying to access Alert Management' - ); - include 'general/noaccess.php'; - exit; - } - if ($al_action !== false) { - // If user tries to copy an action with group=ALL. - if ($al_action['id_group'] == 0) { - // Then must have "PM" access privileges. - if (! check_acl($config['id_user'], 0, 'PM')) { - db_pandora_audit( - 'ACL Violation', - 'Trying to access Alert Management' - ); - include 'general/noaccess.php'; - exit; - } + // If user who doesn't have permission to modify group all tries to copy an action with group=ALL. + if ($can_edit_all == false && $al_action['id_group'] == 0) { + $al_action['id_group'] = users_get_first_group(false, 'LM', false); } else { $own_info = get_user_info($config['id_user']); - if ($own_info['is_admin'] || check_acl($config['id_user'], 0, 'PM')) { + if ($can_edit_all == true || check_acl($config['id_user'], 0, 'PM')) { $own_groups = array_keys( users_get_groups($config['id_user'], 'LM') ); @@ -125,7 +113,7 @@ if ($copy_action) { } } - $result = alerts_clone_alert_action($id); + $result = alerts_clone_alert_action($id, $al_action['id_group']); if ($result) { db_pandora_audit( @@ -397,10 +385,9 @@ foreach ($actions as $action) { $data = []; - if (check_acl_restricted_all($config['id_user'], $action['id_group'], 'LM')) { - $data[0] = ''.$action['name'].''; - } else { - $data[0] = $action['name']; + $data[0] = ''.$action['name'].''; + if ($action['id_group'] == 0 && $can_edit_all == false) { + $data[0] .= ui_print_help_tip(__('You cannot edit this action, You don\'t have the permission to edit All group.'), true); } $data[1] = $action['command_name']; @@ -420,7 +407,7 @@ foreach ($actions as $action) { $data[4] = ''; if (is_central_policies_on_node() === false - && check_acl_restricted_all($config['id_user'], $action['id_group'], 'LM') + && check_acl($config['id_user'], $action['id_group'], 'LM') ) { $table->cellclass[] = [ 3 => 'action_buttons', @@ -430,10 +417,35 @@ foreach ($actions as $action) { $id_action = $action['id']; $text_confirm = __('Are you sure?'); - $data[3] = ''.html_print_image('images/copy.png', true, ['class' => 'invert_filter']).''; - $data[4] = ''.html_print_image('images/cross.png', true, ['class' => 'invert_filter']).''; + $data[3] = '
'; + $data[3] .= html_print_input_hidden('copy_action', 1, true); + $data[3] .= html_print_input_hidden('id', $id_action, true); + $data[3] .= html_print_input_image( + 'dup', + 'images/copy.png', + 1, + '', + true, + ['title' => __('Duplicate')] + ); + $data[3] .= '
'; + + if ($action['id_group'] != 0 || $can_edit_all == true) { + $data[4] = '
'; + $data[4] .= html_print_input_hidden('delete_action', 1, true); + $data[4] .= html_print_input_hidden('id', $id_action, true); + $data[4] .= html_print_input_image( + 'del', + 'images/cross.png', + 1, + '', + true, + ['title' => __('Delete')] + ); + $data[4] .= '
'; + } else { + $data[4] = ''; + } } array_push($table->data, $data); @@ -458,44 +470,3 @@ if (is_central_policies_on_node() === false) { enterprise_hook('close_meta_frame'); ?> - - - diff --git a/pandora_console/godmode/alerts/alert_commands.php b/pandora_console/godmode/alerts/alert_commands.php index 8407a88f97..3d13557b09 100644 --- a/pandora_console/godmode/alerts/alert_commands.php +++ b/pandora_console/godmode/alerts/alert_commands.php @@ -28,12 +28,6 @@ if (! check_acl($config['id_user'], 0, 'LM')) { exit; } -if (!check_acl($config['id_user'], 0, 'PM') && !is_user_admin($config['id_user'])) { - echo "'; -} - if (is_metaconsole()) { $sec = 'advanced'; } else { @@ -465,6 +459,17 @@ if (is_ajax()) { return; } +// This check should be after ajax. Because, ajax will be called from configure_alert_action. +if (!check_acl($config['id_user'], 0, 'PM') && !is_user_admin($config['id_user +'])) { + echo "
"; + echo "

".__('Command managem +ent is limited to administrator users or user profiles with permissions over Pan +dora FMS management').'

'; + echo '
'; +} + enterprise_hook('open_meta_frame'); if ($update_command) { @@ -716,4 +721,4 @@ enterprise_hook('close_meta_frame'); }); } - \ No newline at end of file + diff --git a/pandora_console/godmode/alerts/alert_templates.php b/pandora_console/godmode/alerts/alert_templates.php index 6763e7f6e5..91a23ce366 100644 --- a/pandora_console/godmode/alerts/alert_templates.php +++ b/pandora_console/godmode/alerts/alert_templates.php @@ -401,17 +401,16 @@ foreach ($templates as $template) { $data = []; - if (check_acl_restricted_all($config['id_user'], $template['id_group'], 'LM')) { - $data[0] = ''.$template['name'].''; - } else { - $data[0] = $template['name']; + $data[0] = ''.$template['name'].''; + if (!check_acl_restricted_all($config['id_user'], $template['id_group'], 'LM')) { + $data[0] .= ui_print_help_tip(__('You cannot edit this alert template, You don\'t have the permission to edit All group.'), true); } $data[1] = ui_print_group_icon($template['id_group'], true); $data[3] = alerts_get_alert_templates_type_name($template['type']); if (is_central_policies_on_node() === false - && check_acl_restricted_all($config['id_user'], $template['id_group'], 'LM') + && check_acl($config['id_user'], $template['id_group'], 'LM') ) { $table->cellclass[][4] = 'action_buttons'; $data[4] = '
'; @@ -427,18 +426,20 @@ foreach ($templates as $template) { ); $data[4] .= '
'; - $data[4] .= '
'; - $data[4] .= html_print_input_hidden('delete_template', 1, true); - $data[4] .= html_print_input_hidden('id', $template['id'], true); - $data[4] .= html_print_input_image( - 'del', - 'images/cross.png', - 1, - '', - true, - ['title' => __('Delete')] - ); - $data[4] .= '
'; + if (check_acl_restricted_all($config['id_user'], $template['id_group'], 'LM')) { + $data[4] .= '
'; + $data[4] .= html_print_input_hidden('delete_template', 1, true); + $data[4] .= html_print_input_hidden('id', $template['id'], true); + $data[4] .= html_print_input_image( + 'del', + 'images/cross.png', + 1, + '', + true, + ['title' => __('Delete')] + ); + $data[4] .= '
'; + } } else { $data[4] = ''; } diff --git a/pandora_console/godmode/alerts/configure_alert_action.php b/pandora_console/godmode/alerts/configure_alert_action.php index 7d44ffd25b..bf0dbff521 100644 --- a/pandora_console/godmode/alerts/configure_alert_action.php +++ b/pandora_console/godmode/alerts/configure_alert_action.php @@ -58,7 +58,7 @@ if (defined('METACONSOLE')) { if ($al_action !== false) { $own_info = get_user_info($config['id_user']); - if ($own_info['is_admin'] || check_acl($config['id_user'], 0, 'PM')) { + if ($own_info['is_admin'] || check_acl_restricted_all($config['id_user'], 0, 'LM')) { $own_groups = array_keys(users_get_groups($config['id_user'], 'LM')); } else { $own_groups = array_keys(users_get_groups($config['id_user'], 'LM', false)); @@ -91,8 +91,14 @@ if ($al_action !== false) { true ); } + $is_in_group = true; } +if (!$is_in_group && $al_action['id_group'] != 0) { + db_pandora_audit('ACL Violation', 'Trying to access unauthorized alert action configuration'); + include 'general/noaccess.php'; + exit; +} $is_central_policies_on_node = is_central_policies_on_node(); @@ -102,6 +108,11 @@ if ($is_central_policies_on_node === true) { ); } +$disabled = !$is_in_group; +$disabled_attr = ''; +if ($disabled) { + $disabled_attr = 'disabled="disabled"'; +} $name = ''; $id_command = ''; @@ -116,15 +127,6 @@ if ($id) { $group = $action['id_group']; $action_threshold = $action['action_threshold']; $create_wu_integria = $action['create_wu_integria']; - - if (!check_acl_restricted_all($config['id_user'], $action['id_group'], 'LM')) { - db_pandora_audit( - 'ACL Violation', - 'Trying to access Alert Management' - ); - include 'general/noaccess.php'; - exit; - } } // Hidden div with help hint to fill with javascript. @@ -175,7 +177,7 @@ $table->data[0][1] = html_print_input_text( '', '', '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); if (io_safe_output($name) == 'Monitoring Event') { @@ -194,7 +196,7 @@ $own_info = get_user_info($config['id_user']); $return_all_group = false; -if (users_can_manage_group_all('LW') === true) { +if (users_can_manage_group_all('LW') === true || $disabled) { $return_all_group = true; } @@ -211,7 +213,7 @@ $table->data[1][1] = '
'.html_print_select_groups( false, true, '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ).'
'; $table->colspan[1][1] = 2; @@ -245,11 +247,11 @@ $table->data[2][1] = html_print_select_from_sql( true, false, false, - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[2][1] .= ' '; if ($is_central_policies_on_node === false - && check_acl($config['id_user'], 0, 'PM') + && check_acl($config['id_user'], 0, 'PM') && !$disabled ) { $table->data[2][1] .= __('Create Command'); $table->data[2][1] .= ''; @@ -272,7 +274,7 @@ $table->data[3][1] = html_print_extended_select_for_time( false, true, '', - $is_central_policies_on_node, + $is_central_policies_on_node | $disabled, false, '', false, @@ -308,7 +310,7 @@ $table->data[6][0] = __('Create workunit on recovery').ui_print_help_tip( __('If closed status is set on recovery, a workunit will be added to the ticket in Integria IMS rather that closing the ticket.'), true ); -$table->data[6][1] = html_print_checkbox_switch_extended('create_wu_integria', 1, $create_wu_integria, false, '', '', true); +$table->data[6][1] = html_print_checkbox_switch_extended('create_wu_integria', 1, $create_wu_integria, false, '', $disabled_attr, true); for ($i = 1; $i <= $config['max_macro_fields']; $i++) { $table->data['field'.$i][0] = html_print_image( @@ -328,12 +330,16 @@ for ($i = 1; $i <= $config['max_macro_fields']; $i++) { $table->data['field'.$i][1] .= html_print_input_hidden( 'field'.$i.'_value', (!empty($action['field'.$i]) || $action['field'.$i] == 0) ? $action['field'.$i] : '', - true + true, + '', + $disabled_attr ); $table->data['field'.$i][2] .= html_print_input_hidden( 'field'.$i.'_recovery_value', (!empty($action['field'.$i.'_recovery']) || $action['field'.$i] == 0) ? $action['field'.$i.'_recovery'] : '', - true + true, + '', + $disabled_attr ); } @@ -346,18 +352,7 @@ if ($is_central_policies_on_node === false) { echo '
'; if ($id) { html_print_input_hidden('id', $id); - if ($al_action['id_group'] == 0) { - // Then must have "PM" access privileges. - if (check_acl($config['id_user'], 0, 'PM')) { - html_print_input_hidden('update_action', 1); - html_print_submit_button( - __('Update'), - 'create', - false, - 'class="sub upd"' - ); - } - } else { + if (!$disabled) { html_print_input_hidden('update_action', 1); html_print_submit_button( __('Update'), @@ -365,6 +360,12 @@ if ($is_central_policies_on_node === false) { false, 'class="sub upd"' ); + } else { + echo '
'; + echo '
'; + html_print_submit_button(__('Back'), 'back', false, 'class="sub upd"'); + echo '
'; + echo '
'; } } else { html_print_input_hidden('create_action', 1); @@ -608,6 +609,7 @@ $(document).ready (function () { for (i = 1; i <= max_fields; i++) { var old_value = ''; var old_recovery_value = ''; + var disabled = ''; var field_row = data["fields_rows"][i]; var $table_macros_field = $('#table_macros-field' + i); @@ -623,6 +625,7 @@ $(document).ready (function () { == ("hidden-field" + i + "_value")) { old_value = $("[name=field" + i + "_value]").val(); + disabled = $("[name=field" + i + "_value]").attr('disabled'); } if (($("[name=field" + i + "_recovery_value]").attr('id')) @@ -689,6 +692,10 @@ $(document).ready (function () { $('#help_alert_macros_hint').html()); } + if (disabled) { + $("[name=field" + i + "_value]").attr('disabled','disabled'); + $("[name=field" + i + "_recovery_value]").attr('disabled','disabled'); + } $table_macros_field.show(); } diff --git a/pandora_console/godmode/alerts/configure_alert_template.php b/pandora_console/godmode/alerts/configure_alert_template.php index cbfa4f0d8d..7486c97a94 100644 --- a/pandora_console/godmode/alerts/configure_alert_template.php +++ b/pandora_console/godmode/alerts/configure_alert_template.php @@ -38,7 +38,6 @@ $step = (int) get_parameter('step', 1); // We set here the number of steps. define('LAST_STEP', 3); -// If user tries to duplicate/edit a template with group=ALL then must have "PM" access privileges if ($duplicate_template) { $source_id = (int) get_parameter('source_id'); $a_template = alerts_get_alert_template($source_id); @@ -52,19 +51,14 @@ if (defined('METACONSOLE')) { $sec = 'galertas'; } +$can_edit_all = false; +if (check_acl_restricted_all($config['id_user'], 0, 'LM')) { + $can_edit_all = true; +} + if ($a_template !== false) { // If user tries to duplicate/edit a template with group=ALL if ($a_template['id_group'] == 0) { - if (users_can_manage_group_all('LM') === false) { - db_pandora_audit( - 'ACL Violation', - 'Trying to access Alert Management' - ); - include 'general/noaccess.php'; - exit; - } - - // Header if (defined('METACONSOLE')) { alerts_meta_print_header(); } else { @@ -146,7 +140,12 @@ if ($a_template !== false) { if ($duplicate_template) { $source_id = (int) get_parameter('source_id'); - $id = alerts_duplicate_alert_template($source_id); + // If user doesn't have the permission to access All group and source template is All group, then group is changed to the first group of user. + if ($can_edit_all == false && a_template['id_group'] == 0) { + $a_template['id_group'] = users_get_first_group(false, 'LM', false); + } + + $id = alerts_duplicate_alert_template($source_id, $a_template['id_group']); if ($id) { db_pandora_audit('Template alert management', 'Duplicate alert template '.$source_id.' clone to '.$id); @@ -386,6 +385,14 @@ $create_alert = (bool) get_parameter('create_alert'); $create_template = (bool) get_parameter('create_template'); $update_template = (bool) get_parameter('update_template'); +$disabled = false; +if (!$create_alert && !$create_template) { + // When user edits a template with All group, user must have "LM" access privileges againt All group. + if ($a_template['id_group'] == 0 && !$can_edit_all) { + $disabled = true; + } +} + $name = ''; $description = ''; $type = ''; @@ -602,7 +609,7 @@ if ($step == 2) { 1, $monday, true, - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[0][1] .= __('Tue'); $table->data[0][1] .= html_print_checkbox( @@ -610,7 +617,7 @@ if ($step == 2) { 1, $tuesday, true, - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[0][1] .= __('Wed'); $table->data[0][1] .= html_print_checkbox( @@ -618,7 +625,7 @@ if ($step == 2) { 1, $wednesday, true, - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[0][1] .= __('Thu'); $table->data[0][1] .= html_print_checkbox( @@ -626,7 +633,7 @@ if ($step == 2) { 1, $thursday, true, - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[0][1] .= __('Fri'); $table->data[0][1] .= html_print_checkbox( @@ -634,7 +641,7 @@ if ($step == 2) { 1, $friday, true, - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[0][1] .= __('Sat'); $table->data[0][1] .= html_print_checkbox( @@ -642,7 +649,7 @@ if ($step == 2) { 1, $saturday, true, - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[0][1] .= __('Sun'); $table->data[0][1] .= html_print_checkbox( @@ -650,7 +657,7 @@ if ($step == 2) { 1, $sunday, true, - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[0][2] = __('Use special days list'); @@ -659,7 +666,7 @@ if ($step == 2) { 1, $special_day, true, - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[1][0] = __('Time from'); @@ -680,7 +687,7 @@ if ($step == 2) { '', '', '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[1][2] = __('Time to'); $table->data[1][3] = html_print_input_text( @@ -700,7 +707,7 @@ if ($step == 2) { '', '', '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->colspan['threshold'][1] = 3; @@ -716,7 +723,7 @@ if ($step == 2) { false, true, '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[3][0] = __('Min. number of alerts'); @@ -737,7 +744,7 @@ if ($step == 2) { '', '', '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[3][2] = __('Reset counter for non-sustained alerts'); @@ -750,7 +757,7 @@ if ($step == 2) { 1, $min_alerts_reset_counter, true, - $is_central_policies_on_node, + $is_central_policies_on_node | $disabled, '', false, $create_template == 1 ? 'checked=checked' : '' @@ -774,7 +781,7 @@ if ($step == 2) { '', '', '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[4][2] = __('Disable event'); @@ -783,7 +790,7 @@ if ($step == 2) { 1, $disable_event, true, - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[5][0] = __('Default action'); @@ -811,7 +818,7 @@ if ($step == 2) { true, false, false, - $is_central_policies_on_node, + $is_central_policies_on_node | $disabled, false, false, 0 @@ -833,7 +840,7 @@ if ($step == 2) { false, false, '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[6][1] .= ''; $table->data[6][1] .= ' '.html_print_checkbox('matches_value', 1, $matches, true); @@ -886,7 +893,8 @@ if ($step == 2) { '', 5, 255, - true + true, + $disabled ); $table->colspan['min'][1] = 3; @@ -897,7 +905,8 @@ if ($step == 2) { '', 5, 255, - true + true, + $disabled ); $table->colspan['max'][1] = 3; @@ -940,7 +949,7 @@ if ($step == 2) { false, false, '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->colspan[0][1] = 2; @@ -966,7 +975,7 @@ if ($step == 2) { 0, '', false, - $is_central_policies_on_node, + $is_central_policies_on_node | $disabled, "removeTinyMCE('textarea_field".$i."')", '', true @@ -979,7 +988,7 @@ if ($step == 2) { 0, '', true, - $is_central_policies_on_node, + $is_central_policies_on_node | $disabled, "addTinyMCE('textarea_field".$i."')", '', true @@ -995,7 +1004,7 @@ if ($step == 2) { 'class="fields" min-height-40px', true, '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); // Recovery. @@ -1007,7 +1016,7 @@ if ($step == 2) { 0, '', false, - $is_central_policies_on_node, + $is_central_policies_on_node | $disabled, "removeTinyMCE('textarea_field".$i."_recovery')", '', true @@ -1020,7 +1029,7 @@ if ($step == 2) { 0, '', true, - $is_central_policies_on_node, + $is_central_policies_on_node | $disabled, "addTinyMCE('textarea_field".$i."_recovery')", '', true @@ -1036,7 +1045,7 @@ if ($step == 2) { 'class="fields min-height-40px"', true, '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); } } else { @@ -1093,7 +1102,7 @@ if ($step == 2) { '', '', '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); @@ -1103,8 +1112,12 @@ if ($step == 2) { $return_all_group = false; - if (users_can_manage_group_all('LM') === true) { + if (users_can_manage_group_all('LM') === true || $disabled) { $return_all_group = true; + } else { + if ($id_group == 0) { + $id_group = users_get_first_group(false, 'LM', false); + } } $table->data[0][1] .= ' '; @@ -1121,7 +1134,7 @@ if ($step == 2) { false, true, '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ).'
'; @@ -1134,7 +1147,7 @@ if ($step == 2) { '', true, '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); $table->data[2][0] = __('Priority'); @@ -1149,7 +1162,7 @@ if ($step == 2) { false, false, '', - $is_central_policies_on_node + $is_central_policies_on_node | $disabled ); if (defined('METACONSOLE')) { @@ -1186,16 +1199,6 @@ if ($id) { html_print_input_hidden('create_template', 1); } -$disabled = false; -if (!$create_alert && !$create_template) { - if ($a_template['id_group'] == 0) { - // then must have "PM" access privileges - if (! check_acl($config['id_user'], 0, 'PM')) { - $disabled = true; - } - } -} - if (!$disabled) { if ($is_central_policies_on_node === false) { if ($step >= LAST_STEP) { diff --git a/pandora_console/include/functions_alerts.php b/pandora_console/include/functions_alerts.php index 9e27001d15..2baebc6a51 100644 --- a/pandora_console/include/functions_alerts.php +++ b/pandora_console/include/functions_alerts.php @@ -439,10 +439,11 @@ function alerts_delete_alert_action($id_alert_action) * Clone an alert action. * * @param int Id of the original alert action + * @param int Agent group id if it wants to be changed when clone. * * @return mixed Id of the cloned action or false in case of fail. */ -function alerts_clone_alert_action($id_alert_action) +function alerts_clone_alert_action($id_alert_action, $id_group) { $id_alert_action = safe_int($id_alert_action, 1); if (empty($id_alert_action)) { @@ -455,6 +456,10 @@ function alerts_clone_alert_action($id_alert_action) return false; } + if ($id_group != '') { + $action['id_group'] = $id_group; + } + unset($action['id']); return alerts_create_alert_action($action['name'].' '.__('copy'), $action['id_alert_command'], $action); @@ -1121,10 +1126,11 @@ function alerts_get_alert_template_field3_recovery($id_alert_template) * Duplicates an alert template. * * @param int Id of an alert template. + * @param int Agent group id if it wants to be changed when duplicate. * * @return mixed Duplicates an alert template or false if something goes wrong. */ -function alerts_duplicate_alert_template($id_alert_template) +function alerts_duplicate_alert_template($id_alert_template, $id_group) { $template = alerts_get_alert_template($id_alert_template); @@ -1132,6 +1138,10 @@ function alerts_duplicate_alert_template($id_alert_template) return false; } + if ($id_group != '') { + $template['id_group'] = $id_group; + } + $name = io_safe_input(__('Copy of').' ').$template['name']; $type = $template['type']; From 201d3194de8156ebc9e5e6fcce940b4ae735dec9 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 7 Apr 2021 18:17:08 +0200 Subject: [PATCH 14/22] Some inclusions in mobile view (MC) and minor fixes --- pandora_console/mobile/include/style/main.css | 7 +- pandora_console/mobile/index.php | 11 ++-- pandora_console/mobile/operation/agent.php | 9 ++- pandora_console/mobile/operation/home.php | 64 +++++++++---------- 4 files changed, 50 insertions(+), 41 deletions(-) diff --git a/pandora_console/mobile/include/style/main.css b/pandora_console/mobile/include/style/main.css index 2f4e8065d8..1feae8b3c9 100755 --- a/pandora_console/mobile/include/style/main.css +++ b/pandora_console/mobile/include/style/main.css @@ -1296,6 +1296,11 @@ table.tactical_bars { -webkit-border-radius: 15px !important; } +.ui-header.ui-bar-a .ui-btn-icon-notext .ui-btn-inner .ui-icon { + margin-top: -3px; + margin-left: 3.5px; +} + #login_btn-container .ui-icon { background-color: #333 !important; border-radius: 15px !important; @@ -1431,7 +1436,7 @@ div.nodata_container { } .ui-icon-delete { - margin-top: -3px !important; + margin-top: -3px; } .empty_advice { diff --git a/pandora_console/mobile/index.php b/pandora_console/mobile/index.php index a4ed9f7d21..5087661bd7 100644 --- a/pandora_console/mobile/index.php +++ b/pandora_console/mobile/index.php @@ -183,7 +183,6 @@ switch ($action) { } return; - break; case 'login': if ($user->login() && $user->isLogged()) { if (file_exists('../enterprise/load_enterprise.php')) { @@ -279,9 +278,6 @@ switch ($action) { $page = 'events'; break; - case 'Group view': - break; - case 'Alert detail': $page = 'alerts'; break; @@ -295,6 +291,11 @@ switch ($action) { $id_map = (int) db_get_value('id', 'tlayout', 'name', $section_data); $_GET['id'] = $id_map; break; + + case 'Group view': + default: + // No content. + break; } } @@ -351,7 +352,7 @@ switch ($action) { break; case 'visualmaps': - // Show a list ov VC. + // Show a list of VC. $vc_list = new Visualmaps(); $vc_list->show(); break; diff --git a/pandora_console/mobile/operation/agent.php b/pandora_console/mobile/operation/agent.php index 0d2b327de2..6441a0c21c 100644 --- a/pandora_console/mobile/operation/agent.php +++ b/pandora_console/mobile/operation/agent.php @@ -425,7 +425,12 @@ class Agent success: function(r) { $.mobile.hidePageLoadingMsg(); var className = $('#list_agent_Modules').attr('class'); - $('#list_agent_Modules').parent().html(r); + if (document.getElementById('list_agent_Modules') == null) { + $($('p.empty_advice')[0]).parent().html(r); + className = 'ui-responsive table-stroke ui-table ui-table-reflow'; + } else { + $('#list_agent_Modules').parent().html(r); + } $('#list_agent_Modules').addClass(className); }, error: function(r, t, e) { @@ -468,7 +473,7 @@ class Agent 'id_agent' => $this->id, 'all_modules' => true, 'status' => -1, - 'name' => $name_filter, + 'name' => '%'.$name_filter.'%', ]; } diff --git a/pandora_console/mobile/operation/home.php b/pandora_console/mobile/operation/home.php index 7a89510380..0fa872df7a 100644 --- a/pandora_console/mobile/operation/home.php +++ b/pandora_console/mobile/operation/home.php @@ -70,42 +70,40 @@ class Home ]; } - if (!$system->getConfig('metaconsole')) { - $items['alerts'] = [ - 'name' => __('Alerts'), - 'filename' => 'alerts.php', - 'menu_item' => true, - 'icon' => 'alerts', - ]; + $items['alerts'] = [ + 'name' => __('Alerts'), + 'filename' => 'alerts.php', + 'menu_item' => true, + 'icon' => 'alerts', + ]; - $items['agents'] = [ - 'name' => __('Agents'), - 'filename' => 'agents.php', - 'menu_item' => true, - 'icon' => 'agents', - ]; + $items['agents'] = [ + 'name' => __('Agents'), + 'filename' => 'agents.php', + 'menu_item' => true, + 'icon' => 'agents', + ]; - $items['modules'] = [ - 'name' => __('Modules'), - 'filename' => 'modules.php', - 'menu_item' => true, - 'icon' => 'modules', - ]; + $items['modules'] = [ + 'name' => __('Modules'), + 'filename' => 'modules.php', + 'menu_item' => true, + 'icon' => 'modules', + ]; - // Not in home. - $items['agent'] = [ - 'name' => __('Agent'), - 'filename' => 'agent.php', - 'menu_item' => false, - 'icon' => '', - ]; - $items['module_graph'] = [ - 'name' => __('Module graph'), - 'filename' => 'module_graph.php', - 'menu_item' => false, - 'icon' => '', - ]; - } + // Not in home. + $items['agent'] = [ + 'name' => __('Agent'), + 'filename' => 'agent.php', + 'menu_item' => false, + 'icon' => '', + ]; + $items['module_graph'] = [ + 'name' => __('Module graph'), + 'filename' => 'module_graph.php', + 'menu_item' => false, + 'icon' => '', + ]; $this->pagesItems = $items; } From 56ff24567562a221d940caa5b757c4dc846cd803 Mon Sep 17 00:00:00 2001 From: Junichi Satoh Date: Wed, 14 Apr 2021 11:07:13 +0900 Subject: [PATCH 15/22] Fixed the order of arguments in 'create_profile' as the same as comment in pandora_manage.pl and documentation, and fixed 'profile_name' was not encoded. Plus, added new cli, 'update_profile'. --- pandora_server/util/pandora_manage.pl | 45 +++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 3a9fc1d3ba..38f0656555 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -193,6 +193,7 @@ sub help_screen{ help_screen_line('--delete_profile', ' ', 'Delete perfil from user'); help_screen_line('--add_profile_to_user', ' []', 'Add a profile in group to a user'); help_screen_line('--create_profile', " \n\t \n\t \n\t \n\t ", 'Create profile'); + help_screen_line('--update_profile', " \n\t \n\t \n\t \n\t ", 'Modify profile'); help_screen_line('--disable_eacl', '', 'Disable enterprise ACL system'); help_screen_line('--enable_eacl', '', 'Enable enterprise ACL system'); help_screen_line('--disable_double_auth', '', 'Disable the double authentication for the specified user'); @@ -568,13 +569,29 @@ sub pandora_create_profile ($$$$$$$$$$$$$$$$$$$$$$$$$) { $event_view, $event_edit, $event_management, $report_view, $report_edit, $report_management, $map_view, $map_edit, $map_management, $vconsole_view, $vconsole_edit, $vconsole_management, $pandora_management) = @_; - return db_insert ($dbh, 'id_up', 'INSERT INTO tperfil (name,incident_edit,incident_view,incident_management,agent_view,agent_edit,alert_edit,user_management,db_management,alert_management,pandora_management,report_view,report_edit,report_management,event_view,event_edit,event_management,agent_disable,map_view,map_edit,map_management,vconsole_view,vconsole_edit,vconsole_management) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);', - $profile_name, $incident_view,$incident_edit, $incident_management, $agent_view, + return db_insert ($dbh, 'id_up', 'INSERT INTO tperfil (name,incident_view,incident_edit,incident_management,agent_view,agent_edit,agent_disable,alert_edit,alert_management,user_management,db_management,event_view,event_edit,event_management,report_view,report_edit,report_management,map_view,map_edit,map_management,vconsole_view,vconsole_edit,vconsole_management,pandora_management) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);', + safe_input($profile_name), $incident_view,$incident_edit, $incident_management, $agent_view, $agent_edit, $agent_disable, $alert_edit, $alert_management, $user_management, $db_management, $event_view, $event_edit, $event_management, $report_view, $report_edit, $report_management, $map_view, $map_edit, $map_management, $vconsole_view, $vconsole_edit, $vconsole_management, $pandora_management); } +########################################################################## +#### Update profile. +########################################################################### +sub pandora_update_profile ($$$$$$$$$$$$$$$$$$$$$$$$$) { + my ($dbh, $profile_name, $incident_view,$incident_edit, $incident_management, $agent_view, + $agent_edit, $agent_disable, $alert_edit, $alert_management, $user_management, $db_management, + $event_view, $event_edit, $event_management, $report_view, $report_edit, $report_management, + $map_view, $map_edit, $map_management, $vconsole_view, $vconsole_edit, $vconsole_management, $pandora_management) = @_; + + return db_update ($dbh, 'UPDATE tperfil SET incident_view = ?, incident_edit = ?, incident_management = ?, agent_view = ?, agent_edit = ?, agent_disable = ?, alert_edit = ?, alert_management = ?, user_management = ?, db_management = ?, event_view = ?, event_edit = ?, event_management = ?, report_view = ?, report_edit = ?, report_management = ?, map_view = ?, map_edit = ?, map_management = ?, vconsole_view = ?, vconsole_edit = ?, vconsole_management = ?, pandora_management = ? WHERE name=?;', + $incident_view,$incident_edit, $incident_management, $agent_view, + $agent_edit, $agent_disable, $alert_edit, $alert_management, $user_management, $db_management, + $event_view, $event_edit, $event_management, $report_view, $report_edit, $report_management, + $map_view, $map_edit, $map_management, $vconsole_view, $vconsole_edit, $vconsole_management, $pandora_management, safe_input($profile_name)); +} + ########################################################################## ## Delete a profile from the given user/group. ########################################################################## @@ -4005,6 +4022,26 @@ sub cli_create_profile() { $map_view, $map_edit, $map_management, $vconsole_view, $vconsole_edit, $vconsole_management, $pandora_management); } +############################################################################## +## Update profile. +## Related option: --update_profile +############################################################################## +# +sub cli_update_profile() { + my ($profile_name,$incident_view,$incident_edit,$incident_management,$agent_view, + $agent_edit,$agent_disable,$alert_edit,$alert_management,$user_management,$db_management, + $event_view,$event_edit,$event_management,$report_view,$report_edit,$report_management, + $map_view,$map_edit,$map_management,$vconsole_view,$vconsole_edit,$vconsole_management,$pandora_management) = @ARGV[2..25]; + + my $id_profile = get_profile_id($dbh,$profile_name); + exist_check($id_profile,'profile',$profile_name); + + pandora_update_profile ($dbh, $profile_name, $incident_view, $incident_edit, $incident_management, $agent_view, + $agent_edit, $agent_disable, $alert_edit, $alert_management, $user_management, $db_management, + $event_view, $event_edit, $event_management, $report_view, $report_edit, $report_management, + $map_view, $map_edit, $map_management, $vconsole_view, $vconsole_edit, $vconsole_management, $pandora_management); +} + ############################################################################## # Delete profile. # Related option: --delete_profile @@ -7432,6 +7469,10 @@ sub pandora_manage_main ($$$) { param_check($ltotal, 24); cli_create_profile(); } + elsif ($param eq '--update_profile') { + param_check($ltotal, 24); + cli_update_profile(); + } elsif ($param eq '--delete_profile') { param_check($ltotal, 3); cli_delete_profile(); From b6ea565118a53ab0785c11890bd6531e7de181d8 Mon Sep 17 00:00:00 2001 From: marcos Date: Wed, 14 Apr 2021 12:07:38 +0200 Subject: [PATCH 16/22] add black theme to widget dashboard --- pandora_console/include/functions_html.php | 12 +- pandora_console/include/functions_ui.php | 2 +- .../include/graphs/flot/jquery.flot.js | 1034 +++++++++-------- .../include/graphs/flot/jquery.flot.min.js | 4 +- .../include/graphs/functions_flot.php | 5 +- pandora_console/include/graphs/pandora.d3.js | 2 + .../include/lib/Dashboard/Widget.php | 6 + .../lib/Dashboard/Widgets/events_list.php | 7 +- .../Dashboard/Widgets/system_group_status.php | 2 +- .../lib/Dashboard/Widgets/tree_view.php | 3 + .../include/styles/pandora_black.css | 43 +- .../include/styles/select2_dark.min.css | 10 +- pandora_console/views/dashboard/cell.php | 3 + 13 files changed, 597 insertions(+), 536 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index b566d376ec..c5a16434f8 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -885,6 +885,11 @@ function html_print_select( "; } + $select2 = 'select2.min'; + if ($config['style'] === 'pandora_black') { + $select2 = 'select2_dark.min'; + } + if ($multiple === false) { if (is_ajax()) { $output .= '