Switch to the non-deprecated form of 'session_set_save_handler'.

As of PHP 8.4 the form with more than 2 arguments is deprecated.

This also does some initial work to make the functions behave closer to what SessionHandlerInterface describes.

* https://php.watch/versions/8.4/session_set_save_handler-alt-signature-deprecated
* https://wiki.php.net/rfc/deprecate_functions_with_overloaded_signatures
* https://www.php.net/manual/en/class.sessionhandlerinterface.php
This commit is contained in:
wn_
2024-07-05 16:25:58 +00:00
parent 59cf218144
commit acf3748621

View File

@@ -72,79 +72,72 @@
return true;
}
function ttrss_open(string $savePath, string $sessionName): bool {
return true;
}
if (\Config::get_schema_version() >= 0) {
// TODO: look into making these behave closer to what SessionHandlerInterface intends
session_set_save_handler(new class() implements \SessionHandlerInterface {
public function open(string $path, string $name): bool {
return true;
}
function ttrss_read(string $id): string {
global $session_expire;
public function close(): bool {
return true;
}
$sth = \Db::pdo()->prepare("SELECT data FROM ttrss_sessions WHERE id=?");
$sth->execute([$id]);
/**
* @todo set return type to string|false, and remove ReturnTypeWillChange, when min supported is PHP 8
* @return string|false
*/
#[\ReturnTypeWillChange]
public function read(string $id) {
global $session_expire;
if ($row = $sth->fetch()) {
return base64_decode($row["data"]);
$sth = \Db::pdo()->prepare('SELECT data FROM ttrss_sessions WHERE id=?');
$sth->execute([$id]);
if ($row = $sth->fetch()) {
return base64_decode($row['data']);
}
} else {
$expire = time() + $session_expire;
$sth = \Db::pdo()->prepare("INSERT INTO ttrss_sessions (id, data, expire)
VALUES (?, '', ?)");
$sth->execute([$id, $expire]);
return $sth->execute([$id, $expire]) ? '' : false;
}
return "";
public function write(string $id, string $data): bool {
global $session_expire;
}
$data = base64_encode($data);
$expire = time() + $session_expire;
}
$sth = \Db::pdo()->prepare('SELECT id FROM ttrss_sessions WHERE id=?');
$sth->execute([$id]);
function ttrss_write(string $id, string $data): bool {
global $session_expire;
if ($sth->fetch()) {
$sth = \Db::pdo()->prepare('UPDATE ttrss_sessions SET data=?, expire=? WHERE id=?');
return $sth->execute([$data, $expire, $id]);
}
$data = base64_encode($data);
$expire = time() + $session_expire;
$sth = \Db::pdo()->prepare('INSERT INTO ttrss_sessions (id, data, expire) VALUES (?, ?, ?)');
return $sth->execute([$id, $data, $expire]);
}
$sth = \Db::pdo()->prepare("SELECT id FROM ttrss_sessions WHERE id=?");
$sth->execute([$id]);
public function destroy(string $id): bool {
$sth = \Db::pdo()->prepare('DELETE FROM ttrss_sessions WHERE id = ?');
return $sth->execute([$id]);
}
if ($sth->fetch()) {
$sth = \Db::pdo()->prepare("UPDATE ttrss_sessions SET data=?, expire=? WHERE id=?");
$sth->execute([$data, $expire, $id]);
} else {
$sth = \Db::pdo()->prepare("INSERT INTO ttrss_sessions (id, data, expire)
VALUES (?, ?, ?)");
$sth->execute([$id, $data, $expire]);
}
return true;
}
function ttrss_close(): bool {
return true;
}
function ttrss_destroy(string $id): bool {
$sth = \Db::pdo()->prepare("DELETE FROM ttrss_sessions WHERE id = ?");
$sth->execute([$id]);
return true;
}
function ttrss_gc(int $lifetime): bool {
\Db::pdo()->query("DELETE FROM ttrss_sessions WHERE expire < " . time());
return true;
}
if (\Config::get_schema_version() >= 0) {
session_set_save_handler('\Sessions\ttrss_open',
'\Sessions\ttrss_close', '\Sessions\ttrss_read',
'\Sessions\ttrss_write', '\Sessions\ttrss_destroy',
'\Sessions\ttrss_gc'); // @phpstan-ignore-line
// PHPStan complains about '\Sessions\ttrss_gc' if its $lifetime param isn't marked as string,
// but the docs say it's an int. If it is actually a string it'll get coerced to an int.
register_shutdown_function('session_write_close');
/**
* @todo set return type to int|false, and remove ReturnTypeWillChange, when min supported is PHP 8
* @return int|false the number of deleted sessions on success, or false on failure
*/
#[\ReturnTypeWillChange]
public function gc(int $max_lifetime) {
$result = \Db::pdo()->query('DELETE FROM ttrss_sessions WHERE expire < ' . time());
return $result === false ? false : $result->rowCount();
}
});
if (!defined('NO_SESSION_AUTOSTART')) {
if (isset($_COOKIE[session_name()])) {