Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
97a31f2
The InMobi Choice consent prompt is a module
jwrosewell Oct 9, 2026
8fb826d
CI runs a module's page script tests with Node
jwrosewell Oct 9, 2026
4e1b379
The guides describe [cmp.inmobi]
jwrosewell Oct 9, 2026
cd6b05a
Merge branch 'review/17-cookie-constant' into review/18-inmobi
Jamesr51d Oct 12, 2026
ff7d68e
Only a text/html entry places the InMobi Choice prompt
Jamesr51d Oct 12, 2026
51ceca3
Merge branch 'review/17-cookie-constant' into review/18-inmobi
Jamesr51d Oct 12, 2026
58312af
Merge 17-cookie-constant into 18-inmobi
Jamesr51d Oct 12, 2026
71bf6a3
Merge 17-cookie-constant into 18-inmobi
jwrosewell Oct 13, 2026
b431bf0
Merge split/17-cookie-constant into split/18-inmobi
Jamesr51d Oct 13, 2026
27c720c
Merge split/17-cookie-constant into split/18-inmobi
Jamesr51d Oct 13, 2026
badd6fb
Merge 17-cookie-constant into 18-inmobi
jwrosewell Oct 13, 2026
db43a8c
The consent prompt is refused where the entries leave a page without it
jwrosewell Oct 16, 2026
9a50de7
A CMP id outside 1 to 4095 is refused, naming cmp_id
jwrosewell Oct 16, 2026
520ee6e
A middleware's own markup keys a stored page, so a stub change stores…
jwrosewell Oct 16, 2026
010d3fc
The guides say which entries and CMP ids are refused and what keys a …
jwrosewell Oct 16, 2026
aeaccb8
The example settings say every entry names the prompt, and give the C…
jwrosewell Oct 16, 2026
35c8d2f
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 16, 2026
c8942a6
Load the CMP id test's settings with an origin the load accepts
jwrosewell Oct 16, 2026
340b461
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 16, 2026
e68adcb
Merge the review fixes into split/18-inmobi
jwrosewell Oct 16, 2026
0741e03
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 16, 2026
77775fc
The Google ad tag's bootstrap keys a stored page
jwrosewell Oct 16, 2026
46d2c4d
Prebid's head scripts key a stored page
jwrosewell Oct 16, 2026
180e66c
Didomi's settings script keys a stored page
jwrosewell Oct 16, 2026
0296a7e
Sourcepoint's trap and first-party path key a stored page
jwrosewell Oct 16, 2026
982e407
Permutive's SDK path keys a stored page
jwrosewell Oct 16, 2026
2c13c6c
Lockr's SDK path keys a stored page
jwrosewell Oct 16, 2026
9a4b4e4
DataDome's SDK path keys a stored page
jwrosewell Oct 16, 2026
5e356d5
Google Tag Manager's first-party path keys a stored page
jwrosewell Oct 16, 2026
e3ed24b
The seam probe's head marker and report path key a stored page
jwrosewell Oct 16, 2026
9ad63b7
The changelog and the integration guide say which middleware key a st…
jwrosewell Oct 16, 2026
f90b191
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 16, 2026
97d47f8
Merge the review fixes into split/18-inmobi
jwrosewell Oct 16, 2026
45ccfd1
The CMP id test expects the setting named and its value never quoted
jwrosewell Oct 16, 2026
2a2a2f5
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 16, 2026
08d4b39
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 18, 2026
1fb72db
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 18, 2026
adf12f1
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 18, 2026
8906b01
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 18, 2026
b94a1e3
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 19, 2026
9ef33b0
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 19, 2026
4a7ba6b
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 19, 2026
5810af1
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 19, 2026
decaa8e
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 28, 2026
e1b2153
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 28, 2026
1b0baac
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 28, 2026
1d2cb4f
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 28, 2026
ceb600b
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 28, 2026
13ac06e
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 28, 2026
5aeb169
Merge split/17-cookie-constant into split/18-inmobi
jwrosewell Oct 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ test_details = "test --target aarch64-apple-darwin"
# native crate needs no change here. Axum (native), Cloudflare
# (wasm32-unknown-unknown), Spin, the CLI (native), and integration-tests
# (native) are simply not listed.
build-fastly = "build -p trusted-server-core -p trusted-server-adapter-fastly -p trusted-server-device-fastly -p trusted-server-geo-fastly -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb -p trusted-server-js -p trusted-server-openrtb --target wasm32-wasip1"
check-fastly = "check -p trusted-server-core -p trusted-server-adapter-fastly -p trusted-server-device-fastly -p trusted-server-geo-fastly -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb -p trusted-server-js -p trusted-server-openrtb --target wasm32-wasip1"
clippy-fastly = "clippy -p trusted-server-core -p trusted-server-adapter-fastly -p trusted-server-device-fastly -p trusted-server-geo-fastly -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb -p trusted-server-js -p trusted-server-openrtb --all-targets --all-features --target wasm32-wasip1 -- -D warnings"
test-fastly = "test -p trusted-server-core -p trusted-server-adapter-fastly -p trusted-server-device-fastly -p trusted-server-geo-fastly -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb -p trusted-server-js -p trusted-server-openrtb --target wasm32-wasip1"
build-fastly = "build -p trusted-server-core -p trusted-server-adapter-fastly -p trusted-server-device-fastly -p trusted-server-geo-fastly -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-cmp-inmobi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb -p trusted-server-js -p trusted-server-openrtb --target wasm32-wasip1"
check-fastly = "check -p trusted-server-core -p trusted-server-adapter-fastly -p trusted-server-device-fastly -p trusted-server-geo-fastly -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-cmp-inmobi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb -p trusted-server-js -p trusted-server-openrtb --target wasm32-wasip1"
clippy-fastly = "clippy -p trusted-server-core -p trusted-server-adapter-fastly -p trusted-server-device-fastly -p trusted-server-geo-fastly -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-cmp-inmobi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb -p trusted-server-js -p trusted-server-openrtb --all-targets --all-features --target wasm32-wasip1 -- -D warnings"
test-fastly = "test -p trusted-server-core -p trusted-server-adapter-fastly -p trusted-server-device-fastly -p trusted-server-geo-fastly -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-cmp-inmobi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb -p trusted-server-js -p trusted-server-openrtb --target wasm32-wasip1"
# Feature-on counterpart of `test-fastly`. `test-fastly` does NOT pass
# --all-features, so without this the reusable-sandbox code is linted by
# `clippy-fastly` but its tests never execute.
Expand All @@ -40,8 +40,8 @@ test-fastly-reuse = "test -p trusted-server-adapter-fastly --target wasm32-wasip
# run with the Axum adapter in CI.
build-axum = "build -p trusted-server-adapter-axum"
check-axum = "check -p trusted-server-adapter-axum"
clippy-axum = "clippy -p trusted-server-adapter-axum -p trusted-server-permission-signal-gpc -p trusted-server-permission-signal-gpp -p trusted-server-permission-signal-mtm -p trusted-server-permission-signal-tcf -p trusted-server-permission-signal-us-privacy -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb --all-targets --all-features -- -D warnings"
test-axum = "test -p trusted-server-adapter-axum -p trusted-server-permission-signal-gpc -p trusted-server-permission-signal-gpp -p trusted-server-permission-signal-mtm -p trusted-server-permission-signal-tcf -p trusted-server-permission-signal-us-privacy -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb"
clippy-axum = "clippy -p trusted-server-adapter-axum -p trusted-server-permission-signal-gpc -p trusted-server-permission-signal-gpp -p trusted-server-permission-signal-mtm -p trusted-server-permission-signal-tcf -p trusted-server-permission-signal-us-privacy -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-cmp-inmobi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb --all-targets --all-features -- -D warnings"
test-axum = "test -p trusted-server-adapter-axum -p trusted-server-permission-signal-gpc -p trusted-server-permission-signal-gpp -p trusted-server-permission-signal-mtm -p trusted-server-permission-signal-tcf -p trusted-server-permission-signal-us-privacy -p trusted-server-cmp-osano -p trusted-server-modules -p trusted-server-identity-lockr -p trusted-server-audience-permutive -p trusted-server-cmp-sourcepoint -p trusted-server-cmp-didomi -p trusted-server-cmp-inmobi -p trusted-server-tag-google-tag-manager -p trusted-server-testing-testlight -p trusted-server-framework-nextjs -p trusted-server-ad-tag-google -p trusted-server-bot-protection-datadome -p trusted-server-ad-server-mock -p trusted-server-auction-aps -p trusted-server-auction-prebid -p trusted-server-auction-prebid-server -p trusted-server-auction-protocol-openrtb"

