PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); $userId = (int) $_SESSION['user_id']; $errors = []; $successMessage = ''; $telegramConfig = require __DIR__ . '/../config/telegram.php'; function h(?string $value): string { return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); } function generateTelegramLinkToken(int $length = 32): string { return bin2hex(random_bytes(max(16, (int) ceil($length / 2)))); } $stmtUser = $pdo->prepare(" SELECT `id`, `username`, `email`, `display_name`, `telegram_username`, `telegram_chat_id`, `telegram_link_token`, `telegram_link_token_expires_at`, `telegram_connected_at`, `role`, `is_active` FROM `app_users` WHERE `id` = :id LIMIT 1 "); $stmtUser->execute([':id' => $userId]); $user = $stmtUser->fetch(); if (!$user) { $_SESSION = []; session_destroy(); header('Location: login.php'); exit; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = $_POST['action'] ?? ''; if ($action === 'update_profile') { $displayName = trim($_POST['display_name'] ?? ''); $email = trim($_POST['email'] ?? ''); if ($email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'Bitte eine gueltige E-Mail-Adresse eingeben.'; } if ($displayName !== '' && mb_strlen($displayName) > 100) { $errors[] = 'Der Anzeigename darf maximal 100 Zeichen lang sein.'; } if (empty($errors)) { $stmtCheck = $pdo->prepare(" SELECT `id` FROM `app_users` WHERE `email` = :email AND `id` <> :id LIMIT 1 "); $stmtCheck->execute([ ':email' => $email, ':id' => $userId, ]); if ($stmtCheck->fetch()) { $errors[] = 'Die E-Mail-Adresse ist bereits vergeben.'; } } if (empty($errors)) { $stmtUpdate = $pdo->prepare(" UPDATE `app_users` SET `display_name` = :display_name, `email` = :email, `updated_at` = NOW() WHERE `id` = :id "); $stmtUpdate->execute([ ':display_name' => $displayName !== '' ? $displayName : null, ':email' => $email, ':id' => $userId, ]); $_SESSION['display_name'] = $displayName !== '' ? $displayName : null; $successMessage = 'Die Kontodaten wurden gespeichert.'; } } if ($action === 'generate_telegram_link') { $token = generateTelegramLinkToken(32); $expiresAt = (new DateTimeImmutable('now'))->modify('+30 minutes')->format('Y-m-d H:i:s'); $stmtLink = $pdo->prepare(" UPDATE `app_users` SET `telegram_link_token` = :token, `telegram_link_token_expires_at` = :expires_at, `updated_at` = NOW() WHERE `id` = :id "); $stmtLink->execute([ ':token' => $token, ':expires_at' => $expiresAt, ':id' => $userId, ]); $successMessage = 'Ein neuer Telegram-Verbindungscode wurde erzeugt.'; } if ($action === 'disconnect_telegram') { $stmtDisconnect = $pdo->prepare(" UPDATE `app_users` SET `telegram_username` = NULL, `telegram_chat_id` = NULL, `telegram_link_token` = NULL, `telegram_link_token_expires_at` = NULL, `telegram_connected_at` = NULL, `updated_at` = NOW() WHERE `id` = :id "); $stmtDisconnect->execute([ ':id' => $userId, ]); $successMessage = 'Die Telegram-Verknuepfung wurde entfernt.'; } if ($action === 'change_password') { $currentPassword = $_POST['current_password'] ?? ''; $newPassword = $_POST['new_password'] ?? ''; $newPasswordRepeat = $_POST['new_password_repeat'] ?? ''; $stmtPassword = $pdo->prepare(" SELECT `password_hash` FROM `app_users` WHERE `id` = :id LIMIT 1 "); $stmtPassword->execute([':id' => $userId]); $passwordRow = $stmtPassword->fetch(); if (!$passwordRow || !password_verify($currentPassword, $passwordRow['password_hash'])) { $errors[] = 'Das aktuelle Passwort ist nicht korrekt.'; } if ($newPassword === '') { $errors[] = 'Bitte ein neues Passwort eingeben.'; } elseif (strlen($newPassword) < 8) { $errors[] = 'Das neue Passwort muss mindestens 8 Zeichen lang sein.'; } if ($newPassword !== $newPasswordRepeat) { $errors[] = 'Die neuen Passwoerter stimmen nicht ueberein.'; } if (empty($errors)) { $newHash = password_hash($newPassword, PASSWORD_DEFAULT); $stmtUpdatePassword = $pdo->prepare(" UPDATE `app_users` SET `password_hash` = :password_hash, `updated_at` = NOW() WHERE `id` = :id "); $stmtUpdatePassword->execute([ ':password_hash' => $newHash, ':id' => $userId, ]); $successMessage = 'Das Passwort wurde geaendert.'; } } $stmtUser->execute([':id' => $userId]); $user = $stmtUser->fetch(); } $loggedIn = true; $publicBasePath = './'; $telegramBotUsername = trim((string) ($telegramConfig['bot_username'] ?? '')); $telegramHasConnection = !empty($user['telegram_chat_id']); $telegramLinkToken = trim((string) ($user['telegram_link_token'] ?? '')); $telegramLinkExpiresAt = !empty($user['telegram_link_token_expires_at']) ? new DateTimeImmutable((string) $user['telegram_link_token_expires_at']) : null; $telegramLinkIsActive = $telegramLinkToken !== '' && $telegramLinkExpiresAt instanceof DateTimeImmutable && $telegramLinkExpiresAt > new DateTimeImmutable('now'); $telegramDeepLink = $telegramLinkIsActive && $telegramBotUsername !== '' ? 'https://t.me/' . $telegramBotUsername . '?start=connect_' . $telegramLinkToken : null; ?>

Kontodaten

Benutzername
Rolle

Telegram verbinden

Spaetere Bot-Nachrichten funktionieren nur mit einer verknuepften Chat-ID. Der Telegram-Username allein reicht Telegram fuer aktive Nachrichten an einen Nutzer nicht aus.

Status
Telegram-Username
Chat-ID
Verbunden seit

Aktiver Verbindungscode bis format('d.m.Y H:i')) ?>:

QR-Code mit dem Handy in Telegram scannen und dann im Bot nur noch auf Start tippen.

Verbindung starten: Telegram-Verknuepfung oeffnen oder direkt im Bot: @

Passwort aendern