Skip to content

Staging update#46

Merged
sashyo merged 27 commits into
mainfrom
staging-update
Jul 1, 2026
Merged

Staging update#46
sashyo merged 27 commits into
mainfrom
staging-update

Conversation

@sashyo

@sashyo sashyo commented Jul 1, 2026

Copy link
Copy Markdown
Owner

No description provided.

sashyo added 27 commits July 1, 2026 12:17
…lidated iga-core endpoints (multiAdmin, enclave-signed, no delegation)
…so admin user + tide-realm-admin actually land
…ris so browser token exchange isn't CORS-blocked
…ommit; remove dead server-relay admin-policy endpoint + broken list-time attach
… iga-core rows

The consolidated iga-core CR carries the target user/role/client under the new
UPPERCASE rows[] (per-actionType: GRANT_ROLES has USER_ID/ROLE_ID only,
CREATE_USER has USERNAME, CREATE_ROLE has NAME/CLIENT_ID), not the old payload
userRecord/role/clientId. The old field lookups missed and the table showed
Unknown for User/Role/Client. Resolve GRANT_ROLES UUIDs against the cached
users + roles lists and alias userRecord/role/compositeRole/clientId back onto
the CR data object so api.ts and AdminApprovals.tsx keep working unchanged.
The Change Requests review step only covered the user admin access CR and the
ssh:user policy. Granting the ssh:user role also produces its own change
request in the Change Requests (Access) tab that must be reviewed and committed,
so add that step before switching to the Policies tab.
Reorder Step 2 so the change-request commits follow the actual dependency
order: create the ssh:user role, commit it under the Roles tab, commit its
policy under the Policies tab, then add the role to the user and commit the
resulting access change request under the Access tab. Also fixes the broken
item numbering (list jumped from 2 to 4).
New docs/PUNCHD-GATEWAY.md aimed at users new to gateways: what punchd is and
when it is needed (direct-reachable vs NAT'd target), a plain-words path
diagram, the direct-vs-gateway routing decision (bridgeId gateway: convention),
the pieces (gateway + signal server) and ports, the TideCloak JWT/DPoP + shared
API_SECRET auth model, a minimal local/offline SSH-gateway quick start, the
remote signal-server path, an SSH-relevant config/env reference verified against
punchd-bridge-rs config.rs, troubleshooting, and an explicit assumptions list
(punchd.keylessh.com, keylessh-vs-s5 realm, Node-vs-Rust). Cross-links to
DEPLOYMENT.md and flow-diagram.md for full detail. README gets a one-line
pointer.
New docs/SIGNAL-SERVER.md, companion to PUNCHD-GATEWAY.md, for users new to the
signal/STUN server: what it is and when it is needed (only remote-mode NAT
traversal, not local targets), a plain-words gateway/signal/coturn diagram, the
signal-vs-coturn split of responsibilities, the API_SECRET gateway-registration
flow and gateways:N health check, the Rust deploy.sh + coturn flags (verified),
a config/env reference from config.rs, ports/firewall, troubleshooting, and an
explicit assumptions list (live punchd.keylessh.com, keylessh-vs-s5 realm and
myclient-stun, and the genuinely ambiguous Node-vs-Rust choice). README gets a
one-line pointer next to the punchd guide.
The project is converging on Rust and removing the Node/TS duplicate bridge and
signal-server implementations. Strip all Node references from both easy guides
and drop the Node-vs-Rust open question: document only bridges/punchd-bridge-rs
and signal-server-rs (which has its own deploy.sh + coturn setup). Present a
single Rust path in each doc.
The Node/TS implementations are superseded by their Rust ports, so remove them
and preserve their test coverage in the Rust crates.

Removed:
- bridges/punchd-bridge/ (Node gateway -> bridges/punchd-bridge-rs)
- bridges/tcp-bridge/ (Node WS-TCP bridge -> bridges/ssh-bridge-rs)
- signal-server/ (Node signal server -> signal-server-rs)
- tests/gateway/{der-codec,rdcleanpath}.test.ts and
  tests/signal-server/{pairing,registry}.test.ts (ported to Rust)

Ported coverage (all passing):
- der_codec.rs + rdcleanpath.rs: 26 #[test]s mirroring the TS DER/RDCleanPath
  encode/decode + parse/build/error assertions
- signal-server-rs registry/mod.rs: 11 #[test]s (register/remove, fewest-clients
  selection, realm lookup, re-registration, unpairing, counts)
