Passed
Pull Request — master (#61)
by Damian
03:27
created
src/EnvironmentCheckSuite.php 1 patch
Indentation   +180 added lines, -180 removed lines patch added patch discarded remove patch
@@ -32,184 +32,184 @@
 block discarded – undo
32 32
  */
33 33
 class EnvironmentCheckSuite
34 34
 {
35
-    use Configurable;
36
-    use Injectable;
37
-    use Extensible;
38
-    /**
39
-     * Name of this suite.
40
-     *
41
-     * @var string
42
-     */
43
-    protected $name;
44
-
45
-    /**
46
-     * @var array
47
-     */
48
-    protected $checks = [];
49
-
50
-    /**
51
-     * Associative array of named checks registered via the config system. Each check should specify:
52
-     * - definition (e.g. 'MyHealthCheck("my param")')
53
-     * - title (e.g. 'Is my feature working?')
54
-     * - state (setting this to 'disabled' will cause suites to skip this check entirely.
55
-     *
56
-     * @var array
57
-     */
58
-    private static $registered_checks = [];
59
-
60
-    /**
61
-     * Associative array of named suites registered via the config system. Each suite should enumerate
62
-     * named checks that have been configured in 'registered_checks'.
63
-     *
64
-     * @var array
65
-     */
66
-    private static $registered_suites = [];
67
-
68
-    /**
69
-     * Load checks for this suite from the configuration system. This is an alternative to the
70
-     * EnvironmentCheckSuite::register - both can be used, checks will be appended to the suite.
71
-     *
72
-     * @param string $suiteName The name of this suite.
73
-     */
74
-    public function __construct($suiteName)
75
-    {
76
-        if (empty($this->config()->registered_suites[$suiteName])) {
77
-            // Not registered via config system, but it still may be configured later via self::register.
78
-            return;
79
-        }
80
-
81
-        foreach ($this->config()->registered_suites[$suiteName] as $checkName) {
82
-            if (empty($this->config()->registered_checks[$checkName])) {
83
-                throw new InvalidArgumentException(
84
-                    "Bad EnvironmentCheck: '$checkName' - the named check has not been registered."
85
-                );
86
-            }
87
-
88
-            $check = $this->config()->registered_checks[$checkName];
89
-
90
-            // Existing named checks can be disabled by setting their 'state' to 'disabled'.
91
-            // This is handy for disabling checks mandated by modules.
92
-            if (!empty($check['state']) && $check['state'] === 'disabled') {
93
-                continue;
94
-            }
95
-
96
-            // Add the check to this suite.
97
-            $this->push($check['definition'], $check['title']);
98
-        }
99
-    }
100
-
101
-    /**
102
-     * Run this test suite and return the result code of the worst result.
103
-     *
104
-     * @return EnvironmentCheckSuiteResult
105
-     */
106
-    public function run()
107
-    {
108
-        $result = new EnvironmentCheckSuiteResult();
109
-
110
-        foreach ($this->checkInstances() as $check) {
111
-            list($checkClass, $checkTitle) = $check;
112
-            try {
113
-                list($status, $message) = $checkClass->check();
114
-            // If the check fails, register that as an error
115
-            } catch (Exception $e) {
116
-                $status = EnvironmentCheck::ERROR;
117
-                $message = $e->getMessage();
118
-            }
119
-            $result->addResult($status, $message, $checkTitle);
120
-        }
121
-
122
-        return $result;
123
-    }
124
-
125
-    /**
126
-     * Get instances of all the environment checks.
127
-     *
128
-     * @return EnvironmentChecker[]
129
-     * @throws InvalidArgumentException
130
-     */
131
-    protected function checkInstances()
132
-    {
133
-        $output = [];
134
-        foreach ($this->checks as $check) {
135
-            list($checkClass, $checkTitle) = $check;
136
-            if (is_string($checkClass)) {
137
-                $checkInst = Injector::inst()->create($checkClass);
138
-                if ($checkInst instanceof EnvironmentCheck) {
139
-                    $output[] = [$checkInst, $checkTitle];
140
-                } else {
141
-                    throw new InvalidArgumentException(
142
-                        "Bad EnvironmentCheck: '$checkClass' - the named class doesn't implement EnvironmentCheck"
143
-                    );
144
-                }
145
-            } elseif ($checkClass instanceof EnvironmentCheck) {
146
-                $output[] = [$checkClass, $checkTitle];
147
-            } else {
148
-                throw new InvalidArgumentException("Bad EnvironmentCheck: " . var_export($check, true));
149
-            }
150
-        }
151
-        return $output;
152
-    }
153
-
154
-    /**
155
-     * Add a check to this suite.
156
-     *
157
-     * @param mixed $check
158
-     * @param string $title
159
-     */
160
-    public function push($check, $title = null)
161
-    {
162
-        if (!$title) {
163
-            $title = is_string($check) ? $check : get_class($check);
164
-        }
165
-        $this->checks[] = [$check, $title];
166
-    }
167
-
168
-    /////////////////////////////////////////////////////////////////////////////////////////////
169
-
170
-    /**
171
-     * @var array
172
-     */
173
-    protected static $instances = [];
174
-
175
-    /**
176
-     * Return a named instance of EnvironmentCheckSuite.
177
-     *
178
-     * @param string $name
179
-     *
180
-     * @return EnvironmentCheckSuite
181
-     */
182
-    public static function inst($name)
183
-    {
184
-        if (!isset(self::$instances[$name])) {
185
-            self::$instances[$name] = new EnvironmentCheckSuite($name);
186
-        }
187
-        return self::$instances[$name];
188
-    }
189
-
190
-    /**
191
-     * Register a check against the named check suite.
192
-     *
193
-     * @param string|array $names
194
-     * @param EnvironmentCheck $check
195
-     * @param string|array
196
-     */
197
-    public static function register($names, $check, $title = null)
198
-    {
199
-        if (!is_array($names)) {
200
-            $names = [$names];
201
-        }
202
-
203
-        foreach ($names as $name) {
204
-            self::inst($name)->push($check, $title);
205
-        }
206
-    }
207
-
208
-    /**
209
-     * Unregisters all checks.
210
-     */
211
-    public static function reset()
212
-    {
213
-        self::$instances = [];
214
-    }
35
+	use Configurable;
36
+	use Injectable;
37
+	use Extensible;
38
+	/**
39
+	 * Name of this suite.
40
+	 *
41
+	 * @var string
42
+	 */
43
+	protected $name;
44
+
45
+	/**
46
+	 * @var array
47
+	 */
48
+	protected $checks = [];
49
+
50
+	/**
51
+	 * Associative array of named checks registered via the config system. Each check should specify:
52
+	 * - definition (e.g. 'MyHealthCheck("my param")')
53
+	 * - title (e.g. 'Is my feature working?')
54
+	 * - state (setting this to 'disabled' will cause suites to skip this check entirely.
55
+	 *
56
+	 * @var array
57
+	 */
58
+	private static $registered_checks = [];
59
+
60
+	/**
61
+	 * Associative array of named suites registered via the config system. Each suite should enumerate
62
+	 * named checks that have been configured in 'registered_checks'.
63
+	 *
64
+	 * @var array
65
+	 */
66
+	private static $registered_suites = [];
67
+
68
+	/**
69
+	 * Load checks for this suite from the configuration system. This is an alternative to the
70
+	 * EnvironmentCheckSuite::register - both can be used, checks will be appended to the suite.
71
+	 *
72
+	 * @param string $suiteName The name of this suite.
73
+	 */
74
+	public function __construct($suiteName)
75
+	{
76
+		if (empty($this->config()->registered_suites[$suiteName])) {
77
+			// Not registered via config system, but it still may be configured later via self::register.
78
+			return;
79
+		}
80
+
81
+		foreach ($this->config()->registered_suites[$suiteName] as $checkName) {
82
+			if (empty($this->config()->registered_checks[$checkName])) {
83
+				throw new InvalidArgumentException(
84
+					"Bad EnvironmentCheck: '$checkName' - the named check has not been registered."
85
+				);
86
+			}
87
+
88
+			$check = $this->config()->registered_checks[$checkName];
89
+
90
+			// Existing named checks can be disabled by setting their 'state' to 'disabled'.
91
+			// This is handy for disabling checks mandated by modules.
92
+			if (!empty($check['state']) && $check['state'] === 'disabled') {
93
+				continue;
94
+			}
95
+
96
+			// Add the check to this suite.
97
+			$this->push($check['definition'], $check['title']);
98
+		}
99
+	}
100
+
101
+	/**
102
+	 * Run this test suite and return the result code of the worst result.
103
+	 *
104
+	 * @return EnvironmentCheckSuiteResult
105
+	 */
106
+	public function run()
107
+	{
108
+		$result = new EnvironmentCheckSuiteResult();
109
+
110
+		foreach ($this->checkInstances() as $check) {
111
+			list($checkClass, $checkTitle) = $check;
112
+			try {
113
+				list($status, $message) = $checkClass->check();
114
+			// If the check fails, register that as an error
115
+			} catch (Exception $e) {
116
+				$status = EnvironmentCheck::ERROR;
117
+				$message = $e->getMessage();
118
+			}
119
+			$result->addResult($status, $message, $checkTitle);
120
+		}
121
+
122
+		return $result;
123
+	}
124
+
125
+	/**
126
+	 * Get instances of all the environment checks.
127
+	 *
128
+	 * @return EnvironmentChecker[]
129
+	 * @throws InvalidArgumentException
130
+	 */
131
+	protected function checkInstances()
132
+	{
133
+		$output = [];
134
+		foreach ($this->checks as $check) {
135
+			list($checkClass, $checkTitle) = $check;
136
+			if (is_string($checkClass)) {
137
+				$checkInst = Injector::inst()->create($checkClass);
138
+				if ($checkInst instanceof EnvironmentCheck) {
139
+					$output[] = [$checkInst, $checkTitle];
140
+				} else {
141
+					throw new InvalidArgumentException(
142
+						"Bad EnvironmentCheck: '$checkClass' - the named class doesn't implement EnvironmentCheck"
143
+					);
144
+				}
145
+			} elseif ($checkClass instanceof EnvironmentCheck) {
146
+				$output[] = [$checkClass, $checkTitle];
147
+			} else {
148
+				throw new InvalidArgumentException("Bad EnvironmentCheck: " . var_export($check, true));
149
+			}
150
+		}
151
+		return $output;
152
+	}
153
+
154
+	/**
155
+	 * Add a check to this suite.
156
+	 *
157
+	 * @param mixed $check
158
+	 * @param string $title
159
+	 */
160
+	public function push($check, $title = null)
161
+	{
162
+		if (!$title) {
163
+			$title = is_string($check) ? $check : get_class($check);
164
+		}
165
+		$this->checks[] = [$check, $title];
166
+	}
167
+
168
+	/////////////////////////////////////////////////////////////////////////////////////////////
169
+
170
+	/**
171
+	 * @var array
172
+	 */
173
+	protected static $instances = [];
174
+
175
+	/**
176
+	 * Return a named instance of EnvironmentCheckSuite.
177
+	 *
178
+	 * @param string $name
179
+	 *
180
+	 * @return EnvironmentCheckSuite
181
+	 */
182
+	public static function inst($name)
183
+	{
184
+		if (!isset(self::$instances[$name])) {
185
+			self::$instances[$name] = new EnvironmentCheckSuite($name);
186
+		}
187
+		return self::$instances[$name];
188
+	}
189
+
190
+	/**
191
+	 * Register a check against the named check suite.
192
+	 *
193
+	 * @param string|array $names
194
+	 * @param EnvironmentCheck $check
195
+	 * @param string|array
196
+	 */
197
+	public static function register($names, $check, $title = null)
198
+	{
199
+		if (!is_array($names)) {
200
+			$names = [$names];
201
+		}
202
+
203
+		foreach ($names as $name) {
204
+			self::inst($name)->push($check, $title);
205
+		}
206
+	}
207
+
208
+	/**
209
+	 * Unregisters all checks.
210
+	 */
211
+	public static function reset()
212
+	{
213
+		self::$instances = [];
214
+	}
215 215
 }
Please login to merge, or discard this patch.
src/Controllers/DevCheckController.php 1 patch
Indentation   +35 added lines, -35 removed lines patch added patch discarded remove patch
@@ -14,39 +14,39 @@
 block discarded – undo
14 14
  */
15 15
 class DevCheckController extends Controller
16 16
 {
17
-    /**
18
-     * @var array
19
-     */
20
-    private static $allowed_actions = [
21
-        'index'
22
-    ];
23
-
24
-    /**
25
-     * Permission code to check for access to this controller.
26
-     *
27
-     * @var string
28
-     */
29
-    private static $permission = 'ADMIN';
30
-
31
-    /**
32
-     * @param HTTPRequest $request
33
-     *
34
-     * @return EnvironmentChecker
35
-     *
36
-     * @throws HTTPResponse_Exception
37
-     */
38
-    public function index($request)
39
-    {
40
-        $suite = 'check';
41
-
42
-        if ($name = $request->param('Suite')) {
43
-            $suite = $name;
44
-        }
45
-
46
-        $checker = new EnvironmentChecker($suite, 'Environment status');
47
-        $checker->setRequest($request);
48
-        $checker->init($this->config()->permission);
49
-
50
-        return $checker;
51
-    }
17
+	/**
18
+	 * @var array
19
+	 */
20
+	private static $allowed_actions = [
21
+		'index'
22
+	];
23
+
24
+	/**
25
+	 * Permission code to check for access to this controller.
26
+	 *
27
+	 * @var string
28
+	 */
29
+	private static $permission = 'ADMIN';
30
+
31
+	/**
32
+	 * @param HTTPRequest $request
33
+	 *
34
+	 * @return EnvironmentChecker
35
+	 *
36
+	 * @throws HTTPResponse_Exception
37
+	 */
38
+	public function index($request)
39
+	{
40
+		$suite = 'check';
41
+
42
+		if ($name = $request->param('Suite')) {
43
+			$suite = $name;
44
+		}
45
+
46
+		$checker = new EnvironmentChecker($suite, 'Environment status');
47
+		$checker->setRequest($request);
48
+		$checker->init($this->config()->permission);
49
+
50
+		return $checker;
51
+	}
52 52
 }
Please login to merge, or discard this patch.
src/EnvironmentChecker.php 1 patch
Indentation   +272 added lines, -272 removed lines patch added patch discarded remove patch
@@ -23,276 +23,276 @@
 block discarded – undo
23 23
  */
24 24
 class EnvironmentChecker extends RequestHandler
25 25
 {
26
-    /**
27
-     * @var array
28
-     */
29
-    private static $url_handlers = [
30
-        '' => 'index',
31
-    ];
32
-
33
-    /**
34
-     * @var string
35
-     */
36
-    protected $checkSuiteName;
37
-
38
-    /**
39
-     * @var string
40
-     */
41
-    protected $title;
42
-
43
-    /**
44
-     * @var int
45
-     */
46
-    protected $errorCode = 500;
47
-
48
-    /**
49
-     * @var null|string
50
-     */
51
-    private static $to_email_address = null;
52
-
53
-    /**
54
-     * @var null|string
55
-     */
56
-    private static $from_email_address = null;
57
-
58
-    /**
59
-     * @var bool
60
-     */
61
-    private static $email_results = false;
62
-
63
-    /**
64
-     * @var bool Log results via {@link \Psr\Log\LoggerInterface}
65
-     */
66
-    private static $log_results_warning = false;
67
-
68
-    /**
69
-     * @var string Maps to {@link \Psr\Log\LogLevel} levels. Defaults to LogLevel::WARNING
70
-     */
71
-    private static $log_results_warning_level = LogLevel::WARNING;
72
-
73
-    /**
74
-     * @var bool Log results via a {@link \Psr\Log\LoggerInterface}
75
-     */
76
-    private static $log_results_error = false;
77
-
78
-    /**
79
-     * @var int Maps to {@link \Psr\Log\LogLevel} levels. Defaults to LogLevel::ALERT
80
-     */
81
-    private static $log_results_error_level = LogLevel::ALERT;
82
-
83
-    /**
84
-     * @param string $checkSuiteName
85
-     * @param string $title
86
-     */
87
-    public function __construct($checkSuiteName, $title)
88
-    {
89
-        parent::__construct();
90
-
91
-        $this->checkSuiteName = $checkSuiteName;
92
-        $this->title = $title;
93
-    }
94
-
95
-    /**
96
-     * @param string $permission
97
-     *
98
-     * @throws HTTPResponse_Exception
99
-     */
100
-    public function init($permission = 'ADMIN')
101
-    {
102
-        // if the environment supports it, provide a basic auth challenge and see if it matches configured credentials
103
-        if (Environment::getEnv('ENVCHECK_BASICAUTH_USERNAME')
104
-            && Environment::getEnv('ENVCHECK_BASICAUTH_PASSWORD')
105
-        ) {
106
-            // Check that details are both provided, and match
107
-            if (empty($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_PW'])
108
-                || $_SERVER['PHP_AUTH_USER'] != Environment::getEnv('ENVCHECK_BASICAUTH_USERNAME')
109
-                || $_SERVER['PHP_AUTH_PW'] != Environment::getEnv('ENVCHECK_BASICAUTH_PASSWORD')
110
-            ) {
111
-                // Fail check with basic auth challenge
112
-                $response = new HTTPResponse(null, 401);
113
-                $response->addHeader('WWW-Authenticate', "Basic realm=\"Environment check\"");
114
-                throw new HTTPResponse_Exception($response);
115
-            }
116
-        } elseif (!$this->canAccess(null, $permission)) {
117
-            // Fail check with silverstripe login challenge
118
-            $result = Security::permissionFailure($this, "You must have the {$permission} permission to access this check");
119
-            throw new HTTPResponse_Exception($result);
120
-        }
121
-    }
122
-
123
-    /**
124
-     * Determine if the current member can access the environment checker
125
-     *
126
-     * @param null|int|Member $member
127
-     * @param string          $permission
128
-     * @return bool
129
-     */
130
-    public function canAccess($member = null, $permission = 'ADMIN')
131
-    {
132
-        if (!$member) {
133
-            $member = Security::getCurrentUser();
134
-        }
135
-
136
-        // We allow access to this controller regardless of live-status or ADMIN permission only
137
-        // if on CLI.  Access to this controller is always allowed in "dev-mode", or of the user is ADMIN.
138
-        if (Director::isDev()
139
-            || Director::is_cli()
140
-            || empty($permission)
141
-            || Permission::checkMember($member, $permission)
142
-        ) {
143
-            return true;
144
-        }
145
-
146
-        // Extended access checks.
147
-        // "Veto" style, return NULL to abstain vote.
148
-        $canExtended = null;
149
-        $results = $this->extend('canAccess', $member);
150
-        if ($results && is_array($results)) {
151
-            if (!min($results)) {
152
-                return false;
153
-            }
154
-            return true;
155
-        }
156
-
157
-        return false;
158
-    }
159
-
160
-    /**
161
-     * @return HTTPResponse
162
-     */
163
-    public function index()
164
-    {
165
-        $response = new HTTPResponse;
166
-        $result = EnvironmentCheckSuite::inst($this->checkSuiteName)->run();
167
-
168
-        if (!$result->ShouldPass()) {
169
-            $response->setStatusCode($this->errorCode);
170
-        }
171
-
172
-        $resultText = $result->customise([
173
-            'URL'       => Director::absoluteBaseURL(),
174
-            'Title'     => $this->title,
175
-            'Name'      => $this->checkSuiteName,
176
-            'ErrorCode' => $this->errorCode,
177
-        ])->renderWith(__CLASS__);
178
-
179
-        if ($this->config()->get('email_results') && !$result->ShouldPass()) {
180
-            $email = new Email(
181
-                $this->config()->get('from_email_address'),
182
-                $this->config()->get('to_email_address'),
183
-                $this->title,
184
-                $resultText
185
-            );
186
-            $email->send();
187
-        }
188
-
189
-        // Optionally log errors and warnings individually
190
-        foreach ($result->Details() as $detail) {
191
-            if ($this->config()->get('log_results_warning') && $detail->StatusCode == EnvironmentCheck::WARNING) {
192
-                $this->log(
193
-                    sprintf('EnvironmentChecker warning at "%s" check. Message: %s', $detail->Check, $detail->Message),
194
-                    $this->config()->get('log_results_warning_level')
195
-                );
196
-            } elseif ($this->config()->get('log_results_error') && $detail->StatusCode == EnvironmentCheck::ERROR) {
197
-                $this->log(
198
-                    sprintf('EnvironmentChecker error at "%s" check. Message: %s', $detail->Check, $detail->Message),
199
-                    $this->config()->get('log_results_error_level')
200
-                );
201
-            }
202
-        }
203
-
204
-        // output the result as JSON if requested
205
-        if ($this->getRequest()->getExtension() == 'json'
206
-            || strpos($this->getRequest()->getHeader('Accept'), 'application/json') !== false
207
-        ) {
208
-            $response->setBody($result->toJSON());
209
-            $response->addHeader('Content-Type', 'application/json');
210
-            return $response;
211
-        }
212
-
213
-        $response->setBody($resultText);
214
-
215
-        return $response;
216
-    }
217
-
218
-    /**
219
-     * Sends a log entry to the configured PSR-3 LoggerInterface
220
-     *
221
-     * @param string $message
222
-     * @param int    $level
223
-     */
224
-    public function log($message, $level)
225
-    {
226
-        Injector::inst()->get(LoggerInterface::class)->log($level, $message);
227
-    }
228
-
229
-    /**
230
-     * Set the HTTP status code that should be returned when there's an error.
231
-     *
232
-     * @param int $errorCode
233
-     */
234
-    public function setErrorCode($errorCode)
235
-    {
236
-        $this->errorCode = $errorCode;
237
-    }
238
-
239
-    /**
240
-     * @deprecated
241
-     * @param string $from
242
-     */
243
-    public static function set_from_email_address($from)
244
-    {
245
-        Deprecation::notice('2.0', 'Use config API instead');
246
-        static::config()->set('from_email_address', $from);
247
-    }
248
-
249
-    /**
250
-     * @deprecated
251
-     * @return null|string
252
-     */
253
-    public static function get_from_email_address()
254
-    {
255
-        Deprecation::notice('2.0', 'Use config API instead');
256
-        return static::config()->get('from_email_address');
257
-    }
258
-
259
-    /**
260
-     * @deprecated
261
-     * @param string $to
262
-     */
263
-    public static function set_to_email_address($to)
264
-    {
265
-        Deprecation::notice('2.0', 'Use config API instead');
266
-        static::config()->set('to_email_address', $to);
267
-    }
268
-
269
-    /**
270
-     * @deprecated
271
-     * @return null|string
272
-     */
273
-    public static function get_to_email_address()
274
-    {
275
-        Deprecation::notice('2.0', 'Use config API instead');
276
-        return static::config()->get('to_email_address');
277
-    }
278
-
279
-    /**
280
-     * @deprecated
281
-     * @param bool $results
282
-     */
283
-    public static function set_email_results($results)
284
-    {
285
-        Deprecation::notice('2.0', 'Use config API instead');
286
-        static::config()->set('email_results', $results);
287
-    }
288
-
289
-    /**
290
-     * @deprecated
291
-     * @return bool
292
-     */
293
-    public static function get_email_results()
294
-    {
295
-        Deprecation::notice('2.0', 'Use config API instead');
296
-        return static::config()->get('email_results');
297
-    }
26
+	/**
27
+	 * @var array
28
+	 */
29
+	private static $url_handlers = [
30
+		'' => 'index',
31
+	];
32
+
33
+	/**
34
+	 * @var string
35
+	 */
36
+	protected $checkSuiteName;
37
+
38
+	/**
39
+	 * @var string
40
+	 */
41
+	protected $title;
42
+
43
+	/**
44
+	 * @var int
45
+	 */
46
+	protected $errorCode = 500;
47
+
48
+	/**
49
+	 * @var null|string
50
+	 */
51
+	private static $to_email_address = null;
52
+
53
+	/**
54
+	 * @var null|string
55
+	 */
56
+	private static $from_email_address = null;
57
+
58
+	/**
59
+	 * @var bool
60
+	 */
61
+	private static $email_results = false;
62
+
63
+	/**
64
+	 * @var bool Log results via {@link \Psr\Log\LoggerInterface}
65
+	 */
66
+	private static $log_results_warning = false;
67
+
68
+	/**
69
+	 * @var string Maps to {@link \Psr\Log\LogLevel} levels. Defaults to LogLevel::WARNING
70
+	 */
71
+	private static $log_results_warning_level = LogLevel::WARNING;
72
+
73
+	/**
74
+	 * @var bool Log results via a {@link \Psr\Log\LoggerInterface}
75
+	 */
76
+	private static $log_results_error = false;
77
+
78
+	/**
79
+	 * @var int Maps to {@link \Psr\Log\LogLevel} levels. Defaults to LogLevel::ALERT
80
+	 */
81
+	private static $log_results_error_level = LogLevel::ALERT;
82
+
83
+	/**
84
+	 * @param string $checkSuiteName
85
+	 * @param string $title
86
+	 */
87
+	public function __construct($checkSuiteName, $title)
88
+	{
89
+		parent::__construct();
90
+
91
+		$this->checkSuiteName = $checkSuiteName;
92
+		$this->title = $title;
93
+	}
94
+
95
+	/**
96
+	 * @param string $permission
97
+	 *
98
+	 * @throws HTTPResponse_Exception
99
+	 */
100
+	public function init($permission = 'ADMIN')
101
+	{
102
+		// if the environment supports it, provide a basic auth challenge and see if it matches configured credentials
103
+		if (Environment::getEnv('ENVCHECK_BASICAUTH_USERNAME')
104
+			&& Environment::getEnv('ENVCHECK_BASICAUTH_PASSWORD')
105
+		) {
106
+			// Check that details are both provided, and match
107
+			if (empty($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_PW'])
108
+				|| $_SERVER['PHP_AUTH_USER'] != Environment::getEnv('ENVCHECK_BASICAUTH_USERNAME')
109
+				|| $_SERVER['PHP_AUTH_PW'] != Environment::getEnv('ENVCHECK_BASICAUTH_PASSWORD')
110
+			) {
111
+				// Fail check with basic auth challenge
112
+				$response = new HTTPResponse(null, 401);
113
+				$response->addHeader('WWW-Authenticate', "Basic realm=\"Environment check\"");
114
+				throw new HTTPResponse_Exception($response);
115
+			}
116
+		} elseif (!$this->canAccess(null, $permission)) {
117
+			// Fail check with silverstripe login challenge
118
+			$result = Security::permissionFailure($this, "You must have the {$permission} permission to access this check");
119
+			throw new HTTPResponse_Exception($result);
120
+		}
121
+	}
122
+
123
+	/**
124
+	 * Determine if the current member can access the environment checker
125
+	 *
126
+	 * @param null|int|Member $member
127
+	 * @param string          $permission
128
+	 * @return bool
129
+	 */
130
+	public function canAccess($member = null, $permission = 'ADMIN')
131
+	{
132
+		if (!$member) {
133
+			$member = Security::getCurrentUser();
134
+		}
135
+
136
+		// We allow access to this controller regardless of live-status or ADMIN permission only
137
+		// if on CLI.  Access to this controller is always allowed in "dev-mode", or of the user is ADMIN.
138
+		if (Director::isDev()
139
+			|| Director::is_cli()
140
+			|| empty($permission)
141
+			|| Permission::checkMember($member, $permission)
142
+		) {
143
+			return true;
144
+		}
145
+
146
+		// Extended access checks.
147
+		// "Veto" style, return NULL to abstain vote.
148
+		$canExtended = null;
149
+		$results = $this->extend('canAccess', $member);
150
+		if ($results && is_array($results)) {
151
+			if (!min($results)) {
152
+				return false;
153
+			}
154
+			return true;
155
+		}
156
+
157
+		return false;
158
+	}
159
+
160
+	/**
161
+	 * @return HTTPResponse
162
+	 */
163
+	public function index()
164
+	{
165
+		$response = new HTTPResponse;
166
+		$result = EnvironmentCheckSuite::inst($this->checkSuiteName)->run();
167
+
168
+		if (!$result->ShouldPass()) {
169
+			$response->setStatusCode($this->errorCode);
170
+		}
171
+
172
+		$resultText = $result->customise([
173
+			'URL'       => Director::absoluteBaseURL(),
174
+			'Title'     => $this->title,
175
+			'Name'      => $this->checkSuiteName,
176
+			'ErrorCode' => $this->errorCode,
177
+		])->renderWith(__CLASS__);
178
+
179
+		if ($this->config()->get('email_results') && !$result->ShouldPass()) {
180
+			$email = new Email(
181
+				$this->config()->get('from_email_address'),
182
+				$this->config()->get('to_email_address'),
183
+				$this->title,
184
+				$resultText
185
+			);
186
+			$email->send();
187
+		}
188
+
189
+		// Optionally log errors and warnings individually
190
+		foreach ($result->Details() as $detail) {
191
+			if ($this->config()->get('log_results_warning') && $detail->StatusCode == EnvironmentCheck::WARNING) {
192
+				$this->log(
193
+					sprintf('EnvironmentChecker warning at "%s" check. Message: %s', $detail->Check, $detail->Message),
194
+					$this->config()->get('log_results_warning_level')
195
+				);
196
+			} elseif ($this->config()->get('log_results_error') && $detail->StatusCode == EnvironmentCheck::ERROR) {
197
+				$this->log(
198
+					sprintf('EnvironmentChecker error at "%s" check. Message: %s', $detail->Check, $detail->Message),
199
+					$this->config()->get('log_results_error_level')
200
+				);
201
+			}
202
+		}
203
+
204
+		// output the result as JSON if requested
205
+		if ($this->getRequest()->getExtension() == 'json'
206
+			|| strpos($this->getRequest()->getHeader('Accept'), 'application/json') !== false
207
+		) {
208
+			$response->setBody($result->toJSON());
209
+			$response->addHeader('Content-Type', 'application/json');
210
+			return $response;
211
+		}
212
+
213
+		$response->setBody($resultText);
214
+
215
+		return $response;
216
+	}
217
+
218
+	/**
219
+	 * Sends a log entry to the configured PSR-3 LoggerInterface
220
+	 *
221
+	 * @param string $message
222
+	 * @param int    $level
223
+	 */
224
+	public function log($message, $level)
225
+	{
226
+		Injector::inst()->get(LoggerInterface::class)->log($level, $message);
227
+	}
228
+
229
+	/**
230
+	 * Set the HTTP status code that should be returned when there's an error.
231
+	 *
232
+	 * @param int $errorCode
233
+	 */
234
+	public function setErrorCode($errorCode)
235
+	{
236
+		$this->errorCode = $errorCode;
237
+	}
238
+
239
+	/**
240
+	 * @deprecated
241
+	 * @param string $from
242
+	 */
243
+	public static function set_from_email_address($from)
244
+	{
245
+		Deprecation::notice('2.0', 'Use config API instead');
246
+		static::config()->set('from_email_address', $from);
247
+	}
248
+
249
+	/**
250
+	 * @deprecated
251
+	 * @return null|string
252
+	 */
253
+	public static function get_from_email_address()
254
+	{
255
+		Deprecation::notice('2.0', 'Use config API instead');
256
+		return static::config()->get('from_email_address');
257
+	}
258
+
259
+	/**
260
+	 * @deprecated
261
+	 * @param string $to
262
+	 */
263
+	public static function set_to_email_address($to)
264
+	{
265
+		Deprecation::notice('2.0', 'Use config API instead');
266
+		static::config()->set('to_email_address', $to);
267
+	}
268
+
269
+	/**
270
+	 * @deprecated
271
+	 * @return null|string
272
+	 */
273
+	public static function get_to_email_address()
274
+	{
275
+		Deprecation::notice('2.0', 'Use config API instead');
276
+		return static::config()->get('to_email_address');
277
+	}
278
+
279
+	/**
280
+	 * @deprecated
281
+	 * @param bool $results
282
+	 */
283
+	public static function set_email_results($results)
284
+	{
285
+		Deprecation::notice('2.0', 'Use config API instead');
286
+		static::config()->set('email_results', $results);
287
+	}
288
+
289
+	/**
290
+	 * @deprecated
291
+	 * @return bool
292
+	 */
293
+	public static function get_email_results()
294
+	{
295
+		Deprecation::notice('2.0', 'Use config API instead');
296
+		return static::config()->get('email_results');
297
+	}
298 298
 }
Please login to merge, or discard this patch.