function do_change_password() { global $settings, $error, $changedPassword; if ($_POST['password'] != $_POST['password2']) { $error = "Your new passwords don't match!"; return; } if (!password_policy($_POST['password'], $error2)) { $error = $error2; return; } $dbh = $settings->getDatabase(); $statement = $dbh->prepare("SELECT * FROM users WHERE username = :username;"); $statement->execute(array(':username' => Session::Get()->getUsername())); $row = $statement->fetch(PDO::FETCH_ASSOC); if (!$row || !password_verify($_POST['old_password'], $row['password'])) { $error = "Your old password is incorrect!"; return; } $statement = $dbh->prepare("UPDATE users SET password = :password WHERE username = :username;"); $statement->execute(array(':username' => Session::Get()->getUsername(), ':password' => password_hash($_POST['password'], PASSWORD_DEFAULT))); $changedPassword = true; }
$dbh = $settings->getDatabase(); $statement = $dbh->prepare("SELECT * FROM users WHERE username = :username;"); $statement->execute(array(':username' => $_POST['reset'])); if (!($row = $statement->fetch(PDO::FETCH_ASSOC))) { $error = 'Unknown user'; } else { if ($row['reset_password_timestamp'] !== NULL && abs($row['reset_password_timestamp'] - time()) > 3600) { $error = 'The token is only valid for one hour'; } else { if ($row['reset_password_token'] === NULL || hash_hmac('sha256', $row['password'], $row['reset_password_token']) !== $_POST['token']) { $error = 'Invalid token'; } else { if ($_POST['password'] !== $_POST['password2']) { $error = 'The passwords doesn\'t match'; } else { if (!password_policy($_POST['password'], $error2)) { $error = $error2; } } } } } if (!isset($error)) { $statement = $dbh->prepare("UPDATE users SET password = :password, reset_password_token = NULL, reset_password_timestamp = NULL WHERE username = :username;"); $statement->execute(array(':username' => $_POST['reset'], ':password' => password_hash($_POST['password'], PASSWORD_DEFAULT))); $reset = true; } } require BASE . '/inc/smarty.php'; if ($error) { $smarty->assign('error', $error);