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
= htmlspecialchars($error) ?>
= htmlspecialchars($success) ?>
⏰ Kod wygasł!
Twój kod weryfikacyjny stracił ważność po 15 minutach.
Kliknij przycisk poniżej aby otrzymać nowy kod.
📧 Email: = htmlspecialchars($userData['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.