requireAdminHtml(); $message = ''; $error = ''; function h($s) { return htmlspecialchars((string)$s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } function t($key, $fallback = null) { global $languageStore, $language; return $languageStore->translate($key, $language, $fallback); } function post_value($name, $default = '') { return $_POST[$name] ?? $default; } function post_bool($name) { return isset($_POST[$name]) && $_POST[$name] === '1'; } function resolve_user_language($userSettings, $userId, $allowedLanguages) { $language = isset($_GET['lang']) ? (string)$_GET['lang'] : (string)$userSettings->get($userId, 'language', 'en'); if (!in_array($language, $allowedLanguages, true)) { $language = 'en'; } $userSettings->set($userId, 'language', $language); return $language; } function fmt_time($ts) { if ($ts === null) { return '-'; } return date('Y-m-d H:i:s', (int)$ts); } $language = resolve_user_language( $userSettings, $currentUser->id(), $languageStore->supportedLanguages() ); $languageStore->seedDefaults(array( 'app.title' => array('en' => 'Racket sandbox', 'nl' => 'Racket sandbox'), 'app.manage_prompts' => array('en' => 'Manage prompts', 'nl' => 'Prompts beheren'), 'app.user_management' => array('en' => 'User management', 'nl' => 'Gebruikersbeheer'), 'app.logout' => array('en' => 'Logout', 'nl' => 'Uitloggen'), 'app.language' => array('en' => 'Language', 'nl' => 'Taal'), 'app.logged_in_as' => array('en' => 'Logged in as:', 'nl' => 'Ingelogd als:'), 'app.admin' => array('en' => 'Admin', 'nl' => 'Admin'), 'app.enabled' => array('en' => 'Enabled', 'nl' => 'Ingeschakeld'), 'app.full_name' => array('en' => 'Full name', 'nl' => 'Volledige naam'), 'app.email' => array('en' => 'Email', 'nl' => 'E-mail'), 'app.password' => array('en' => 'Password', 'nl' => 'Wachtwoord'), 'app.new_password' => array('en' => 'New password', 'nl' => 'Nieuw wachtwoord'), 'app.created' => array('en' => 'Created', 'nl' => 'Gemaakt'), 'app.last_login' => array('en' => 'Last login', 'nl' => 'Laatste login'), 'app.actions' => array('en' => 'Actions', 'nl' => 'Acties'), 'app.create_user' => array('en' => 'Create user', 'nl' => 'Gebruiker aanmaken'), 'app.update_user' => array('en' => 'Update user', 'nl' => 'Gebruiker aanpassen'), 'app.change_password' => array('en' => 'Change password', 'nl' => 'Wachtwoord wijzigen'), 'app.delete_user' => array('en' => 'Delete user', 'nl' => 'Gebruiker verwijderen'), 'app.delete_user_confirm' => array('en' => 'Delete user', 'nl' => 'Gebruiker verwijderen'), 'app.cannot_delete_self' => array('en' => 'You cannot delete your own account.', 'nl' => 'Je kunt je eigen account niet verwijderen.'), 'app.cannot_disable_self' => array('en' => 'You cannot disable your own account.', 'nl' => 'Je kunt je eigen account niet uitschakelen.'), 'app.cannot_remove_own_admin' => array('en' => 'You cannot remove your own admin rights.', 'nl' => 'Je kunt je eigen adminrechten niet verwijderen.'), 'app.user_created' => array('en' => 'User created.', 'nl' => 'Gebruiker aangemaakt.'), 'app.user_updated' => array('en' => 'User updated.', 'nl' => 'Gebruiker aangepast.'), 'app.password_changed' => array('en' => 'Password changed.', 'nl' => 'Wachtwoord gewijzigd.'), 'app.user_deleted' => array('en' => 'User deleted.', 'nl' => 'Gebruiker verwijderd.'), 'app.back_to_sandbox' => array('en' => 'Back to Racket sandbox', 'nl' => 'Terug naar Racket sandbox'), 'app.configuration' => array('en' => 'Configuration', 'nl' => 'Configuratie'), )); if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = post_value('action'); try { if ($action === 'logout') { $auth->logout(); header('Location: /login.php'); exit; } elseif ($action === 'create_user') { $auth->createUser( post_value('email'), post_value('full_name'), post_value('password'), post_bool('is_admin'), post_bool('is_enabled') ); $message = t('app.user_created', 'User created.'); } elseif ($action === 'update_user') { $userId = (int)post_value('user_id'); $isAdmin = post_bool('is_admin'); $isEnabled = post_bool('is_enabled'); if ($userId === $currentUser->id() && !$isAdmin) { throw new Exception(t('app.cannot_remove_own_admin', 'You cannot remove your own admin rights.')); } if ($userId === $currentUser->id() && !$isEnabled) { throw new Exception(t('app.cannot_disable_self', 'You cannot disable your own account.')); } $auth->updateUser($userId, post_value('email'), post_value('full_name')); $auth->setAdmin($userId, $isAdmin); $auth->setEnabled($userId, $isEnabled); $message = t('app.user_updated', 'User updated.'); } elseif ($action === 'set_password') { $auth->setPassword(post_value('email'), post_value('password')); $message = t('app.password_changed', 'Password changed.'); } elseif ($action === 'delete_user') { $userId = (int)post_value('user_id'); if ($userId === $currentUser->id()) { throw new Exception(t('app.cannot_delete_self', 'You cannot delete your own account.')); } $auth->deleteUser($userId); $message = t('app.user_deleted', 'User deleted.'); } } catch (Throwable $e) { $error = $e->getMessage(); } } $users = $auth->listUsers(); $headerLanguages = array(); foreach ($languageStore->supportedLanguages() as $lang) { $headerLanguages[$lang] = $languageStore->languageLabel($lang); } header('Content-Type: text/html; charset=utf-8'); ?> <?= h(t('app.user_management', 'User management')) ?>
t('app.user_management', 'User management'), 'nav_items' => array( array('label' => t('app.back_to_sandbox', 'Back to Racket sandbox'), 'url' => '/?lang=' . rawurlencode($language)), array( 'label' => t('app.manage_prompts', 'Manage prompts'), 'url' => '/prompts?lang=' . rawurlencode($language), 'separator_before' => true, ), array( 'label' => t('app.user_management', 'User management'), 'url' => '/users?lang=' . rawurlencode($language), 'active' => true, 'separator_before' => true, ), array( 'label' => t('app.configuration', 'Configuration'), 'url' => '/admin-config?lang=' . rawurlencode($language), 'separator_before' => true, ), ), 'user' => $currentUser, 'user_prefix' => t('app.logged_in_as', 'Logged in as:'), 'admin_label' => t('app.admin', 'Admin'), 'language_label' => t('app.language', 'Language'), 'language' => $language, 'languages' => $headerLanguages, 'language_action' => '/users', 'logout_action' => '/users?lang=' . rawurlencode($language), 'logout_label' => t('app.logout', 'Logout'), 'message' => $message, 'error' => $error, )); ?>

createdAt())) ?> lastLoginAt())) ?>
id() !== $currentUser->id()): ?>