From 5408a2bb898acfbc44dd1e5a2519530d3019630b Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Mon, 15 Jun 2026 21:36:36 +0200 Subject: [PATCH] adasd --- public/assets/auth/login.css | 53 ++++++++++++++++++++--- public/assets/auth/password-visibility.js | 1 + public/auth/register/index.php | 24 ++++++++-- public/auth/reset-password/index.php | 17 ++++++-- src/App/RegistrationService.php | 38 +++++++++++++++- 5 files changed, 118 insertions(+), 15 deletions(-) diff --git a/public/assets/auth/login.css b/public/assets/auth/login.css index 2a05c763..459d56b8 100644 --- a/public/assets/auth/login.css +++ b/public/assets/auth/login.css @@ -190,7 +190,18 @@ body { } .login-password-row input { - padding-right: 56px; + padding-right: 64px; +} + +.login-password-row input::-ms-reveal, +.login-password-row input::-ms-clear { + display: none; +} + +.login-password-row input::-webkit-credentials-auto-fill-button, +.login-password-row input::-webkit-textfield-decoration-container { + visibility: hidden; + pointer-events: none; } .login-password-toggle { @@ -201,13 +212,43 @@ body { display: inline-flex; align-items: center; justify-content: center; - width: 36px; - height: 36px; - border: 0; + width: 34px; + height: 34px; + border: 1px solid rgba(15, 23, 42, 0.16); border-radius: 999px; - background: transparent; - color: rgba(15, 23, 42, 0.56); + background: rgba(15, 23, 42, 0.78); + color: rgba(255, 255, 255, 0.96); + box-shadow: 0 8px 18px rgba(15, 23, 42, 0.18); cursor: pointer; + transition: background-color 160ms ease, transform 160ms ease, box-shadow 160ms ease; +} + +.login-password-toggle:hover { + background: rgba(15, 23, 42, 0.92); + transform: translateY(-50%) scale(1.03); +} + +.login-password-toggle:focus-visible { + outline: 2px solid rgba(14, 165, 233, 0.55); + outline-offset: 2px; +} + +.login-password-icon { + width: 17px; + height: 17px; + display: block; +} + +.login-password-icon-hide { + display: none; +} + +.login-password-toggle.is-visible .login-password-icon-show { + display: none; +} + +.login-password-toggle.is-visible .login-password-icon-hide { + display: block; } .login-field textarea { diff --git a/public/assets/auth/password-visibility.js b/public/assets/auth/password-visibility.js index 5ea1d1c4..9ad14faf 100644 --- a/public/assets/auth/password-visibility.js +++ b/public/assets/auth/password-visibility.js @@ -13,6 +13,7 @@ document.addEventListener('DOMContentLoaded', () => { const isHidden = input.type === 'password'; input.type = isHidden ? 'text' : 'password'; toggle.setAttribute('aria-label', isHidden ? 'Passwort verbergen' : 'Passwort anzeigen'); + toggle.classList.toggle('is-visible', isHidden); }); }); }); diff --git a/public/auth/register/index.php b/public/auth/register/index.php index 85ca81fc..b8c1c008 100644 --- a/public/auth/register/index.php +++ b/public/auth/register/index.php @@ -143,9 +143,17 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { @@ -153,9 +161,17 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { diff --git a/public/auth/reset-password/index.php b/public/auth/reset-password/index.php index da7cf25c..630fbf68 100644 --- a/public/auth/reset-password/index.php +++ b/public/auth/reset-password/index.php @@ -13,12 +13,21 @@ $token = trim((string) ($_GET['token'] ?? $_POST['token'] ?? '')); $record = $service->validate($token); $message = null; $error = null; +$form = [ + 'password' => '', + 'password_confirm' => '', +]; if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $form = [ + 'password' => (string) ($_POST['password'] ?? ''), + 'password_confirm' => (string) ($_POST['password_confirm'] ?? ''), + ]; + $result = $service->complete( $token, - (string) ($_POST['password'] ?? ''), - (string) ($_POST['password_confirm'] ?? '') + $form['password'], + $form['password_confirm'] ); if ($result['success'] ?? false) { @@ -58,12 +67,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
diff --git a/src/App/RegistrationService.php b/src/App/RegistrationService.php index c328faf1..0b8e732f 100644 --- a/src/App/RegistrationService.php +++ b/src/App/RegistrationService.php @@ -163,14 +163,16 @@ final class RegistrationService $request['provisioning']['status'] = 'ldap_created_inactive'; $request['provisioning']['ldif_path'] = $this->writeLdifDraft($request['id'], $username, $this->ldifBuilder->build($request, $provisioning)); } catch (\Throwable $exception) { + $errorReference = $this->logProvisioningFailure($request, $provisioning, $exception); $request['password_secret'] = $passwordSecret; $request['status'] = 'provisioning_failed'; $request['provisioning']['status'] = 'provisioning_failed'; $request['provisioning']['error'] = $exception->getMessage(); + $request['provisioning']['error_reference'] = $errorReference; return [ 'success' => false, - 'errors' => ['Die Registrierung konnte im Moment nicht gespeichert werden. Bitte versuche es später erneut.'], + 'errors' => ['Die Registrierung konnte im Moment nicht gespeichert werden. Bitte versuche es später erneut. Referenz: ' . $errorReference], 'request' => $this->store->create($request), ]; } @@ -379,4 +381,38 @@ final class RegistrationService return $this->projectRoot . '/' . ltrim($path, '/'); } + + /** + * @param array $request + * @param array $provisioning + */ + private function logProvisioningFailure(array $request, array $provisioning, \Throwable $exception): string + { + $reference = 'REG-' . gmdate('YmdHis') . '-' . substr(bin2hex(random_bytes(4)), 0, 8); + $path = $this->resolveProjectPath('data/registration-provisioning-errors.log'); + $directory = dirname($path); + + if (!is_dir($directory)) { + mkdir($directory, 0775, true); + } + + $payload = [ + 'reference' => $reference, + 'created_at' => gmdate('c'), + 'message' => $exception->getMessage(), + 'username' => (string) ($request['username'] ?? ''), + 'email' => (string) ($request['email'] ?? ''), + 'display_name' => (string) ($request['display_name'] ?? ''), + 'origin' => $request['origin'] ?? [], + 'provisioning' => $provisioning, + ]; + + file_put_contents( + $path, + json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . PHP_EOL, + FILE_APPEND | LOCK_EX + ); + + return $reference; + } }