ponepaste/includes/Helpers/SessionHelper.php

66 lines
1.8 KiB
PHP
Raw Permalink Normal View History

<?php
namespace PonePaste\Helpers;
use DateTime;
2021-08-29 01:26:29 -04:00
use PonePaste\Models\User;
use PonePaste\Models\UserSession;
class SessionHelper {
public const REMEMBER_TOKEN_COOKIE = '_ponepaste_token';
2022-03-14 15:43:01 -04:00
public const CSRF_TOKEN_KEY = 'csrf_token';
public static function currentUser() {
$session_user = SessionHelper::currentUserFromPhpSession();
if ($session_user !== null) {
return $session_user;
}
if (!empty($_COOKIE[self::REMEMBER_TOKEN_COOKIE]) &&
($session = SessionHelper::currentUserFromRememberToken($_COOKIE[self::REMEMBER_TOKEN_COOKIE]))) {
$_SESSION['user_id'] = $session->user_id;
return $session;
}
return null;
}
public static function destroySession() : void {
$token = $_COOKIE[SessionHelper::REMEMBER_TOKEN_COOKIE];
2021-08-29 01:26:29 -04:00
UserSession::where('token', $token)->delete();
unset($_COOKIE[SessionHelper::REMEMBER_TOKEN_COOKIE]);
setcookie(SessionHelper::REMEMBER_TOKEN_COOKIE, null, time() - 3600);
}
private static function currentUserFromRememberToken(string $remember_token) {
2021-08-29 01:26:29 -04:00
$session = UserSession
::with('user')
->where('token', $remember_token)
->first();
if (!$session) {
return null;
}
$session_expiry = $session->expire_at;
$now = new DateTime();
/* Session is expired (diff is negative) */
if ($now->diff($session_expiry)->invert === 1) {
$session->delete();
return null;
}
return $session->user;
}
private static function currentUserFromPhpSession() {
if (empty($_SESSION['user_id'])) {
return null;
}
2021-08-29 01:26:29 -04:00
return User::find(intval($_SESSION['user_id']));
}
}