clientIpIsAllowedInMaintenanceMode()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 1
Metric Value
c 2
b 1
f 1
dl 0
loc 7
rs 9.4285
cc 3
eloc 4
nc 3
nop 0
1
<?php
2
3
/**
4
 * Class MaintenanceModeExtension.
5
 * 
6
 * throw a 503 if mysite/down exists
7
 *
8
 * @property Controller $owner
9
 */
10
class MaintenanceModeExtension extends Extension
0 ignored issues
show
Coding Style Compatibility introduced by
PSR1 recommends that each class must be in a namespace of at least one level to avoid collisions.

You can fix this by adding a namespace to your class:

namespace YourVendor;

class YourClass { }

When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.

Loading history...
11
{
12
    /**
13
     * @throws SS_HTTPResponse_Exception
14
     */
15
    public function onBeforeInit()
16
    {
17
        if ($this->isDownForMaintenance() && !$this->clientIpIsAllowedInMaintenanceMode()) {
18
            $this->throw503();
19
        }
20
    }
21
22
    /**
23
     * @return bool
24
     */
25
    public function isDownForMaintenance()
26
    {
27
        return file_exists(BASE_PATH.'/mysite/down');
28
    }
29
30
    /**
31
     * Somehow $this->owner->httpError keeps the website spinning.
32
     *
33
     * Maybe not very Silverstripe'sch, but at least this works
34
     *
35
     * @throws SS_HTTPResponse_Exception
36
     */
37
    protected function throw503()
38
    {
39
        $message = 'Website is down for maintenance';
40
        $errorFile = $this->get503File();
41
        $content = is_file($errorFile) ? file_get_contents($errorFile) : '<h1>'.$message.'</h1>';
42
43
        throw new SS_HTTPResponse_Exception(new SS_HTTPResponse($content, 503, $message));
44
    }
45
46
    /**
47
     * @return string
48
     */
49
    protected function get503File()
50
    {
51
        $custom = BASE_PATH.(string) Config::inst()->get('MaintenanceMode', 'file');
52
53
        return is_file($custom) ? $custom : BASE_PATH.'/assets/error-503.html';
54
    }
55
56
    /**
57
     * @return bool
58
     */
59
    protected function clientIpIsAllowedInMaintenanceMode()
60
    {
61
        $ip = $this->getClientIp();
62
        $allowed = $this->getAllowedIpAddresses();
63
64
        return (bool) $allowed && (bool) $ip && in_array($ip, $allowed);
65
    }
66
67
    /**
68
     * @return string|false
69
     */
70
    protected function getClientIp()
71
    {
72
        $request = $this->owner->getRequest();
73
74
        return (bool) $request ? $request->getIP() : false;
75
    }
76
77
    /**
78
     * @return array
79
     */
80
    protected function getAllowedIpAddresses()
81
    {
82
        return (array) Config::inst()->get('MaintenanceMode', 'allowed_ips');
83
    }
84
}
85