Skip to content
Snippets Groups Projects
Commit acf37486 authored by wn_'s avatar wn_
Browse files

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
parent 59cf2181
No related branches found
No related tags found
No related merge requests found
...@@ -72,79 +72,72 @@ ...@@ -72,79 +72,72 @@
return true; return true;
} }
function ttrss_open(string $savePath, string $sessionName): bool { if (\Config::get_schema_version() >= 0) {
return true; // 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 { public function close(): bool {
global $session_expire; return true;
}
/**
* @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;
$sth = \Db::pdo()->prepare("SELECT data FROM ttrss_sessions WHERE id=?"); $sth = \Db::pdo()->prepare('SELECT data FROM ttrss_sessions WHERE id=?');
$sth->execute([$id]); $sth->execute([$id]);
if ($row = $sth->fetch()) { if ($row = $sth->fetch()) {
return base64_decode($row["data"]); return base64_decode($row['data']);
}
} else {
$expire = time() + $session_expire; $expire = time() + $session_expire;
$sth = \Db::pdo()->prepare("INSERT INTO ttrss_sessions (id, data, expire) $sth = \Db::pdo()->prepare("INSERT INTO ttrss_sessions (id, data, expire)
VALUES (?, '', ?)"); VALUES (?, '', ?)");
$sth->execute([$id, $expire]); return $sth->execute([$id, $expire]) ? '' : false;
}
return "";
}
}
function ttrss_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]);
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; public function write(string $id, string $data): bool {
} global $session_expire;
function ttrss_close(): bool { $data = base64_encode($data);
return true; $expire = time() + $session_expire;
}
function ttrss_destroy(string $id): bool { $sth = \Db::pdo()->prepare('SELECT id FROM ttrss_sessions WHERE id=?');
$sth = \Db::pdo()->prepare("DELETE FROM ttrss_sessions WHERE id = ?"); $sth->execute([$id]);
$sth->execute([$id]);
return true; if ($sth->fetch()) {
} $sth = \Db::pdo()->prepare('UPDATE ttrss_sessions SET data=?, expire=? WHERE id=?');
return $sth->execute([$data, $expire, $id]);
}
function ttrss_gc(int $lifetime): bool { $sth = \Db::pdo()->prepare('INSERT INTO ttrss_sessions (id, data, expire) VALUES (?, ?, ?)');
\Db::pdo()->query("DELETE FROM ttrss_sessions WHERE expire < " . time()); return $sth->execute([$id, $data, $expire]);
}
return true; public function destroy(string $id): bool {
} $sth = \Db::pdo()->prepare('DELETE FROM ttrss_sessions WHERE id = ?');
return $sth->execute([$id]);
}
if (\Config::get_schema_version() >= 0) { /**
session_set_save_handler('\Sessions\ttrss_open', * @todo set return type to int|false, and remove ReturnTypeWillChange, when min supported is PHP 8
'\Sessions\ttrss_close', '\Sessions\ttrss_read', * @return int|false the number of deleted sessions on success, or false on failure
'\Sessions\ttrss_write', '\Sessions\ttrss_destroy', */
'\Sessions\ttrss_gc'); // @phpstan-ignore-line #[\ReturnTypeWillChange]
// PHPStan complains about '\Sessions\ttrss_gc' if its $lifetime param isn't marked as string, public function gc(int $max_lifetime) {
// but the docs say it's an int. If it is actually a string it'll get coerced to an int. $result = \Db::pdo()->query('DELETE FROM ttrss_sessions WHERE expire < ' . time());
return $result === false ? false : $result->rowCount();
register_shutdown_function('session_write_close'); }
});
if (!defined('NO_SESSION_AUTOSTART')) { if (!defined('NO_SESSION_AUTOSTART')) {
if (isset($_COOKIE[session_name()])) { if (isset($_COOKIE[session_name()])) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment