Completed
Pull Request — master (#294)
by Robbie
02:05
created

InitStateMiddleware::process()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 25
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 25
rs 8.8571
c 0
b 0
f 0
cc 2
eloc 12
nc 2
nop 2
1
<?php
2
3
namespace SilverStripe\Subsites\Middleware;
4
5
use SilverStripe\Admin\AdminRootController;
6
use SilverStripe\Control\HTTPRequest;
7
use SilverStripe\Control\Middleware\HTTPMiddleware;
8
use SilverStripe\Core\Config\Configurable;
9
use SilverStripe\Core\Injector\Injector;
10
use SilverStripe\Subsites\Model\Subsite;
11
use SilverStripe\Subsites\State\SubsiteState;
12
13
class InitStateMiddleware implements HTTPMiddleware
14
{
15
    use Configurable;
16
17
    /**
18
     * URL paths that should be considered as admin only, i.e. not frontend
19
     *
20
     * @config
21
     * @var array
22
     */
23
    private static $admin_url_paths = [
0 ignored issues
show
Unused Code introduced by
The property $admin_url_paths is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
24
        'dev/',
25
        'graphql/',
26
    ];
27
28
    public function process(HTTPRequest $request, callable $delegate)
29
    {
30
        // Initialise and register the State
31
        $state = SubsiteState::create();
32
        Injector::inst()->registerService($state);
33
34
        // Detect whether the request was made in the CMS area (or other admin-only areas)
35
        $isAdmin = $this->getIsAdmin($request);
36
        $state->setUseSessions($isAdmin);
37
38
        // Detect the subsite ID
39
        $subsiteId = $this->detectSubsiteId($request);
40
        $state->setSubsiteId($subsiteId);
41
42
        // Persist to the session if using the CMS
43
        if ($state->getUseSessions()) {
44
            $original = $request->getSession()->get('SubsiteID');
45
            $request->getSession()->set('SubsiteID', $subsiteId);
46
47
            // Track session changes
48
            $state->setSessionWasChanged($subsiteId === $original);
49
        }
50
51
        return $delegate($request);
52
    }
53
54
    /**
55
     * Determine whether the website is being viewed from an admin protected area or not
56
     *
57
     * @param  HTTPRequest $request
58
     * @return bool
59
     */
60
    public function getIsAdmin(HTTPRequest $request)
61
    {
62
        $adminPaths = static::config()->get('admin_url_paths');
63
        $adminPaths[] = AdminRootController::config()->get('url_base') . '/';
64
        $currentPath = rtrim($request->getURL(), '/') . '/';
65
        foreach ($adminPaths as $adminPath) {
66
            if (substr($currentPath, 0, strlen($adminPath)) === $adminPath) {
67
                return true;
68
            }
69
        }
70
        return false;
71
    }
72
73
    /**
74
     * Use the given request to detect the current subsite ID
75
     *
76
     * @param  HTTPRequest $request
77
     * @return int
78
     */
79
    protected function detectSubsiteId(HTTPRequest $request)
80
    {
81
        if ($request->getVar('SubsiteID') !== null) {
82
            return (int) $request->getVar('SubsiteID');
83
        }
84
85
        if (SubsiteState::singleton()->getUseSessions() && $request->getSession()->get('SubsiteID') !== null) {
86
            return (int) $request->getSession()->get('SubsiteID');
87
        }
88
89
        $subsiteIdFromDomain = Subsite::getSubsiteIDForDomain();
90
        if ($subsiteIdFromDomain !== null) {
91
            return (int) $subsiteIdFromDomain;
92
        }
93
94
        // Default fallback
95
        return 0;
96
    }
97
}
98