diff --git a/runtime/history/SUPPORT-260918-GRAM-SUPPORT-SERVICE-WORKER-SOURCE-RCA-READONLY-516R5RCA4.json b/runtime/history/SUPPORT-260918-GRAM-SUPPORT-SERVICE-WORKER-SOURCE-RCA-READONLY-516R5RCA4.json new file mode 100644 index 00000000..b025e02a --- /dev/null +++ b/runtime/history/SUPPORT-260918-GRAM-SUPPORT-SERVICE-WORKER-SOURCE-RCA-READONLY-516R5RCA4.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260918-GRAM-SUPPORT-SERVICE-WORKER-SOURCE-RCA-READONLY-516R5RCA4", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "gram-support-service-worker-source-rca-readonly", + "started_at_utc": "2026-09-18T06:16:22Z", + "finished_at_utc": "2026-09-18T06:16:23Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "628189b0b18497cabb62b75d0fb6506209677e28954b6201c862bba85c776534", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "change_declared": false, + "result_contract_valid": true, + "result_contract_status": null, + "result_contract_error": null, + "command_rc": 0, + "changes_made": false, + "rollback_started": false, + "rollback_restored": null, + "mutation_outcome": "NO_MUTATION", + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "9742e5b94ef98a5dfa64fc2efe1dfef47880eaffad20efdf2bf9b72b47f7b6d6", + "sanitized_output_sha256": "9742e5b94ef98a5dfa64fc2efe1dfef47880eaffad20efdf2bf9b72b47f7b6d6", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "GRAM516R5RCA4_SAFE_REPORT={\"err_truncated\":false,\"guest\":{\"core\":[{\"matches\":[{\"sep\":true},{\"line\":125,\"text\":\"\\t\\tswitch (get_class($reply))\"},{\"line\":126,\"text\":\"\\t\\t{\"},{\"line\":127,\"text\":\"\\t\\t\\tcase Redirect::class:\"},{\"line\":128,\"text\":\"\\t\\t\\tcase Reroute::class:\"},{\"line\":129,\"text\":\"\\t\\t\\t\\treturn false; // don't update anything, assume the next page will do it\"},{\"line\":130,\"text\":\"\"},{\"line\":131,\"text\":\"\\t\\t\\tcase Message::class:\"},{\"line\":132,\"text\":\"\\t\\t\\tcase View::class:\"},{\"line\":133,\"text\":\"\\t\\t\\t\\t$viewState = 'valid';\"},{\"line\":134,\"text\":\"\\t\\t\\t\\tbreak;\"},{\"line\":135,\"text\":\"\\t\\t}\"},{\"line\":136,\"text\":\"\"},{\"line\":137,\"text\":\"\\t\\tif ($reply->getResponseCode() >= 400)\"},{\"line\":138,\"text\":\"\\t\\t{\"},{\"line\":139,\"text\":\"\\t\\t\\t$viewState = 'error';\"},{\"line\":140,\"text\":\"\\t\\t}\"},{\"line\":141,\"text\":\"\"},{\"line\":142,\"text\":\"\\t\\treturn true;\"},{\"line\":143,\"text\":\"\\t}\"},{\"line\":144,\"text\":\"\"},{\"line\":145,\"text\":\"\\tpublic function checkTfaRedirect()\"},{\"line\":146,\"text\":\"\\t{\"},{\"line\":147,\"text\":\"\\t\\t$session = $this->session();\"},{\"line\":148,\"text\":\"\\t\\tif ($session->tfaLoginRedirect)\"},{\"line\":149,\"text\":\"\\t\\t{\"},{\"sep\":true},{\"line\":219,\"text\":\"\\tpublic function assertNotDisabled($action)\"},{\"line\":220,\"text\":\"\\t{\"},{\"line\":221,\"text\":\"\\t\\tif (\\\\XF::visitor()->user_state == 'disabled')\"},{\"line\":222,\"text\":\"\\t\\t{\"},{\"line\":223,\"text\":\"\\t\\t\\tthrow $this->exception(\"},{\"line\":224,\"text\":\"\\t\\t\\t\\t$this->plugin(ErrorPlugin::class)->actionDisabled()\"},{\"line\":225,\"text\":\"\\t\\t\\t);\"},{\"line\":226,\"text\":\"\\t\\t}\"},{\"line\":227,\"text\":\"\\t}\"},{\"line\":228,\"text\":\"\"},{\"line\":229,\"text\":\"\\tpublic function assertCanonicalBaseUrl($action)\"},{\"line\":230,\"text\":\"\\t{\"},{\"line\":231,\"text\":\"\\t\\tif ($this->responseType != 'html')\"},{\"line\":232,\"text\":\"\\t\\t{\"},{\"line\":233,\"text\":\"\\t\\t\\treturn;\"},{\"line\":234,\"text\":\"\\t\\t}\"},{\"line\":235,\"text\":\"\"},{\"line\":236,\"text\":\"\\t\\tif (!$this->request->isGet() && !$this->request->isHead())\"},{\"line\":237,\"text\":\"\\t\\t{\"},{\"line\":238,\"text\":\"\\t\\t\\treturn;\"},{\"line\":239,\"text\":\"\\t\\t}\"},{\"line\":240,\"text\":\"\"},{\"line\":241,\"text\":\"\\t\\t$options = $this->options();\"},{\"line\":242,\"text\":\"\\t\\tif (!$options->boardUrlCanonical)\"},{\"line\":243,\"text\":\"\\t\\t{\"},{\"sep\":true},{\"line\":273,\"text\":\"\"},{\"line\":274,\"text\":\"\\t\\t\\tthrow $this->exception($reply);\"},{\"line\":275,\"text\":\"\\t\\t}\"},{\"line\":276,\"text\":\"\\t}\"},{\"line\":277,\"text\":\"\"},{\"line\":278,\"text\":\"\\tpublic function assertBoardActive($action)\"},{\"line\":279,\"text\":\"\\t{\"},{\"line\":280,\"text\":\"\\t\\t$options = $this->options();\"},{\"line\":281,\"text\":\"\\t\\tif (!$options->boardActive && !\\\\XF::visitor()->is_admin)\"},{\"line\":282,\"text\":\"\\t\\t{\"},{\"line\":283,\"text\":\"\\t\\t\\t$reply = $this->message(new PreEscaped($options->boardInactiveMessage), $this->app->config('serviceUnavailableCode'));\"},{\"line\":284,\"text\":\"\\t\\t\\t$reply->setPageParam('skipSidebarWidgets', true);\"},{\"line\":285,\"text\":\"\\t\\t\\t$reply->setResponseHeader('Retry-After', 60);\"},{\"line\":286,\"text\":\"\\t\\t\\t$reply->setResponseHeader('Refresh', 60);\"},{\"line\":287,\"text\":\"\"},{\"line\":288,\"text\":\"\\t\\t\\tthrow $this->exception($reply);\"},{\"line\":289,\"text\":\"\\t\\t}\"},{\"line\":290,\"text\":\"\\t}\"},{\"line\":291,\"text\":\"\"},{\"line\":292,\"text\":\"\\tpublic function assertTfaRequirement($action)\"},{\"line\":293,\"text\":\"\\t{\"},{\"line\":294,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":295,\"text\":\"\\t\\tif ($visitor->user_id\"},{\"line\":296,\"text\":\"\\t\\t\\t&& empty($visitor->Option->use_tfa)\"},{\"line\":297,\"text\":\"\\t\\t\\t&& \\\\XF::config('enableTfa')\"},{\"line\":298,\"text\":\"\\t\\t\\t&& $visitor->hasPermission('general', 'requireTfa')\"},{\"sep\":true},{\"line\":459,\"text\":\"\\t\\treturn in_array($requestRoutePath, $whitelistRoutePaths, true);\"},{\"line\":460,\"text\":\"\\t}\"},{\"line\":461,\"text\":\"\"},{\"line\":462,\"text\":\"\\tpublic function isEmbeddedImageRequest(): bool\"},{\"line\":463,\"text\":\"\\t{\"},{\"line\":464,\"text\":\"\\t\\treturn $this->request->isEmbeddedImageRequest();\"},{\"line\":465,\"text\":\"\\t}\"},{\"line\":466,\"text\":\"\"},{\"line\":467,\"text\":\"\\tpublic function assertNotEmbeddedImageRequest()\"},{\"line\":468,\"text\":\"\\t{\"},{\"line\":469,\"text\":\"\\t\\tif ($this->isEmbeddedImageRequest())\"},{\"line\":470,\"text\":\"\\t\\t{\"},{\"line\":471,\"text\":\"\\t\\t\\t$this->setResponseType('raw');\"},{\"line\":472,\"text\":\"\"},{\"line\":473,\"text\":\"\\t\\t\\t$view = $this->view('XF:Error\\\\EmbeddedImageRequest');\"},{\"line\":474,\"text\":\"\\t\\t\\t$view->setResponseCode(406);\"},{\"line\":475,\"text\":\"\"},{\"line\":476,\"text\":\"\\t\\t\\tthrow $this->exception($view);\"},{\"line\":477,\"text\":\"\\t\\t}\"},{\"line\":478,\"text\":\"\\t}\"},{\"line\":479,\"text\":\"\"},{\"line\":480,\"text\":\"\\tpublic function hasContentPendingApproval()\"},{\"line\":481,\"text\":\"\\t{\"},{\"line\":482,\"text\":\"\\t\\t$pendingUntil = $this->session()->hasContentPendingUntil;\"},{\"line\":483,\"text\":\"\\t\\treturn ($pendingUntil && $pendingUntil >= \\\\XF::$time);\"},{\"line\":484,\"text\":\"\\t}\"},{\"line\":485,\"text\":\"\"},{\"line\":486,\"text\":\"\\tprotected function isDiscouraged()\"},{\"sep\":true},{\"line\":565,\"text\":\"\\tpublic function assertNotFlooding($action, $floodingLimit = null)\"},{\"line\":566,\"text\":\"\\t{\"},{\"line\":567,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":568,\"text\":\"\\t\\tif ($visitor->hasPermission('general', 'bypassFloodCheck'))\"},{\"line\":569,\"text\":\"\\t\\t{\"},{\"line\":570,\"text\":\"\\t\\t\\treturn;\"},{\"line\":571,\"text\":\"\\t\\t}\"},{\"line\":572,\"text\":\"\"},{\"line\":573,\"text\":\"\\t\\t$floodChecker = $this->service(FloodCheckService::class);\"},{\"line\":574,\"text\":\"\\t\\t$timeRemaining = $floodChecker->checkFlooding($action, $visitor->user_id, $floodingLimit);\"},{\"line\":575,\"text\":\"\\t\\tif ($timeRemaining)\"},{\"line\":576,\"text\":\"\\t\\t{\"},{\"line\":577,\"text\":\"\\t\\t\\tthrow $this->exception($this->responseFlooding($timeRemaining));\"},{\"line\":578,\"text\":\"\\t\\t}\"},{\"line\":579,\"text\":\"\\t}\"},{\"line\":580,\"text\":\"\"},{\"line\":581,\"text\":\"\\tpublic function responseFlooding($floodSeconds)\"},{\"line\":582,\"text\":\"\\t{\"},{\"line\":583,\"text\":\"\\t\\treturn $this->error(\\\\XF::phrase('must_wait_x_seconds_before_performing_this_action', ['count' => $floodSeconds]));\"},{\"line\":584,\"text\":\"\\t}\"},{\"line\":585,\"text\":\"\"},{\"line\":586,\"text\":\"\\tpublic function isRobot()\"},{\"line\":587,\"text\":\"\\t{\"},{\"line\":588,\"text\":\"\\t\\treturn boolval($this->request->getRobotName());\"},{\"line\":589,\"text\":\"\\t}\"},{\"line\":590,\"text\":\"\"},{\"line\":591,\"text\":\"\\t/**\"},{\"line\":592,\"text\":\"\\t * @return IpRepository\"},{\"line\":593,\"text\":\"\\t */\"}],\"path\":\"src/XF/Pub/Controller/AbstractController.php\",\"present\":true,\"sha256\":\"023efffff88cd1675173f30a8104d25fb220a5d8dc989d89c33d3ba09b0c0169\"}],\"error\":null,\"files\":[{\"matches\":[],\"path\":\"Pub/Controller/Support.php\",\"present\":true,\"sha256\":\"6cb34b1d27e9f0132263637cefa62fe0e998a9a86620b7ac33199f41ee86f9d4\"},{\"matches\":[],\"path\":\"Pub/Controller/StaffSupport.php\",\"present\":true,\"sha256\":\"6852bd0061d6e118851673bfd4099e2b22e6291bf09f429820740844996f93f9\"},{\"matches\":[{\"sep\":true},{\"line\":1,\"text\":\"\"},{\"line\":2,\"text\":\"\"},{\"line\":3,\"text\":\" \"},{\"line\":4,\"text\":\" \"},{\"line\":5,\"text\":\" \"},{\"line\":6,\"text\":\" \"},{\"line\":7,\"text\":\"\"}],\"path\":\"_data/routes.xml\",\"present\":true,\"sha256\":\"c80e6b0f7153993915d8bbc8ee6b36e6386b00bb1865d6aff050f9c1fd1f0302\"},{\"matches\":[{\"sep\":true},{\"line\":553,\"text\":\"<xf:if is=\\\"$xf.options.gramSupportSiteId\\\">\"},{\"line\":554,\"text\":\"\\t<a class=\\\"gramSupport-launcher button button--primary\\\"\"},{\"line\":555,\"text\":\"\\t\\thref=\\\"{{ link('support/create') }}\\\"\"},{\"line\":556,\"text\":\"\\t\\taria-label=\\\"{{ phrase('gram_support_open_support') }}\\\">\"},{\"line\":557,\"text\":\"\\t\\t{{ phrase('gram_support_open_support') }}\"},{\"line\":558,\"text\":\"\\t</a>\"},{\"line\":559,\"text\":\"</xf:if>\"},{\"line\":560,\"text\":\"\"},{\"line\":561,\"text\":\" \"},{\"line\":591,\"text\":\" \"},{\"line\":663,\"text\":\"