# --- Cloudflare adapter (native host + wasm32-unknown-unknown) ---
# Build/check target the WASM runtime (requires the `cloudflare` feature);
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -327,3 +327,9 @@ jobs:

- name: Run unit tests
run: npm test -- --run

# A module that writes a script into pages tests it in its own folder,
# with Node's test runner and no packages.
- name: Run module page script tests
working-directory: .
run: node --test "crates/*/*/tests/*.test.mjs"
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ crates/
auction/ # auction module crates (aps, prebid, prebid-server)
audience/ # audience module crates (permutive)
bot-protection/ # bot protection module crates (datadome)
cmp/ # consent tool module crates (didomi, osano, sourcepoint)
cmp/ # consent tool module crates (didomi, inmobi, osano, sourcepoint)
framework/ # framework module crates (nextjs)
identity/ # identity module crates (lockr)
tag/ # tag manager module crates (google-tag-manager)
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- The InMobi Choice consent prompt as a module, `[cmp] module = "inmobi"` with `[cmp.inmobi] script_url`, from `crates/cmp/inmobi`. Where a `[[fetch]]` entry names `cmp.inmobi`, its middleware writes the IAB TCF stub, InMobi's GPP stub and the deferred Choice loader into the head, in that order, and the two stubs' behavior is tested with Node's test runner, which CI now runs for every module's `tests/*.test.mjs`. The script URL is refused unless it is `https` on an InMobi Choice host with no user name or password, `cmp_id` unless it is a whole number from 1 to 4095, and entries that leave any page without the prompt are refused. The new `Middleware::template_key` keys a stored page by what a middleware writes that no setting decides, so a change to a stub stores pages again. The Trusted Server maintainers hold the crate until InMobi adopt it.
- The stock modules' fetch middleware give as their `template_key` the text compiled into their crates that they write into a page, so a change to it stores pages again. The Google ad tag gives its head scripts, the `tsjs.adInit` bootstrap among them, and the GPT script's first-party path, Prebid its configuration script and bundle tag, Didomi its settings script, and Sourcepoint its head scripts and its CDN's first-party path. Permutive, Lockr, DataDome and Google Tag Manager give the first-party path they point a vendor's address at.
- `[robots-txt]` serves a publisher's `/robots.txt` from the settings. `modules` names what makes the file, in order. `refuse_all` and `allow_all` are Trusted Server's own, and any other name is a module that contributes rules through the new `RobotsTxtContributor` extension point, declared with `with_robots_txt_contributor`. Trusted Server writes the file, so a contributor cannot produce a malformed one, a refusal cannot be loosened, and a path in `always_allow` stays open to every crawler refused the whole site. With `refuse_all` selected every response an adapter finalizes carries `X-Robots-Tag: noindex, nofollow`. A module is asked for the host the request was addressed to, never one a forwarded header names, and is given nothing of the crawler's connection. Its answer is held for that host in the request's key-value store until its refresh is due, and no adapter gives a request a working one, so every adapter asks each module on every request. A module that cannot answer has its last held answer served, and with none held, or with no rule in the whole file, the answer is `503` and never an empty file. On Fastly the file is answered before the Edge Cookie steps and the request filters. Without the section `/robots.txt` reaches the publisher's origin as before.
- `ts keys rotate` and `ts keys deactivate` rotate and retire the request signing keys from an operator's machine. They write the two stores the service links as `jwks_store` and `signing_keys` through the `fastly` CLI, with the token from `FASTLY_API_TOKEN`. A private key reaches `fastly` on its standard input and never in its arguments, and a key id no platform can store is refused before anything is written. A command that cannot read the config store writes nothing, and a delete that failed part way can be run again.
- One Fastly service can serve several publishers. A `TS__CONFIG__KEY` entry in the `trusted_server_config` store that contains `{host}` names an app-config blob for each host, pushed with `ts config push --key <host>`, and each request reads the blob under its own host. Each host's blob names its permission policy file and pins its SHA-256, and the push keeps each file `--permissions` supplies once, in a shared entry under `permissions_<sha256>`, written before the blob, which a live push writes a minute after it writes an entry. A host with no blob is answered `421 Misdirected Request`, never from the logical store ID or from another host's blob, a malformed selector is answered `500`, and a sandbox that serves several requests keeps an application for each blob, found only by that blob's key. Without the entry, or with a selector that has no placeholder, the service reads one blob. `scripts/config-by-host-local-test.sh` runs it under Viceroy.
Expand Down
13 changes: 13 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ members = [
"crates/audience/permutive",
"crates/cmp/sourcepoint",
"crates/cmp/didomi",
"crates/cmp/inmobi",
"crates/tag/google-tag-manager",
"crates/testing/testlight",
"crates/framework/nextjs",
Expand Down Expand Up @@ -161,6 +162,7 @@ trusted-server-identity-lockr = { path = "crates/identity/lockr" }
trusted-server-audience-permutive = { path = "crates/audience/permutive" }
trusted-server-cmp-sourcepoint = { path = "crates/cmp/sourcepoint" }
trusted-server-cmp-didomi = { path = "crates/cmp/didomi" }
trusted-server-cmp-inmobi = { path = "crates/cmp/inmobi" }
trusted-server-tag-google-tag-manager = { path = "crates/tag/google-tag-manager" }
trusted-server-testing-testlight = { path = "crates/testing/testlight" }
trusted-server-framework-nextjs = { path = "crates/framework/nextjs" }
Expand Down
Loading
Loading