|
2 | 2 |
|
3 | 3 | Source-level repair for the pinned upstream file backend. **Not deployed and not |
4 | 4 | an authenticated runtime.** No client launcher, account/token import or provider |
5 | | -request is included. Keep the existing runtime and empty owner profile unchanged. |
| 5 | +request to a real provider is included. Keep the existing runtime and owner |
| 6 | +profile unchanged. The CI-only synthetic protocol harness below is separate. |
6 | 7 |
|
7 | 8 | The helper writes a private sibling temporary file, syncs its contents, atomically |
8 | 9 | persists it over the destination, then syncs the parent directory on Unix. Before |
@@ -74,6 +75,45 @@ different path/link/type, nonempty lock or nonprivate alias group is refused. |
74 | 75 | Only counts are reported. This does not test a real login, TLS headers, model |
75 | 76 | access or cancellation, and no existing owner profile is mounted. |
76 | 77 |
|
| 78 | +## Synthetic Native Protocol |
| 79 | + |
| 80 | +After compilation/version validation, `protocol_smoke.sh` runs the actual CLI's |
| 81 | +stdio app-server against a newly generated private CA and local TLS peer. The |
| 82 | +native development build's supported login-issuer override selects only |
| 83 | +`https://login.example.test:8443`. The source, native protocol and storage patch |
| 84 | +are unchanged. This does not establish the release build's issuer selection, |
| 85 | +production gateway behavior or real provider compatibility. |
| 86 | + |
| 87 | +An early no-client preflight checks the same namespace, peer/trust setup and |
| 88 | +teardown before expensive compilation. Only loopback is enabled inside a fresh |
| 89 | +network namespace, with a file-only name mapping and no host resolver/profile. |
| 90 | +Trusted setup holds network-administration privileges only until loopback is up; |
| 91 | +the checker, TLS peer and client run as UID/GID65534, no supplementary groups, |
| 92 | +all capabilities cleared and no-new-privileges. Read-only runtime/test inputs, |
| 93 | +a128MiB private tmpfs and time/CPU/address-space/process/file-size limits bound |
| 94 | +the run. Host /tmp, keyrings, auth, configuration and histories are not mounted. |
| 95 | + |
| 96 | +Six scenarios cover initialize/device-code/pending polling, wrong-ID/correct-ID/ |
| 97 | +repeat cancellation, process-group termination, untrusted CA, trusted CA with a |
| 98 | +wrong certificate name, provider403 and malformed user-code JSON. Only two exact |
| 99 | +POST routes and synthetic bodies are accepted; OAuth token exchange is not |
| 100 | +allowed. Initialization and effective HTTP identities must be neutral, or absent |
| 101 | +for the native raw-auth client. Credential headers are refused. |
| 102 | + |
| 103 | +A bounded syscall trace admits only the mounted client execution and loopback |
| 104 | +peer connection attempts. Each scenario checks private owner/modes, bounded |
| 105 | +file counts/bytes and absence of auth.json. This is a bounded scratch inventory, |
| 106 | +not a complete native filename allowlist or proof against malicious client code. |
| 107 | +Polling must stop after cancellation; process groups/listener threads must exit. |
| 108 | +An independent host-side kernel namespace-reference check follows Bubblewrap's |
| 109 | +PID-namespace teardown. Only count/status receipts are printed. Generated peer |
| 110 | +keys are removed by the wrapper; no binary or test-state artifact is uploaded. |
| 111 | + |
| 112 | +Actual native protocol results remain pending until the exact-source workflow |
| 113 | +finishes. Synthetic codes are not credentials, successful cancellation is not |
| 114 | +authenticated inference, and none of this authorizes a real owner login or |
| 115 | +server runtime replacement. |
| 116 | + |
77 | 117 | ## Limits |
78 | 118 |
|
79 | 119 | - Tests execute the actual Rust helper on synthetic files, including controlled |
|
0 commit comments