. */ declare(strict_types=1); namespace Fisharebest\Webtrees; use Illuminate\Database\Capsule\Manager as DB; use Psr\Http\Message\ServerRequestInterface; use SessionHandlerInterface; /** * Session handling - stores sessions in the database. */ class SessionDatabaseHandler implements SessionHandlerInterface { /** @var ServerRequestInterface */ private $request; public function __construct(ServerRequestInterface $request) { $this->request = $request; } /** * @param $save_path * @param $name * * @return bool */ public function open($save_path, $name): bool { return true; } /** * @return bool */ public function close(): bool { return true; } /** * @param string $id * * @return string */ public function read($id): string { return (string) DB::table('session') ->where('session_id', '=', $id) ->value('session_data'); } /** * @param string $id * @param string $data * * @return bool */ public function write($id, $data): bool { DB::table('session')->updateOrInsert([ 'session_id' => $id, ], [ 'session_time' => Carbon::now(), 'user_id' => (int) Auth::id(), 'ip_address' => $this->request->getServerParams()['REMOTE_ADDR'] ?? '127.0.0.1', 'session_data' => $data, ]); return true; } /** * @param string $id * * @return bool */ public function destroy($id): bool { DB::table('session') ->where('session_id', '=', $id) ->delete(); return true; } /** * @param int $maxlifetime * * @return bool */ public function gc($maxlifetime): bool { DB::table('session') ->where('session_time', '<', Carbon::now()->subSeconds($maxlifetime)) ->delete(); return true; } }