AuthTreePreference::process()   A
last analyzed

Complexity

Conditions 6
Paths 12

Size

Total Lines 30
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 15
nc 12
nop 2
dl 0
loc 30
rs 9.2222
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * webtrees-lib: MyArtJaub library for webtrees
5
 *
6
 * @package MyArtJaub\Webtrees
7
 * @subpackage Certificates
8
 * @author Jonathan Jaubart <[email protected]>
9
 * @copyright Copyright (c) 2021-2022, Jonathan Jaubart
10
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3
11
 */
12
13
declare(strict_types=1);
14
15
namespace MyArtJaub\Webtrees\Http\Middleware;
16
17
use Fig\Http\Message\RequestMethodInterface;
18
use Fisharebest\Webtrees\Auth;
19
use Fisharebest\Webtrees\Registry;
20
use Fisharebest\Webtrees\User;
21
use Fisharebest\Webtrees\Validator;
22
use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
23
use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage;
24
use Psr\Http\Message\ResponseInterface;
25
use Psr\Http\Message\ServerRequestInterface;
26
use Psr\Http\Server\MiddlewareInterface;
27
use Psr\Http\Server\RequestHandlerInterface;
28
29
/**
30
 * Middleware to restrict access based on a Tree preference.
31
 */
32
class AuthTreePreference implements MiddlewareInterface
33
{
34
    /**
35
     * {@inheritDoc}
36
     * @see \Psr\Http\Server\MiddlewareInterface::process()
37
     */
38
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
39
    {
40
        $tree = Validator::attributes($request)->tree();
41
        $route = Validator::attributes($request)->route();
42
        $user = Validator::attributes($request)->user();
43
44
        $permission_preference = $route->extras['permission_preference'] ?? '';
45
        $permission_level = $permission_preference === '' ? '' : $tree->getPreference($permission_preference);
46
47
        // Permissions are configured
48
        if (is_numeric($permission_level)) {
49
            // Logged in with the correct role?
50
            if (Auth::accessLevel($tree, $user) <= (int) $permission_level) {
51
                    return $handler->handle($request);
52
            }
53
54
            // Logged in, but without the correct role?
55
            if ($user instanceof User) {
56
                throw new HttpAccessDeniedException();
57
            }
58
        }
59
60
        // Permissions no configured, or not logged in
61
        if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
62
            throw new HttpAccessDeniedException();
63
        }
64
65
        return Registry::responseFactory()->redirect(
66
            LoginPage::class,
67
            ['tree' => $tree->name(), 'url' => (string) $request->getUri()]
68
        );
69
    }
70
}
71