__('Delete'),
2 => __('Copy'),
3 => __('Enable'),
4 => __('Disable')
];
$href_options = [
3 => [
'radio_value' => '4',
'radio_caption' => __('Defer to the Users Setting')
],
0 => [
'radio_value' => '1',
'radio_caption' => __('Show the Page that the User pointed their browser to')
],
1 => [
'radio_value' => '2',
'radio_caption' => __('Show the Console')
],
2 => [
'radio_value' => '3',
'radio_caption' => __('Show the default Graph Screen')
]
];
$gperm_options = [
0 => [
'radio_value' => '1',
'radio_caption' => __('Defer to the Users Setting')
],
1 => [
'radio_value' => '2',
'radio_caption' => __('Grant Access')
],
2 => [
'radio_value' => '3',
'radio_caption' => __('Restrict Access')
]
];
$fields_user_group_edit = [
'spacer_general' => [
'friendly_name' => __('General'),
'method' => 'spacer',
],
'name' => [
'method' => 'textbox',
'friendly_name' => __('Group Name'),
'description' => __('The name of this Group.'),
'value' => '|arg1:name|',
'max_length' => '255'
],
'description' => [
'method' => 'textbox',
'friendly_name' => __('Group Description'),
'description' => __('A more descriptive name for this group, that can include spaces or special characters.'),
'value' => '|arg1:description|',
'max_length' => '255'
],
'enabled' => [
'method' => 'checkbox',
'friendly_name' => __('Enabled'),
'description' => __('Determines if user is able to login.'),
'value' => '|arg1:enabled|',
'default' => ''
],
'grp1' => [
'friendly_name' => __('Group Options'),
'method' => 'checkbox_group',
'description' => __('Set any user account-specific options here.'),
'items' => [
'graph_settings' => [
'value' => '|arg1:graph_settings|',
'friendly_name' => __('Allow Users of this Group to keep custom User Settings'),
'form_id' => '|arg1:id|',
'default' => 'on'
]
]
],
'spacer_rights' => [
'friendly_name' => __('Rights'),
'method' => 'spacer',
],
'show_tree' => [
'friendly_name' => __('Tree Rights'),
'method' => 'radio',
'description' => __('Should Users of this Group have access to the Tree?'),
'value' => '|arg1:show_tree|',
'default' => '1',
'items' => $gperm_options
],
'show_list' => [
'friendly_name' => __('Graph List Rights'),
'method' => 'radio',
'description' => __('Should Users of this Group have access to the Graph List?'),
'value' => '|arg1:show_list|',
'default' => '1',
'items' => $gperm_options
],
'show_preview' => [
'friendly_name' => __('Graph Preview Rights'),
'method' => 'radio',
'description' => __('Should Users of this Group have access to the Graph Preview?'),
'value' => '|arg1:show_preview|',
'default' => '1',
'items' => $gperm_options
],
'login_opts' => [
'friendly_name' => __('Login Options'),
'method' => 'radio',
'default' => '1',
'description' => __('What to do when a User from this User Group logs in.'),
'value' => '|arg1:login_opts|',
'items' => $href_options
],
'id' => [
'method' => 'hidden_zero',
'value' => '|arg1:id|'
],
'save_component_group' => [
'method' => 'hidden',
'value' => '1'
]
];
if (isrv('update_policy')) {
// GHSA-j67j-wpm4-9g3x: update_policy is read before the action dispatcher, so
// the global.php GET/CSRF denylist cannot cover it. csrf_check() only validates
// the token on POST, so require POST before rewriting the group's permission policy.
if (strtoupper($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') {
header('Allow: POST');
http_response_code(405);
exit;
}
update_policies();
} else {
switch (grv('action')) {
case 'actions':
form_actions();
break;
case 'save':
form_save();
break;
case 'perm_remove':
perm_remove();
break;
case 'edit':
top_header();
group_edit();
bottom_footer();
break;
default:
if (!api_plugin_hook_function('user_group_admin_action', grv('action'))) {
top_header();
user_group();
bottom_footer();
}
break;
}
}
function user_group_disable(int $id) : void {
db_execute_prepared("UPDATE user_auth_group SET enabled = '' WHERE id = ?", [$id]);
reset_group_perms($id);
}
function user_group_enable(int $id) : void {
db_execute_prepared("UPDATE user_auth_group SET enabled = 'on' WHERE id = ?", [$id]);
reset_group_perms($id);
}
function user_group_remove(int $id) : void {
db_execute_prepared('DELETE FROM user_auth_group WHERE id = ?', [$id]);
db_execute_prepared('DELETE FROM user_auth_group_members WHERE group_id = ?', [$id]);
db_execute_prepared('DELETE FROM user_auth_group_realm WHERE group_id = ?', [$id]);
db_execute_prepared('DELETE FROM user_auth_group_perms WHERE group_id = ?', [$id]);
}
function user_group_copy(int $id, string $prefix = 'New Group') : void {
static $count = 1;
$name = $prefix . ' ' . $count;
db_execute_prepared('INSERT INTO user_auth_group
(name, description, graph_settings, login_opts, show_tree, show_list, show_preview,
policy_graphs, policy_trees, policy_hosts, policy_graph_templates, enabled)
SELECT ' . db_qstr($name) . ', description, graph_settings, login_opts, show_tree, show_list, show_preview,
policy_graphs, policy_trees, policy_hosts, policy_graph_templates, enabled
FROM user_auth_group WHERE id = ?', [$id]);
$id = db_fetch_insert_id();
if (!empty($id)) {
$perms = db_fetch_assoc_prepared('SELECT *
FROM user_auth_group_perms
WHERE group_id = ?',
[$id]);
if (cacti_sizeof($perms)) {
foreach ($perms as $p) {
db_execute_prepared('INSERT INTO user_auth_group_perms
(group_id, item_id, type)
VALUES (?, ?, ?)',
[$id, $p['item_id'], $p['type']]);
}
}
$realms = db_fetch_assoc_prepared('SELECT *
FROM user_auth_group_realm
WHERE group_id = ?',
[$id]);
if (cacti_sizeof($realms)) {
foreach ($realms as $r) {
db_execute_prepared('INSERT INTO user_auth_group_realm
(group_id, realm_id)
VALUES (?, ?)',
[$id, $r['realm_id']]);
}
}
}
$count++;
}
function update_policies() : void {
$policies = ['policy_graphs', 'policy_trees', 'policy_hosts', 'policy_graph_templates'];
foreach ($policies as $p) {
if (isrv($p)) {
db_execute_prepared("UPDATE `user_auth_group` SET `$p` = ? WHERE `id` = ?", [gfrv($p), gfrv('id')]);
}
}
header('Location: user_group_admin.php?action=edit&tab=' . gnrv('tab') . '&id=' . gnrv('id'));
exit;
}
function form_actions() : void {
global $group_actions, $user_auth_realms;
// if we are to save this form, instead of display it
if (isrv('associate_host')) {
foreach ($_POST as $var => $val) {
if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) {
// ================= input validation =================
input_validate_input_number($matches[1], 'chk[1]');
// ====================================================
if (gnrv('drp_action') == '1') {
db_execute_prepared('REPLACE INTO user_auth_group_perms
(group_id, item_id, type)
VALUES (?, ?, 3)',
[gnrv('id'), $matches[1]]);
} else {
db_execute_prepared('DELETE FROM user_auth_group_perms
WHERE group_id = ?
AND item_id = ?
AND type = 3',
[gnrv('id'), $matches[1]]);
}
}
}
header('Location: user_group_admin.php?action=edit&tab=permsd&id=' . gnrv('id'));
exit;
}
if (isrv('associate_graph')) {
foreach ($_POST as $var => $val) {
if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) {
// ================= input validation =================
input_validate_input_number($matches[1], 'chk[1]');
// ====================================================
if (gnrv('drp_action') == '1') {
db_execute_prepared('REPLACE INTO user_auth_group_perms
(group_id, item_id, type)
VALUES (?, ?, 1)',
[gnrv('id'), $matches[1]]);
} else {
db_execute_prepared('DELETE FROM user_auth_group_perms
WHERE group_id = ?
AND item_id = ?
AND type = 1',
[gnrv('id'), $matches[1]]);
}
}
}
header('Location: user_group_admin.php?action=edit&tab=permsg&id=' . gnrv('id'));
exit;
}
if (isrv('associate_template')) {
foreach ($_POST as $var => $val) {
if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) {
// ================= input validation =================
input_validate_input_number($matches[1], 'chk[1]');
// ====================================================
if (gnrv('drp_action') == '1') {
db_execute_prepared('REPLACE INTO user_auth_group_perms
(group_id, item_id, type)
VALUES (?, ?, 4)',
[gnrv('id'), $matches[1]]);
} else {
db_execute_prepared('DELETE FROM user_auth_group_perms
WHERE group_id = ?
AND item_id = ?
AND type = 4',
[gnrv('id'), $matches[1]]);
}
}
}
header('Location: user_group_admin.php?action=edit&tab=permste&id=' . gnrv('id'));
exit;
}
if (isrv('associate_tree')) {
foreach ($_POST as $var => $val) {
if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) {
// ================= input validation =================
input_validate_input_number($matches[1], 'chk[1]');
// ====================================================
if (gnrv('drp_action') == '1') {
db_execute_prepared('REPLACE INTO user_auth_group_perms
(group_id, item_id, type)
VALUES (?, ?, 2)',
[gnrv('id'), $matches[1]]);
} else {
db_execute_prepared('DELETE FROM user_auth_group_perms
WHERE group_id = ?
AND item_id = ?
AND type = 2',
[gnrv('id'), $matches[1]]);
}
}
}
header('Location: user_group_admin.php?action=edit&tab=permstr&id=' . gnrv('id'));
exit;
}
if (isrv('associate_member')) {
foreach ($_POST as $var => $val) {
if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) {
// ================= input validation =================
input_validate_input_number($matches[1], 'chk[1]');
// ====================================================
if (gnrv('drp_action') == '1') {
db_execute_prepared('REPLACE INTO user_auth_group_members
(group_id, user_id)
VALUES (?, ?)',
[gnrv('id'), $matches[1]]);
} else {
db_execute_prepared('DELETE FROM user_auth_group_members
WHERE group_id = ?
AND user_id = ?',
[gnrv('id'), $matches[1]]);
}
}
}
header('Location: user_group_admin.php?action=edit&tab=members&id=' . gnrv('id'));
exit;
}
if (isrv('selected_items')) {
$selected_items = sanitize_unserialize_selected_items(gnrv('selected_items'));
if ($selected_items != false) {
if (gnrv('drp_action') == '1') { // delete
for ($i = 0; ($i < cacti_count($selected_items)); $i++) {
user_group_remove($selected_items[$i]);
api_plugin_hook_function('user_group_remove', $selected_items[$i]);
}
} elseif (gnrv('drp_action') == '2') { // copy
for ($i = 0; ($i < cacti_count($selected_items)); $i++) {
user_group_copy($selected_items[$i], gnrv('group_prefix'));
}
} elseif (gnrv('drp_action') == '3') { // enable
for ($i = 0; ($i < cacti_count($selected_items)); $i++) {
user_group_enable($selected_items[$i]);
}
} elseif (gnrv('drp_action') == '4') { // disable
for ($i = 0; ($i < cacti_count($selected_items)); $i++) {
user_group_disable($selected_items[$i]);
}
}
}
header('Location: user_group_admin.php');
exit;
} else {
$ilist = '';
$iarray = [];
foreach ($_POST as $var => $val) {
if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) {
// ================= input validation =================
input_validate_input_number($matches[1], 'chk[1]');
// ====================================================
if (gnrv('drp_action') != '2') {
$ilist .= '
' . htmle(db_fetch_cell_prepared('SELECT name FROM user_auth_group WHERE id = ?', [$matches[1]])) . '
';
}
$iarray[] = $matches[1];
}
}
$form_data = [
'general' => [
'page' => 'user_group_admin.php',
'actions' => $group_actions,
'optvar' => 'drp_action',
'item_array' => $iarray,
'item_list' => $ilist
],
'options' => [
1 => [
'smessage' => __('Click \'Continue\' to Delete the following User Group.'),
'pmessage' => __('Click \'Continue\' to Delete following User Groups.'),
'scont' => __('Delete User Group'),
'pcont' => __('Delete User Groups')
],
2 => [
'smessage' => __('Click \'Continue\' to Copy the following User Group.'),
'pmessage' => __('Click \'Continue\' to Copy following User Groups.'),
'scont' => __('Copy User Group'),
'pcont' => __('Copy User Groups'),
'extra' => [
'group_prefix' => [
'method' => 'textbox',
'title' => __('Group Prefix'),
'default' => __('New Group'),
'width' => 25
]
]
],
3 => [
'smessage' => __('Click \'Continue\' to Enable the following User Group.'),
'pmessage' => __('Click \'Continue\' to Enable following User Groups.'),
'scont' => __('Enable User Group'),
'pcont' => __('Enable User Groups')
],
4 => [
'smessage' => __('Click \'Continue\' to Disable the following User Group.'),
'pmessage' => __('Click \'Continue\' to Disable following User Groups.'),
'scont' => __('Disable User Group'),
'pcont' => __('Disable User Groups')
]
]
];
form_continue_confirmation($form_data);
}
}
function form_save() : void {
global $settings_user;
if (isrv('save_component_group')) {
// ================= input validation =================
gfrv('id');
gfrv('realm');
// ====================================================
// check duplicate group
if (cacti_sizeof(db_fetch_row_prepared('SELECT * FROM user_auth_group WHERE name = ? AND id != ?', [gnrv('name'), gnrv('id')]))) {
raise_message(12);
}
$save['id'] = gnrv('id');
$save['name'] = CactiValidator::validateInput(gnrv('name'), 'name', [new Assert\NotBlank()], 3);
$save['description'] = CactiValidator::validateInput(gnrv('description'), 'description', [], 3);
$save['show_tree'] = CactiValidator::validateInput(gnrv('show_tree', ''), 'show_tree', [], 3);
$save['show_list'] = CactiValidator::validateInput(gnrv('show_list', ''), 'show_list', [], 3);
$save['show_preview'] = CactiValidator::validateInput(gnrv('show_preview', ''), 'show_preview', [], 3);
$save['graph_settings'] = CactiValidator::validateInput(gnrv('graph_settings', ''), 'graph_settings', [], 3);
$save['login_opts'] = CactiValidator::validateInput(gnrv('login_opts'), 'login_opts', [], 3);
$save['enabled'] = CactiValidator::validateInput(gnrv('enabled', ''), 'enabled', [], 3);
// Collect the per-Login-Provider "Automatic Group Assignment" values
// into a JSON map keyed by provider id. Only non-blank values are
// stored so a provider that is never assigned here leaves no stale key
// behind to be evaluated at login time.
$providers = db_fetch_assoc('SELECT id FROM login_providers ORDER BY id');
$providers = is_array($providers) ? $providers : [];
$auto_assignments = [];
foreach ($providers as $provider) {
// no-validation: free-text IdP/directory group name; escaped at every sink (ldap_escape in group lookups, prepared statements / json_encode on store)
$group_name = trim((string) CactiValidator::validateInput(gnrv('auto_assign_' . $provider['id'], ''), 'auto_assign_' . $provider['id'], [], 3));
if ($group_name !== '') {
$auto_assignments[(string) $provider['id']] = $group_name;
}
}
$save['auto_assignments'] = json_encode($auto_assignments);
$save = api_plugin_hook_function('user_group_admin_setup_sql_save', $save);
if (!is_error_message()) {
$group_id = sql_save($save, 'user_auth_group');
if ($group_id) {
reset_group_perms($group_id);
raise_message(1);
} else {
raise_message(2);
}
}
header('Location: user_group_admin.php?action=edit&tab=general&id=' . (isset($group_id) && $group_id > 0 ? $group_id : gnrv('id')));
exit;
}
if (isrv('save_component_realm_perms')) {
db_execute_prepared('DELETE FROM user_auth_group_realm WHERE group_id = ?', [gfrv('id')]);
foreach ($_POST as $var => $val) {
if (preg_match('/^[section]/i', $var)) {
if (substr($var, 0, 7) == 'section') {
db_execute_prepared('REPLACE INTO user_auth_group_realm (group_id, realm_id) VALUES (?, ?)', [grv('id'), substr($var, 7)]);
}
}
}
reset_group_perms(grv('id'));
raise_message(1);
header('Location: user_group_admin.php?action=edit&tab=realms&id=' . grv('id'));
exit;
}
if (isrv('save_component_graph_settings')) {
foreach ($settings_user as $tab_short_name => $tab_fields) {
foreach ($tab_fields as $field_name => $field_array) {
if ((isset($field_array['items'])) && (is_array($field_array['items']))) {
foreach ($field_array['items'] as $sub_field_name => $sub_field_array) {
db_execute_prepared('REPLACE INTO settings_user_group (group_id, name, value) VALUES (?, ?, ?)', [gfrv('id'), $sub_field_name, gnrv($sub_field_name, '')]);
}
} else {
db_execute_prepared('REPLACE INTO settings_user_group (group_id, name, value) VALUES (?, ?, ?)', [grv('id'), $field_name, gnrv($field_name)]);
}
}
}
kill_session_var(OPTIONS_USER);
reset_group_perms(grv('id'));
raise_message(1);
header('Location: user_group_admin.php?action=edit&tab=settings&id=' . gnrv('id'));
exit;
} else {
api_plugin_hook('user_group_admin_save');
}
// redirect to the appropriate page
header('Location: user_group_admin.php?action=edit&tab=general&id=' . gnrv('id'));
}
function perm_remove() : void {
// ================= input validation =================
gfrv('id');
gfrv('group_id');
// ====================================================
if (grv('type') == 'graph') {
db_execute_prepared('DELETE FROM user_auth_group_perms WHERE type=1 AND group_id = ? AND item_id = ?', [grv('group_id'), grv('id')]);
} elseif (grv('type') == 'tree') {
db_execute_prepared('DELETE FROM user_auth_group_perms WHERE type=2 AND group_id = ? AND item_id = ?', [grv('group_id'), grv('id')]);
} elseif (grv('type') == 'host') {
db_execute_prepared('DELETE FROM user_auth_group_perms WHERE type=3 AND group_id = ? AND item_id = ?', [grv('group_id'), grv('id')]);
} elseif (grv('type') == 'graph_template') {
db_execute_prepared('DELETE FROM user_auth_group_perms WHERE type=4 AND group_id = ? AND item_id = ?', [grv('group_id'), grv('id')]);
}
header('Location: user_group_admin.php?action=edit&tab=gperms&id=' . grv('group_id'));
}
function user_group_members_edit(string $header_label) : void {
global $auth_realms;
member_filter($header_label);
// if the number of rows is -1, set it to the default
if (grv('rows') == -1) {
$rows = read_config_option('num_rows_table');
} else {
$rows = grv('rows');
}
$sql_where = '';
$sql_params = [];
// form the 'where' clause for our main sql query
if (grv('filter') != '') {
$sql_where = ($sql_where != '' ? ' AND ' : 'WHERE ') . '(username LIKE ? OR full_name LIKE ?)';
$sql_params[] = '%' . grv('filter') . '%';
$sql_params[] = '%' . grv('filter') . '%';
}
if (grv('associated') != 'false') {
$sql_where .= ($sql_where != '' ? ' AND ' : 'WHERE ') . 'user_auth_group_members.group_id = ?';
$sql_params[] = grv('id', 0);
}
$total_rows = db_fetch_cell_prepared("SELECT COUNT(ua.id)
FROM user_auth AS ua
LEFT JOIN user_auth_group_members
ON ua.id = user_auth_group_members.user_id
$sql_where",
$sql_params);
$sql_query = "SELECT DISTINCT ua.id, ua.username, ua.full_name, ua.enabled, ua.realm
FROM user_auth AS ua
LEFT JOIN user_auth_group_members
ON ua.id = user_auth_group_members.user_id
$sql_where
ORDER BY username, full_name
LIMIT " . ($rows * (grv('page') - 1)) . ',' . $rows;
$members = db_fetch_assoc_prepared($sql_query, $sql_params);
$display_text = [
__('Login Name'),
__('Full Name'),
__('ID'),
__('Membership'),
__('Enabled'),
__('Realm')
];
$nav = html_nav_bar('user_group_admin.php?action=edit&tab=members&id=' . grv('id'), MAX_DISPLAY_PAGES, grv('page'), $rows, $total_rows, cacti_sizeof($display_text) + 1, __('Users'), 'page', 'main');
form_start('user_group_admin.php?tab=members&id=' . grv('id'), 'chk');
print $nav;
html_start_box('', '100%', false, 3, 'center', '');
html_header_checkbox($display_text, false);
if (cacti_sizeof($members)) {
foreach ($members as $g) {
if (isset($auth_realms[$g['realm']]['name'])) {
$realm = $auth_realms[$g['realm']]['name'];
} elseif (isset($auth_realms[$g['realm']])) {
$realm = $auth_realms[$g['realm']];
} else {
$realm = __('Unavailable');
}
form_alternate_row('line' . $g['id'], true);
form_selectable_cell(filter_value($g['username'], grv('filter'), 'user_admin.php?action=user_edit&id=' . $g['id']), $g['id']);
form_selectable_cell(filter_value($g['full_name'], grv('filter')), $g['id']);
form_selectable_cell($g['id'], $g['id']);
if (user_group_is_member($g['id'], grv('id'))) {
form_selectable_cell('' . __('Group Member') . '', $g['id']);
} else {
form_selectable_cell('' . __('Non Member') . '', $g['id']);
}
form_selectable_cell(($g['enabled'] == 'on' ? __('Enabled') : __('Disabled')), $g['id']);
form_selectable_cell($realm, $g['id']);
form_checkbox_cell($g['full_name'], $g['id']);
form_end_row();
}
} else {
print '
' . __('No Matching Group Members Found') . '
';
}
html_end_box(false);
if (cacti_sizeof($members)) {
print $nav;
}
form_hidden_box('tab', 'members', '');
form_hidden_box('id', grv('id'), '');
form_hidden_box('associate_member', '1', '');
$assoc_actions = [
1 => __('Add to Group'),
2 => __('Remove from Group')
];
// draw the dropdown containing a list of available actions for this form
draw_actions_dropdown($assoc_actions);
form_end();
}
function user_group_graph_perms_edit(string $tab, string $header_label) : void {
global $assoc_actions;
// ================= input validation =================
gfrv('id');
// ====================================================
$policy_array = [
1 => __('Allow'),
2 => __('Deny')
];
$policy = [];
if (!ierv('id')) {
$policy = db_fetch_row_prepared('SELECT policy_graphs, policy_trees, policy_hosts, policy_graph_templates
FROM user_auth_group
WHERE id = ?',
[grv('id')]);
}
switch($tab) {
case 'permsg':
$graph_auth_method = read_config_option('graph_auth_method');
if ($graph_auth_method == 1) {
$policy_note = __('Note: System Graph Policy is \'Permissive\' meaning the User must have access to at least one of Graph, Device, or Graph Template to gain access to the Graph');
} elseif ($graph_auth_method == 2) {
$policy_note = __('Note: System Graph Policy is \'Restrictive\' meaning the User must have access to either the Graph or the Device and Graph Template to gain access to the Graph');
} elseif ($graph_auth_method == 3) {
$policy_note = __('Note: System Graph Policy is \'Device\' meaning the User must have access to the Graph or Device to gain access to the Graph');
} else {
$policy_note = __('Note: System Graph Policy is \'Graph Template\' meaning the User must have access to the Graph or Graph Template to gain access to the Graph');
}
graph_filter($header_label);
form_start('user_group_admin.php', 'policy');
// box: device permissions
html_start_box(__('Default Graph Policy'), '100%', false, 3, 'center', '');
?>
'>
0)';
} else {
$sql_where .= 'WHERE (gtg.local_graph_id > 0)';
}
if (grv('graph_template_id') == '-1') {
// Show all items
} elseif (grv('graph_template_id') == '0') {
$sql_where .= ($sql_where != '' ? ' AND ' : 'WHERE ') . ' gtg.graph_template_id=0';
} elseif (!ierv('graph_template_id')) {
$sql_where .= ($sql_where != '' ? ' AND ' : 'WHERE ') . ' gtg.graph_template_id=' . grv('graph_template_id');
}
$policies = db_fetch_assoc_prepared("SELECT uag.id, 'group' AS type, uag.name,
uag.policy_graphs, uag.policy_hosts, uag.policy_graph_templates
FROM user_auth_group AS uag
WHERE uag.enabled = 'on'
AND uag.id = ?",
[grv('id')]);
/**
* if viewing just the graphs that the user has access to
* we use a custom crafted sql_where clause to calculate
* permissions due to the inefficient nature of the HAVING
* SQL clause.
*/
if (grv('associated') == 'false') {
$sql_where = get_policy_where($graph_auth_method, $policies, $sql_where);
}
/**
* get the sql join and select to display the policy information
* this includes the four graph permission types
*/
$details = get_policy_join_select($policies);
if (cacti_sizeof($details)) {
$sql_select = $details['sql_select'];
$sql_join = $details['sql_join'];
} else {
$sql_select = '';
$sql_join = '';
}
$graphs = db_fetch_assoc("SELECT gtg.local_graph_id, h.description,
h.disabled, h.deleted, gt.name AS template_name,
gtg.title_cache, gtg.width, gtg.height, gl.snmp_index, gl.snmp_query_id, $sql_select
FROM graph_templates_graph AS gtg
INNER JOIN graph_local AS gl
ON gl.id = gtg.local_graph_id
LEFT JOIN graph_templates AS gt
ON gt.id = gl.graph_template_id
LEFT JOIN host AS h
ON h.id = gl.host_id
$sql_join
$sql_where
ORDER BY gtg.title_cache
$sql_limit");
$total_rows = db_fetch_cell("SELECT COUNT(DISTINCT gl.id)
FROM graph_templates_graph AS gtg
INNER JOIN graph_local AS gl
ON gl.id = gtg.local_graph_id
LEFT JOIN graph_templates AS gt
ON gt.id = gl.graph_template_id
LEFT JOIN host AS h
ON h.id = gl.host_id
$sql_where");
$nav = html_nav_bar('user_group_admin.php?action=edit&tab=permsg&id=' . grv('id'), MAX_DISPLAY_PAGES, grv('page'), $rows, $total_rows, 7, __('Graphs'), 'page', 'main');
form_start('user_group_admin.php?tab=permsg&id=' . grv('id'), 'chk');
print $nav;
html_start_box('', '100%', false, 3, 'center', '');
$display_text = [ __('Graph Title'), __('ID'), __('Effective Policy')];
html_header_checkbox($display_text, false);
if (cacti_sizeof($graphs)) {
foreach ($graphs as $g) {
form_alternate_row('line' . $g['local_graph_id'], true);
form_selectable_cell(filter_value($g['title_cache'], grv('filter')), $g['local_graph_id']);
form_selectable_cell($g['local_graph_id'], $g['local_graph_id']);
form_selectable_cell(get_permission_string($g, $policies), $g['local_graph_id']);
form_checkbox_cell($g['title_cache'], $g['local_graph_id']);
form_end_row();
}
} else {
print '