<?php
declare(strict_types=1);
use Airship\Engine\{
AutoPilot,
State
};
use ParagonIE\Cookie\{
Cookie,
Session
};
/**
* @global State $state
*/
// Start the session
if (!Session::id()) {
if (!isset($state)) {
$state = State::instance();
}
$session_config = [
// Prevent uninitialized sessions from being accepted
'use_strict_mode' => true,
// The session ID cookie should be inaccessible to JavaScript
'cookie_httponly' => true,
// If we're over HTTPS, enforce secure=1
'cookie_secure' => AutoPilot::isHTTPSConnection()
];
if (isset($state->universal['session_config'])) {
$session_config = $state->universal['session_config'] + $session_config;
if (isset($session_config['cookie_domain'])) {
if ($session_config['cookie_domain'] === '*' || \trim($session_config['cookie_domain']) === '') {
unset($session_config['cookie_domain']);
}
}
}
Session::start(
Cookie::SAME_SITE_RESTRICTION_STRICT,
$session_config
);
}
if (empty($_SESSION['created_canary'])) {
// We haven't seen this session ID before
$_SESSION = [];
Session::regenerate(true);
// Create the canary
$_SESSION['created_canary'] = (new \DateTime())
->format(\AIRSHIP_DATE_FORMAT);
} else {
$dt = (new \DateTime($_SESSION['created_canary']))->add(
new \DateInterval('PT01H')
);
$now = new \DateTime();
// Has an hour passed?
if ($dt < $now) {
// An hour has passed:
Session::regenerate(true);
// Recreate the canary
$_SESSION['created_canary'] = $now->format(\AIRSHIP_DATE_FORMAT);
}
}
|