auth.php 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <?php
  2. define("USERNAME_REGEX", "^[\p{L}\p{N}_-]{1,64}$");
  3. define("PASSWORD_REGEX", "^(?=.*[\p{Ll}])(?=.*[\p{Lu}])(?=.*[\p{N}]).{8,1024}|.{10,1024}$");
  4. define("PLACEHOLDER_USERNAME", "lain");
  5. define("PLACEHOLDER_PASSWORD", "••••••••••••••••••••••••");
  6. // Password storage security
  7. define("ALGO_PASSWORD", PASSWORD_ARGON2ID);
  8. define("OPTIONS_PASSWORD", array(
  9. "memory_cost" => 65536,
  10. "time_cost" => 24,
  11. "threads" => 64,
  12. ));
  13. function checkPasswordFormat($password) {
  14. if (preg_match("/" . PASSWORD_REGEX . "/u", $password) !== 1)
  15. userError("Password malformed.");
  16. }
  17. function checkUsernameFormat($username) {
  18. if (preg_match("/" . USERNAME_REGEX . "/u", $username) !== 1)
  19. userError("Username malformed.");
  20. }
  21. function hashPassword($password) {
  22. return password_hash($password, ALGO_PASSWORD, OPTIONS_PASSWORD);
  23. }
  24. function userExist($username) {
  25. return isset(query('select', 'users', ['username' => $username], 'username')[0]);
  26. }
  27. function checkPassword($username, $password) {
  28. return password_verify($password, query('select', 'users', ['username' => $username], 'password')[0]);
  29. }
  30. function outdatedPasswordHash($username) {
  31. return password_needs_rehash(query('select', 'users', ['username' => $username], 'password')[0], ALGO_PASSWORD, OPTIONS_PASSWORD);
  32. }
  33. function changePassword($username, $password) {
  34. $db = new PDO('sqlite:' . DB_PATH);
  35. $stmt = $db->prepare("UPDATE users SET password = :password WHERE username = :username");
  36. $stmt->bindValue(':username', $username);
  37. $stmt->bindValue(':password', hashPassword($password));
  38. $stmt->execute();
  39. }