diff --git a/app/Controllers/UserManagementController.php b/app/Controllers/UserManagementController.php index 9e35640..2260648 100644 --- a/app/Controllers/UserManagementController.php +++ b/app/Controllers/UserManagementController.php @@ -100,4 +100,215 @@ class UserManagementController 'activeMenu' => 'users', ]; } + + /** + * Zeigt das Formular zum Anlegen eines neuen Benutzers (Platzhalter). + * @return array + */ + public function create(): array + { + // CSRF token sicherstellen + if (empty($_SESSION['csrf_token'])) { + $_SESSION['csrf_token'] = bin2hex(random_bytes(16)); + } + + $viewPath = __DIR__ . '/../../public/views/users_create.php'; + + return [ + 'view' => $viewPath, + 'data' => [ + 'loginPage' => false, + 'csrf_token' => $_SESSION['csrf_token'], + ], + 'pageTitle' => 'Benutzer hinzufügen', + 'activeMenu' => 'users', + 'activeSubMenu' => 'create', + ]; + } + + /** + * Verarbeitet das Absenden des 'Benutzer hinzufügen'-Formulars (Platzhalter, + * führt keine LDAP-Änderung aus, validiert aber Eingaben). + * + * @return array + */ + public function createSubmit(): array + { + $errors = []; + + // CSRF prüfen + $token = $_POST['csrf_token'] ?? ''; + if (empty($token) || !isset($_SESSION['csrf_token']) || hash_equals($_SESSION['csrf_token'], $token) === false) { + $errors[] = 'Ungültiger CSRF-Token.'; + } + + $username = trim((string)($_POST['username'] ?? '')); + $firstname = trim((string)($_POST['givenName'] ?? '')); + $lastname = trim((string)($_POST['sn'] ?? '')); + $email = trim((string)($_POST['mail'] ?? '')); + + if ($username === '') { + $errors[] = 'Benutzername wird benötigt.'; + } + if ($email !== '' && filter_var($email, FILTER_VALIDATE_EMAIL) === false) { + $errors[] = 'E-Mail-Adresse ist ungültig.'; + } + + // Für jetzt nur eine Erfolgsmeldung (keine AD-Operation) + $viewPath = __DIR__ . '/../../public/views/users_create.php'; + + $data = [ + 'loginPage' => false, + 'csrf_token' => $_SESSION['csrf_token'], + ]; + + if (!empty($errors)) { + $data['errors'] = $errors; + $data['form'] = [ + 'username' => $username, + 'givenName' => $firstname, + 'sn' => $lastname, + 'mail' => $email, + ]; + + return [ + 'view' => $viewPath, + 'data' => $data, + 'pageTitle' => 'Benutzer hinzufügen', + 'activeMenu' => 'users', + 'activeSubMenu' => 'create', + ]; + } + + $data['success'] = 'Benutzer-Formular erfolgreich validiert (Platzhalter, wurde nicht angelegt).'; + $data['form'] = ['username' => $username]; + + return [ + 'view' => $viewPath, + 'data' => $data, + 'pageTitle' => 'Benutzer hinzufügen', + 'activeMenu' => 'users', + 'activeSubMenu' => 'create', + ]; + } + + /** + * Zeigt das CSV-Import-Formular (Platzhalter). + * @return array + */ + public function import(): array + { + // CSRF token sicherstellen + if (empty($_SESSION['csrf_token'])) { + $_SESSION['csrf_token'] = bin2hex(random_bytes(16)); + } + + $viewPath = __DIR__ . '/../../public/views/users_import.php'; + + return [ + 'view' => $viewPath, + 'data' => [ + 'loginPage' => false, + 'csrf_token' => $_SESSION['csrf_token'], + ], + 'pageTitle' => 'Benutzer importieren (CSV)', + 'activeMenu' => 'users', + 'activeSubMenu' => 'import', + ]; + } + + /** + * Verarbeitet CSV-Upload und zeigt eine Vorschau der ersten Zeilen (Platzhalter). + * + * @return array + */ + public function importSubmit(): array + { + $errors = []; + + // CSRF prüfen + $token = $_POST['csrf_token'] ?? ''; + if (empty($token) || !isset($_SESSION['csrf_token']) || hash_equals($_SESSION['csrf_token'], $token) === false) { + $errors[] = 'Ungültiger CSRF-Token.'; + } + + if (!isset($_FILES['csv_file']) || $_FILES['csv_file']['error'] !== UPLOAD_ERR_OK) { + $errors[] = 'Bitte eine gültige CSV-Datei hochladen.'; + } + + $preview = []; + if (empty($errors)) { + $tmp = $_FILES['csv_file']['tmp_name']; + if (($handle = fopen($tmp, 'r')) !== false) { + $row = 0; + while (($data = fgetcsv($handle, 0, ',')) !== false && $row < 50) { + $preview[] = $data; + $row++; + } + fclose($handle); + } else { + $errors[] = 'Die hochgeladene Datei konnte nicht gelesen werden.'; + } + } + + $viewPath = __DIR__ . '/../../public/views/users_import.php'; + + $data = [ + 'loginPage' => false, + 'csrf_token' => $_SESSION['csrf_token'], + ]; + + if (!empty($errors)) { + $data['errors'] = $errors; + } else { + $data['preview'] = $preview; + $data['success'] = 'CSV-Datei erfolgreich hochgeladen. Vorschau der ersten Zeilen:'; + } + + return [ + 'view' => $viewPath, + 'data' => $data, + 'pageTitle' => 'Benutzer importieren (CSV)', + 'activeMenu' => 'users', + 'activeSubMenu' => 'import', + ]; + } + + /** + * Zeigt die Benutzersuche (Platzhalter). + * @return array + */ + public function search(): array + { + $query = trim((string)($_GET['q'] ?? '')); + + $users = []; + if ($query !== '') { + try { + $allUsers = $this->directoryService->getUsers(); + foreach ($allUsers as $u) { + $hay = strtolower($u['samaccountname'] . ' ' . $u['displayname'] . ' ' . $u['mail']); + if (strpos($hay, strtolower($query)) !== false) { + $users[] = $u; + } + } + } catch (\Throwable $e) { + $this->logger->logException('Fehler bei Benutzersuche.', $e, ['query' => $query]); + } + } + + $viewPath = __DIR__ . '/../../public/views/users_search.php'; + + return [ + 'view' => $viewPath, + 'data' => [ + 'loginPage' => false, + 'query' => $query, + 'results' => $users, + ], + 'pageTitle' => 'Benutzer suchen', + 'activeMenu' => 'users', + 'activeSubMenu' => 'search', + ]; + } } diff --git a/public/index.php b/public/index.php index 70dbe3c..85d960d 100644 --- a/public/index.php +++ b/public/index.php @@ -240,6 +240,44 @@ switch ($route) { handleResult($result); break; + case 'users.create': + requireLogin($config); + $result = $userManagementController->create(); + handleResult($result); + break; + + case 'users.create.submit': + requireLogin($config); + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + header('Location: index.php?route=users.create'); + exit; + } + $result = $userManagementController->createSubmit(); + handleResult($result); + break; + + case 'users.import': + requireLogin($config); + $result = $userManagementController->import(); + handleResult($result); + break; + + case 'users.import.submit': + requireLogin($config); + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + header('Location: index.php?route=users.import'); + exit; + } + $result = $userManagementController->importSubmit(); + handleResult($result); + break; + + case 'users.search': + requireLogin($config); + $result = $userManagementController->search(); + handleResult($result); + break; + default: http_response_code(404); echo 'Route nicht gefunden.'; diff --git a/public/views/partials/sidebar.php b/public/views/partials/sidebar.php index ea97dd7..79451ec 100644 --- a/public/views/partials/sidebar.php +++ b/public/views/partials/sidebar.php @@ -49,6 +49,23 @@ Benutzer & Gruppen + + + + + diff --git a/public/views/users.php b/public/views/users.php index e95e779..644df23 100644 --- a/public/views/users.php +++ b/public/views/users.php @@ -25,6 +25,11 @@ declare(strict_types=1); diff --git a/public/views/users_create.php b/public/views/users_create.php new file mode 100644 index 0000000..53d30f8 --- /dev/null +++ b/public/views/users_create.php @@ -0,0 +1,52 @@ + +
+
+
Benutzer hinzufügen
+
+
+ +
+
    + +
  • + +
+
+ + + +
+ + +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + + Zurück zur Liste +
+
+
diff --git a/public/views/users_import.php b/public/views/users_import.php new file mode 100644 index 0000000..c9b57ab --- /dev/null +++ b/public/views/users_import.php @@ -0,0 +1,55 @@ + +
+
+
Benutzer importieren (CSV)
+
+
+ +
+
    + +
  • + +
+
+ + + +
+ + +
+ +
+ + +
+ + Zurück zur Liste +
+ + +
Vorschau (erste Zeilen)
+
+ + + + + + + + + + +
+
+ +
+
diff --git a/public/views/users_search.php b/public/views/users_search.php new file mode 100644 index 0000000..ff20133 --- /dev/null +++ b/public/views/users_search.php @@ -0,0 +1,48 @@ + +
+
+
Benutzer suchen
+
+
+
+ +
+ + +
+ + Zurück zur Liste +
+ + +
Ergebnisse für ""
+ +
+ + + + + + + + + + + + + +
BenutzernameNameE-Mail
+
+ +
Keine Treffer gefunden.
+ + +
+