filtering: a per-node expose setting overrides a listen's source (ADR 0051)
#4
Closed
jschoubben
wants to merge 1 commits from
config/exposure-setting into events/module-broker-account
pull from: config/exposure-setting
merge into: :events/module-broker-account
:main
:fix/sweep-2026-10-30
:fix/checker-full-failure
:feat/1945-user-list-switch
:fix/1945-mesh-grants-publishes-memberships
:fix/issued-states-follow-the-module
:fix/1945-credential-on-assignment
:fix/r6-mirror-on-change
:fix/store-forge-address
:fix/r6-look-again-after-unlock
:fix/r6-key-waits-said
:fix/1931-reconnects-verb
:fix/forge-requires-no-status
:fix/906-lease-renewal
:feat/r4e-controller
:fix/1106-sdk-member-merges
:fix/1399-person-word-test
:fix/1652-checks-wait
:feat/files-through-the-store-files-verbs
:fix/1649-held-ask-handed-out-twice
:fix/1658-sdk-items
:fix/1334-a-bus-reload-fails-a-tier
:feat/chain-on-the-bus
:fix/701-a-name-nothing-answers-is-not-used
:fix/270-a-dead-bus-watch-is-heard
:fix/630-config-values-from-four-sources
:fix/613-node-smb-server
:feat/328-libraries-and-module-users
:feat/325-identities-and-kept-folders
:feat/bus-view-principal
:test/plan-diff-left-out-line
:fix/the-registry-trust-test-reads-the-runtimes-module
:fix/the-runtime-file-is-the-runtimes
:feat/build-edges-are-recorded
:fix/several-contributions-collide-in-grants-v2
No Reviewers
No labels
Milestone
No items
No Milestone
Assignees
agent-ace
agent-g14
agent-novox
agent-shanks
jschoubben
mesh-tools
miel.truyen
nox-agent
Clear assignees
No Assignees
No due date set.
Dependencies
No dependencies set.
Reference: novox/mesh-controller#4
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Implements the
listens.from-as-a-setting half of ADR 0051 — the code behind your postgres case.listens.fromwas a manifest constant, one value for every node a module runs on. Now a per-node setting overrides it:makes postgres public on novox while it stays
from: meshon ace (and everywhere the setting isn't). The firewall (ADR 0050) is computed from the effective source, so the packet filter follows the setting — no manifest edit, no rebuild.Exposure(m, layers)extracts and validates the override: a port the module doesn't listen on, or a source that isn'tmesh/anywhere/machine, is refused rather than silently reaching nothing (the ADR 0048/0050 discipline).Filteringapplies it per listen (keyed on the declared port, so it travels with the mesh-assigned port).UnusedSettingsknowsexposeis a real destination for a module that listens, so a valid exposure isn't flagged stray.mesh; the setting opens the port toanywhere; a bad port/source is refused.Postgres already declares
listens: [{5432, from: mesh}], so nothing changes there — the exposure is purely the assignment's.Stacked on
events/module-broker-account. Depends on ADR 0051 (HQ PR #19).https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
listens.from was a manifest constant — one value for every node a module runs on. Now a per-node setting overrides it: {"expose": {"5432": "anywhere"}} makes postgres public on the machine it is set for while it stays from:mesh elsewhere, and the firewall (ADR 0050) is computed from the effective source. Exposure() validates it — a port the module does not listen on, or a source that is not mesh/anywhere/machine, is refused rather than reaching nothing; UnusedSettings knows 'expose' is a real destination. Tested: default mesh, setting opens it to anywhere, bad settings refused.