ponepaste/includes/User.class.php

63 lines
1.9 KiB
PHP
Raw Normal View History

<?php
class User {
2021-07-20 12:15:41 -04:00
public const REMEMBER_TOKEN_COOKIE = '_ponepaste_token';
public int $user_id;
public string $username;
private function __construct(array $row) {
$this->user_id = intval($row['user_id']);
$this->username = $row['username'];
}
2021-07-19 18:38:13 -04:00
public static function findByUsername(DatabaseHandle $conn, string $username) : User | null {
$query = $conn->query('SELECT id, username FROM users WHERE username = ?', [$username]);
$row = $query->fetch();
return empty($row) ? null : new User($row);
}
public static function current(DatabaseHandle $conn) : User | null {
$session_user = User::createFromPhpSession($conn);
if ($session_user !== null) {
return $session_user;
}
2021-07-20 12:15:41 -04:00
if (!empty($_COOKIE[self::REMEMBER_TOKEN_COOKIE]) &&
($token_user = User::createFromRememberToken($conn, $_COOKIE[self::REMEMBER_TOKEN_COOKIE]))) {
$_SESSION['user_id'] = $token_user->user_id;
return $token_user;
}
return null;
}
public static function createFromRememberToken(DatabaseHandle $conn, string $remember_token) : User | null {
$result = $conn->query(
2021-07-19 18:38:13 -04:00
'SELECT users.id AS id, users.username AS username, users.banned AS banned
FROM user_sessions
INNER JOIN users ON users.id = user_sessions.user_id
WHERE user_sessions.token = ?', [$remember_token]
);
if ($row = $result->fetch()) {
return new User($row);
}
return null;
}
public static function createFromPhpSession(DatabaseHandle $conn) : User | null {
if (empty($_SESSION['user_id'])) {
return null;
}
$user_id = intval($_SESSION['user_id']);
2021-07-19 18:38:13 -04:00
$row = $conn->query('SELECT id, username, banned FROM users WHERE id = ?', [$user_id])->fetch();
return $row ? new User($row) : null;
}
}