Source of file HealthCheckController.php
Size: 3,167 Bytes - Last Modified: 2021-12-23T10:41:57+00:00
/var/www/docs.ssmods.com/process/src/src/Control/HealthCheckController.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | <?php namespace Sunnysideup\HealthCheckProvider\Control; use SilverStripe\Control\Controller; use SilverStripe\Core\Environment; use Sunnysideup\HealthCheckProvider\Model\HealthCheckProvider; use Sunnysideup\HealthCheckProvider\Model\HealthCheckProviderSecurity; class HealthCheckController extends Controller { protected $editorID = 0; private static $url_segment = 'health-check-provider'; private static $allowed_actions = [ 'ping' => '->canProvide', 'provide' => '->canProvide', 'confirmreceipt' => '->canProvide', ]; public function index($request) { return $this->httpError(404); } public function ping() { $this->getResponse()->addHeader('Content-type', 'application/json'); return '{"Success": ' . ($this->canProvide() ? 'true' : 'false') . '}'; } public function provide($request) { $check = $this->checkSecurity($request); if ($check !== 'all-good') { return $check; } //we are ready!~ $this->getResponse()->addHeader('Content-type', 'application/json'); return $this->provideData(); } public function confirmreceipt($request) { $check = $this->checkSecurity($request); if ($check !== 'all-good') { return $check; } $outcome = $this->recordReceipt($request); $this->getResponse()->addHeader('Content-type', 'application/json'); return '{"Success": ' . $outcome . '}'; } protected function provideData(): string { $obj = HealthCheckProvider::create(); $obj->EditorID = $this->editorID; $obj->SendNow = true; $id = $obj->write(); sleep(2); HealthCheckProvider::get()->byID($id); return (string) $obj->Data; } protected function recordReceipt($request): bool { $success = false; $id = (int) $request->param('ID'); $code = $request->param('OtherID'); /** @var HealthCheckProvider|null $obj */ $obj = HealthCheckProvider::get()->byID($id); if ($obj) { if (! $code) { $code = 'no code provided'; } $obj->ResponseCode = $code; $obj->Sent = true; $obj->SendNow = false; $obj->write(); $success = $obj->getCodesMatch(); } return $success; } protected function checkSecurity($request) { $headers = $request->getHeaders(); $key = $headers['handshake'] ?? ''; $ip = $request->getIp(); $outcome = HealthCheckProviderSecurity::check($key, $ip); if ($outcome) { $this->editorID = HealthCheckProviderSecurity::get_editor_id($key, $ip); return 'all-good'; } return $this->httpError(403, 'Sorry, we can not provide access.'); } protected function canProvide(): bool { if (Environment::getEnv('SS_HEALTH_CHECK_PROVIDER_ALLOW_RETRIEVAL')) { return true; } die('Please set SS_HEALTH_CHECK_PROVIDER_ALLOW_RETRIEVAL to use this facility.'); } } |