- signal-server-rs signaling/handler.rs: 5 #[test]s (auto/explicit pairing +
  the exact paired/error JSON frames, via channel senders)

quic-relay: no such directory exists and the Rust stack removed the QUIC relay
(WebRTC DataChannel is used instead), so the stale .gitignore line and the
pkill hint went with the Node server; nothing depends on it.

References updated: .gitignore (drop dead line, add ssh-bridge-rs/target),
docker-compose.yml (drop commented tcp-bridge block), .env.example, README,
docs/{ARCHITECTURE,DEPLOYMENT,DEVELOPERS,PUNCHD-GATEWAY} point at the Rust dirs;
docs/flow-diagram.md keeps its historical Node source citations with a note that
the current code is the Rust crates. CI already builds only the Rust crates.
Wire the Rust SSH bridge into CI so the image the Azure marketplace already
pulls (tideorg/keylessh-bridge:latest) is actually built again after the Node
tcp-bridge was removed. Add a build-ssh-bridge job to docker-build.yml,
mirroring build-gateway exactly (same login/buildx/metadata tag scheme/
platforms/cache), building bridges/ssh-bridge-rs via its Dockerfile. Reuses the
existing registry name so no Azure template changes are needed; the image keeps
port 8080 + PORT/TIDECLOAK_CONFIG_B64, matching the tcp-bridge container app.

Also fix two pre-existing defects that broke the ssh-bridge-rs Docker build from
a clean checkout:
- Track Cargo.lock (was gitignored and absent) so the Dockerfile's
  COPY Cargo.toml Cargo.lock step works, matching signal-server-rs.
- Bump the builder base image rust:1.84 -> rust:1.94.0-bookworm; the crate uses
  edition 2024, unsupported by 1.84 (punchd-bridge-rs already uses 1.94).

Verified: local docker build of bridges/ssh-bridge-rs succeeds; the image
exposes 8080, sets PORT=8080, entrypoint ./ssh-bridge-rs.
The Deploy to Azure Container App step only echoed guidance to update a
container app named keylessh-tcp-bridge with the gateway image. That app name
exists nowhere else in the repo, and no azure template or deploy script defines
any gateway container app (tideorg/punchd-gateway / port 7891) for it to target,
so the step was non-executing, misleading dead code. Remove it and rename the
workflow to Build and Push Punchd Gateway. The build+push of tideorg/punchd-
gateway is unchanged.
New docs/VPN-SETUP.md, companion to the gateway + signal-server guides, for
users new to the VPN: what it is and when to use it (network-level LAN reach vs
one-service SSH/gateway access), a plain-words data-path diagram, the roles
(gateway = VPN server, punchd-vpn = client; not TideSSP/PunchdEndpoint), the
TideCloak JWT/DPoP auth + vpn:<gatewayId> role firewall model, gateway-side and
client-side setup steps, a client args reference verified against
punchd_vpn.rs, ports (QUIC 7893 + signal/TURN), troubleshooting, and an
assumptions list (custom IP-over-QUIC not WireGuard, hardcoded 10.66.0.0/24 +
MTU + TUN name, IPv4-only, punchd-vpn vs PunchdEndpoint). Grounded in
bridges/punchd-bridge-rs vpn code; Rust-only. README gets a pointer next to the
gateway/signal guides.
@sashyo
sashyo merged commit 8d55841 into main Jul 1, 2026
2 checks passed
@sashyo
sashyo deleted the staging-update branch July 1, 2026 07:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant