{"record":{"id":"2789f3cf1dc258a9","repo":"instructure/canvas-lms","slug":"invalid-tool-proxy","errorCode":null,"errorMessage":"Invalid Tool Proxy","messagePattern":"Invalid Tool Proxy","errorType":"exception","errorClass":"Lti::Errors::InvalidToolProxyError","httpStatus":null,"severity":"error","filePath":"app/controllers/lti/ims/tool_proxy_controller.rb","lineNumber":113,"sourceCode":"\n      def re_reg\n        tp = nil\n        if oauth2_request?\n          begin\n            validate_access_token!\n            tp = ToolProxy.find_by guid: access_token.sub\n          rescue Lti::OAuth2::InvalidTokenError\n            render_unauthorized and return\n          end\n        elsif request.authorization.present?\n          tp = ToolProxy.find_by guid: oauth_consumer_key\n          render_unauthorized and return unless oauth_authenticated_request?(tp.shared_secret)\n        else\n          render_unauthorized and return\n        end\n\n        unless tp_validator.valid?\n          raise Lti::Errors::InvalidToolProxyError.new \"Invalid Tool Proxy\", tp_validator.errors.as_json\n        end\n\n        json = {\n          \"@context\" => \"http://purl.imsglobal.org/ctx/lti/v2/ToolProxyId\",\n          \"@type\" => \"ToolProxy\",\n          \"@id\" => tp.raw_data[\"@id\"],\n          \"tool_proxy_guid\" => tp.guid\n        }\n\n        tps = ToolProxyService.new\n        tps.create_secret(::IMS::LTI::Models::ToolProxy.from_json(payload))\n\n        tp.update_payload = {\n          acknowledgement_url: request.headers[\"VND-IMS-CONFIRM-URL\"],\n          payload: JSON.parse(payload)\n        }\n\n        if (tc_half_secret = tps.tc_half_secret)","sourceCodeStart":95,"sourceCodeEnd":131,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/controllers/lti/ims/tool_proxy_controller.rb#L95-L131","documentation":"Guard in Lti::IMS::ToolProxyController#re_reg: after authenticating the re-registration request (OAuth2 bearer token or shared-secret signature), tp_validator.valid? failed — the submitted Tool Proxy JSON doesn't validate against the LTI 2 schema/contract — so Lti::Errors::InvalidToolProxy is raised.","triggerScenarios":"Thrown at app/controllers/lti/ims/tool_proxy_controller.rb:113 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Fix the Tool Proxy payload so it passes the IMS ToolProxy validator (required capabilities, security contract, services)","Compare against the originally registered ToolProxy JSON for missing fields"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"1c9f0bb8013ed69c4f2efe11fd483025469b7e6c","analyzedAt":"2026-09-15T20:33:18.891Z","contentChangedAt":"2026-09-15T20:33:18.891Z","schemaVersion":2},"datasetVersion":"2026-09-23T02:17:17.105Z"}