Passed
Branch feature/2.1-geodispersion-dev (1d61a8)
by Jonathan
61:21
created

AuthTreePreference   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 40
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 16
c 1
b 0
f 0
dl 0
loc 40
rs 10
wmc 6

1 Method

Rating   Name   Duplication   Size   Complexity  
A process() 0 34 6
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, 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\Tree;
20
use Fisharebest\Webtrees\User;
21
use Fisharebest\Webtrees\Exceptions\HttpAccessDeniedException;
22
use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage;
23
use Psr\Http\Message\ResponseInterface;
24
use Psr\Http\Message\ServerRequestInterface;
25
use Psr\Http\Server\MiddlewareInterface;
26
use Psr\Http\Server\RequestHandlerInterface;
27
28
/**
29
 * Middleware to restrict access based on a Tree preference.
30
 */
31
class AuthTreePreference implements MiddlewareInterface
32
{
33
    /**
34
     * {@inheritDoc}
35
     * @see \Psr\Http\Server\MiddlewareInterface::process()
36
     */
37
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
38
    {
39
        $tree = $request->getAttribute('tree');
40
        assert($tree instanceof Tree);
41
        /** @var Tree $tree */
42
43
        $route = $request->getAttribute('route');
44
        assert($route instanceof \Aura\Router\Route);
45
        /** @var \Aura\Router\Route $route */
46
47
        $user = $request->getAttribute('user');
48
49
        $permission_preference = $route->extras['permission_preference'] ?? '';
50
        $permission_level = $permission_preference === '' ? '' : $tree->getPreference($permission_preference);
51
52
        // Permissions are configured
53
        if (is_numeric($permission_level)) {
54
            // Logged in with the correct role?
55
            if (Auth::accessLevel($tree, $user) <= (int) $permission_level) {
56
                    return $handler->handle($request);
57
            }
58
59
            // Logged in, but without the correct role?
60
            if ($user instanceof User) {
61
                throw new HttpAccessDeniedException();
62
            }
63
        }
64
65
        // Permissions no configured, or not logged in
66
        if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
67
            throw new HttpAccessDeniedException();
68
        }
69
70
        return redirect(route(LoginPage::class, ['tree' => $tree->name(), 'url' => $request->getUri()]));
71
    }
72
}
73