'.$table_adv_parent.$table_adv_module_mode.$table_adv_cascade;
if ($new_agent) {
@@ -788,7 +788,7 @@ if ($new_agent) {
$table_adv_options .= '
+
'.$table_adv_gis.$table_adv_agent_icon.$table_adv_url.$table_adv_quiet.$table_adv_status.$table_adv_remote.$table_adv_safe.'
';
diff --git a/pandora_console/godmode/agentes/configurar_agente.php b/pandora_console/godmode/agentes/configurar_agente.php
index 22410b0e23..d5f6f1fcfd 100644
--- a/pandora_console/godmode/agentes/configurar_agente.php
+++ b/pandora_console/godmode/agentes/configurar_agente.php
@@ -1213,7 +1213,7 @@ if ($update_module || $create_module) {
$max_timeout = (int) get_parameter('max_timeout');
$max_retries = (int) get_parameter('max_retries');
- $min = (int) get_parameter_post('min');
+ $min = (int) get_parameter('min');
$max = (int) get_parameter('max');
$interval = (int) get_parameter('module_interval', $intervalo);
$ff_interval = (int) get_parameter('module_ff_interval');
diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php
index 0e08a3728f..9e7ce18c4e 100644
--- a/pandora_console/godmode/agentes/modificar_agente.php
+++ b/pandora_console/godmode/agentes/modificar_agente.php
@@ -163,7 +163,7 @@ echo '
';
echo __('Group').' ';
$own_info = get_user_info($config['id_user']);
-if (!$own_info['is_admin'] && !check_acl($config['id_user'], 0, 'AW')) {
+if (!$own_info['is_admin'] && check_acl($config['id_user'], 0, 'AW')) {
$return_all_group = false;
} else {
$return_all_group = true;
diff --git a/pandora_console/godmode/agentes/module_manager_editor.php b/pandora_console/godmode/agentes/module_manager_editor.php
index b340761265..13c313892a 100644
--- a/pandora_console/godmode/agentes/module_manager_editor.php
+++ b/pandora_console/godmode/agentes/module_manager_editor.php
@@ -267,10 +267,10 @@ if ($id_agent_module) {
$cron_interval = explode(' ', $module['cron_interval']);
if (isset($cron_interval[4])) {
$minute_from = $cron_interval[0];
- $min = explode('-', $minute_from);
- $minute_from = $min[0];
- if (isset($min[1])) {
- $minute_to = $min[1];
+ $minute = explode('-', $minute_from);
+ $minute_from = $minute[0];
+ if (isset($minute[1])) {
+ $minute_to = $minute[1];
}
$hour_from = $cron_interval[1];
diff --git a/pandora_console/godmode/alerts/configure_alert_action.php b/pandora_console/godmode/alerts/configure_alert_action.php
index 3b7b5a947d..8ea292445b 100644
--- a/pandora_console/godmode/alerts/configure_alert_action.php
+++ b/pandora_console/godmode/alerts/configure_alert_action.php
@@ -317,9 +317,9 @@ $(document).ready (function () {
jQuery.post (,
values,
function (data, status) {
- original_command = js_html_entity_decode (data["command"]);
+ original_command = data["command"];
render_command_preview (original_command);
- command_description = js_html_entity_decode (data["description"]);
+ command_description = data["description"];
render_command_description(command_description);
var max_fields = parseInt('');
diff --git a/pandora_console/godmode/events/custom_events.php b/pandora_console/godmode/events/custom_events.php
index bfb0e8c64d..cfdf50cf17 100644
--- a/pandora_console/godmode/events/custom_events.php
+++ b/pandora_console/godmode/events/custom_events.php
@@ -113,6 +113,8 @@ $fields_available['instructions'] = __('Instructions');
$fields_available['server_name'] = __('Server Name');
$fields_available['data'] = __('Data');
$fields_available['module_status'] = __('Module Status');
+$fields_available['mini_severity'] = __('Severity mini');
+
// Remove fields already selected.
foreach ($fields_available as $key => $available) {
diff --git a/pandora_console/godmode/events/events.php b/pandora_console/godmode/events/events.php
index c937ad281c..72ae001fe1 100644
--- a/pandora_console/godmode/events/events.php
+++ b/pandora_console/godmode/events/events.php
@@ -50,17 +50,10 @@ if (check_acl($config['id_user'], 0, 'PM')) {
'text' => ''.html_print_image('images/event_responses.png', true, ['title' => __('Event responses')]).'',
];
- if (!is_metaconsole()) {
- $buttons['fields'] = [
- 'active' => false,
- 'text' => ''.html_print_image('images/custom_columns.png', true, ['title' => __('Custom fields')]).'',
- ];
- } else {
- $buttons['fields'] = [
- 'active' => false,
- 'text' => ''.html_print_image('images/custom_columns.png', true, ['title' => __('Custom fields')]).'',
- ];
- }
+ $buttons['fields'] = [
+ 'active' => false,
+ 'text' => ''.html_print_image('images/custom_columns.png', true, ['title' => __('Custom fields')]).'',
+ ];
}
switch ($section) {
diff --git a/pandora_console/godmode/groups/credential_store.php b/pandora_console/godmode/groups/credential_store.php
new file mode 100644
index 0000000000..9a822dc986
--- /dev/null
+++ b/pandora_console/godmode/groups/credential_store.php
@@ -0,0 +1,632 @@
+ 'noaccess'];
+ }
+
+ include 'general/noaccess.php';
+ return;
+}
+
+// Required files.
+ui_require_css_file('credential_store');
+require_once $config['homedir'].'/include/functions_credential_store.php';
+require_once $config['homedir'].'/include/functions_io.php';
+
+if (is_ajax()) {
+ $draw = get_parameter('draw', 0);
+ $filter = get_parameter('filter', []);
+ $get_key = get_parameter('get_key', 0);
+ $new_form = get_parameter('new_form', 0);
+ $new_key = get_parameter('new_key', 0);
+ $update_key = get_parameter('update_key', 0);
+ $delete_key = get_parameter('delete_key', 0);
+
+ if ($new_form) {
+ echo print_inputs();
+ exit;
+ }
+
+ if ($delete_key) {
+ $identifier = get_parameter('identifier', null);
+
+ if (empty($identifier)) {
+ ajax_msg('error', __('identifier cannot be empty'));
+ }
+
+ if (db_process_sql_delete(
+ 'tcredential_store',
+ ['identifier' => $identifier]
+ ) === false
+ ) {
+ ajax_msg('error', $config['dbconnection']->error, true);
+ } else {
+ ajax_msg('result', $identifier, true);
+ }
+ }
+
+ if ($update_key) {
+ $data = get_parameter('values', null);
+
+ if ($data === null || !is_array($data)) {
+ echo json_encode(['error' => __('Invalid parameters, please retry')]);
+ exit;
+ }
+
+ $values = [];
+ foreach ($data as $key => $value) {
+ if ($key == 'identifier') {
+ $identifier = base64_decode($value);
+ } else if ($key == 'product') {
+ $product = base64_decode($value);
+ } else {
+ $values[$key] = base64_decode($value);
+ }
+ }
+
+ if (empty($identifier)) {
+ ajax_msg('error', __('identifier cannot be empty'));
+ }
+
+ if (empty($product)) {
+ ajax_msg('error', __('product cannot be empty'));
+ }
+
+ if (db_process_sql_update(
+ 'tcredential_store',
+ $values,
+ ['identifier' => $identifier]
+ ) === false
+ ) {
+ ajax_msg('error', $config['dbconnection']->error);
+ } else {
+ ajax_msg('result', $identifier);
+ }
+
+ exit;
+ }
+
+ if ($new_key) {
+ $data = get_parameter('values', null);
+
+ if ($data === null || !is_array($data)) {
+ echo json_encode(['error' => __('Invalid parameters, please retry')]);
+ exit;
+ }
+
+ $values = [];
+ foreach ($data as $key => $value) {
+ $values[$key] = base64_decode($value);
+ if ($key == 'identifier') {
+ $values[$key] = preg_replace('/\s+/', '-', trim($values[$key]));
+ }
+ }
+
+ $identifier = $values['identifier'];
+
+ if (empty($identifier)) {
+ ajax_msg('error', __('identifier cannot be empty'));
+ }
+
+ if (empty($values['product'])) {
+ ajax_msg('error', __('product cannot be empty'));
+ }
+
+ if (db_process_sql_insert('tcredential_store', $values) === false) {
+ ajax_msg('error', $config['dbconnection']->error);
+ } else {
+ ajax_msg('result', $identifier);
+ }
+
+ exit;
+ }
+
+ if ($get_key) {
+ $identifier = get_parameter('identifier', null);
+
+ $key = get_key($identifier);
+ echo print_inputs($key);
+
+ exit;
+ }
+
+ if ($draw) {
+ // Datatables offset, limit and order.
+ $start = get_parameter('start', 0);
+ $length = get_parameter('length', $config['block_size']);
+ $order = get_datatable_order(true);
+ try {
+ ob_start();
+
+ $fields = [
+ 'cs.*',
+ 'tg.nombre as `group`',
+ ];
+
+ // Retrieve data.
+ $data = credentials_get_all(
+ // Fields.
+ $fields,
+ // Filter.
+ $filter,
+ // Offset.
+ $start,
+ // Limit.
+ $length,
+ // Order.
+ $order['direction'],
+ // Sort field.
+ $order['field']
+ );
+
+ // Retrieve counter.
+ $count = credentials_get_all(
+ 'count',
+ $filter
+ );
+
+ if ($data) {
+ $data = array_reduce(
+ $data,
+ function ($carry, $item) {
+ // Transforms array of arrays $data into an array
+ // of objects, making a post-process of certain fields.
+ $tmp = (object) $item;
+ $tmp->username = io_safe_output($tmp->username);
+
+ if (empty($tmp->group)) {
+ $tmp->group = __('All');
+ } else {
+ $tmp->group = io_safe_output($tmp->group);
+ }
+
+ $carry[] = $tmp;
+ return $carry;
+ }
+ );
+ }
+
+ // Datatables format: RecordsTotal && recordsfiltered.
+ echo json_encode(
+ [
+ 'data' => $data,
+ 'recordsTotal' => $count,
+ 'recordsFiltered' => $count,
+ ]
+ );
+ // Capture output.
+ $response = ob_get_clean();
+ } catch (Exception $e) {
+ return json_encode(['error' => $e->getMessage()]);
+ }
+
+ // If not valid, show error with issue.
+ json_decode($response);
+ if (json_last_error() == JSON_ERROR_NONE) {
+ // If valid dump.
+ echo $response;
+ } else {
+ echo json_encode(
+ ['error' => $response]
+ );
+ }
+
+
+ exit;
+ }
+
+ exit;
+}
+
+// Datatables list.
+try {
+ $columns = [
+ 'group',
+ 'identifier',
+ 'product',
+ 'username',
+ 'options',
+ ];
+
+ $column_names = [
+ __('Group'),
+ __('Identifier'),
+ __('Product'),
+ __('User'),
+ [
+ 'text' => __('Options'),
+ 'class' => 'action_buttons',
+ ],
+ ];
+
+ $table_id = 'keystore';
+ // Load datatables user interface.
+ ui_print_datatable(
+ [
+ 'id' => $table_id,
+ 'class' => 'info_table',
+ 'style' => 'width: 100%',
+ 'columns' => $columns,
+ 'column_names' => $column_names,
+ 'ajax_url' => 'godmode/groups/credential_store',
+ 'ajax_postprocess' => 'process_datatables_item(item)',
+ 'no_sortable_columns' => [-1],
+ 'order' => [
+ 'field' => 'identifier',
+ 'direction' => 'asc',
+ ],
+ 'search_button_class' => 'sub filter float-right',
+ 'form' => [
+ 'inputs' => [
+ [
+ 'label' => __('Group'),
+ 'type' => 'select',
+ 'id' => 'filter_id_group',
+ 'name' => 'filter_id_group',
+ 'options' => users_get_groups_for_select(
+ $config['id_user'],
+ 'AR',
+ true,
+ true,
+ false
+ ),
+ ],
+ [
+ 'label' => __('Free search'),
+ 'type' => 'text',
+ 'class' => 'mw250px',
+ 'id' => 'free_search',
+ 'name' => 'free_search',
+ ],
+ ],
+ ],
+ ]
+ );
+} catch (Exception $e) {
+ echo $e->getMessage();
+}
+
+// Auxiliar div.
+$new = '';
+$details = '';
+$aux = '';
+
+
+echo $new.$details.$aux;
+
+// Create button.
+echo ' ';
+html_print_submit_button(
+ __('Add key'),
+ 'create',
+ false,
+ 'class="sub next"'
+);
+echo ' ';
+
+?>
+
+
diff --git a/pandora_console/godmode/groups/group_list.php b/pandora_console/godmode/groups/group_list.php
index ee61cdaf79..8cb3c106c1 100644
--- a/pandora_console/godmode/groups/group_list.php
+++ b/pandora_console/godmode/groups/group_list.php
@@ -1,20 +1,36 @@
$v) {
$agents[$keys_prefix.$k] = $v;
unset($agents[$k]);
if ($all_agents) {
- // Unserialize to get the status
+ // Unserialize to get the status.
if ($serialized && is_metaconsole()) {
$agent_info = explode($serialized_separator, $k);
$agent_disabled = db_get_value_filter(
@@ -174,7 +193,8 @@ if (is_ajax()) {
['id_agente' => $agent_info[1]]
);
} else if (!$serialized && is_metaconsole()) {
- // Cannot retrieve the disabled status. Mark all as not disabled
+ // Cannot retrieve the disabled status.
+ // Mark all as not disabled.
$agent_disabled = 0;
} else {
$agent_disabled = db_get_value_filter(
@@ -226,11 +246,13 @@ if (! check_acl($config['id_user'], 0, 'PM')) {
}
$sec = defined('METACONSOLE') ? 'advanced' : 'gagente';
-$url_tree = "index.php?sec=$sec&sec2=godmode/groups/group_list&tab=tree";
-$url_groups = "index.php?sec=$sec&sec2=godmode/groups/group_list&tab=groups";
+$url_credbox = 'index.php?sec='.$sec.'&sec2=godmode/groups/group_list&tab=credbox';
+$url_tree = 'index.php?sec='.$sec.'&sec2=godmode/groups/group_list&tab=tree';
+$url_groups = 'index.php?sec='.$sec.'&sec2=godmode/groups/group_list&tab=groups';
+
$buttons['tree'] = [
'active' => false,
- 'text' => "".html_print_image(
+ 'text' => ''.html_print_image(
'images/gm_massive_operations.png',
true,
[
@@ -241,7 +263,7 @@ $buttons['tree'] = [
$buttons['groups'] = [
'active' => false,
- 'text' => "".html_print_image(
+ 'text' => ''.html_print_image(
'images/group.png',
true,
[
@@ -250,21 +272,38 @@ $buttons['groups'] = [
).'',
];
+$buttons['credbox'] = [
+ 'active' => false,
+ 'text' => ''.html_print_image(
+ 'images/key.png',
+ true,
+ [
+ 'title' => __('Credential Store'),
+ ]
+ ).'',
+];
+
$tab = (string) get_parameter('tab', 'groups');
-// Marks correct tab
+$title = __('Groups defined in %s', get_product_name());
+// Marks correct tab.
switch ($tab) {
case 'tree':
$buttons['tree']['active'] = true;
break;
+ case 'credbox':
+ $buttons['credbox']['active'] = true;
+ $title = __('Credential store');
+ break;
+
case 'groups':
default:
$buttons['groups']['active'] = true;
break;
}
-// Header
+// Header.
if (defined('METACONSOLE')) {
agents_meta_print_header();
echo '';
@@ -272,7 +311,7 @@ if (defined('METACONSOLE')) {
echo ' ';
} else {
ui_print_page_header(
- __('Groups defined in %s', get_product_name()),
+ $title,
'images/group.png',
false,
'group_list_tab',
@@ -281,12 +320,19 @@ if (defined('METACONSOLE')) {
);
}
+// Load credential store view before parse list-tree forms.
+if ($tab == 'credbox') {
+ include_once __DIR__.'/credential_store.php';
+ // Stop script.
+ return;
+}
+
$create_group = (bool) get_parameter('create_group');
$update_group = (bool) get_parameter('update_group');
$delete_group = (bool) get_parameter('delete_group');
$pure = get_parameter('pure', 0);
-// Create group
+// Create group.
if (($create_group) && (check_acl($config['id_user'], 0, 'PM'))) {
$name = (string) get_parameter('name');
$icon = (string) get_parameter('icon');
@@ -301,7 +347,7 @@ if (($create_group) && (check_acl($config['id_user'], 0, 'PM'))) {
$check = db_get_value('nombre', 'tgrupo', 'nombre', $name);
$propagate = (bool) get_parameter('propagate');
- // Check if name field is empty
+ // Check if name field is empty.
if ($name != '') {
if (!$check) {
$values = [
@@ -328,12 +374,11 @@ if (($create_group) && (check_acl($config['id_user'], 0, 'PM'))) {
ui_print_error_message(__('Each group must have a different name'));
}
} else {
- // $result = false;
ui_print_error_message(__('Group must have a name'));
}
}
-// Update group
+// Update group.
if ($update_group) {
$id_group = (int) get_parameter('id_group');
$name = (string) get_parameter('name');
@@ -349,49 +394,35 @@ if ($update_group) {
$contact = (string) get_parameter('contact');
$other = (string) get_parameter('other');
- // Check if name field is empty
+ // Check if name field is empty.
if ($name != '') {
- switch ($config['dbtype']) {
- case 'mysql':
- $sql = sprintf(
- 'UPDATE tgrupo SET nombre = "%s",
- icon = "%s", disabled = %d, parent = %d, custom_id = "%s", propagate = %d, id_skin = %d, description = "%s", contact = "%s", other = "%s", password = "%s"
- WHERE id_grupo = %d',
- $name,
- empty($icon) ? '' : substr($icon, 0, -4),
- !$alerts_enabled,
- $id_parent,
- $custom_id,
- $propagate,
- $skin,
- $description,
- $contact,
- $other,
- $group_pass,
- $id_group
- );
- break;
-
- case 'postgresql':
- case 'oracle':
- $sql = sprintf(
- 'UPDATE tgrupo SET nombre = \'%s\',
- icon = \'%s\', disabled = %d, parent = %d, custom_id = \'%s\', propagate = %d, id_skin = %d, description = \'%s\', contact = \'%s\', other = \'%s\'
- WHERE id_grupo = %d',
- $name,
- substr($icon, 0, -4),
- !$alerts_enabled,
- $id_parent,
- $custom_id,
- $propagate,
- $skin,
- $description,
- $contact,
- $other,
- $id_group
- );
- break;
- }
+ $sql = sprintf(
+ 'UPDATE tgrupo
+ SET nombre = "%s",
+ icon = "%s",
+ disabled = %d,
+ parent = %d,
+ custom_id = "%s",
+ propagate = %d,
+ id_skin = %d,
+ description = "%s",
+ contact = "%s",
+ other = "%s",
+ password = "%s"
+ WHERE id_grupo = %d',
+ $name,
+ empty($icon) ? '' : substr($icon, 0, -4),
+ !$alerts_enabled,
+ $id_parent,
+ $custom_id,
+ $propagate,
+ $skin,
+ $description,
+ $contact,
+ $other,
+ $group_pass,
+ $id_group
+ );
$result = db_process_sql($sql);
} else {
@@ -405,7 +436,7 @@ if ($update_group) {
}
}
-// Delete group
+// Delete group.
if (($delete_group) && (check_acl($config['id_user'], 0, 'PM'))) {
$id_group = (int) get_parameter('id_group');
@@ -445,7 +476,14 @@ if (($delete_group) && (check_acl($config['id_user'], 0, 'PM'))) {
}
}
+
+// Credential store is loaded previously in this document to avoid
+// process group tree - list forms.
if ($tab == 'tree') {
+ /*
+ * Group tree view.
+ */
+
echo html_print_image(
'images/spinner.gif',
true,
@@ -456,6 +494,10 @@ if ($tab == 'tree') {
);
echo "";
} else {
+ /*
+ * Group list view.
+ */
+
$acl = '';
$search_name = '';
$offset = (int) get_parameter('offset', 0);
@@ -463,17 +505,22 @@ if ($tab == 'tree') {
$block_size = $config['block_size'];
if (!empty($search)) {
- $search_name = "AND t.nombre LIKE '%$search%'";
+ $search_name = 'AND t.nombre LIKE "%'.$search.'%"';
}
if (!users_can_manage_group_all('AR')) {
$user_groups_acl = users_get_groups(false, 'AR');
$groups_acl = implode(',', $user_groups_ACL);
if (empty($groups_acl)) {
- return ui_print_info_message(['no_close' => true, 'message' => __('There are no defined groups') ]);
+ return ui_print_info_message(
+ [
+ 'no_close' => true,
+ 'message' => __('There are no defined groups'),
+ ]
+ );
}
- $acl = "AND t.id_grupo IN ($groups_acl)";
+ $acl = 'AND t.id_grupo IN ('.$groups_acl.')';
}
$form = " |