Repository navigation
fix(profiles): refuse an @ before url hosts and uppercase image repository paths - #2358
Merged
Merged
Conversation
…itory paths Preflight, the chart and the API refuse any @ before the auth base URL host (Node drops an empty user info such as https://@host or https://:@host, which Helm keeps); preflight refuses it in observability URLs too. Preflight refuses an uppercase repository path in controller, runtime and repository images, which Kubernetes refuses to pull; an uppercase registry host or tag stays valid.
Contributor
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review blockedAutomated review did not run, so no review verdict was produced. Reason: The input-safety check rejected material in this revision. No detected value, path, or scanner output is reproduced here. Automatic review is on hold, including after source changes. Request a fresh re-review after resolving the failure; maintainers can also release the hold through an intentional scanner-policy update. Next step: If this is a genuine credential, remove and rotate it. If it is an intentional test fixture, a maintainer must review and qualify it. |
freeqaz
had a problem deploying
to
integration-qa-pr
October 13, 2026 19:52 — with
GitHub Actions
Error
freeqaz
had a problem deploying
to
integration-qa-pr
October 13, 2026 19:52 — with
GitHub Actions
Error
freeqaz
temporarily deployed
to
integration-qa-pr
October 13, 2026 20:01 — with
GitHub Actions
Inactive
freeqaz
temporarily deployed
to
integration-qa-pr
October 13, 2026 20:01 — with
GitHub Actions
Inactive
This branch was previously deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Two profile refusals still passed preflight and then failed or misbehaved at deploy time.
@before a URL host. Node drops an empty user info, sohttps://@hostandhttps://:@hostparse ashttps://host/. Preflight and the API accepted both. Helm 3.19.2 keeps the user info:helm templaterefusedhttps://:@hostand renderedhttps://@hostwith the@still in it. The observability URL (fix(profiles): refuse observability URLs that parse as another host #2329) also dropped the@without saying so (http://@192.0.2.10:3000/d).controlPlaneDigestImage) and the runtime rule (digestImage) acceptedregistry.example.invalid/Team/controller@sha256:.... Kubernetes refuses to pull that image (InvalidImageName), because only the registry host and the tag may use uppercase.Change
scripts/render-installation-profile.mjswrittenUserinfo. Like URL parsing, it drops tabs and newlines and skips any slashes or backslashes after the scheme. It then reports any@before the host.httpOrigin(controlPlane.authBaseUrl) andparsedObservabilityUrl(controlPlane.observabilityUrl) refuse any value where it finds one.ipv4HostKeptand the written-host percent checks run. That made the regexes' userinfo-skip group dead code, so it is removed (mutants H26 and I8).lowercaseImageRepositorycheck forcontrolPlane.controllerImage,runtime.imageandrepository.image. It refuses uppercase in the repository path and allows it only in the registry host (the first component, when a/follows) and in the tag. This matches how kubelet splits the registry host from the path._helpers.tpl).auth.baseUrlrefuses any@. The[?#]check is now[?#@]; the path, query and fragment are already refused there.refuseWrittenUserinfoinauth/configuration.ts, called on the rawOCC_AUTH_BASE_URLinserver.mjsand inbootstrap-installation.mjs. Both refuse the value asAUTH_BASE_URL_INVALID.https://@host, which used to render. The profiles guide gets one sentence on each rule.The chart still renders an uppercase repository path. Its image rule is shared with
prepare-bootstrap-volumeand the upgrade tooling, so the change stays in preflight, and a test documents the gap.Verification
profile-preflight-chart-parity: auth base URLshttps://@console.example.com,https://:@console.example.comandhttps://@192.0.2.10are refused by preflight and Helm 3.19.2. A new test refuses 4 uppercase-path images in each of the 3 image fields, and checks that Helm still renders the controller image. Accepted rows were added for an uppercase registry host or tag.profile-renderer: 5 observability URLs with an@before the host get the generic refusal, not the IPv4 one.sign-in-chart-parity: the API, the bootstrap Job and the chart refusehttps://@,https://:@andhttps:@, and the real entrypoint refuseshttps://@console....https://@192.0.2.10and onControllerserver.mjs, bootstrap, each image field), narrows the slash skip or tab stripping, or drops or widens a branch of the image regex.taskset -c 20,21, load 3-7) of each touched test file:profile-preflight-chart-parity21-23 s,profile-renderer36-39 s andsign-in-chart-parity61-65 s.profile-preflight-chart-parity,profile-renderer,sign-in-chart-parity,configuration-startupandbootstrap-volumepass locally.tsc --build, eslint and prettier--checkpass on the touched files. Prettier was first shown to fail on a badly formatted file.git merge-treeshows the same conflicted files and hunk counts against this head as against main.Risks
OCC_AUTH_BASE_URLwithhttps://@hostused to render and start; it is now refused, as the breaking-changes entry says. An uppercase image repository path never pulled.observability.url(it stores the host alone); only preflight refuses it.