['regexp' => '/^([0-9a-z_A-Z]+)$/']]); // ==================================================== // present a tabbed interface $tabs = [ 'general' => [ 'display' => __('General'), 'url' => CACTI_PATH_URL . 'auth_profile.php?tab=general' ], '2fa' => [ 'display' => __('2FA'), 'url' => CACTI_PATH_URL . 'auth_profile.php?tab=2fa' ], ]; if (read_config_option('secpass_2fa_enabled') == '') { unset($tabs['2fa']); } $tabs = api_plugin_hook_function('auth_profile_tabs', $tabs); // set the default tab load_current_session_value('tab', 'sess_profile_tabs', 'general'); $current_tab = gnrv('tab'); if (cacti_sizeof($tabs) > 1) { $i = 0; // draw the tabs print "
'; } if ($current_tab == 'general') { settings(); settings_javascript(); } elseif ($current_tab == '2fa') { settings_2fa(); } else { api_plugin_hook_function('auth_profile_run_action', grv('tab')); } bottom_footer(); break; } function auth_profile_require_post() : void { if (strtoupper($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') { http_response_code(405); print json_encode(['status' => 405, 'text' => __('Method not allowed')]); exit; } } function api_auth_logout_everywhere() : void { $user = $_SESSION[SESS_USER_ID]; if (!empty($user)) { db_execute_prepared('DELETE FROM user_auth_cache WHERE user_id = ?', [$user] ); // Revoking the remember-me tokens is not enough: a database session on // another device stays authenticated until it expires. Terminate the // user's other sessions too, keeping the current one so the action does // not log the caller out mid-request. db_execute_prepared('DELETE FROM sessions WHERE user_id = ? AND id != ?', [$user, session_id()]); } } function api_auth_clear_user_settings() : void { $user = $_SESSION[SESS_USER_ID]; if (!empty($user)) { if (isrv('tab') && gnrv('tab') == 'general') { db_execute_prepared('DELETE FROM settings_user WHERE user_id = ?', [$user] ); kill_session_var(OPTIONS_USER); } elseif (isrv('tab')) { api_plugin_hook('auth_profile_reset'); } raise_message('37'); } } function api_auth_clear_user_setting(string $name) : void { global $settings_user; $user = $_SESSION[SESS_USER_ID]; if (read_config_option('client_timezone_support') == '0') { unset($settings_user['client_timezone_support']); } if (!empty($user)) { if (isrv('tab') && gnrv('tab') == 'general') { db_execute_prepared('DELETE FROM settings_user WHERE user_id = ? AND name = ?', [$user, $name] ); foreach ($settings_user as $tab => $settings) { if (isset($settings[$name])) { if (isset($settings[$name]['default'])) { db_execute_prepared('INSERT INTO settings_user (name, value, user_id) VALUES (?, ?, ?)', [$name, $settings[$name]['default'], $user] ); header('Content-Type: application/json'); print json_encode(['id' => $name, 'value' => $settings[$name]['default']]); kill_session_var(OPTIONS_USER); break; } } } } else { api_plugin_hook_function('auth_profile_reset_value', $name); } } } function api_auth_update_user_setting(string $name, string $value) : void { global $settings_user; $user = $_SESSION[SESS_USER_ID]; if (!empty($user)) { if ($name == 'full_name' || $name == 'email_address') { db_execute_prepared("UPDATE user_auth SET $name = ? WHERE id = ?", [$value, $user] ); } else { foreach ($settings_user as $tab => $settings) { if (isset($settings[$name])) { db_execute_prepared('REPLACE INTO settings_user (name, value, user_id) VALUES (?, ?, ?)', [$name, $value, $user] ); kill_session_var(OPTIONS_USER); kill_session_var('selected_theme'); kill_session_var(SESS_USER_LANGUAGE); break; } } } } } function form_save() : void { global $errors, $settings_user; // Save the users profile information if (isrv('full_name') && isrv('email_address') && isset($_SESSION[SESS_USER_ID])) { db_execute_prepared('UPDATE user_auth SET full_name = ?, email_address = ? WHERE id = ?', [ gnrv('full_name'), gnrv('email_address'), $_SESSION[SESS_USER_ID] ] ); } $errors = []; $currentTab = ''; if (isrv('tab')) { // ================= input validation ================= gfrv('tab', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^([0-9a-z_A-Z]+)$/']]); // ==================================================== $currentTab = (string) gnrv('tab'); } // Save the users graph settings if they have permission if (is_view_allowed('graph_settings') == true && $currentTab == 'general') { save_user_settings($_SESSION[SESS_USER_ID]); } elseif ($currentTab !== '') { api_plugin_hook('auth_profile_save'); } if (cacti_sizeof($errors) == 0) { raise_message(1); } else { raise_message(35); foreach ($errors as $error) { // @phpstan-ignore-line raise_message($error); } } // reset local settings cache so the user sees the new settings kill_session_var(SESS_USER_LANGUAGE); kill_session_var(OPTIONS_USER); kill_session_var('selected_theme'); $tab = ($currentTab !== '') ? ('?tab=' . rawurlencode($currentTab)) : ''; header('Location: auth_profile.php' . $tab); } function settings() : bool { global $tabs_graphs, $settings_user, $current_user, $graph_views, $current_user; // you cannot have per-user graph settings if cacti's user management is not turned on if (read_config_option('auth_method') == AUTH_METHOD_NONE) { raise_message(6); return false; } $referer = validate_redirect_url($_SERVER['HTTP_REFERER'] ?? '', 'graph_view.php'); if (strpos($referer, 'auth_profile.php') === false) { $timespan_sel_pos = strpos($referer, '&predefined_timespan'); if ($timespan_sel_pos !== false) { $referer = substr($referer, 0, $timespan_sel_pos); } $_SESSION['profile_referer'] = $referer; } form_start('auth_profile.php', 'chk'); html_start_box(__('User Account Details'), '100%', true, 3, 'center', ''); $current_user = db_fetch_row_prepared('SELECT * FROM user_auth WHERE id = ?', [$_SESSION[SESS_USER_ID]] ); if (!cacti_sizeof($current_user)) { return false; } // Set the graph views the user has permission to unset($graph_views); if (is_view_allowed('show_tree')) { $graph_views[1] = __('Tree View'); } if (is_view_allowed('show_list')) { $graph_views[2] = __('List View'); } if (is_view_allowed('show_preview')) { $graph_views[2] = __('Preview View'); } if (isset($graph_views) && cacti_sizeof($graph_views)) { $settings_user['general']['default_view_mode']['array'] = $graph_views; } else { unset($settings_user['general']['default_view_mode']); } // file: user_admin.php, action: user_edit (host) $fields_user = [ 'username' => [ 'method' => 'value', 'friendly_name' => __('User Name'), 'description' => __('The login name for this user.'), 'value' => '|arg1:username|', 'max_length' => '40', 'size' => '40' ], 'full_name' => [ 'method' => 'textbox', 'friendly_name' => __('Full Name'), 'description' => __('A more descriptive name for this user, that can include spaces or special characters.'), 'value' => '|arg1:full_name|', 'max_length' => '120', 'size' => '60' ], 'email_address' => [ 'method' => 'textbox', 'type' => 'email', 'friendly_name' => __('Email Address'), 'description' => __('An Email Address you be reached at.'), 'value' => '|arg1:email_address|', 'max_length' => '60', 'size' => '60' ], 'clear_settings' => [ 'method' => 'button', 'friendly_name' => __('Clear User Settings'), 'description' => __('Return all User Settings to Default values.'), 'value' => __('Clear User Settings'), 'on_click' => 'clearUserSettings()' ], 'private_data' => [ 'method' => 'button', 'friendly_name' => __('Clear Private Data'), 'description' => __('Clear Private Data including Column sizing.'), 'value' => __('Clear Private Data'), 'on_click' => 'clearPrivateData()' ] ]; if (read_config_option('auth_cache_enabled') == 'on') { $fields_user += [ 'logout_everywhere' => [ 'method' => 'button', 'friendly_name' => __('Logout Everywhere'), 'description' => __('Clear all your Login Session Tokens from all devices that you have logged into using your session cookies.'), 'value' => __('Logout Everywhere'), 'on_click' => 'logoutEverywhere()' ] ]; } draw_edit_form( [ 'config' => ['no_form_tag' => true], 'fields' => inject_form_variables($fields_user, $current_user) ] ); html_end_box(true, true); if (is_view_allowed('graph_settings') == true) { if (read_config_option('client_timezone_support') == 0) { unset($settings_user['general']['client_timezone_support']); } $settings_user['tree']['default_tree_id']['sql'] = get_allowed_trees(false, true); html_start_box(__('User Settings'), '100%', true, 3, 'center', ''); foreach ($settings_user as $tab_short_name => $tab_fields) { $collapsible = true; print "