Repository navigation
Emit absolute creative rewrite URLs - #917
ChristianPavilonis wants to merge 6 commits into
Conversation
Retain main's sanitization controls, bounded CSS rewriting and opaque-origin click recovery while keeping configured absolute creative URLs. Keep the inline renderer's explicit origin override and both branches' regression coverage. Adapt root-relative test assumptions to absolute signing responses.
aram356
left a comment
There was a problem hiding this comment.
Summary
Adds [publisher].public_origin and emits absolute proxy, click, runtime, sign, and rebuild URLs on it, with the creative runtime capturing its script origin for endpoints. The template's new active public_origin placeholder bypasses the deploy placeholder guard, so an operator following the guard's error message ships a config that points every rewritten creative at ads.example.com. The absent-key fallback and the new currentScript precedence also deserve a second look.
4 of the inline comments below carry a one-click GitHub
suggestion. Use Commit suggestion (or Add suggestion to batch for several at once) to apply them as commits on the PR branch. The remaining comments describe the fix in prose because the change touches multiple files or lines outside the diff and can't be auto-applied.
Blocking
🔧 wrench
- Template
public_originplaceholder escapes the deploy guard: see inline attrusted-server.example.toml:70
Non-blocking
🤔 thinking
- Absent-key fallback moves every existing deployment to
https://{apex}: see inline atcrates/trusted-server-core/src/settings.rs:275 currentScriptprecedence bypasses the pinned-stamp hardening: see inline atcrates/trusted-server-js/lib/src/integrations/creative/first_party.ts:8
♻️ refactor
public_originerrors drop the reason: see inline atcrates/trusted-server-core/src/settings.rs:158- Rebuild
//guard is bypassable and its test is vacuous: see inline atcrates/trusted-server-core/src/proxy.rs:1931 - EC cookie scope constraint is undocumented: see inline at
docs/guide/configuration.md:418 tsjs_unified_script_tagis now dead and duplicated: see inline atcrates/trusted-server-core/src/creative.rs:609
⛏ nitpick
- Port 0 accepted: see inline at
crates/trusted-server-core/src/settings.rs:3845
Cross-cutting / body-level findings
-
♻️ Inline fallback ignores
public_origin(crates/trusted-server-core/src/publisher.rs:6140-6144, outside the diff).build_bid_map_with_auction_idstill falls back toformat!("https://{}", settings.publisher.domain)when the request origin is empty. Withpublic_origin = "https://ads.example.com:8443",domain = "example.com", and an empty request origin, the inlineadmcomes out ashttps://example.com/first-party/proxy?...(verified throughbuild_bid_map(..., "", ...), the branchbuild_bid_map_rewrites_inline_adm_to_absolute_first_party_urlsexercises). Use the configured origin:let base_origin = if request_origin.is_empty() { settings.publisher.effective_public_origin() } else { request_origin.to_owned() };
-
⛏ The rollout caveat is repeated in many places. The "omission keeps old configs deserializable, not the serving page's scheme, host, or port" text, plus upgrade and rollback sequencing, appears in the CHANGELOG, the template,
configuration.md(twice),auction/README.md,creative-processing.md,first-party-proxy.md,auction-orchestration.md,api-reference.md, andtesting.md. Keep the full text inconfiguration.md#public_originand link to it elsewhere, so a later change (for example an opt-in default) edits one place. The newtesting.mdsection is guidance for this one feature's tests rather than the general testing guide, so it fits better in the spec or as test comments.
CI Status
- .github/dependabot.yml: PASS
- Analyze (actions): PASS
- Analyze (javascript-typescript): PASS (both runs)
- Analyze (python): PASS
- Analyze (rust): PASS
- browser integration tests: PASS
- cargo check (cloudflare native + wasm32-unknown-unknown): PASS
- cargo check/build/test (spin native + wasm32-wasip1): PASS
- cargo fmt: PASS (required)
- cargo test: PASS (required)
- cargo test (axum native): PASS
- cargo test (cross-adapter parity): PASS
- cargo test (ts CLI, native) (macos-latest): PASS
- cargo test (ts CLI, native) (ubuntu-latest): PASS
- CI Node pin guard: PASS
- CLAUDE.md symlink guard: PASS
- CodeQL: PASS
- docs-proposal scripts: PASS
- format-docs: PASS (required)
- format-typescript: PASS (required)
- HTML EOF runtime (Fastly): PASS
- integration tests: PASS
- integration tests (Fastly EC lifecycle): PASS
- prepare integration artifacts: PASS
- ts dev lint domains (changed lines): PASS
- vitest: PASS
Reject the public-origin template placeholder, warn on the retained domain fallback, preserve validation reasons, and reject port zero.\n\nRemove the redundant rebuild authority guard and unused script-tag helper. Retain script-origin precedence with explicit spoofing-limit coverage, use the configured inline fallback, and centralize rollout and EC-cookie guidance.\n\nRetarget template-based audit generators and test harnesses to their actual public endpoints.
|
Addressed the requested changes in a35fef4 and replied to/resolved all eight inline threads. The two body-level findings are fixed too:
We explicitly reviewed and retained the always-absolute HTTPS/domain fallback and script-origin-first endpoint selection. The CLI now warns about an omitted The placeholder guard also exposed template consumers that only replaced the previous three publisher fields. Audit-generated drafts, CLI test fixtures, EOF runtime fixtures, and the template-cache fixture generator now supply the appropriate public endpoint. EOF fixtures distinguish the runtime listener from the upstream origin. Validation on the revised sources:
Fresh GitHub CI is running for the pushed commit. Requesting re-review from @aram356. |
Summary
srcset, creative-runtime, sign-response and rebuild-response URLs using validated, normalizedpublisher.public_origin.main, including its separate click switch and asset-host allowlist. Fix runtime-specific integration origins, foreign-parent browser coverage and the browser CI generator dependency.Closes #915
Spec
Absolute creative rewrite URLs, with two independent source-backed review rounds recorded in its review log.
Changes
publisher.public_origin; normalization at Settings/app-config loading and construction; TOML/JSON/blob and present/absent-leaf CLI overlay coverage.GET rebuild routing and absolute-click input support already exist on
main; they are not new routes in this PR. Useful compatibility/route tests remain. The inline SSAT/page-bids path keeps its request-origin override and no runtime injection. TSJS source selection and hashing are unchanged. No CORS expansion or signing-format migration.Compatibility and rollout
An omitted
public_originstays omitted in serialized configuration, but generated general-purpose URLs now usehttps://{publisher.domain}rather than following the visitor's scheme, host and port. Verify the actual browser-facing endpoint, including local HTTP ports. Old binaries reject the new key, so coordinate binary/config activation and rollback when the fallback cannot serve traffic. CLI environment overrides only replace an existing TOML scalar leaf.Test plan
Validation uses Rust 1.98.1, Node 24.20.0 and standalone Viceroy 0.21.0. Local artifacts and logs are retained outside the worktree.
cargo test-fastly && cargo test-fastly-reuse && cargo test-axum && cargo test-cloudflare && cargo test-spincargo fmt --all -- --checkts dev lint domains --changed-vs origin/main.fastly compute servesession. Automated Viceroy/Chromium checks cover the runtime path instead.All local gates above are complete. Native core rustdoc succeeds with 31 link warnings on unchanged
maindocumentation; it is not warning-clean. All GitHub checks passed on99d2109c2, including the fresh-runner browser config-generator build, both browser framework suites, integration matrix and Fastly EC lifecycle tests.Review
Four independent final lanes covered correctness, architecture, code smells and style. The missing browser-CI generator and changed-line example-host issues were fixed and re-reviewed. No blocking production findings remain. One nonblocking maintenance suggestion, sharing the two integration-fixture retargeting helpers, is deferred to avoid merging their distinct upstream/timestamp/error contracts in this fix.
Checklist
AGENTS.mdconventions.unwrap()calls or plaintext production credentials.