From 5d41cf7d04e95c59ee6bab6e1143c964e8d87e05 Mon Sep 17 00:00:00 2001 From: miguel angel rasteu Date: Wed, 27 Sep 2023 15:47:44 +0200 Subject: [PATCH 01/72] #12139 Fix new_agent api request --- pandora_console/include/functions_api.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index 7e22befbee..068c5409f6 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -2014,7 +2014,7 @@ function api_set_new_agent($id_node, $thrash2, $other, $trhash3, $return=false, } returnError('No agent alias specified'); - } else if (agents_get_agent_id($nombre_agente)) { + } else if (agents_get_agent_id($agent->nombre())) { if ($message === true) { return 'The agent name already exists in DB.'; } @@ -2062,7 +2062,7 @@ function api_set_new_agent($id_node, $thrash2, $other, $trhash3, $return=false, } } - if ($return === false) { + if ($return !== true) { returnData( 'string', [ From 9a57cc550ec99fbe9b063124dbecdc46e7ec1233 Mon Sep 17 00:00:00 2001 From: miguel angel rasteu Date: Wed, 11 Oct 2023 16:31:48 +0200 Subject: [PATCH 02/72] #12192 Fix pandora itsm url --- pandora_console/godmode/setup/setup_ITSM.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/godmode/setup/setup_ITSM.php b/pandora_console/godmode/setup/setup_ITSM.php index 3196ef677c..50aee8631e 100644 --- a/pandora_console/godmode/setup/setup_ITSM.php +++ b/pandora_console/godmode/setup/setup_ITSM.php @@ -558,7 +558,7 @@ $table_cr_settings->data[4][0] = html_print_label_input_block( // Print. echo ''; From d389f9c3d19c688f1ada55714891717db5498fb0 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Thu, 16 Nov 2023 11:15:01 +0100 Subject: [PATCH 03/72] #12439 Added Quiet icon to agent finder --- .../operation/search_agents.getdata.php | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/pandora_console/operation/search_agents.getdata.php b/pandora_console/operation/search_agents.getdata.php index bdeea391a1..f4c1fe0d76 100644 --- a/pandora_console/operation/search_agents.getdata.php +++ b/pandora_console/operation/search_agents.getdata.php @@ -169,12 +169,26 @@ if ($searchAgents) { } foreach ($agents as $key => $agent) { + $agent_quiet = ''; + if ((bool) $agent['quiet'] === true) { + $agent_quiet = html_print_image( + 'images/dot_blue.png', + true, + [ + 'border' => '0', + 'title' => __('Quiet'), + 'alt' => '', + 'class' => 'mrgn_lft_5px', + ] + ); + } + if ($agent['disabled']) { $agents[$key]['agent'] = ''.ucfirst(strtolower($agent['alias'])).''.ui_print_help_tip(__('Disabled'), true).''; + title="'.$agent['id_agente'].'">'.ucfirst(strtolower($agent['alias'])).''.ui_print_help_tip(__('Disabled'), true).''.$agent_quiet; } else { $agents[$key]['agent'] = ''.ucfirst(strtolower($agent['alias'])).''; + title='.$agent['nombre'].'>'.ucfirst(strtolower($agent['alias'])).''.$agent_quiet; } $agents[$key]['os'] = ui_print_os_icon($agent['id_os'], false, true); From b6582b7f7ea10588862856e007b63d81d5373cf2 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Wed, 22 Nov 2023 13:30:44 +0100 Subject: [PATCH 04/72] #12202 added Asteroids game --- pandora_console/include/ajax/events.php | 13 + pandora_console/include/asteroids/LICENSE.txt | 25 + pandora_console/include/asteroids/README.rst | 46 + .../include/asteroids/asteroids.js | 840 ++++++++++++++++++ pandora_console/include/asteroids/index.html | 14 + pandora_console/include/asteroids/style.css | 46 + .../include/javascript/pandora_events.js | 45 + pandora_console/include/styles/asteroids.css | 65 ++ pandora_console/operation/menu.php | 1 + 9 files changed, 1095 insertions(+) create mode 100644 pandora_console/include/asteroids/LICENSE.txt create mode 100644 pandora_console/include/asteroids/README.rst create mode 100644 pandora_console/include/asteroids/asteroids.js create mode 100644 pandora_console/include/asteroids/index.html create mode 100644 pandora_console/include/asteroids/style.css create mode 100644 pandora_console/include/styles/asteroids.css diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 7e8341c4a1..88e063b581 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -95,6 +95,8 @@ $parameters_modal = get_parameter('parameters', 0); // User private filter. $current_filter = get_parameter('current_filter', 0); $private_filter_event = get_parameter('private_filter_event', 0); +// Asteroids. +$playAsteroids = (bool) get_parameter('playAsteroids', false); if ($get_comments === true) { global $config; @@ -2751,3 +2753,14 @@ if ($draw_row_response_info === true) { echo $output; return; } + +// Asteroids. +if ($playAsteroids === true) { + echo ui_require_css_file('asteroids', 'include/styles/', true); + echo ui_require_javascript_file('asteroids', 'include/asteroids/', true); + + $output = '
Asteroids game goes here!
'; + + echo $output; + return; +} diff --git a/pandora_console/include/asteroids/LICENSE.txt b/pandora_console/include/asteroids/LICENSE.txt new file mode 100644 index 0000000000..0dc661d166 --- /dev/null +++ b/pandora_console/include/asteroids/LICENSE.txt @@ -0,0 +1,25 @@ +Copyright (c) 2023, James Socol +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + diff --git a/pandora_console/include/asteroids/README.rst b/pandora_console/include/asteroids/README.rst new file mode 100644 index 0000000000..c7465358c2 --- /dev/null +++ b/pandora_console/include/asteroids/README.rst @@ -0,0 +1,46 @@ +========= +ASTEROIDS +========= + +Last week, at work, we joked about creating an Asteroids clone where every +asteroid had a bug number in it, as a bit of a joke. (Ha ha, every bug you +kill spawns two more!) + +I was bored this afternoon, so here's a port of Asteroids to JS/Canvas. + +Now all I need to do is hook in the bug numbers. + + +Gameplay +======== + +You're the triangle in the middle. You want to destroy the circles. You have +a gun (spacebar), some thrusters to turn (left and right arrow keys) and an +engine (up arrow key). + +Remember, it's kill or be killed out there. + + +Rights +====== + +The name *Asteroids* is, as far as I know, still property of Atari. I mean no +ill-will towards Atari by releasing this code. Frankly, it's a poor +substitute for anything resembling a real game. I just wanted to see if I +could do it. + +If anyone from Atari asks, I will gladly rename and/or remove this code. But +since there are so many *Asteroids* clones as it is, and the original was +released in 1979, and it was kind of a copy of *Spacewar!*, I doubt they'll +mind too much. + + +Strikes me as funny... +====================== + +The original *Spacewar!*, one of the earliest (if not the original) computer +games, took `200 hours to code `_. + +This probably took me 6. + +I am so glad we've moved past the PDP-1. diff --git a/pandora_console/include/asteroids/asteroids.js b/pandora_console/include/asteroids/asteroids.js new file mode 100644 index 0000000000..d6e9a460f4 --- /dev/null +++ b/pandora_console/include/asteroids/asteroids.js @@ -0,0 +1,840 @@ +// Asteroids.js +// Copyright (c) 2010–2023 James Socol +// See LICENSE.txt for license terms. + +// Game settings +GAME_HEIGHT = 480; +GAME_WIDTH = 640; +FRAME_PERIOD = 60; // 1 frame / x frames/sec +LEVEL_TIMEOUT = 2000; // How long to wait after clearing a level. + +// Player settings +ROTATE_SPEED = Math.PI / 10; // How fast do players turn? (radians) +MAX_SPEED = 15; // Maximum player speed +THRUST_ACCEL = 1; +DEATH_TIMEOUT = 2000; // milliseconds +INVINCIBLE_TIMEOUT = 1500; // How long to stay invincible after resurrecting? +PLAYER_LIVES = 3; +POINTS_PER_SHOT = 1; // How many points does a shot cost? (Should be >= 0.) +POINTS_TO_EXTRA_LIFE = 1000; // How many points to get a 1-up? + +// Bullet settings +BULLET_SPEED = 20; +MAX_BULLETS = 3; +MAX_BULLET_AGE = 25; + +// Asteroid settings +ASTEROID_COUNT = 2; // This + current level = number of asteroids. +ASTEROID_GENERATIONS = 3; // How many times to they split before dying? +ASTEROID_CHILDREN = 2; // How many does each death create? +ASTEROID_SPEED = 3; +ASTEROID_SCORE = 10; // How many points is each one worth? + +var Asteroids = function(home) { + // Constructor + // Order matters. + + // Set up logging. + this.log_level = Asteroids.LOG_DEBUG; + this.log = Asteroids.logger(this); + + // Create the info pane, player, and playfield. + home.innerHTML = ""; + this.info = Asteroids.infoPane(this, home); + this.playfield = Asteroids.playfield(this, home); + this.player = Asteroids.player(this); + + // Set up the event listeners. + this.keyState = Asteroids.keyState(this); + this.listen = Asteroids.listen(this); + + // Useful functions. + this.asteroids = Asteroids.asteroids(this); + this.overlays = Asteroids.overlays(this); + this.highScores = Asteroids.highScores(this); + this.level = Asteroids.level(this); + this.gameOver = Asteroids.gameOver(this); + + // Play the game. + Asteroids.play(this); + return this; +}; + +Asteroids.infoPane = function(game, home) { + var pane = document.createElement("div"); + pane.innerHTML = "ASTEROIDS"; + + var lives = document.createElement("span"); + lives.className = "lives"; + lives.innerHTML = "LIVES: " + PLAYER_LIVES; + + var score = document.createElement("span"); + score.className = "score"; + score.innerHTML = "SCORE: 0"; + + var level = document.createElement("span"); + level.className = "level"; + level.innerHTML = "LEVEL: 1"; + + pane.appendChild(lives); + pane.appendChild(score); + pane.appendChild(level); + home.appendChild(pane); + + return { + setLives: function(game, l) { + lives.innerHTML = "LIVES: " + l; + }, + setScore: function(game, s) { + score.innerHTML = "SCORE: " + s; + }, + setLevel: function(game, _level) { + level.innerHTML = "LEVEL: " + _level; + }, + getPane: function() { + return pane; + } + }; +}; + +Asteroids.playfield = function(game, home) { + var canvas = document.createElement("canvas"); + canvas.width = GAME_WIDTH; + canvas.height = GAME_HEIGHT; + home.appendChild(canvas); + return canvas; +}; + +Asteroids.logger = function(game) { + if (typeof console != "undefined" && typeof console.log != "undefined") { + return { + info: function(msg) { + if (game.log_level <= Asteroids.LOG_INFO) console.log(msg); + }, + debug: function(msg) { + if (game.log_level <= Asteroids.LOG_DEBUG) console.log(msg); + }, + warning: function(msg) { + if (game.log_level <= Asteroids.LOG_WARNING) console.log(msg); + }, + error: function(msg) { + if (game.log_level <= Asteroids.LOG_ERROR) console.log(msg); + }, + critical: function(msg) { + if (game.log_level <= Asteroids.LOG_CRITICAL) console.log(msg); + } + }; + } else { + return { + info: function(msg) {}, + debug: function(msg) {}, + warning: function(msg) {}, + error: function(msg) {}, + critical: function(msg) {} + }; + } +}; + +Asteroids.asteroids = function(game) { + var asteroids = []; + + return { + push: function(obj) { + return asteroids.push(obj); + }, + pop: function() { + return asteroids.pop(); + }, + splice: function(i, j) { + return asteroids.splice(i, j); + }, + get length() { + return asteroids.length; + }, + getIterator: function() { + return asteroids; + }, + generationCount: function(_gen) { + var total = 0; + for (var i = 0; i < asteroids.length; i++) { + if (asteroids[i].getGeneration() == _gen) total++; + } + game.log.debug("Found " + total + " asteroids in generation " + _gen); + return total; + } + }; +}; + +/** + * Creates an overlays controller. + */ +Asteroids.overlays = function(game) { + var overlays = []; + + return { + draw: function(ctx) { + for (var i = 0; i < overlays.length; i++) { + overlays[i].draw(ctx); + } + }, + add: function(obj) { + if (-1 == overlays.indexOf(obj) && typeof obj.draw != "undefined") { + overlays.push(obj); + return true; + } + return false; + }, + remove: function(obj) { + var i = overlays.indexOf(obj); + if (-1 != i) { + overlays.splice(i, 1); + return true; + } + return false; + } + }; +}; + +/** + * Creates a player object. + */ +Asteroids.player = function(game) { + // implements IScreenObject + var position = [GAME_WIDTH / 2, GAME_HEIGHT / 2], + velocity = [0, 0], + direction = -Math.PI / 2, + dead = false, + invincible = false, + lastRez = null, + lives = PLAYER_LIVES, + score = 0, + radius = 3, + path = [ + [10, 0], + [-5, 5], + [-5, -5], + [10, 0] + ]; + + return { + getPosition: function() { + return position; + }, + getVelocity: function() { + return velocity; + }, + getSpeed: function() { + return Math.sqrt(Math.pow(velocity[0], 2) + Math.pow(velocity[1], 2)); + }, + getDirection: function() { + return direction; + }, + getRadius: function() { + return radius; + }, + getScore: function() { + return score; + }, + addScore: function(pts) { + score += pts; + }, + lowerScore: function(pts) { + score -= pts; + if (score < 0) { + score = 0; + } + }, + getLives: function() { + return lives; + }, + rotate: function(rad) { + if (!dead) { + direction += rad; + game.log.info(direction); + } + }, + thrust: function(force) { + if (!dead) { + velocity[0] += force * Math.cos(direction); + velocity[1] += force * Math.sin(direction); + + if (this.getSpeed() > MAX_SPEED) { + velocity[0] = MAX_SPEED * Math.cos(direction); + velocity[1] = MAX_SPEED * Math.sin(direction); + } + + game.log.info(velocity); + } + }, + move: function() { + Asteroids.move(position, velocity); + }, + draw: function(ctx) { + let color = "#fff"; + if (invincible) { + const dt = (new Date() - lastRez) / 200; + const c = Math.floor(Math.cos(dt) * 16).toString(16); + color = `#${c}${c}${c}`; + } + Asteroids.drawPath(ctx, position, direction, 1, path, color); + }, + isDead: function() { + return dead; + }, + isInvincible: function() { + return invincible; + }, + extraLife: function(game) { + game.log.debug("Woo, extra life!"); + lives++; + }, + die: function(game) { + if (!dead) { + game.log.info("You died!"); + dead = true; + invincible = true; + lives--; + position = [GAME_WIDTH / 2, GAME_HEIGHT / 2]; + velocity = [0, 0]; + direction = -Math.PI / 2; + if (lives > 0) { + setTimeout( + (function(player, _game) { + return function() { + player.resurrect(_game); + }; + })(this, game), + DEATH_TIMEOUT + ); + } else { + game.gameOver(); + } + } + }, + resurrect: function(game) { + if (dead) { + dead = false; + invincible = true; + lastRez = new Date(); + setTimeout(function() { + invincible = false; + game.log.debug("No longer invincible!"); + }, INVINCIBLE_TIMEOUT); + game.log.debug("You ressurrected!"); + } + }, + fire: function(game) { + if (!dead) { + game.log.debug("You fired!"); + var _pos = [position[0], position[1]], + _dir = direction; + + this.lowerScore(POINTS_PER_SHOT); + + return Asteroids.bullet(game, _pos, _dir); + } + } + }; +}; + +Asteroids.bullet = function(game, _pos, _dir) { + // implements IScreenObject + var position = [_pos[0], _pos[1]], + velocity = [0, 0], + direction = _dir, + age = 0, + radius = 1, + path = [ + [0, 0], + [-4, 0] + ]; + + velocity[0] = BULLET_SPEED * Math.cos(_dir); + velocity[1] = BULLET_SPEED * Math.sin(_dir); + + return { + getPosition: function() { + return position; + }, + getVelocity: function() { + return velocity; + }, + getSpeed: function() { + return Math.sqrt(Math.pow(velocity[0], 2) + Math.pow(velocity[1], 2)); + }, + getRadius: function() { + return radius; + }, + getAge: function() { + return age; + }, + birthday: function() { + age++; + }, + move: function() { + Asteroids.move(position, velocity); + }, + draw: function(ctx) { + Asteroids.drawPath(ctx, position, direction, 1, path); + } + }; +}; + +Asteroids.keyState = function(_) { + var state = { + [Asteroids.LEFT]: false, + [Asteroids.UP]: false, + [Asteroids.RIGHT]: false, + [Asteroids.DOWN]: false, + [Asteroids.FIRE]: false + }; + + return { + on: function(key) { + state[key] = true; + }, + off: function(key) { + state[key] = false; + }, + getState: function(key) { + if (typeof state[key] != "undefined") return state[key]; + return false; + } + }; +}; + +Asteroids.listen = function(game) { + const keyMap = { + ArrowLeft: Asteroids.LEFT, + KeyA: Asteroids.LEFT, + ArrowRight: Asteroids.RIGHT, + KeyD: Asteroids.RIGHT, + ArrowUp: Asteroids.UP, + KeyW: Asteroids.UP, + Space: Asteroids.FIRE + }; + + window.addEventListener( + "keydown", + function(e) { + const state = keyMap[e.code]; + if (state) { + e.preventDefault(); + e.stopPropagation(); + game.keyState.on(state); + return false; + } + return true; + }, + true + ); + + window.addEventListener( + "keyup", + function(e) { + const state = keyMap[e.code]; + if (state) { + e.preventDefault(); + e.stopPropagation(); + game.keyState.off(state); + return false; + } + return true; + }, + true + ); +}; + +Asteroids.asteroid = function(game, _gen) { + // implements IScreenObject + var position = [0, 0], + velocity = [0, 0], + direction = 0, + generation = _gen, + radius = 7, + path = [ + [1, 7], + [5, 5], + [7, 1], + [5, -3], + [7, -7], + [3, -9], + [-1, -5], + [-4, -2], + [-8, -1], + [-9, 3], + [-5, 5], + [-1, 3], + [1, 7] + ]; + + return { + getPosition: function() { + return position; + }, + setPosition: function(pos) { + position = pos; + }, + getVelocity: function() { + return velocity; + }, + setVelocity: function(vel) { + velocity = vel; + direction = Math.atan2(vel[1], vel[0]); + }, + getSpeed: function() { + return Math.sqrt(Math.pow(velocity[0], 2) + Math.pow(velocity[1], 2)); + }, + getRadius: function() { + return radius * generation; + }, + getGeneration: function() { + return generation; + }, + move: function() { + Asteroids.move(position, velocity); + }, + draw: function(ctx) { + Asteroids.drawPath(ctx, position, direction, generation, path); + // ctx.setTransform(1, 0, 0, 1, position[0], position[1]); + // ctx.beginPath(); + // ctx.arc(0, 0, radius*generation, 0, Math.PI*2, false); + // ctx.stroke(); + // ctx.closePath(); + } + }; +}; + +Asteroids.collision = function(a, b) { + // if a.getPosition() inside b.getBounds? + var a_pos = a.getPosition(), + b_pos = b.getPosition(); + + function sq(x) { + return Math.pow(x, 2); + } + + var distance = Math.sqrt(sq(a_pos[0] - b_pos[0]) + sq(a_pos[1] - b_pos[1])); + + if (distance <= a.getRadius() + b.getRadius()) return true; + return false; +}; + +Asteroids.level = function(game) { + var level = 0, + speed = ASTEROID_SPEED, + hspeed = ASTEROID_SPEED / 2; + + return { + getLevel: function() { + return level; + }, + levelUp: function(game) { + level++; + game.log.debug("Congrats! On to level " + level); + while ( + game.asteroids.generationCount(ASTEROID_GENERATIONS) < + level + ASTEROID_COUNT + ) { + var a = Asteroids.asteroid(game, ASTEROID_GENERATIONS); + a.setPosition([ + Math.random() * GAME_WIDTH, + Math.random() * GAME_HEIGHT + ]); + a.setVelocity([ + Math.random() * speed - hspeed, + Math.random() * speed - hspeed + ]); + game.asteroids.push(a); + } + } + }; +}; + +Asteroids.gameOver = function(game) { + return function() { + game.log.debug("Game over!"); + + if (game.player.getScore() > 0) { + game.highScores.addScore("Player", game.player.getScore()); + } + + game.overlays.add({ + // implements IOverlay + draw: function(ctx) { + ctx.font = "30px System, monospace"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.fillText("GAME OVER", GAME_WIDTH / 2, GAME_HEIGHT / 2); + + var scores = game.highScores.getScores(); + ctx.font = "12px System, monospace"; + for (var i = 0; i < scores.length; i++) { + ctx.fillText( + scores[i].name + " " + scores[i].score, + GAME_WIDTH / 2, + GAME_HEIGHT / 2 + 20 + 14 * i + ); + } + } + }); + }; +}; + +Asteroids.highScores = function(game) { + var scores = []; + + if ((t = localStorage.getItem("high-scores"))) { + scores = JSON.parse(t); + } + + return { + getScores: function() { + return scores; + }, + addScore: function(_name, _score) { + scores.push({ name: _name, score: _score }); + scores.sort(function(a, b) { + return b.score - a.score; + }); + if (scores.length > 10) { + scores.length = 10; + } + game.log.debug("Saving high scores."); + var str = JSON.stringify(scores); + localStorage.setItem("high-scores", str); + } + }; +}; + +Asteroids.drawPath = function(ctx, position, direction, scale, path, color) { + if (!color) { + color = "#fff"; + } + ctx.strokeStyle = color; + ctx.setTransform( + Math.cos(direction) * scale, + Math.sin(direction) * scale, + -Math.sin(direction) * scale, + Math.cos(direction) * scale, + position[0], + position[1] + ); + + ctx.beginPath(); + ctx.moveTo(path[0][0], path[0][1]); + for (i = 1; i < path.length; i++) { + ctx.lineTo(path[i][0], path[i][1]); + } + ctx.stroke(); + ctx.closePath(); + ctx.strokeStyle = "#fff"; +}; + +Asteroids.move = function(position, velocity) { + position[0] += velocity[0]; + if (position[0] < 0) position[0] = GAME_WIDTH + position[0]; + else if (position[0] > GAME_WIDTH) position[0] -= GAME_WIDTH; + + position[1] += velocity[1]; + if (position[1] < 0) position[1] = GAME_HEIGHT + position[1]; + else if (position[1] > GAME_HEIGHT) position[1] -= GAME_HEIGHT; +}; + +Asteroids.stars = function() { + var stars = []; + for (var i = 0; i < 50; i++) { + stars.push([Math.random() * GAME_WIDTH, Math.random() * GAME_HEIGHT]); + } + + return { + draw: function(ctx) { + var ii = stars.length; + for (var i = 0; i < ii; i++) { + ctx.fillRect(stars[i][0], stars[i][1], 1, 1); + } + } + }; +}; + +Asteroids.play = function(game) { + var ctx = game.playfield.getContext("2d"); + ctx.fillStyle = "white"; + ctx.strokeStyle = "white"; + + var speed = ASTEROID_SPEED, + hspeed = ASTEROID_SPEED / 2; + + game.level.levelUp(game); + + var bullets = [], + last_fire_state = false, + last_asteroid_count = 0; + + var extra_lives = 0; + + // Add a star field. + game.overlays.add(Asteroids.stars()); + + game.pulse = setInterval(function() { + var kill_asteroids = [], + new_asteroids = [], + kill_bullets = []; + + ctx.save(); + ctx.clearRect(0, 0, GAME_WIDTH, GAME_HEIGHT); + + // Be nice and award extra lives first. + var t_extra_lives = game.player.getScore() / POINTS_TO_EXTRA_LIFE; + t_extra_lives = Math.floor(t_extra_lives); + if (t_extra_lives > extra_lives) { + game.player.extraLife(game); + } + extra_lives = t_extra_lives; + + if (game.keyState.getState(Asteroids.UP)) { + game.player.thrust(THRUST_ACCEL); + } + + if (game.keyState.getState(Asteroids.LEFT)) { + game.player.rotate(-ROTATE_SPEED); + } + + if (game.keyState.getState(Asteroids.RIGHT)) { + game.player.rotate(ROTATE_SPEED); + } + + var fire_state = game.keyState.getState(Asteroids.FIRE); + if ( + fire_state && + fire_state != last_fire_state && + bullets.length < MAX_BULLETS + ) { + var b = game.player.fire(game); + bullets.push(b); + } + last_fire_state = fire_state; + + if (!game.player.isDead()) { + game.player.move(); + game.player.draw(ctx); + } + + for (var k = 0; k < bullets.length; k++) { + if (!bullets[k]) continue; + + if (bullets[k].getAge() > MAX_BULLET_AGE) { + kill_bullets.push(k); + continue; + } + bullets[k].birthday(); + bullets[k].move(); + bullets[k].draw(ctx); + } + + for (var r = kill_bullets.length - 1; r >= 0; r--) { + bullets.splice(r, 1); + } + + var asteroids = game.asteroids.getIterator(); + for (var i = 0; i < game.asteroids.length; i++) { + var killit = false; + asteroids[i].move(); + asteroids[i].draw(ctx); + + // Destroy the asteroid + for (var j = 0; j < bullets.length; j++) { + if (!bullets[j]) continue; + if (Asteroids.collision(bullets[j], asteroids[i])) { + game.log.debug("You shot an asteroid!"); + // Destroy the bullet. + bullets.splice(j, 1); + killit = true; // JS doesn't have "continue 2;" + continue; + } + } + + // Kill the asteroid? + if (killit) { + var _gen = asteroids[i].getGeneration() - 1; + if (_gen > 0) { + // Create children ;) + for (var n = 0; n < ASTEROID_CHILDREN; n++) { + var a = Asteroids.asteroid(game, _gen); + var _pos = [ + asteroids[i].getPosition()[0], + asteroids[i].getPosition()[1] + ]; + a.setPosition(_pos); + a.setVelocity([ + Math.random() * speed - hspeed, + Math.random() * speed - hspeed + ]); + new_asteroids.push(a); + } + } + game.player.addScore(ASTEROID_SCORE); + kill_asteroids.push(i); + continue; + } + + // Kill the player? + if ( + !game.player.isDead() && + !game.player.isInvincible() && + Asteroids.collision(game.player, asteroids[i]) + ) { + game.player.die(game); + } + } + + kill_asteroids.sort(function(a, b) { + return a - b; + }); + for (var m = kill_asteroids.length - 1; m >= 0; m--) { + game.asteroids.splice(kill_asteroids[m], 1); + } + + for (var o = 0; o < new_asteroids.length; o++) { + game.asteroids.push(new_asteroids[o]); + } + + ctx.restore(); + + // Do we need to level up? + if (0 == game.asteroids.length && last_asteroid_count != 0) { + setTimeout(function() { + game.level.levelUp(game); + }, LEVEL_TIMEOUT); + } + + last_asteroid_count = game.asteroids.length; + + // Draw overlays. + game.overlays.draw(ctx); + + // Update the info pane. + game.info.setLives(game, game.player.getLives()); + game.info.setScore(game, game.player.getScore()); + game.info.setLevel(game, game.level.getLevel()); + }, FRAME_PERIOD); +}; + +// Some boring constants. +Asteroids.LOG_ALL = 0; +Asteroids.LOG_INFO = 1; +Asteroids.LOG_DEBUG = 2; +Asteroids.LOG_WARNING = 3; +Asteroids.LOG_ERROR = 4; +Asteroids.LOG_CRITICAL = 5; +Asteroids.LOG_NONE = 6; + +Asteroids.LEFT = 37; +Asteroids.UP = 38; +Asteroids.RIGHT = 39; +Asteroids.DOWN = 40; +Asteroids.FIRE = 32; + +// Load it up! +window.onload = Asteroids(document.getElementById("asteroids")); diff --git a/pandora_console/include/asteroids/index.html b/pandora_console/include/asteroids/index.html new file mode 100644 index 0000000000..3c1dfbd690 --- /dev/null +++ b/pandora_console/include/asteroids/index.html @@ -0,0 +1,14 @@ + + + + + Asteroids + + + + +
Asteroids game goes here!
+ + + + diff --git a/pandora_console/include/asteroids/style.css b/pandora_console/include/asteroids/style.css new file mode 100644 index 0000000000..ab877caa06 --- /dev/null +++ b/pandora_console/include/asteroids/style.css @@ -0,0 +1,46 @@ +/* Style for Asteroids.js + * Copyright (c) 2010 James Socol + * See LICENSE.txt for license. + */ + +body { + background-color: #000; + color: #fff; + font-family: "Calibri", "System", monospace; + font-size: 14px; +} + +div#asteroids { + margin: 50px auto; + width: 640px; + border: 1px solid #fff; + padding: 5px; +} + +div#asteroids > * { + color: #fff; +} + +div#asteroids > div { + font-family: "System", monospace; + font-size: 11px; + padding-bottom: 5px; +} + +div#asteroids > div > span { + float: right; + padding-left: 20px; +} + +div#instructions { + width: 640px; + margin: 20px auto; +} + +h1 { + font-size: 18px; +} + +h2 { + font-size: 16px; +} diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index 86b84376c5..f1453ce493 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -1739,3 +1739,48 @@ function loadModal() { } } window.onload = loadModal; + +// Load Asteroids game. +$(window).on("load", function() { + let counter = 0; + $("#button-sound_events_button") + .off("click") + .on("click", function(e) { + counter++; + if (counter == 12) { + $("#modal-asteroids") + .dialog({ + title: "Asteroids", + resizable: true, + modal: true, + width: 900, + height: 700, + open: function() { + $.ajax({ + method: "post", + url: getUrlAjax(), + data: { + page: "include/ajax/events", + playAsteroids: 1 + }, + dataType: "html", + success: function(data) { + $("#modal-asteroids").html(data); + $(".ui-widget-content").css("background", "#222"); + $(".ui-dialog-title").css("color", "#fff"); + }, + error: function(error) { + console.error(error); + } + }); + }, + close: function() { + counter = 0; + $(".ui-widget-content").css("background", "#fff"); + $(".ui-dialog-title").css("color", "rgb(51, 51, 51)"); + } + }) + .show(); + } + }); +}); diff --git a/pandora_console/include/styles/asteroids.css b/pandora_console/include/styles/asteroids.css new file mode 100644 index 0000000000..8b434b59ba --- /dev/null +++ b/pandora_console/include/styles/asteroids.css @@ -0,0 +1,65 @@ +/** + * + * Name: Default theme + * Pandora Stylesheet + * + * @category Stylesheet + * @package Pandora FMS + * @subpackage Community + * @version 1.0.0 + * @license See below + * + * ______ ___ _______ _______ ________ + * | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __| + * | __/| _ | | _ || _ | _| _ | | ___| |__ | + * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| + * + * ============================================================================ + * Copyright (c) 2005-2023 Pandora FMS + * Please see https://pandorafms.com for full contribution list + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation for version 2. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * ============================================================================ + */ + +div#asteroids { + background-color: #000; + color: #fff; + margin: 50px auto; + width: 640px; + border: 1px solid #fff; + padding: 5px; +} + +div#asteroids > * { + color: #fff; +} + +div#asteroids > div { + font-family: "System", monospace; + font-size: 11px; + padding-bottom: 5px; +} + +div#asteroids > div > span { + float: right; + padding-left: 20px; +} + +div#instructions { + width: 640px; + margin: 20px auto; +} + +h1 { + font-size: 18px; +} + +h2 { + font-size: 16px; +} diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index 3794a30ae3..2ec659f51a 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -603,6 +603,7 @@ if ($access_console_node === true) { $sub[$javascript]['type'] = 'direct'; echo ''; + echo ''; ui_require_javascript_file('pandora_events'); From 51a152d86d50886b090d1908cf7a41cb1bbc32f6 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Fri, 24 Nov 2023 13:25:42 +0100 Subject: [PATCH 05/72] #12202 Added setup flag for easter egg --- pandora_console/include/javascript/pandora_events.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index f1453ce493..a95ce68899 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -1747,7 +1747,8 @@ $(window).on("load", function() { .off("click") .on("click", function(e) { counter++; - if (counter == 12) { + let flagEasternEgg = $("#flagEasternEgg").val(); + if (counter == 12 && flagEasternEgg == true) { $("#modal-asteroids") .dialog({ title: "Asteroids", From 28820f4471f1812f6d8ff06d5b2c59f29bc5ef4e Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 29 Nov 2023 11:04:48 +0100 Subject: [PATCH 06/72] #12543 fixed pagination metaconsole --- pandora_console/include/functions_events.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 2a91641315..7a106ead7f 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -1907,7 +1907,7 @@ function events_get_all( // -1 For pagination 'All'. ((int) $limit === -1) ? $end = count($data) - : $end = ((int) $offset !== 0) ? ($offset + $limit) : $limit; + : $end = $limit; $finally = array_slice($data, $offset, $end, true); $return = [ 'buffers' => $buffers, From b6722214de2aa5cc3124d21f69ebef1e9bdfed90 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 29 Nov 2023 15:43:38 +0100 Subject: [PATCH 07/72] #12541 changes in graph analytics --- .../include/javascript/graph_analytics.js | 183 +++++++++++++++--- .../operation/reporting/graph_analytics.php | 99 ++++++++-- 2 files changed, 240 insertions(+), 42 deletions(-) diff --git a/pandora_console/include/javascript/graph_analytics.js b/pandora_console/include/javascript/graph_analytics.js index 6c14f3f8c8..742e43201e 100644 --- a/pandora_console/include/javascript/graph_analytics.js +++ b/pandora_console/include/javascript/graph_analytics.js @@ -1,3 +1,4 @@ +/* global $ */ // Droppable options. var droppableOptions = { accept: ".draggable", @@ -422,12 +423,38 @@ $("[data-button=new]").click(function(e) { }); }); +function updateSelect(element, fields, selected) { + if (typeof fields === "object") { + $(element) + .find("select option[value!=0]") + .remove(); + $(element) + .find(".select2-container .select2-selection__rendered") + .empty(); + Object.keys(fields).forEach(function(key) { + if (key === selected) { + $(element) + .find(".select2-container .select2-selection__rendered") + .append(`${fields[key]}`); + $(element) + .find("select") + .append(``); + } else { + $(element) + .find("select") + .append(``); + } + }); + } +} + // Save graps modal. $("[data-button=save]").click(function(e) { // Filter save mode selector $("#save_filter_row1").show(); $("#save_filter_row2").show(); $("#update_filter_row1").hide(); + $("#delete_filter_row2").hide(); $("#radiobtn0002").prop("checked", false); $("#radiobtn0001").prop("checked", true); $("#text-id_name").val(""); @@ -438,20 +465,43 @@ $("[data-button=save]").click(function(e) { $("#save_filter_row2").show(); $("#submit-save_filter").show(); $("#update_filter_row1").hide(); - } else { + $("#delete_filter_row2").hide(); + } else if ($(this).val() == "update") { $("#save_filter_row1").hide(); $("#save_filter_row2").hide(); $("#update_filter_row1").show(); $("#submit-save_filter").hide(); + $("#delete_filter_row2").hide(); + } else { + $("#save_filter_row1").hide(); + $("#save_filter_row2").hide(); + $("#update_filter_row1").hide(); + $("#submit-save_filter").hide(); + $("#delete_filter_row2").show(); } }); - $("#save-filter-select").dialog({ - resizable: true, - draggable: true, - modal: false, - closeOnEscape: true, - width: 350 + $.ajax({ + method: "POST", + url: "ajax.php", + dataType: "json", + data: { + page: "operation/reporting/graph_analytics", + load_list_filters: 1 + }, + success: function(data) { + if (data) { + updateSelect("#save_filter_form", data, 0); + $("#save-filter-select").dialog({ + resizable: true, + draggable: true, + modal: false, + closeOnEscape: true, + width: 350, + title: titleModalActions + }); + } + } }); }); @@ -535,14 +585,67 @@ function save_update_filter() { }); } +// Delete filter. +function delete_filter() { + confirmDialog({ + title: titleDelete, + message: messageDelete, + onAccept: function() { + $.ajax({ + method: "POST", + url: "ajax.php", + dataType: "html", + data: { + page: "operation/reporting/graph_analytics", + delete_filter: $("#delete_filter").val() + }, + success: function(data) { + if (data == "deleted") { + confirmDialog({ + title: titleDeleteConfirm, + message: messageDeleteConfirm, + hideCancelButton: true, + onAccept: function() { + $( + "button.ui-button.ui-corner-all.ui-widget.ui-button-icon-only.ui-dialog-titlebar-close" + ).click(); + } + }); + } else { + confirmDialog({ + title: titleDeleteError, + message: messageDeleteError, + hideCancelButton: true + }); + } + } + }); + } + }); +} + // Load graps modal. $("[data-button=load]").click(function(e) { - $("#load-filter-select").dialog({ - resizable: true, - draggable: true, - modal: false, - closeOnEscape: true, - width: "auto" + $.ajax({ + method: "POST", + url: "ajax.php", + dataType: "json", + data: { + page: "operation/reporting/graph_analytics", + load_list_filters: 1 + }, + success: function(data) { + if (data) { + updateSelect("#load_filter_form", data, 0); + $("#load-filter-select").dialog({ + resizable: true, + draggable: true, + modal: false, + closeOnEscape: true, + width: "auto" + }); + } + } }); }); @@ -618,12 +721,26 @@ function loadFilter(url, filterId, homeurl, id) { // Share button. $("[data-button=share]").click(function(e) { - $("#share-select").dialog({ - resizable: true, - draggable: true, - modal: false, - closeOnEscape: true, - width: "auto" + $.ajax({ + method: "POST", + url: "ajax.php", + dataType: "json", + data: { + page: "operation/reporting/graph_analytics", + load_list_filters: 1 + }, + success: function(data) { + if (data) { + updateSelect("#share_form-0-0", data, 0); + $("#share-select").dialog({ + resizable: true, + draggable: true, + modal: false, + closeOnEscape: true, + width: "auto" + }); + } + } }); }); @@ -643,13 +760,27 @@ $("#button-share-modal").click(function(e) { // Export button. $("[data-button=export]").click(function(e) { - $("#export-select").dialog({ - resizable: true, - draggable: true, - modal: false, - closeOnEscape: true, - width: "auto", - title: titleExport + $.ajax({ + method: "POST", + url: "ajax.php", + dataType: "json", + data: { + page: "operation/reporting/graph_analytics", + load_list_filters: 1 + }, + success: function(data) { + if (data) { + updateSelect("#export_form-0-0", data, 0); + $("#export-select").dialog({ + resizable: true, + draggable: true, + modal: false, + closeOnEscape: true, + width: "auto", + title: titleExport + }); + } + } }); }); diff --git a/pandora_console/operation/reporting/graph_analytics.php b/pandora_console/operation/reporting/graph_analytics.php index 8797376070..b85a0cb84d 100644 --- a/pandora_console/operation/reporting/graph_analytics.php +++ b/pandora_console/operation/reporting/graph_analytics.php @@ -45,8 +45,10 @@ if (is_ajax()) { $save_filter = get_parameter('save_filter'); $load_filter = get_parameter('load_filter'); $update_filter = get_parameter('update_filter'); + $delete_filter = get_parameter('delete_filter'); $get_new_values = get_parameter('get_new_values'); $export_filter = get_parameter('export_filter'); + $load_list_filters = get_parameter('load_list_filters'); if (empty($search_left) === false) { $output = []; @@ -289,6 +291,11 @@ if (is_ajax()) { return; } + if (empty($delete_filter) === false) { + $result = db_process_sql_delete('tgraph_analytics_filter', ['id' => $delete_filter]); + echo ((bool) $result === true) ? 'deleted' : ''; + } + // Get new values. if (empty($get_new_values) === false) { $data = []; @@ -322,19 +329,19 @@ if (is_ajax()) { $graphs = json_decode(db_get_value('graph_modules', 'tgraph_analytics_filter', 'id', $filter)); $interval = db_get_value('tgraph_analytics_filter.interval', 'tgraph_analytics_filter', 'id', $filter); - foreach ($graphs as $graph) { - $id_graph = db_process_sql_insert( - 'tgraph', - [ - 'id_user' => $config['id_user'], - 'id_group' => $group, - 'name' => $filter_name.' ('.__('Graph').' '.($counter + 1).')', - 'description' => __('Created from Graph analytics. Filter:').' '.$filter_name.'. '.__('Graph').' '.($counter + 1), - 'period' => $interval, - 'stacked' => 2, - ] - ); + $id_graph = db_process_sql_insert( + 'tgraph', + [ + 'id_user' => $config['id_user'], + 'id_group' => $group, + 'name' => $filter_name.' ('.__('Graph').') ', + 'description' => __('Created from Graph analytics. Filter:').' '.$filter_name.'. '.__('Graph'), + 'period' => $interval, + 'stacked' => 2, + ] + ); + foreach ($graphs as $graph) { if ($id_graph > 0) { $counter++; $field_order = 1; @@ -360,6 +367,11 @@ if (is_ajax()) { echo $counter; } + if (empty($load_list_filters) === false) { + $filters = graph_analytics_filter_select(); + echo json_encode($filters); + } + return; } @@ -384,7 +396,7 @@ if (check_acl($config['id_user'], 0, 'RW') === 1 || check_acl($config['id_user'] 'content' => html_print_radio_button( 'filter_mode', 'new', - __('New filter'), + __('Create'), true, true ), @@ -398,7 +410,21 @@ if (check_acl($config['id_user'], 0, 'RW') === 1 || check_acl($config['id_user'] 'content' => html_print_radio_button( 'filter_mode', 'update', - __('Update filter'), + __('Update'), + false, + true + ), + ], + true + ); + + $data[2] = html_print_div( + [ + 'style' => 'display: flex;', + 'content' => html_print_radio_button( + 'filter_mode', + 'delete', + __('Delete'), false, true ), @@ -466,7 +492,37 @@ if (check_acl($config['id_user'], 0, 'RW') === 1 || check_acl($config['id_user'] ); $table->data[] = $data; - $table->rowclass[] = ''; + $table->rowclass[] = 'display-grid'; + + $data = []; + $table->rowid[4] = 'delete_filter_row2'; + $data[0] = __('Delete filter'); + + $select_filters_delete = graph_analytics_filter_select(); + + $data[0] .= html_print_select( + $select_filters_delete, + 'delete_filter', + '', + '', + '', + 0, + true + ); + $data[1] = html_print_submit_button( + __('Delete filter'), + 'delete_filter', + false, + [ + 'class' => 'mini ', + 'icon' => 'delete', + 'style' => 'margin-left: 155px; width: 145px;', + 'onclick' => 'delete_filter();', + ], + true + ); + + $table->data[] = $data; html_print_table($table); } else { @@ -583,7 +639,7 @@ echo ''; echo '
+ '.__('Agents').'
'.ui_toggle( - '', - __('Agents'), - 'agents-toggle', - 'agents-toggle', - true, - true, - '', - 'white-box-content', - 'box-flat white_table_graph', - 'images/arrow@svg.svg', - 'images/arrow@svg.svg', - false, - false, - false, - '', - '', - null, - null, - false, - false, - 'static' + '', + __('Agents'), + 'agents-toggle', + 'agents-toggle', + true, + true, + '', + 'white-box-content', + 'box-flat white_table_graph', + 'images/arrow@svg.svg', + 'images/arrow@svg.svg', + false, + false, + false, + '', + '', + null, + null, + false, + false, + 'static' ).ui_toggle( '', __('Groups'), @@ -898,6 +903,7 @@ $left_content .= ' ).'
+ '.__('Modules').' @@ -1000,7 +1006,7 @@ const messageLoadConfirm = ""; const titleExport = ""; const titleExportConfirm = ""; -const messageExportConfirm = ""; +const messageExportConfirm = ""; const titleExportError = ""; const messageExportError = ""; From 6154ce725bbe25a4487a8182183b944c0ed357cd Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Thu, 30 Nov 2023 13:18:44 +0100 Subject: [PATCH 09/72] #12501 Fixed password field --- pandora_console/godmode/agentes/agent_manager.php | 11 +++-------- pandora_console/godmode/agentes/configure_field.php | 6 ++++++ pandora_console/include/styles/pandora.css | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index 557b855e09..e469c3f155 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -986,17 +986,12 @@ foreach ($fields as $field) { } if ((bool) $field['is_password_type'] === true) { - $customContent = html_print_input_text_extended( + $customContent = html_print_input_password( 'customvalue_'.$field['id_field'], $custom_value, - 'customvalue_'.$field['id_field'], '', - 30, - 100, - $view_mode, - '', - '', - true, + 45, + 255, true ); } else if ($field['is_link_enabled']) { diff --git a/pandora_console/godmode/agentes/configure_field.php b/pandora_console/godmode/agentes/configure_field.php index 839040cb00..904b807bbd 100755 --- a/pandora_console/godmode/agentes/configure_field.php +++ b/pandora_console/godmode/agentes/configure_field.php @@ -275,21 +275,27 @@ $(document).ready (function () { $('#configure_field-3').show(); dialog_message("#message_no_set_password"); $('#configure_field-1').hide(); + $('#configure_field-2-0').hide(); } else{ $('#configure_field-3').hide(); $('#configure_field-1').show(); + $('#configure_field-2-0').show(); } }); $('input[type=checkbox][name=is_password_type]').change(function () { if( $('input[type=checkbox][name=is_password_type]').prop('checked')){ + $('#configure_field-1').hide(); dialog_message("#message_no_set_combo"); $('#configure_field-3').hide(); + $('#configure_field-2-1').hide(); } else{ if($('input[type=checkbox][name=is_combo_enable]').prop('checked') === true) { $('#configure_field-3').show(); } + $('#configure_field-1').show(); + $('#configure_field-2-1').show(); } }); }); diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 384048fa00..75dbb9a6ae 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -11810,7 +11810,7 @@ p.trademark-copyright { } .show-hide-pass { - position: fixed; + position: absolute; border: 0; outline: none; margin-left: -50px; From 24c8e606f48751d24ff8832d7ec16eb9bd232cbd Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 30 Nov 2023 16:29:18 +0100 Subject: [PATCH 10/72] #12569 fixed button credential boxes --- pandora_console/godmode/servers/modificar_server.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/servers/modificar_server.php b/pandora_console/godmode/servers/modificar_server.php index c51c0476d3..03863fb4f5 100644 --- a/pandora_console/godmode/servers/modificar_server.php +++ b/pandora_console/godmode/servers/modificar_server.php @@ -521,7 +521,7 @@ $(document).ready (function () { function (data) { $(".white-box-content").html(data); - $("#submit-add").click(function (e) { + $("#button-add").click(function (e) { add_credential_boxes(); }); @@ -550,7 +550,7 @@ $(document).ready (function () { $(".white-box-content").html(data2); // Insert credential - $("#submit-add").click(function (e) { + $("#button-add").click(function (e) { save_credential_boxes(); }) }, From 87f4a6e15fc66c6840afc1d1867f27df6e1158e7 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Fri, 1 Dec 2023 10:08:25 +0100 Subject: [PATCH 11/72] #12384 Fixed acl --- .../javascript/functions_pandora_networkmap.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pandora_console/include/javascript/functions_pandora_networkmap.js b/pandora_console/include/javascript/functions_pandora_networkmap.js index c31216a2fc..44e3ba196c 100644 --- a/pandora_console/include/javascript/functions_pandora_networkmap.js +++ b/pandora_console/include/javascript/functions_pandora_networkmap.js @@ -806,6 +806,10 @@ function edit_node(data_node, dblClick) { var flag_edit_node = true; var edit_node = null; + if (networkmap_write === 0) { + return false; + } + //Only select one node var selection = d3_nm.selectAll(".node_selected"); var id; @@ -1950,6 +1954,10 @@ function init_minimap() { // Context menu //////////////////////////////////////////////////////////////////////// function show_menu(item, data) { + if (networkmap_write === 0) { + return false; + } + mouse = []; mouse[0] = d3_nm.event.pageX; mouse[1] = d3_nm.event.pageY; @@ -2819,6 +2827,10 @@ function cancel_set_parent() { // OWN CODE FOR TO DRAG //////////////////////////////////////////////////////////////////////// function init_drag_and_drop() { + if (networkmap_write === 0) { + return false; + } + window.dragables = svg.selectAll(".dragable_node"); window.drag_start = [0, 0]; From 5191739658e4dd3849d8090524a10697263f798a Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Fri, 1 Dec 2023 12:05:42 +0100 Subject: [PATCH 12/72] #12542 fixed local component module group --- pandora_console/include/javascript/pandora_modules.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/javascript/pandora_modules.js b/pandora_console/include/javascript/pandora_modules.js index 4e2f73db28..a126bc36f5 100644 --- a/pandora_console/include/javascript/pandora_modules.js +++ b/pandora_console/include/javascript/pandora_modules.js @@ -159,7 +159,9 @@ function configure_modules_form() { period_select_update("module_interval", data["module_interval"]); } - $("#id_module_group").val(data["id_module_group"]); + $("#id_module_group") + .val(data["id_module_group"]) + .trigger("change"); if (data["history_data"]) $("#checkbox-history_data").check(); else $("#checkbox-history_data").uncheck(); From 706540f94733999a3aeb6a0feacf9189aa6000d6 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Mon, 4 Dec 2023 15:12:33 +0100 Subject: [PATCH 13/72] #12598 Fixed event filter deleted and assigned as favorite --- pandora_console/godmode/events/event_filter.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/events/event_filter.php b/pandora_console/godmode/events/event_filter.php index c4f1860e6f..fce8163ad0 100644 --- a/pandora_console/godmode/events/event_filter.php +++ b/pandora_console/godmode/events/event_filter.php @@ -88,7 +88,17 @@ if ($multiple_delete) { ['id_filter' => $id] ); - if ($result === false) { + if ($result !== false) { + db_process_sql_delete( + 'tfavmenu_user', + [ + 'id_element' => $id, + 'section' => 'Events', + 'id_user' => $config['id_user'], + ] + ); + $result = true; + } else { break; } } From c22525febc900abd3bc54ed291b03ebf6e735a19 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 4 Dec 2023 16:54:14 +0100 Subject: [PATCH 14/72] #12569 fixed actions credential boxes --- pandora_console/godmode/servers/modificar_server.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/servers/modificar_server.php b/pandora_console/godmode/servers/modificar_server.php index 03863fb4f5..8a78de9592 100644 --- a/pandora_console/godmode/servers/modificar_server.php +++ b/pandora_console/godmode/servers/modificar_server.php @@ -609,7 +609,7 @@ $(document).ready (function () { function (data) { $(".white-box-content").html(data); - $("#submit-update").click(function (e) { + $("#button-update").click(function (e) { update_credential_boxes(datas); }); }, From abfa08b6e0d7b6e699154f994bfd9b526f58b746 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Thu, 7 Dec 2023 10:25:11 +0100 Subject: [PATCH 15/72] #12577 fixed visual error of the dynamic threshold ff threshold and cron from module containers --- .../agentes/module_manager_editor_common.php | 13 +++++++++---- pandora_console/include/styles/pandora.css | 8 ++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index c396634f67..2cf295aabf 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -1122,13 +1122,13 @@ if (isset($id_agente) === true && (int) $moduletype === MODULE_DATA) { $tableCron->data['cron_to_select'][0] = html_print_extended_select_for_cron($hour_to, $minute_to, $mday_to, $month_to, $wday_to, true, $disabledBecauseInPolicy, true); } -$table_advanced->rowclass['cron_section'] = 'table_section full_section'; +$table_advanced->rowclass['cron_section'] = 'table_section full_section mrgn_top_mod_0px'; $table_advanced->data['cron_section'] = html_print_table($tableCron, true); $table_advanced->data['title_3'] = html_print_subtitle_table(__('Thresholds and state changes')); $table_advanced->rowclass['caption_min_max_values'] = 'w50p pdd_t_10px'; -$table_advanced->rowclass['min_max_values'] = 'w50p'; +$table_advanced->rowclass['min_max_values'] = 'w50p pdd_b_10px'; $table_advanced->data['caption_min_max_values'][0] = __('Min. Value'); $table_advanced->data['caption_min_max_values'][1] = __('Max. Value'); @@ -1205,7 +1205,7 @@ $tableDynamicThreshold->data['adv_dynamic_threshold_twotailed'][0] = html_print_ $disabledBecauseInPolicy ); -$table_advanced->rowclass['dynamic_threshold_table'] = 'table_section full_section'; +$table_advanced->rowclass['dynamic_threshold_table'] = 'table_section full_section mrgn_top_mod_0px'; $table_advanced->data['dynamic_threshold_table'] = html_print_table($tableDynamicThreshold, true); $tableFFThreshold = new stdClass(); @@ -1295,10 +1295,15 @@ $tableFFThreshold->data['ff_thresholds_each'][2] = html_print_input_text( $classdisabledBecauseInPolicy ); +$table_advanced->rowclass['gap_flipflop'] = 'mrgn_top_btn_10px_imp'; +$table_advanced->data['gap_flipflop'] = html_print_input_hidden('gap_flipflop', 0); -$table_advanced->rowclass['flipflop_thresholds_table'] = 'table_section full_section'; +$table_advanced->rowclass['flipflop_thresholds_table'] = 'table_section full_section mrgn_top_mod_0px'; $table_advanced->data['flipflop_thresholds_table'] = html_print_table($tableFFThreshold, true); +$table_advanced->rowclass['gap_ff'] = 'mrgn_top_btn_10px_imp'; +$table_advanced->data['gap_ff'] = html_print_input_hidden('gap_ff', 0); + $table_advanced->rowclass['caption_ff_interval_timeout'] = 'w50p'; $table_advanced->rowclass['ff_interval_timeout'] = 'w50p'; $table_advanced->cellclass['caption_ff_interval_timeout'][0] = 'w50p'; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index d8f7dd9416..3215aefabf 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -7056,6 +7056,10 @@ div.graph div.legend table { margin: 0 1em 0 2em; } +.mrgn_top_btn_10px_imp { + margin: 10px 0 10px 0 !important; +} + /* * MARGIN LEFT */ @@ -7217,6 +7221,10 @@ div.graph div.legend table { margin-top: 0px; } +.mrgn_top_mod_0px { + margin-top: 0px !important; +} + .mrgn_top_5px { margin-top: 5px; } From 8d4e3e78a30369be7b834a5ac8f0934e4a720eb1 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Thu, 7 Dec 2023 16:00:42 +0100 Subject: [PATCH 16/72] #12579 fixed icons as buttons in action on satellite server agents --- .../include/class/SatelliteAgent.class.php | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/pandora_console/include/class/SatelliteAgent.class.php b/pandora_console/include/class/SatelliteAgent.class.php index 29fa2e3b77..09b023958d 100644 --- a/pandora_console/include/class/SatelliteAgent.class.php +++ b/pandora_console/include/class/SatelliteAgent.class.php @@ -388,26 +388,38 @@ class SatelliteAgent extends HTML $tmp->actions = ''; if ($delete === false) { - $tmp->actions .= html_print_image( - ($disable === true) ? 'images/lightbulb_off.png' : 'images/lightbulb.png', - true, + $tmp->actions .= html_print_anchor( [ - 'border' => '0', - 'class' => 'main_menu_icon mrgn_lft_05em invert_filter', - 'onclick' => 'disable_agent(\''.$tmp->address.'\',\''.strip_tags($tmp->name).'\',\''.(int) $disable.'\',\''.$id_agente.'\')', - ] + 'href' => '#', + 'content' => html_print_image( + ($disable === true) ? 'images/lightbulb_off.png' : 'images/lightbulb.png', + true, + [ + 'border' => '0', + 'class' => 'main_menu_icon mrgn_lft_05em invert_filter', + 'onclick' => 'disable_agent(\''.$tmp->address.'\',\''.strip_tags($tmp->name).'\',\''.(int) $disable.'\',\''.$id_agente.'\')', + ] + ), + ], + true ); } if ($disable === false) { - $tmp->actions .= html_print_image( - ($delete === true) ? 'images/add.png' : 'images/delete.svg', - true, + $tmp->actions .= html_print_anchor( [ - 'border' => '0', - 'class' => 'main_menu_icon mrgn_lft_05em invert_filter', - 'onclick' => 'delete_agent(\''.$tmp->address.'\',\''.strip_tags($tmp->name).'\',\''.(int) $delete.'\',\''.$id_agente.'\')', - ] + 'href' => '#', + 'content' => html_print_image( + ($delete === true) ? 'images/add.png' : 'images/delete.svg', + true, + [ + 'border' => '0', + 'class' => 'main_menu_icon mrgn_lft_05em invert_filter', + 'onclick' => 'delete_agent(\''.$tmp->address.'\',\''.strip_tags($tmp->name).'\',\''.(int) $delete.'\',\''.$id_agente.'\')', + ] + ), + ], + true ); } From 812e47603e5e08c492ed9b43c1af0150d2b07d4a Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 11 Dec 2023 18:05:58 +0100 Subject: [PATCH 17/72] some changes in audit view --- pandora_console/include/class/AuditLog.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/class/AuditLog.class.php b/pandora_console/include/class/AuditLog.class.php index 261ffac531..ceb98875a1 100644 --- a/pandora_console/include/class/AuditLog.class.php +++ b/pandora_console/include/class/AuditLog.class.php @@ -123,7 +123,7 @@ class AuditLog extends HTML ], [ 'text' => 'action', - 'class' => 'w80px table_action_buttons show_extended_info', + 'class' => 'w80px show_extended_info', ] ); @@ -187,7 +187,7 @@ class AuditLog extends HTML 'no_sortable_columns' => [-1], 'order' => [ 'field' => 'date', - 'direction' => 'asc', + 'direction' => 'desc', ], 'search_button_class' => 'sub filter float-right', 'form' => [ @@ -441,7 +441,7 @@ class AuditLog extends HTML $(document).ready(function() { // Add event listener for opening and closing details - $('#audit_logs tbody').on('click', 'td.show_extended_info', function() { + $(document).on('click', '#audit_logs tbody tr:has(td.show_extended_info)', function() { var tr = $(this).closest('tr'); var table = $("#tableId; ?>").DataTable(); var row = table.row(tr); From 276cf73e49a113fbd3a80c5591c929c96f5695be Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 12 Dec 2023 10:23:47 +0100 Subject: [PATCH 18/72] #12575 fixed order columns in dashboard --- pandora_console/include/ajax/dashboard.ajax.php | 17 +++++++++++++++-- pandora_console/views/dashboard/list.php | 6 +++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/ajax/dashboard.ajax.php b/pandora_console/include/ajax/dashboard.ajax.php index 50a0e0b7a1..40497a2ebc 100644 --- a/pandora_console/include/ajax/dashboard.ajax.php +++ b/pandora_console/include/ajax/dashboard.ajax.php @@ -41,7 +41,20 @@ if ($method === 'draw') { $length = get_parameter('length', $config['block_size']); $orderBy = get_datatable_order(true); - $sort_field = $orderBy['field']; + switch ($orderBy['field']) { + case 'groups': + $sort_field = 'nombre'; + break; + + case 'favorite': + $sort_field = 'active'; + break; + + default: + $sort_field = $orderBy['field']; + break; + } + $order = $orderBy['direction']; $pagination = ''; @@ -121,7 +134,7 @@ if ($method === 'draw') { ); } - $sql = 'SELECT * FROM tdashboard '.$where.' ORDER BY id '.$pagination; + $sql = 'SELECT * FROM tdashboard LEFT JOIN tgrupo ON tgrupo.id_grupo = tdashboard.id_group '.$where.' ORDER BY '.$sort_field.' '.$order.$pagination; $dashboards = db_get_all_rows_sql($sql); $count = db_get_value_sql('SELECT COUNT(*) FROM tdashboard '.$where); foreach ($dashboards as $dashboard) { diff --git a/pandora_console/views/dashboard/list.php b/pandora_console/views/dashboard/list.php index aae6778f6d..aaf675e64a 100644 --- a/pandora_console/views/dashboard/list.php +++ b/pandora_console/views/dashboard/list.php @@ -112,7 +112,11 @@ if (empty($dashboards) === true) { 'manageDashboards' => $manageDashboards, ], 'default_pagination' => $config['block_size'], - 'no_sortable_columns' => [], + 'no_sortable_columns' => [ + 4, + 5, + 6, + ], 'order' => [ 'field' => 'name', 'direction' => 'desc', From e3fc6c13f5c143111aad2239caf94ebab69c2d6b Mon Sep 17 00:00:00 2001 From: "felix.suarez" Date: Tue, 12 Dec 2023 22:29:47 -0600 Subject: [PATCH 19/72] Change api_call to manage_api_call --- pandora_server/util/pandora_manage.pl | 56 +++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index afcf8b9199..997e254737 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -264,7 +264,7 @@ sub help_screen{ ######################################################################## # ######################################################################## -sub api_call($$$;$$$$) { +sub manage_api_call($$$;$$$$) { my ($pa_config, $op, $op2, $id, $id2, $other, $return_type) = @_; my $content = undef; @@ -400,7 +400,7 @@ sub pandora_disable_group ($$$) { foreach my $id_agent (@agents_bd) { # Call the API. - $result += api_call( + $result += manage_api_call( $conf, 'set', 'disabled_and_standby', $id_agent->{'id_agente'}, $server, '1|1' ); } @@ -2253,7 +2253,7 @@ sub cli_module_group_synch() { if ($return_type eq '') { $return_type = 'csv'; } - my $result = api_call(\%conf,'set', 'module_group_synch', undef, undef, "$other", $return_type); + my $result = manage_api_call(\%conf,'set', 'module_group_synch', undef, undef, "$other", $return_type); print "$result \n\n "; } @@ -2321,7 +2321,7 @@ sub cli_create_network_component() { my $other2 = join('|', @todo2); # Call the API. - my $result = api_call( $conf, 'set', 'new_network_component', $c_name, undef, "$c_type|$other|$c_group|$other2"); + my $result = manage_api_call( $conf, 'set', 'new_network_component', $c_name, undef, "$c_type|$other|$c_group|$other2"); print "$result \n\n "; } @@ -4322,7 +4322,7 @@ sub cli_get_alert_actions() { if ($return_type eq '') { $return_type = 'csv'; } - my $result = api_call(\%conf,'get', 'alert_actions', undef, undef, "$action_name|$separator",$return_type); + my $result = manage_api_call(\%conf,'get', 'alert_actions', undef, undef, "$action_name|$separator",$return_type); print "$result \n\n "; } @@ -4337,7 +4337,7 @@ sub cli_get_alert_actions_meta() { $return_type = 'csv'; } - my $result = api_call(\%conf,'get', 'alert_actions_meta', undef, undef, "$server_name|$action_name|$separator",$return_type); + my $result = manage_api_call(\%conf,'get', 'alert_actions_meta', undef, undef, "$server_name|$action_name|$separator",$return_type); print "$result \n\n "; } @@ -4557,7 +4557,7 @@ sub cli_create_event() { sub cli_update_event_custom_id() { my ($id_event, $event_custom_id) = @ARGV[2..3]; - my $result = api_call(\%conf, 'set', 'event_custom_id', $id_event, $event_custom_id); + my $result = manage_api_call(\%conf, 'set', 'event_custom_id', $id_event, $event_custom_id); print "\n$result\n"; } @@ -4849,7 +4849,7 @@ sub cli_apply_policy() { my ($id_policy, $id_agent, $name, $id_server) = @ARGV[2..5]; # Call the API. - my $result = api_call(\%conf, 'set', 'apply_policy', $id_policy, $id_agent, "$name|$id_server"); + my $result = manage_api_call(\%conf, 'set', 'apply_policy', $id_policy, $id_agent, "$name|$id_server"); print "\n$result\n"; } @@ -6022,7 +6022,7 @@ sub cli_policy_add_agent() { sub cli_policy_delete_agent() { my ($policy_id, $agent_id) = @ARGV[2..3]; - my $result = api_call(\%conf,'set', 'remove_agent_from_policy', $policy_id, $agent_id); + my $result = manage_api_call(\%conf,'set', 'remove_agent_from_policy', $policy_id, $agent_id); print "$result \n\n "; } @@ -6032,7 +6032,7 @@ sub cli_create_planned_downtime() { my @todo = @ARGV[3..21]; my $other = join('|', @todo); - my $result = api_call(\%conf,'set', 'planned_downtimes_created', $name, undef, "$other"); + my $result = manage_api_call(\%conf,'set', 'planned_downtimes_created', $name, undef, "$other"); print "$result \n\n "; } @@ -6046,7 +6046,7 @@ sub cli_add_item_planned_downtime() { my $other_modules = join(';', @modules); my $other = $other_agents . "|" . $other_modules; - my $result = api_call(\%conf,'set', 'planned_downtimes_additem', $id, undef, "$other"); + my $result = manage_api_call(\%conf,'set', 'planned_downtimes_additem', $id, undef, "$other"); print_log "$result \n\n"; } @@ -8645,7 +8645,7 @@ sub cli_create_tag() { my ($tag_name, $tag_description, $tag_url, $tag_email) = @ARGV[2..5]; # Call the API. - my $result = api_call(\%conf, 'set', 'create_tag', undef, undef, "$tag_name|$tag_description|$tag_url|$tag_email"); + my $result = manage_api_call(\%conf, 'set', 'create_tag', undef, undef, "$tag_name|$tag_description|$tag_url|$tag_email"); print "\n$result\n"; } @@ -8682,7 +8682,7 @@ sub cli_add_tag_to_user_profile() { exist_check($user_profile_id, 'given profile and group combination for user', $user_id); # Call the API. - my $result = api_call(\%conf, 'set', 'tag_user_profile', $user_id, $tag_id, "$group_id|$profile_id"); + my $result = manage_api_call(\%conf, 'set', 'tag_user_profile', $user_id, $tag_id, "$group_id|$profile_id"); print "\n$result\n"; } @@ -8706,7 +8706,7 @@ sub cli_add_tag_to_module() { exist_check($module_id, 'module name', $module_name); # Call the API. - my $result = api_call(\%conf, 'set', 'add_tag_module', $module_id, $tag_id); + my $result = manage_api_call(\%conf, 'set', 'add_tag_module', $module_id, $tag_id); print "\n$result\n"; } @@ -8725,7 +8725,7 @@ sub cli_migration_agent_queue() { } # Call the API. - my $result = api_call( $conf, 'set', 'migrate_agent', $id_agent, 0, "$source_name|$target_name|$only_db" ); + my $result = manage_api_call( $conf, 'set', 'migrate_agent', $id_agent, 0, "$source_name|$target_name|$only_db" ); print "\n$result\n"; } @@ -8740,7 +8740,7 @@ sub cli_migration_agent() { } # Call the API. - my $result = api_call( $conf, 'get', 'migrate_agent', $id_agent); + my $result = manage_api_call( $conf, 'get', 'migrate_agent', $id_agent); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8849,7 +8849,7 @@ sub cli_new_cluster() { my ($cluster_name,$cluster_type,$description,$group_id) = @ARGV[2..5]; # Call the API. - my $result = api_call( $conf, 'set', 'new_cluster', undef, undef, "$cluster_name|$cluster_type|$description|$group_id"); + my $result = manage_api_call( $conf, 'set', 'new_cluster', undef, undef, "$cluster_name|$cluster_type|$description|$group_id"); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8867,7 +8867,7 @@ sub cli_add_cluster_agent() { my ($other) = @ARGV[2..2]; # Call the API. - my $result = api_call( $conf, 'set', 'add_cluster_agent', undef, undef, $other); + my $result = manage_api_call( $conf, 'set', 'add_cluster_agent', undef, undef, $other); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8885,7 +8885,7 @@ sub cli_add_cluster_item() { my ($other) = @ARGV[2..2]; # Call the API. - my $result = api_call( $conf, 'set', 'add_cluster_item', undef, undef, $other); + my $result = manage_api_call( $conf, 'set', 'add_cluster_item', undef, undef, $other); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8903,7 +8903,7 @@ sub cli_delete_cluster() { my ($id) = @ARGV[2..2]; # Call the API. - my $result = api_call( $conf, 'set', 'delete_cluster', $id); + my $result = manage_api_call( $conf, 'set', 'delete_cluster', $id); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8921,7 +8921,7 @@ sub cli_delete_cluster_agent() { my ($id_agent,$id_cluster) = @ARGV[2..3]; # Call the API. - my $result = api_call( $conf, 'set', 'delete_cluster_agent', undef, undef, "$id_agent|$id_cluster"); + my $result = manage_api_call( $conf, 'set', 'delete_cluster_agent', undef, undef, "$id_agent|$id_cluster"); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8939,7 +8939,7 @@ sub cli_delete_cluster_item() { my ($id) = @ARGV[2..2]; # Call the API. - my $result = api_call( $conf, 'set', 'delete_cluster_item', $id); + my $result = manage_api_call( $conf, 'set', 'delete_cluster_item', $id); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8958,7 +8958,7 @@ sub cli_get_cluster_status() { my ($id) = @ARGV[2..2]; # Call the API. - my $result = api_call( $conf, 'get', 'cluster_status', $id); + my $result = manage_api_call( $conf, 'get', 'cluster_status', $id); if( defined($result) && "$result" ne "" ){ print "\n1\n"; @@ -8979,7 +8979,7 @@ sub cli_set_disabled_and_standby() { $value = 1 unless defined($value); #Set to disabled by default # Call the API. - my $result = api_call( + my $result = manage_api_call( $conf, 'set', 'disabled_and_standby', $id, $id_node, $value ); @@ -8995,7 +8995,7 @@ sub cli_set_disabled_and_standby() { sub cli_reset_agent_counts() { my $agent_id = @ARGV[2]; - my $result = api_call(\%conf,'set', 'reset_agent_counts', $agent_id); + my $result = manage_api_call(\%conf,'set', 'reset_agent_counts', $agent_id); print "$result \n\n "; } @@ -9010,7 +9010,7 @@ sub cli_event_in_progress() { my $event_id = @ARGV[2]; # Call the API. - my $result = api_call( + my $result = manage_api_call( $conf, 'set', 'event_in_progress', $event_id ); @@ -9080,7 +9080,7 @@ sub cli_get_gis_agent(){ my $agent_id = @ARGV[2]; - my $result = api_call(\%conf,'get', 'gis_agent', $agent_id); + my $result = manage_api_call(\%conf,'get', 'gis_agent', $agent_id); print "$result \n\n "; } @@ -9096,7 +9096,7 @@ sub cli_insert_gis_data(){ my @position = @ARGV[3..5]; my $other = join('|', @position); - my $result = api_call(\%conf,'set', 'gis_agent_only_position', $agent_id, undef, "$other"); + my $result = manage_api_call(\%conf,'set', 'gis_agent_only_position', $agent_id, undef, "$other"); print "$result \n\n "; } From 7b6c14974d1bfee2a230b729f92998b1861a3147 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 13 Dec 2023 10:34:46 +0100 Subject: [PATCH 20/72] #12573 fixed number of cells in list dashboard --- pandora_console/include/lib/Dashboard/Manager.php | 9 +++++++++ pandora_console/pandoradb_data.sql | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/lib/Dashboard/Manager.php b/pandora_console/include/lib/Dashboard/Manager.php index 4430bfa253..bee64b7ba1 100644 --- a/pandora_console/include/lib/Dashboard/Manager.php +++ b/pandora_console/include/lib/Dashboard/Manager.php @@ -1056,6 +1056,7 @@ class Manager implements PublicLogin 'name' => $name, 'id_user' => $id_user, 'id_group' => $id_group, + 'cells' => 1, 'cells_slideshow' => $slideshow, 'active' => $favourite, 'date_range' => $dateRange, @@ -1367,6 +1368,7 @@ class Manager implements PublicLogin global $config; $items = \get_parameter('items', []); + $totalCells = 0; // Class Dashboard. if (empty($items) === false) { @@ -1398,8 +1400,15 @@ class Manager implements PublicLogin return false; } } + + if (is_array($items) === true) { + $totalCells = count($items); + } } + $values = ['cells' => $totalCells]; + $this->put($values); + echo json_encode($result); } diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 70f9451932..a3f28d816a 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -2704,8 +2704,8 @@ INSERT INTO `treport_content` (`id_rc`,`id_report`,`id_gs`,`id_agent_module`,`ty (2,1,0,0,'top_n',28800,0,2,'Top CPU per agent','',0,'<p>This type of report implies loading a lot of data. Therefore it is recommended for scheduled reports, not real-time view.</p>',NULL,0,'','','','00:00:00','00:00:00',1,1,1,1,1,1,1,0,3,10,0,10,0,1,1,0,'{"show_in_same_row":0,"hide_notinit_agents":0,"priority_mode":"1","dyn_height":"250","text_agent":"Lio=","text_agent_module":"Y3B1Lio="}',0,0,'',0,0,300,0,0,NULL,NULL,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,NULL,NULL,1,0,0,NULL), (3,1,0,0,'event_report_group',21600,0,3,'General event report','This is a sample of not normal events for any agent available in the last 6 hours',0,'<p>This type of report implies loading a lot of data. Therefore it is recommended for scheduled reports, not real-time view.</p>',NULL,0,'','','','00:00:00','00:00:00',1,1,1,1,1,1,1,0,0,10,0,10,0,0,0,0,'{"show_in_same_row":0,"hide_notinit_agents":0,"priority_mode":"1","dyn_height":"250","server_multiple":"\"\"","show_summary_group":0,"filter_event_severity":"[\"20\"]","filter_event_type":"[\"all\"]","filter_event_status":"[\"-1\"]","event_graph_by_agent":"1","event_graph_by_user_validator":"1","event_graph_by_criticity":"1","event_graph_validated_vs_unvalidated":0,"event_filter_search":"","event_filter_exclude":"","custom_data_events":"1","label":""}',0,0,'',0,0,300,0,0,NULL,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,NULL,NULL,1,0,0,NULL); INSERT INTO `tdashboard` (`id`,`name`,`id_user`,`id_group`,`active`,`cells`,`cells_slideshow`) VALUES - (1,'Sample Dashboard #1','',0,0,0,0), - (2,'Sample Dashboard #2','',0,0,0,0); + (1,'Sample Dashboard #1','',0,0,7,0), + (2,'Sample Dashboard #2','',0,0,10,0); INSERT INTO `twidget_dashboard` (`id`,`position`,`options`,`order`,`id_dashboard`,`id_widget`,`prop_width`,`prop_height`) VALUES (1,'{\"x\":\"0\",\"y\":\"0\",\"width\":\"4\",\"height\":\"4\"}','{\"title\":\"Agents hive\",\"background\":\"#ffffff\",\"groups\":[\"12,8,4,9,2,10,13,11\"]}',0,1,1,0.32,0.32), (2,'{\"x\":\"4\",\"y\":\"0\",\"width\":\"3\",\"height\":\"4\"}','{\"title\":\"Clock\",\"background\":\"#ffffff\",\"clockType\":\"analogic\"}',1,1,12,0.32,0.32), From 88784de3ef390d0805bdbb5beed1e01393e533fa Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 13 Dec 2023 13:03:08 +0100 Subject: [PATCH 21/72] #12143 fix datepicker dashboard widget hardening --- .../include/javascript/pandora_dashboards.js | 13 ++++++++++++- pandora_console/include/javascript/pandora_ui.js | 9 +++++++++ .../lib/Dashboard/Widgets/security_hardening.php | 4 ++-- pandora_console/include/styles/pandora.css | 4 ++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/javascript/pandora_dashboards.js b/pandora_console/include/javascript/pandora_dashboards.js index 283acf8005..da969814cc 100644 --- a/pandora_console/include/javascript/pandora_dashboards.js +++ b/pandora_console/include/javascript/pandora_dashboards.js @@ -22,6 +22,9 @@ function show_option_dialog(settings) { method: "updateDashboard", dataType: "json" }, + oncancel: { + reload: true + }, ajax_callback: update_dashboard }); } @@ -458,6 +461,10 @@ function initialiceLayout(data) { }*/ function configurationWidget(cellId, widgetId, size) { + var reload = 0; + if (widgetId == 46) { + reload = 1; + } load_modal({ target: $("#modal-config-widget"), form: "form-config-widget", @@ -483,8 +490,12 @@ function initialiceLayout(data) { method: "saveWidgetIntoCell", dataType: "json" }, + oncancel: { + reload: reload + }, ajax_callback: update_widget_to_cell, - onsubmitClose: 1 + onsubmitClose: 1, + onsubmitReload: reload }); } diff --git a/pandora_console/include/javascript/pandora_ui.js b/pandora_console/include/javascript/pandora_ui.js index 45ca47e92b..de17eae3ea 100644 --- a/pandora_console/include/javascript/pandora_ui.js +++ b/pandora_console/include/javascript/pandora_ui.js @@ -168,6 +168,8 @@ function load_modal(settings) { if (typeof settings.oncancel.confirm == "function") { //receive function settings.oncancel.confirm(cancelModal); + } else if (settings.oncancel.reload == true) { + location.reload(); } else if (settings.oncancel != undefined) { cancelModal(); } @@ -347,6 +349,13 @@ function load_modal(settings) { AJAX_RUNNING = 0; } }); + + if ( + settings.onsubmitReload != undefined && + settings.onsubmitReload == true + ) { + location.reload(); + } } else { AJAX_RUNNING = 0; } diff --git a/pandora_console/include/lib/Dashboard/Widgets/security_hardening.php b/pandora_console/include/lib/Dashboard/Widgets/security_hardening.php index b3c124f039..0e9612cd29 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/security_hardening.php +++ b/pandora_console/include/lib/Dashboard/Widgets/security_hardening.php @@ -274,9 +274,9 @@ class SecurityHardening extends Widget 'name' => 'range', 'type' => 'date_range', 'selected' => 'chose_range', - 'date_init' => date('Y-m-d', $values['date_init']), + 'date_init' => date('Y/m/d', $values['date_init']), 'time_init' => date('H:i:s', $values['date_init']), - 'date_end' => date('Y-m-d', $values['date_end']), + 'date_end' => date('Y/m/d', $values['date_end']), 'time_end' => date('H:i:s', $values['date_end']), 'return' => true, ], diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 8f8226320e..2e6cd36149 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -12048,6 +12048,10 @@ div.relative > div > div#ui-datepicker-div { left: 5px !important; } +#ui-datepicker-div .ui-datepicker-header { + background-color: white; +} + .ui-widget-overlay { background: #aaa; opacity: 0.3 !important; From fe9b35ed77b4c6058961fd5a946535b5817b5c80 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 13 Dec 2023 16:51:14 +0100 Subject: [PATCH 22/72] #12622 help only when feedback enable --- pandora_console/general/header.php | 32 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index 102d8e3136..d092722cee 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -397,21 +397,23 @@ echo sprintf('
', $menuTypeClass); $modal_box .= ''.__('Join discord community').''; $modal_box .= '
'; - $modal_help = html_print_div( - [ - 'id' => 'modal-help-content', - 'content' => html_print_image( - 'images/help@header.svg', - true, - [ - 'title' => __('Help'), - 'class' => 'main_menu_icon bot invert_filter', - 'alt' => 'user', - ] - ).$modal_box, - ], - true, - ); + if ($config['activate_feedback'] === '1') { + $modal_help = html_print_div( + [ + 'id' => 'modal-help-content', + 'content' => html_print_image( + 'images/help@header.svg', + true, + [ + 'title' => __('Help'), + 'class' => 'main_menu_icon bot invert_filter', + 'alt' => 'user', + ] + ).$modal_box, + ], + true, + ); + } // User. From 6e150c1bc2ab65dd2cba29aaa5f2919a206b8ad4 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 14 Dec 2023 08:59:13 +0100 Subject: [PATCH 23/72] #12560 alert update manager --- pandora_console/include/class/ConsoleSupervisor.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index 83208256fb..ae12f37772 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -928,7 +928,9 @@ class ConsoleSupervisor false ); - if ($prev !== false + if ($data['type'] === 'NOTIF.UPDATEMANAGER.REGISTRATION' && $prev !== false) { + return; + } else if ($prev !== false && (time() - $prev['timestamp']) > $max_age ) { // Clean previous notification. From 065b096f14515ebee793f85f097bcf02de63663c Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 14 Dec 2023 10:03:58 +0100 Subject: [PATCH 24/72] #12366 user list 5 users bug styles --- pandora_console/godmode/users/user_list.php | 65 +++++++-------------- pandora_console/include/styles/pandora.css | 11 ++++ 2 files changed, 31 insertions(+), 45 deletions(-) diff --git a/pandora_console/godmode/users/user_list.php b/pandora_console/godmode/users/user_list.php index d488b4faad..89607ced69 100644 --- a/pandora_console/godmode/users/user_list.php +++ b/pandora_console/godmode/users/user_list.php @@ -689,7 +689,7 @@ foreach ($info as $user_id => $user_info) { // User profiles. if ($user_is_admin || $user_id == $config['id_user'] || isset($group_um[0])) { $user_profiles = db_get_all_rows_sql( - 'SELECT * FROM tusuario_perfil where id_usuario LIKE "'.$user_id.'" LIMIT 5' + 'SELECT * FROM tusuario_perfil where id_usuario LIKE "'.$user_id.'"' ); } else { $user_profiles_aux = users_get_user_profile($user_id, 'LIMIT 5'); @@ -778,17 +778,24 @@ foreach ($info as $user_id => $user_info) { if ($user_profiles !== false) { $total_profile = 0; - $data[4] .= '
'; + $data[4] .= '
'; foreach ($user_profiles as $row) { + if ($total_profile > 5) { + $data[4] .= "'; + } + + if ($total_profile == 0 && count($user_profiles) > 5) { + $data[4] .= ''.html_print_image( 'images/zoom.png', true, [ @@ -804,8 +811,6 @@ foreach ($info as $user_id => $user_info) { ); } - $data[4] .= '
'; - $total_profile++; } @@ -1052,43 +1057,13 @@ if ($is_management_allowed === true) { ?> diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 53d559b1d0..65212bed73 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -985,6 +985,12 @@ select:-internal-list-box { justify-content: flex-start !important; } +.flex-column-start { + display: flex; + flex-direction: column; + align-items: flex-start; +} + .padding-2 { padding: 2em; } @@ -5530,6 +5536,11 @@ input:checked + .p-slider:before { color: #4d4d4d; } +.show-profiles { + position: absolute; + margin-left: 15%; +} + /* Tables to upload files */ #table_filemanager tr:first-child th span { font-weight: bold; From 9258de7edc976f940ce4383803f23077b51404a6 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Thu, 14 Dec 2023 12:25:21 +0100 Subject: [PATCH 25/72] fix multiple selector --- pandora_console/godmode/modules/manage_nc_groups.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/godmode/modules/manage_nc_groups.php b/pandora_console/godmode/modules/manage_nc_groups.php index d5540d2472..423008db82 100644 --- a/pandora_console/godmode/modules/manage_nc_groups.php +++ b/pandora_console/godmode/modules/manage_nc_groups.php @@ -63,7 +63,7 @@ if (is_metaconsole() === true) { ], [ 'link' => '', - 'label' => __('Component groups'), + 'label' => __('Component groups1221'), ], ] ); @@ -394,11 +394,11 @@ html_print_action_buttons( $('[id^=checkbox-all_delete]').change(function(){ if ($("#checkbox-all_delete").prop("checked")) { $('[id^=checkbox-delete_multiple]').parent().parent().addClass('checkselected'); - $(".check_delete").prop("checked", true); + $(".custom_checkbox_input").prop("checked", true); } else{ $('[id^=checkbox-delete_multiple]').parent().parent().removeClass('checkselected'); - $(".check_delete").prop("checked", false); + $(".custom_checkbox_input").prop("checked", false); } }); }); From 7398982912fac42ac2130ca9fae7bb9a8f4b607a Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Thu, 14 Dec 2023 12:27:00 +0100 Subject: [PATCH 26/72] fix multiple selector --- pandora_console/godmode/modules/manage_nc_groups.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/modules/manage_nc_groups.php b/pandora_console/godmode/modules/manage_nc_groups.php index 423008db82..e7ceff1f01 100644 --- a/pandora_console/godmode/modules/manage_nc_groups.php +++ b/pandora_console/godmode/modules/manage_nc_groups.php @@ -63,7 +63,7 @@ if (is_metaconsole() === true) { ], [ 'link' => '', - 'label' => __('Component groups1221'), + 'label' => __('Component groups'), ], ] ); From c6d29ea60ed57927d7ce3afbaeba80be084704a9 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 14 Dec 2023 16:59:39 +0100 Subject: [PATCH 27/72] #12435 external link users fix --- pandora_console/extras/mr/68.sql | 2 ++ pandora_console/godmode/users/configure_user.php | 4 ++-- pandora_console/godmode/users/user_management.php | 2 +- pandora_console/pandoradb.sql | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pandora_console/extras/mr/68.sql b/pandora_console/extras/mr/68.sql index 3095941187..e988817a54 100644 --- a/pandora_console/extras/mr/68.sql +++ b/pandora_console/extras/mr/68.sql @@ -1,5 +1,7 @@ START TRANSACTION; +ALTER TABLE `tusuario` CHANGE COLUMN `metaconsole_data_section` `metaconsole_data_section` TEXT NOT NULL DEFAULT '' ; + DELETE FROM `twelcome_tip` WHERE `title` = 'Automatic agent provision system'; INSERT INTO `twelcome_tip` (`id_lang`,`id_profile`,`title`,`text`,`url`,`enable`) VALUES ('en_GB',0,'Automatic agent provision system','The agent self-provisioning system allows an agent recently entered into the system to automatically apply changes to their configuration (such as moving them from group, assigning them certain values in custom fields) and of course applying certain monitoring policies. It is one of the most powerful functionalities, aimed at managing very large system parks.','https://pandorafms.com/manual/start?id=en/documentation/02_installation/05_configuration_agents#conf',1); diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 83e54f24c5..dbca522db4 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -427,7 +427,7 @@ if ($create_user === true) { } else if ($values['section'] === HOME_SCREEN_OTHER) { $values['data_section'] = get_parameter('data_section_other'); } else if (io_safe_output($values['section']) === HOME_SCREEN_EXTERNAL_LINK) { - $values['data_section'] = get_parameter('data_section_external'); + $values['data_section'] = get_parameter('data_section'); } // $values['section'] = $homeScreenValues[$values['section']]; @@ -727,7 +727,7 @@ if ($update_user) { } else if ($values['section'] === HOME_SCREEN_OTHER) { $values['data_section'] = get_parameter('data_section_other'); } else if (io_safe_output($values['section']) === HOME_SCREEN_EXTERNAL_LINK) { - $values['data_section'] = get_parameter('data_section_external'); + $values['data_section'] = get_parameter('data_section'); } // $values['section'] = $homeScreenValues[$values['section']]; diff --git a/pandora_console/godmode/users/user_management.php b/pandora_console/godmode/users/user_management.php index b1212c11ec..2f8aecd47e 100644 --- a/pandora_console/godmode/users/user_management.php +++ b/pandora_console/godmode/users/user_management.php @@ -118,7 +118,7 @@ $customHomeScreenAddition[HOME_SCREEN_EXTERNAL_LINK] = html_print_input_text( $user_info['data_section'], '', 60, - 255, + 999, true ); $customHomeScreenDataField = ''; diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 56e49ad467..a4df08742c 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1292,7 +1292,7 @@ CREATE TABLE IF NOT EXISTS `tusuario` ( `section` TEXT, `data_section` TEXT, `metaconsole_section` VARCHAR(255) NOT NULL DEFAULT 'Default', - `metaconsole_data_section` VARCHAR(255) NOT NULL DEFAULT '', + `metaconsole_data_section` TEXT, `force_change_pass` TINYINT UNSIGNED NOT NULL DEFAULT 0, `last_pass_change` DATETIME, `last_failed_login` DATETIME, From a008c7486c4b543d1802d0813ba42bcbe86f90d8 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Thu, 14 Dec 2023 17:28:34 +0100 Subject: [PATCH 28/72] #12026 Fixed widget --- .../lib/Dashboard/Widgets/inventory.php | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/pandora_console/include/lib/Dashboard/Widgets/inventory.php b/pandora_console/include/lib/Dashboard/Widgets/inventory.php index a8fc01ee1c..8424d6cfbf 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/inventory.php +++ b/pandora_console/include/lib/Dashboard/Widgets/inventory.php @@ -177,6 +177,12 @@ class InventoryWidget extends Widget // Must be configured before using. $this->configurationRequired = false; + if (isset($this->values['inventoryModuleId']) + && $this->values['inventoryModuleId'] === 'basic' + && $this->values['agentId'] === 0 + ) { + $this->configurationRequired = true; + } } @@ -296,9 +302,12 @@ class InventoryWidget extends Widget ]; $fields = []; - array_unshift($fields, __('All')); + if (isset($values['inventoryModuleId']) === false) { + $values['inventoryModuleId'] = 0; + } + $inputs[] = [ 'label' => __('Module'), 'arguments' => [ @@ -316,31 +325,6 @@ class InventoryWidget extends Widget ], ]; - // Agent select. - if ($is_metaconsole === false) { - $agents = []; - $sql = 'SELECT id_agente, nombre FROM tagente'; - if ($inventory_id_group > 0) { - $sql .= ' WHERE id_grupo = '.$inventory_id_group; - } else { - $user_groups = implode(',', array_keys(users_get_groups($config['id_user']))); - - // Avoid errors if there are no groups. - if (empty($user_groups) === true) { - $user_groups = '"0"'; - } - - $sql .= ' WHERE id_grupo IN ('.$user_groups.')'; - } - - $result = db_get_all_rows_sql($sql); - if ($result) { - foreach ($result as $row) { - $agents[$row['id_agente']] = $row['nombre']; - } - } - } - // Date filter. if (is_metaconsole() === false) { $inputs[] = [ From 8df792f11b401ba84d851b73d9b8b03b4d1b3ae2 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Fri, 15 Dec 2023 10:41:21 +0100 Subject: [PATCH 29/72] #12571 custom graphs refactored --- .../reporting/graph_builder.graph_editor.php | 246 +++++++----------- .../godmode/reporting/graph_builder.php | 2 +- pandora_console/include/ajax/graph.ajax.php | 103 ++++++++ pandora_console/include/functions_html.php | 25 +- .../include/styles/custom_graph.css | 16 ++ 5 files changed, 235 insertions(+), 157 deletions(-) create mode 100644 pandora_console/include/styles/custom_graph.css diff --git a/pandora_console/godmode/reporting/graph_builder.graph_editor.php b/pandora_console/godmode/reporting/graph_builder.graph_editor.php index 0256c28f92..c4da379ebd 100644 --- a/pandora_console/godmode/reporting/graph_builder.graph_editor.php +++ b/pandora_console/godmode/reporting/graph_builder.graph_editor.php @@ -30,7 +30,7 @@ if (!$report_w && !$report_m) { require_once $config['homedir'].'/include/functions_agents.php'; require_once $config['homedir'].'/include/functions_modules.php'; require_once $config['homedir'].'/include/functions_groups.php'; - +ui_require_css_file('custom_graph'); $editGraph = (bool) get_parameter('edit_graph', 0); $action = get_parameter('action', ''); @@ -41,113 +41,6 @@ if (isset($_GET['get_agent'])) { } } -switch ($action) { - case 'sort_items': - $resultOperationDB = null; - $position_to_sort = (int) get_parameter('position_to_sort', 1); - $ids_serialize = (string) get_parameter('ids_items_to_sort', ''); - $move_to = (string) get_parameter('move_to', 'after'); - - $countItems = db_get_sql( - ' - SELECT COUNT(id_gs) - FROM tgraph_source - WHERE id_graph = '.$id_graph - ); - - if (($countItems < $position_to_sort) || ($position_to_sort < 1)) { - $resultOperationDB = false; - } else if (!empty($ids_serialize)) { - $ids = explode('|', $ids_serialize); - $items = db_get_all_rows_sql( - 'SELECT id_gs, `field_order` - FROM tgraph_source - WHERE id_graph = '.$id_graph.' - ORDER BY `field_order`' - ); - - if ($items === false) { - $items = []; - } - - - // Clean the repeated order values. - $order_temp = 1; - foreach ($items as $item) { - db_process_sql_update( - 'tgraph_source', - ['`field_order`' => $order_temp], - ['id_gs' => $item['id_rc']] - ); - - $order_temp++; - } - - $items = db_get_all_rows_sql( - 'SELECT id_gs, `field_order` - FROM tgraph_source - WHERE id_graph = '.$id_graph.' - ORDER BY `field_order`' - ); - - if ($items === false) { - $items = []; - } - - - - $temp = []; - - $temp = []; - foreach ($items as $item) { - // Remove the contents from the block to sort. - if (array_search($item['id_gs'], $ids) === false) { - $temp[$item['field_order']] = $item['id_gs']; - } - } - - $items = $temp; - - - - $sorted_items = []; - foreach ($items as $pos => $id_unsort) { - if ($pos == $position_to_sort) { - if ($move_to == 'after') { - $sorted_items[] = $id_unsort; - } - - foreach ($ids as $id) { - $sorted_items[] = $id; - } - - if ($move_to != 'after') { - $sorted_items[] = $id_unsort; - } - } else { - $sorted_items[] = $id_unsort; - } - } - - $items = $sorted_items; - - - - foreach ($items as $order => $id) { - db_process_sql_update( - 'tgraph_source', - ['`field_order`' => ($order + 1)], - ['id_gs' => $id] - ); - } - - $resultOperationDB = true; - } else { - $resultOperationDB = false; - } - break; -} - if ($editGraph) { $graphRows = db_get_all_rows_sql( 'SELECT t1.*, @@ -257,41 +150,6 @@ $table->data[0][1] = html_print_label_input_block( ); -$SortItems = "
"; -$SortItems .= html_print_table($table, true); -$SortItems .= html_print_input_hidden('action', 'sort_items', true); -$SortItems .= html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Sort'), - 'srcbutton', - false, - [ - 'class' => 'mini', - 'icon' => 'search', - 'mode' => 'secondary', - ], - true - ), - ], - true -); -$SortItems .= '
'; - -ui_toggle( - $SortItems, - ''.__('Sort items').'', - '', - '', - false, - false, - '', - 'white-box-content no_border', - 'filter-datatable-main box-flat white_table_graph max_floating_element_size' -); - - // Configuration form. echo ''; echo "
"; @@ -300,10 +158,11 @@ echo "'; echo ''; echo ''; @@ -340,6 +199,7 @@ echo ''; // Modules table. if ($count_module_array > 0) { echo "
'.html_print_input( [ - 'type' => 'select_multiple_modules_filtered', - 'uniqId' => 'modules', - 'class' => 'flex flex-row', - 'searchBar' => true, + 'type' => 'select_multiple_modules_filtered', + 'uniqId' => 'modules', + 'class' => 'flex flex-row', + 'searchBar' => false, + 'placeholderAgents' => __('Search agent name'), ] ).'
"; + echo ''; echo ' @@ -348,6 +208,8 @@ if ($count_module_array > 0) { '; + echo ''; + echo ''; $color = 0; for ($a = 0; $a < $count_module_array; $a++) { // Calculate table line color. @@ -359,7 +221,7 @@ if ($count_module_array > 0) { $color = 1; } - echo ""; + echo ""; echo "'; echo "'; @@ -410,9 +272,30 @@ if ($count_module_array > 0) { echo ''; - echo ''; @@ -420,6 +303,8 @@ if ($count_module_array > 0) { echo ''; } + echo ''; + echo '
'.__('P.').' '.__('Agent').''.__('Weight').' '.__('Delete').' '.__('Sort').'
$position_array[$a]
$position_array[$a]".$agent_array[$a].'"; echo modules_get_agentmodule_name($module_array[$a]).''; + echo ''; - echo html_print_checkbox_extended('sorted_items[]', $idgs_array[$a], false, false, '', 'class="selected_check"', true); + echo html_print_input_image( + 'up', + 'images/arrow-up-white.png', + 'up', + ($config['style'] !== 'pandora_black') ? 'filter: invert(100%)' : '', + true, + [ + 'class' => 'invert_filter main_menu_icon', + 'onclick' => 'reorder(\'up\', \''.$idgs_array[$a].'\', this)', + ], + ); + echo html_print_input_image( + 'down', + 'images/arrow-down-white.png', + 'down', + ($config['style'] !== 'pandora_black') ? 'filter: invert(100%)' : '', + true, + [ + 'class' => 'invert_filter main_menu_icon', + 'onclick' => 'reorder(\'down\', \''.$idgs_array[$a].'\', this)', + ] + ); echo '
'; } @@ -482,4 +367,65 @@ function added_ids_sorted_items_to_hidden_input() { return true; } } + + +function reorder(action, idElement, element) { + var tr = $(element).parent().parent(); + switch (action) { + case "up": + changePosition(action, idElement) + .then((data) => { + if(data.success) { + $(tr).find('.position').html(parseInt($(tr).find('.position').html()) - 1); + $($(tr).prev()).find('.position').html(parseInt($($(tr).prev()).find('.position').html()) + 1); + $(tr).prev().insertAfter(tr); + } + }) + .catch((err) => { + console.log(err); + }) + break; + + case "down": + changePosition(action, idElement) + .then((data) => { + if(data.success) { + $(tr).find('.position').html(parseInt($(tr).find('.position').html()) + 1); + $($(tr).next()).find('.position').html(parseInt(($(tr).next()).find('.position').html()) - 1); + $(tr).next().insertBefore(tr); + } + }) + .catch((err) => { + console.log(err); + }) + break; + + default: + break; + } +} + +function changePosition(order, idElement) { + return new Promise(function(resolve, reject) { + $.ajax({ + method: "POST", + url: "", + dataType: "json", + data: { + page: "include/ajax/graph.ajax", + sort_items: 1, + order, + id_graph: , + id: idElement + }, + success: function(data) { + resolve(data); + }, + error: function(error) { + reject(error); + } + }); + }); +} + diff --git a/pandora_console/godmode/reporting/graph_builder.php b/pandora_console/godmode/reporting/graph_builder.php index 2e7b1f782e..e6aa119e84 100644 --- a/pandora_console/godmode/reporting/graph_builder.php +++ b/pandora_console/godmode/reporting/graph_builder.php @@ -237,7 +237,7 @@ if ($add_module === true) { ); $id_agent_modules = db_get_all_rows_sql( - 'SELECT id_agente_modulo FROM tagente_modulo WHERE id_agente IN ('.implode(',', $id_agents).") AND nombre IN ('".implode("','", $id_modules)."')" + 'SELECT id_agente_modulo FROM tagente_modulo WHERE id_agente IN ('.implode(',', $id_agents).") AND id_agente_modulo IN ('".implode("','", $id_modules)."')" ); if (count($id_agent_modules) > 0 && $id_agent_modules != '') { diff --git a/pandora_console/include/ajax/graph.ajax.php b/pandora_console/include/ajax/graph.ajax.php index 6ea76f373b..2db3a72912 100644 --- a/pandora_console/include/ajax/graph.ajax.php +++ b/pandora_console/include/ajax/graph.ajax.php @@ -17,6 +17,8 @@ $save_custom_graph = (bool) get_parameter('save_custom_graph'); $print_custom_graph = (bool) get_parameter('print_custom_graph', false); $print_sparse_graph = (bool) get_parameter('print_sparse_graph'); $get_graphs = (bool) get_parameter('get_graphs_container'); +$sort_items = (bool) get_parameter('sort_items'); + $width = get_parameter('width', 0); $height = get_parameter('height', 0); @@ -337,3 +339,104 @@ if ($get_graphs) { return; } } + + +if ($sort_items === true) { + $order = (string) get_parameter('order'); + $id = (string) get_parameter('id', ''); + $idGraph = (string) get_parameter('id_graph', ''); + $total = db_get_num_rows('SELECT * FROM tgraph_source WHERE id_graph = '.$idGraph.''); + $item = db_get_row_sql( + 'SELECT id_gs, field_order + FROM tgraph_source + WHERE id_gs = '.$id.' + ORDER BY field_order' + ); + + switch ($order) { + case 'up': + if (($item['field_order'] - 1) < 1) { + echo json_encode(['success' => false]); + return; + } + + $prevItem = db_get_row_sql( + 'SELECT id_gs, field_order + FROM tgraph_source + WHERE id_graph = '.$idGraph.' + AND field_order = '.($item['field_order'] - 1).' + ORDER BY field_order' + ); + + db_process_sql_begin(); + + $resultItem = db_process_sql_update( + 'tgraph_source', + ['field_order' => ($item['field_order'] - 1)], + ['id_gs' => $item['id_gs']], + false + ); + $resultPrevItem = db_process_sql_update( + 'tgraph_source', + ['field_order' => ($prevItem['field_order'] + 1)], + ['id_gs' => $prevItem['id_gs']], + false + ); + + if ($resultItem !== false && $resultPrevItem !== false) { + db_process_sql_commit(); + echo json_encode(['success' => true]); + return; + } else { + db_process_sql_rollback(); + echo json_encode(['success' => false]); + return; + } + break; + + case 'down': + if (($item['field_order'] + 1) > $total) { + echo json_encode(['success' => false]); + return; + } + + $nextItem = db_get_row_sql( + 'SELECT id_gs, field_order + FROM tgraph_source + WHERE id_graph = '.$idGraph.' + AND field_order = '.($item['field_order'] + 1).' + ORDER BY field_order' + ); + + + db_process_sql_begin(); + + $resultItem = db_process_sql_update( + 'tgraph_source', + ['field_order' => ($item['field_order'] + 1)], + ['id_gs' => $item['id_gs']], + false + ); + $resultNextItem = db_process_sql_update( + 'tgraph_source', + ['field_order' => ($nextItem['field_order'] - 1)], + ['id_gs' => $nextItem['id_gs']], + false + ); + + if ($resultItem !== false && $resultNextItem !== false) { + db_process_sql_commit(); + echo json_encode(['success' => true]); + return; + } else { + db_process_sql_rollback(); + echo json_encode(['success' => false]); + return; + } + break; + + default: + echo json_encode(['success' => false]); + break; + } +} diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 5b37dc51d2..eada8c4d90 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -774,7 +774,8 @@ function html_print_select( $select2_multiple_enable_all=false, $form='', $order=false, - $custom_id=null + $custom_id=null, + $placeholder='', ) { $output = "\n"; @@ -1013,7 +1014,8 @@ function html_print_select( $output .= ' diff --git a/pandora_console/godmode/agentes/configurar_agente.php b/pandora_console/godmode/agentes/configurar_agente.php index 3da403ef80..c2e3a2f4f6 100644 --- a/pandora_console/godmode/agentes/configurar_agente.php +++ b/pandora_console/godmode/agentes/configurar_agente.php @@ -102,7 +102,6 @@ $alias_as_name = 0; $direccion_agente = get_parameter('direccion', ''); $direccion_agente = trim(io_safe_output($direccion_agente)); $direccion_agente = io_safe_input($direccion_agente); -$unique_ip = 0; $intervalo = SECONDS_5MINUTES; $ff_interval = 0; $quiet_module = 0; @@ -186,7 +185,6 @@ if ($create_agent) { $alias = io_safe_input(trim(preg_replace('/[\/\\\|%#&$]/', '', $alias_safe_output))); $alias_as_name = (int) get_parameter_post('alias_as_name', 0); $direccion_agente = (string) get_parameter_post('direccion', ''); - $unique_ip = (int) get_parameter_post('unique_ip', 0); // Safe_output only validate ip. $direccion_agente = trim(io_safe_output($direccion_agente)); @@ -269,12 +267,7 @@ if ($create_agent) { $nombre_agente = $alias; } - if ($unique_ip && $direccion_agente != '') { - $sql = 'SELECT direccion FROM tagente WHERE direccion = "'.$direccion_agente.'"'; - $exists_ip = db_get_row_sql($sql); - } - - if (!$exists_alias && !$exists_ip) { + if (!$exists_alias) { $id_agente = db_process_sql_insert( 'tagente', [ @@ -371,8 +364,6 @@ if ($create_agent) { $agent_creation_error = __('Could not be created'); if ($exists_alias) { $agent_creation_error = __('Could not be created, because name already exists'); - } else if ($exists_ip) { - $agent_creation_error = __('Could not be created, because IP already exists'); } } } @@ -962,7 +953,6 @@ if ($update_agent) { $alias = io_safe_input(trim(preg_replace('/[\/\\\|%#&$]/', '', $alias_safe_output))); $alias_as_name = (int) get_parameter_post('alias_as_name', 0); $direccion_agente = (string) get_parameter_post('direccion', ''); - $unique_ip = (int) get_parameter_post('unique_ip', 0); // Safe_output only validate ip. $direccion_agente = trim(io_safe_output($direccion_agente)); @@ -1097,18 +1087,11 @@ if ($update_agent) { // If there is an agent with the same name, but a different ID. } - if ($direccion_agente !== $address_list && (bool) $unique_ip === true && $direccion_agente != '') { - $sql = 'SELECT direccion FROM tagente WHERE direccion = "'.$direccion_agente.'"'; - $exists_ip = db_get_row_sql($sql); - } - $old_group = agents_get_agent_group($id_agente); if ($grupo <= 0) { ui_print_error_message(__('The group id %d is incorrect.', $grupo)); } else if ($old_group !== $grupo && group_allow_more_agents($grupo, true, 'update') === false) { ui_print_error_message(__('Agent cannot be updated due to the maximum agent limit for this group')); - } else if ($exists_ip) { - ui_print_error_message(__('Duplicate main IP address')); } else { // If different IP is specified than previous, add the IP. if ($direccion_agente != '' diff --git a/pandora_console/include/ajax/agent.php b/pandora_console/include/ajax/agent.php index 65dcd96aef..b03a9e5b40 100644 --- a/pandora_console/include/ajax/agent.php +++ b/pandora_console/include/ajax/agent.php @@ -39,6 +39,7 @@ $get_agent_filters = get_parameter('get_agent_filters', 0); $save_agent_filter = get_parameter('save_agent_filter', 0); $update_agent_filter = get_parameter('update_agent_filter', 0); $delete_agent_filter = get_parameter('delete_agent_filter', 0); +$check_unique_ip = (bool) get_parameter('check_unique_ip', 0); if (https_is_running()) { header('Content-type: application/json'); @@ -1020,4 +1021,29 @@ $(document).ready(function() { return; } +if ($check_unique_ip === true) { + $direccion_agente = (string) get_parameter_post('direccion', ''); + $ip_all = get_parameter_post('ip_all', ''); + + if (empty($direccion_agente) === true) { + echo json_encode(['success' => false, 'message' => __('Please enter an IP address.')]); + return; + } + + $sql = 'SELECT direccion FROM tagente WHERE direccion = "'.$direccion_agente.'"'; + $exists_ip = db_get_row_sql($sql); + + if ($exists_ip !== false) { + if (is_array($ip_all) === true && in_array($direccion_agente, $ip_all) === true) { + echo json_encode(['success' => true, 'message' => __('Success! but this IP is already in the list.')]); + } else { + echo json_encode(['success' => false, 'message' => __('This IP is already being used'), 'exist_ip' => true]); + } + } else { + echo json_encode(['success' => true, 'message' => __('Success! this IP is available to be used.')]); + } + + return; +} + return; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 94d337bdbe..78425214ec 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -481,6 +481,11 @@ select:-internal-list-box { max-width: 120px; } +.w130px { + width: 130px; + max-width: 130px; +} + .w200px { width: 200px; max-width: 200px; @@ -598,6 +603,10 @@ select:-internal-list-box { min-width: 120px; } +.mw130px { + min-width: 130px; +} + .mw180px { min-width: 180px; } From 3044ef482383b40434a685b7481a4db123bfabde Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 2 Jan 2024 10:26:36 +0100 Subject: [PATCH 45/72] #12419 fixed external url and changed size field --- pandora_console/godmode/users/configure_user.php | 12 ++++-------- pandora_console/godmode/users/user_management.php | 12 +----------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 83e54f24c5..7da3069e5a 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -424,10 +424,8 @@ if ($create_user === true) { $values['data_section'] = $dashboard; } else if (io_safe_output($values['section']) === HOME_SCREEN_VISUAL_CONSOLE) { $values['data_section'] = $visual_console; - } else if ($values['section'] === HOME_SCREEN_OTHER) { - $values['data_section'] = get_parameter('data_section_other'); - } else if (io_safe_output($values['section']) === HOME_SCREEN_EXTERNAL_LINK) { - $values['data_section'] = get_parameter('data_section_external'); + } else if ($values['section'] === HOME_SCREEN_OTHER || io_safe_output($values['section']) === HOME_SCREEN_EXTERNAL_LINK) { + $values['data_section'] = get_parameter('data_section'); } // $values['section'] = $homeScreenValues[$values['section']]; @@ -724,10 +722,8 @@ if ($update_user) { $values['data_section'] = $dashboard; } else if (io_safe_output($values['section']) === HOME_SCREEN_VISUAL_CONSOLE) { $values['data_section'] = $visual_console; - } else if ($values['section'] === HOME_SCREEN_OTHER) { - $values['data_section'] = get_parameter('data_section_other'); - } else if (io_safe_output($values['section']) === HOME_SCREEN_EXTERNAL_LINK) { - $values['data_section'] = get_parameter('data_section_external'); + } else if ($values['section'] === HOME_SCREEN_OTHER || io_safe_output($values['section']) === HOME_SCREEN_EXTERNAL_LINK) { + $values['data_section'] = get_parameter('data_section'); } // $values['section'] = $homeScreenValues[$values['section']]; diff --git a/pandora_console/godmode/users/user_management.php b/pandora_console/godmode/users/user_management.php index b1212c11ec..afb5a8b1f0 100644 --- a/pandora_console/godmode/users/user_management.php +++ b/pandora_console/godmode/users/user_management.php @@ -84,8 +84,7 @@ $customHomeScreenAddition[HOME_SCREEN_DASHBOARD] = html_print_select( // Home screen. Visual consoles. $customHomeScreenAddition[HOME_SCREEN_VISUAL_CONSOLE] = html_print_select($layouts_aux, 'visual_console', $user_info['data_section'], '', '', '', true, false, true, 'w100p', false, 'width: 100%'); // Home screen. External link and Other. -$customHomeScreenAddition[HOME_SCREEN_EXTERNAL_LINK] = html_print_input_text('data_section_external', $user_info['data_section'], '', 60, 255, true); -$customHomeScreenAddition[HOME_SCREEN_OTHER] = html_print_input_text('data_section_other', $user_info['data_section'], '', 60, 255, true); +$customHomeScreenAddition[HOME_SCREEN_EXTERNAL_LINK] = html_print_input_text('data_section', $user_info['data_section'], '', 60, 400, true); $layouts = visual_map_get_user_layouts($config['id_user'], true); $layouts_aux = []; @@ -112,15 +111,6 @@ $customHomeScreenAddition[HOME_SCREEN_VISUAL_CONSOLE] = html_print_select( false, 'width: 100%' ); -// Home screen. External link and Other. -$customHomeScreenAddition[HOME_SCREEN_EXTERNAL_LINK] = html_print_input_text( - 'data_section', - $user_info['data_section'], - '', - 60, - 255, - true -); $customHomeScreenDataField = ''; foreach ($customHomeScreenAddition as $key => $customField) { $customHomeScreenDataField .= html_print_div( From 70f213811ec045593b5d8c60500233137ed19b68 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 2 Jan 2024 11:18:53 +0100 Subject: [PATCH 46/72] #12716 fixed permission in monitor detail --- .../operation/agentes/status_monitor.php | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index cbce3755ad..9978e94715 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -1061,19 +1061,20 @@ $buttons .= html_print_button( ], true ); - -$buttons .= html_print_button( - __('Manage filter'), - 'save-filter', - false, - '', - [ - 'icon' => 'wand', - 'mode' => 'mini secondary', - 'class' => 'float-left margin-right-2 sub wand', - ], - true -); +if (check_acl($config['id_user'], 0, 'AW')) { + $buttons .= html_print_button( + __('Manage filter'), + 'save-filter', + false, + '', + [ + 'icon' => 'wand', + 'mode' => 'mini secondary', + 'class' => 'float-left margin-right-2 sub wand', + ], + true + ); +} $filters .= html_print_div( [ From ebbc4d77beed80942ec527d7f5ef0d38a39deea1 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 8 Jan 2024 08:39:58 +0100 Subject: [PATCH 47/72] #12527 redirect to all messages --- pandora_console/include/functions_notifications.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index c65c475550..f511450ad1 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -1137,6 +1137,15 @@ function notifications_print_dropdown() $mess = []; } + $redirection_notifications = html_print_menu_button( + [ + 'href' => 'javascript:', + 'class' => 'notification_menu_actions', + 'text' => __('View all messages'), + 'onClick' => "window.location='".ui_get_full_url('index.php?sec=message_list&sec2=operation/messages/message_list')."'", + ], + true + ); $notification_menu = html_print_menu_button( [ 'href' => 'javascript:', @@ -1154,6 +1163,7 @@ function notifications_print_dropdown()
+
%s
@@ -1166,6 +1176,7 @@ function notifications_print_dropdown() ", $notification_filter, $notification_menu, + $redirection_notifications, array_reduce( $mess, function ($carry, $message) { From 706426471ecfa0c453a550ac68a450d5efcfb5fd Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 8 Jan 2024 10:57:32 +0100 Subject: [PATCH 48/72] #12366 fix for spaces on users --- pandora_console/godmode/users/user_list.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pandora_console/godmode/users/user_list.php b/pandora_console/godmode/users/user_list.php index 89607ced69..832c85027e 100644 --- a/pandora_console/godmode/users/user_list.php +++ b/pandora_console/godmode/users/user_list.php @@ -780,8 +780,9 @@ foreach ($info as $user_id => $user_info) { $data[4] .= '
'; foreach ($user_profiles as $row) { + $total_profile++; if ($total_profile > 5) { - $data[4] .= "