getMessage()); } $user_id = $_SESSION['user_id']; $error = ''; $success = ''; $link_expired = false; $code_verified = false; require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/account_suspension.php'; $suspensionState = og_is_current_user_suspended($pdo); if (!empty($suspensionState['is_suspended'])) { header('Location: /account/settings/?error=' . urlencode('Twoje konto jest zawieszone. Zmiana hasła jest zablokowana.')); exit(); } // Pobranie danych użytkownika try { $stmt = $pdo->prepare("SELECT email, password, password_reset_code, password_reset_expires FROM users WHERE id = ?"); $stmt->execute([$user_id]); $userData = $stmt->fetch(PDO::FETCH_ASSOC); if (!$userData) { die("Nie znaleziono użytkownika"); } } catch (PDOException $e) { die("Błąd bazy danych: " . $e->getMessage() . "

Czy dodałeś kolumny password_reset_code i password_reset_expires do tabeli users?

Wykonaj w phpMyAdmin:
ALTER TABLE users\nADD COLUMN password_reset_code VARCHAR(6) NULL AFTER newsletter_enabled,\nADD COLUMN password_reset_expires DATETIME NULL AFTER password_reset_code;
"); } // Jeśli użytkownik nie ma kodu, przekieruj do żądania if (empty($userData['password_reset_code'])) { header('Location: /account/settings/?error=' . urlencode('Link do zmiany hasła jest nieważny lub został już użyty.')); exit(); } // Sprawdzenie czy kod wygasł if (!empty($userData['password_reset_expires'])) { if (strtotime($userData['password_reset_expires']) < time()) { $link_expired = true; } } // Obsługa resend if (isset($_GET['resend']) && $_GET['resend'] == '1') { $reset_code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT); $reset_expires = date('Y-m-d H:i:s', strtotime('+15 minutes')); $update = $pdo->prepare("UPDATE users SET password_reset_code = ?, password_reset_expires = ? WHERE id = ?"); $update->execute([$reset_code, $reset_expires, $user_id]); require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/smtp_helper.php'; $subject = "Nowy kod zmiany hasła - Wspólnie"; $message = "

🔒 Nowy kod zmiany hasła

Twój nowy kod weryfikacyjny to:

$reset_code

Kod jest ważny przez 15 minut.

"; sendEmailSMTP($userData['email'], $subject, $message); $success = "Nowy kod został wysłany na Twój email!"; $link_expired = false; } // Weryfikacja kodu if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['action']) && $_POST['action'] === 'verify_code' && !$link_expired) { $code = trim($_POST["code"] ?? ""); if (empty($code)) { $error = "Kod weryfikacyjny jest wymagany."; } else { if (strtotime($userData['password_reset_expires']) < time()) { $error = "Kod weryfikacyjny wygasł."; $link_expired = true; } elseif ($userData['password_reset_code'] != $code) { $error = "Nieprawidłowy kod weryfikacyjny."; } else { $code_verified = true; } } } // Walidacja i zmiana hasła function validatePassword($password) { $errors = []; if (strlen($password) < 8) { $errors[] = "Hasło musi mieć minimum 8 znaków"; } if (!preg_match('/[A-Z]/', $password)) { $errors[] = "Hasło musi zawierać wielką literę"; } if (!preg_match('/[a-z]/', $password)) { $errors[] = "Hasło musi zawierać małą literę"; } if (!preg_match('/[0-9]/', $password)) { $errors[] = "Hasło musi zawierać cyfrę"; } return $errors; } if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['action']) && $_POST['action'] === 'change_password') { $code = trim($_POST["code"] ?? ""); $new_password = $_POST["new_password"] ?? ""; $confirm_password = $_POST["confirm_password"] ?? ""; // Pobierz aktualne hasło użytkownika $stmt = $pdo->prepare("SELECT password, password_reset_code, password_reset_expires FROM users WHERE id = ?"); $stmt->execute([$user_id]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if (strtotime($user['password_reset_expires']) < time()) { $error = "Kod weryfikacyjny wygasł."; $link_expired = true; } elseif ($user['password_reset_code'] != $code) { $error = "Nieprawidłowy kod weryfikacyjny."; } elseif (empty($new_password) || empty($confirm_password)) { $error = "Wszystkie pola są wymagane."; $code_verified = true; } elseif ($new_password !== $confirm_password) { $error = "Hasła nie są identyczne."; $code_verified = true; } else { // Walidacja siły hasła $validation_errors = validatePassword($new_password); if (!empty($validation_errors)) { $error = implode(", ", $validation_errors); $code_verified = true; } elseif (password_verify($new_password, $user['password'])) { $error = "Nowe hasło nie może być takie samo jak obecne hasło."; $code_verified = true; } else { // Wszystko OK - zmień hasło $new_hash = password_hash($new_password, PASSWORD_DEFAULT); $update = $pdo->prepare("UPDATE users SET password = ?, password_reset_code = NULL, password_reset_expires = NULL WHERE id = ?"); $update->execute([$new_hash, $user_id]); header('Location: /account/settings/?success=password_changed'); exit(); } } } ?> Zmiana hasła | Wspólnie

🔒 Zmiana hasła

Wpisz 6-cyfrowy kod wysłany na Twój email

⏰ Kod wygasł!
Twój kod weryfikacyjny stracił ważność po 15 minutach.
Kliknij przycisk poniżej aby otrzymać nowy kod.
📧 Email:
⏱️ Kod ważny: 15 minut od wysłania
ℹ️ Hasło musi zawierać co najmniej 8 znaków, w tym wielką literę, małą literę i cyfrę.

Formularz jest zablokowany. Kliknij "Wyślij kod ponownie" aby otrzymać nowy kod.

← Powrót do ustawień