xref: /webtrees/app/Http/Middleware/UseSession.php (revision e873f434551745f888937263ff89e80db3b0f785)
1b5979037SGreg Roach<?php
23976b470SGreg Roach
3b5979037SGreg Roach/**
4b5979037SGreg Roach * webtrees: online genealogy
5d11be702SGreg Roach * Copyright (C) 2023 webtrees development team
6b5979037SGreg Roach * This program is free software: you can redistribute it and/or modify
7b5979037SGreg Roach * it under the terms of the GNU General Public License as published by
8b5979037SGreg Roach * the Free Software Foundation, either version 3 of the License, or
9b5979037SGreg Roach * (at your option) any later version.
10b5979037SGreg Roach * This program is distributed in the hope that it will be useful,
11b5979037SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
12b5979037SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13b5979037SGreg Roach * GNU General Public License for more details.
14b5979037SGreg Roach * You should have received a copy of the GNU General Public License
1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
16b5979037SGreg Roach */
17fcfa147eSGreg Roach
18b5979037SGreg Roachdeclare(strict_types=1);
19b5979037SGreg Roach
20b5979037SGreg Roachnamespace Fisharebest\Webtrees\Http\Middleware;
21b5979037SGreg Roach
22b5979037SGreg Roachuse Fisharebest\Webtrees\Auth;
231fe542e9SGreg Roachuse Fisharebest\Webtrees\Contracts\UserInterface;
24d35568b4SGreg Roachuse Fisharebest\Webtrees\Registry;
25b5979037SGreg Roachuse Fisharebest\Webtrees\Session;
26e931043eSGreg Roachuse Fisharebest\Webtrees\Webtrees;
276ccdf4f0SGreg Roachuse Psr\Http\Message\ResponseInterface;
286ccdf4f0SGreg Roachuse Psr\Http\Message\ServerRequestInterface;
296ccdf4f0SGreg Roachuse Psr\Http\Server\MiddlewareInterface;
306ccdf4f0SGreg Roachuse Psr\Http\Server\RequestHandlerInterface;
31b5979037SGreg Roach
32dc6156d0SGreg Roachuse function session_destroy;
33dc6156d0SGreg Roachuse function session_status;
34d97083feSGreg Roachuse function time;
35dc6156d0SGreg Roach
36dc6156d0SGreg Roachuse const PHP_SESSION_ACTIVE;
37dc6156d0SGreg Roach
38b5979037SGreg Roach/**
39b5979037SGreg Roach * Middleware to activate sessions.
40b5979037SGreg Roach */
41b5979037SGreg Roachclass UseSession implements MiddlewareInterface
42b5979037SGreg Roach{
43d97083feSGreg Roach    // To avoid read-write contention on the wt_user_setting table, don't update the last-active time on every request.
44*e873f434SGreg Roach    private const int UPDATE_ACTIVITY_INTERVAL = 60;
45d97083feSGreg Roach
46b5979037SGreg Roach    /**
476ccdf4f0SGreg Roach     * @param ServerRequestInterface  $request
486ccdf4f0SGreg Roach     * @param RequestHandlerInterface $handler
49b5979037SGreg Roach     *
506ccdf4f0SGreg Roach     * @return ResponseInterface
51b5979037SGreg Roach     */
526ccdf4f0SGreg Roach    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
53b5979037SGreg Roach    {
54dc6156d0SGreg Roach        // Some sites (e.g. Wordpress/NinjaFirewall) use the PHP auto_prepend_file
55dc6156d0SGreg Roach        // setting to run their own startup code - which may start a session.
56dc6156d0SGreg Roach        if (session_status() === PHP_SESSION_ACTIVE) {
57dc6156d0SGreg Roach            session_destroy();
58dc6156d0SGreg Roach        }
59dc6156d0SGreg Roach
60b5979037SGreg Roach        // Sessions
614d7dd147SGreg Roach        Session::start($request);
62b5979037SGreg Roach
6357ab2231SGreg Roach        $user = Auth::user();
6457ab2231SGreg Roach
65d97083feSGreg Roach        // Update the last-login time.
66b5979037SGreg Roach        if (Session::get('masquerade') === null) {
67d97083feSGreg Roach            $last = (int) $user->getPreference(UserInterface::PREF_TIMESTAMP_ACTIVE);
68e88d077cSGreg Roach
69d97083feSGreg Roach            if (time() - $last >= self::UPDATE_ACTIVITY_INTERVAL) {
70d97083feSGreg Roach                $user->setPreference(UserInterface::PREF_TIMESTAMP_ACTIVE, (string) time());
71b5979037SGreg Roach            }
72b5979037SGreg Roach        }
73b5979037SGreg Roach
74e931043eSGreg Roach        // Allow request handlers, modules, etc. to have a dependency on the current user.
75d35568b4SGreg Roach        Registry::container()->set(UserInterface::class, $user);
76e931043eSGreg Roach
7757ab2231SGreg Roach        $request = $request->withAttribute('user', $user);
780c8c69d4SGreg Roach
798246ffa1SGreg Roach        $response = $handler->handle($request);
808246ffa1SGreg Roach
81dc6b8e0eSGreg Roach        Session::save();
828246ffa1SGreg Roach
838246ffa1SGreg Roach        return $response;
84b5979037SGreg Roach    }
85b5979037SGreg Roach}
86