use MinehubsStudios\backend\Database;
use MinehubsStudios\backend\Request;
use MinehubsStudios\backend\Session;
use PDO;
use DateMalformedStringException;
use DateTime;
use Random\RandomException;
class RememberMe {
/**
* @var Database
*/
private Database $database;
/**
* @var Request
*/
private Request $request;
/**
* @var Session
*
*/
private Session $session;
/**
* REMEMBER ME CONSTRUCTOR.
*
* @param Database $database
* @param Request $request
* @param Session $session
*/
public function __construct(Database $database, Request $request, Session $session) {
$this -> database = $database;
$this -> request = $request;
$this -> session = $session;
}
/**
* SECURELY HANDLES 'Remember Me' COOKIE AUTHENTICATION.
*
* @return void
*
* @throws DateMalformedStringException
* @throws RandomException
*/
public function authenticate(): void {
if (!isset($_COOKIE['remember'])) {
$this -> request -> redirectToLogin();
}
$remember_token = $_COOKIE['remember'];
// FETCH STORED TOKEN & EXPIRY FROM DB.
$statement = $this -> database -> pdo -> prepare("SELECT users_id, remember_token, remember_expiry, users_name, users_role FROM users WHERE remember_token IS NOT NULL");
$statement -> execute();
$user = $statement -> fetch(PDO::FETCH_ASSOC);
// VALIDATE TOKEN & EXPIRE.
if (!$user || !isset($user['remember_token'], $user['remember_expiry']) || !is_string($remember_token) || !is_string($user['remember_token']) || !password_verify($remember_token, $user['remember_token'])) {
$this -> clear();
$this -> request -> redirectToLogin();
}
$expiry_time = is_string($user['remember_expiry']) ? $user['remember_expiry'] : '1970-01-01 00:00:00';
if (new DateTime() > new DateTime($expiry_time)) {
$this -> clear();
$this -> request -> redirectToLogin();
}
// STORE USER DATA.
session_regenerate_id(true);
$this -> session -> set("userid", $user['users_id']);
$this -> session -> set("name", $user["users_name"]);
$this -> session -> set("role", $user["users_role"]);
// REFRESH 'Remember Me' EXPIRY.
$this -> set($user['users_id']);
}
/**
* SET 'Remember Me' TOKEN FOR USER.
*
* @param int $user_id - THE USER'S UNIQUE ID.
*
* @return void
*
* @throws RandomException
*/
public function set(int $user_id): void {
$new_token = bin2hex(random_bytes(32));
$hashed_token = password_hash($new_token, PASSWORD_ARGON2ID);
$expiry_time = new DateTime('+7 days') -> format('Y-m-d H:i:s');
$statement = $this -> database -> pdo -> prepare("UPDATE users SET remember_token = :token, remember_expiry = :expiry WHERE users_id = :id");
$statement -> execute(['token' => $hashed_token, 'expiry' => $expiry_time, 'id' => $user_id]);
setcookie('remember', $new_token, [
'expires' => strtotime('+7 days'),
'httponly' => true,
'secure' => isset($_SERVER['HTTPS']),
'samesite' => 'Strict'
]);
}
/**
* CLEARS 'Remember Me' COOKIE & DB TOKEN.
*
* @return void
*/
private function clear(): void {
setcookie('remember', '', time() - 3600, '/', '', isset($_SERVER['HTTPS']), true);
$statement = $this -> database -> pdo -> prepare("UPDATE users SET remember_token = NULL, remember_expiry = NULL WHERE users_id = ?");
$statement -> execute([$this -> session -> get('userid')]);
}
}
Warning: session_name(): Session name cannot be changed after headers have already been sent in /customers/a/5/e/minehubsstudios.com/httpd.www/backend/Session.php on line 55
Warning: ini_set(): Session ini settings cannot be changed after headers have already been sent in /customers/a/5/e/minehubsstudios.com/httpd.www/backend/Session.php on line 57
Warning: ini_set(): Session ini settings cannot be changed after headers have already been sent in /customers/a/5/e/minehubsstudios.com/httpd.www/backend/Session.php on line 58
Warning: ini_set(): Session ini settings cannot be changed after headers have already been sent in /customers/a/5/e/minehubsstudios.com/httpd.www/backend/Session.php on line 59
Warning: ini_set(): Session ini settings cannot be changed after headers have already been sent in /customers/a/5/e/minehubsstudios.com/httpd.www/backend/Session.php on line 60
Warning: session_set_cookie_params(): Session cookie parameters cannot be changed after headers have already been sent in /customers/a/5/e/minehubsstudios.com/httpd.www/backend/Session.php on line 62
Warning: session_start(): Session cannot be started after headers have already been sent in /customers/a/5/e/minehubsstudios.com/httpd.www/backend/Session.php on line 79
Warning: session_start(): Session cannot be started after headers have already been sent in /customers/a/5/e/minehubsstudios.com/httpd.www/backend/Session.php on line 79
Warning: Cannot modify header information - headers already sent by (output started at /customers/a/5/e/minehubsstudios.com/httpd.www/backend/auth/RememberMe.php:1) in /customers/a/5/e/minehubsstudios.com/httpd.www/Bootstrap.php on line 161
Warning: Cannot modify header information - headers already sent by (output started at /customers/a/5/e/minehubsstudios.com/httpd.www/backend/auth/RememberMe.php:1) in /customers/a/5/e/minehubsstudios.com/httpd.www/Bootstrap.php on line 162
Warning: Cannot modify header information - headers already sent by (output started at /customers/a/5/e/minehubsstudios.com/httpd.www/backend/auth/RememberMe.php:1) in /customers/a/5/e/minehubsstudios.com/httpd.www/Bootstrap.php on line 163
Warning: Cannot modify header information - headers already sent by (output started at /customers/a/5/e/minehubsstudios.com/httpd.www/backend/auth/RememberMe.php:1) in /customers/a/5/e/minehubsstudios.com/httpd.www/Bootstrap.php on line 164
Last year, The Other Side reached London at the Lift Off Film Festival. This year, The Other Side is coming over sea to the United States and thus its first American film festival, where it has been selected for the Illume Short Film Festival in the category "Narrative Short Films". The festival is on July 17 - August 15 2021, due to corona it will be held and broadcast online.
Results...
The Other Side has been selected to its first international film festival. The festival is being held online from Pinewood Studios in London (UK). The festival can be followed online from December 21 to December 28, 2020 on Lift-Off Global Network Youtube channel.
The Other Side has been selected for two categories "Any film, Any genre" and "Short Live Action Narratives".
Results...