code wiki / _hdl_build / nx_hub_gw_gate.nx
nx_hub_gw_gate.nx source
↩ module page · 118 lines · 8199 B
1import "nx_gate_gn.nx"
2// nx_hub_gw_gate.nx -- hermetic gate for the HUB gateway decision handler. Crafts raw HTTP request
3// byte-buffers (no socket, no curl) and asserts the HTTP status the live daemon would emit:
4// T1 GET /tictactoe (production, no token) -> 200 (public)
5// T2 GET /beta/newgame (public beta, no token) -> 200
6// T3 GET /hub/notes + member token -> 200 (granted 2 >= required 2)
7// T4 (NEG) GET /hub/notes + viewer token -> 403 (logged in, under-level; no escalation)
8// T5 (NEG) GET /hub/notes + NO token -> 302 (need login)
9// T6 GET /hub/gallery + operator token -> 200
10// T7 (NEG) GET /hub/gallery + member token -> 403
11// T8 (NEG) GET /notes + operator token -> 404 (hub artifact at public root: NO LEAK)
12// T9 (NEG) GET /hub/doesnotexist + operator token -> 404 (no fabricated artifact)
13// T10 (NEG) GET /hub/notes + BOGUS token -> 302 (unrecognized session = anonymous = login)
14// T11 SERVE target carried: GET /hub/notes member -> target == "notes"
15// Sovereign: nx_syscalls + nx_site_lock_lib + nx_hub_gw_decide. license_tier: ORIGINAL
16import "nx_syscalls.nx"
17import "nx_site_lock_lib.nx"
18import "nx_hub_gw_decide.nx"
19
20func gp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
21func g_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
22func g_app(buf: *u8, off: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { buf[off + i] = s[i]; i = i + 1 } return off + i }
23func g_row2(buf: *u8, off: i64, a: *u8, b: *u8) -> i64 {
24 var o: i64 = g_app(buf, off, a); buf[o] = 9 as u8; o = o + 1
25 o = g_app(buf, o, b); buf[o] = 10 as u8; o = o + 1
26 return o
27}
28func g_row7(buf: *u8, off: i64, a: *u8, b: *u8, c: *u8, d: *u8, e: *u8, f: *u8, g: *u8) -> i64 {
29 var o: i64 = g_app(buf, off, a); buf[o] = 9 as u8; o = o + 1
30 o = g_app(buf, o, b); buf[o] = 9 as u8; o = o + 1
31 o = g_app(buf, o, c); buf[o] = 9 as u8; o = o + 1
32 o = g_app(buf, o, d); buf[o] = 9 as u8; o = o + 1
33 o = g_app(buf, o, e); buf[o] = 9 as u8; o = o + 1
34 o = g_app(buf, o, f); buf[o] = 9 as u8; o = o + 1
35 o = g_app(buf, o, g); buf[o] = 10 as u8; o = o + 1
36 return o
37}
38// build a raw HTTP request into buf: "<line1>\nHost: nishifamily.com\n[X-Nishi-Session: <token>\n]\n"
39func g_req(buf: *u8, line1: *u8, token: *u8) -> i64 {
40 var o: i64 = g_app(buf, 0, line1); buf[o] = 10 as u8; o = o + 1
41 o = g_app(buf, o, "Host: nishifamily.com" as *u8); buf[o] = 10 as u8; o = o + 1
42 if g_slen(token) > 0 {
43 o = g_app(buf, o, "X-Nishi-Session: " as *u8); o = g_app(buf, o, token); buf[o] = 10 as u8; o = o + 1
44 }
45 buf[o] = 10 as u8; o = o + 1
46 return o
47}
48
49func main(argc: i64, argv: *i64) -> i64 {
50 gp("=== nx_hub_gw_gate (raw HTTP request -> fail-closed HTTP status; in-process, no socket) ===\n" as *u8)
51 let reg: *u8 = sys_mmap(16384); var rn: i64 = 0
52 rn = g_row7(reg, rn, "tictactoe" as *u8, "production" as *u8, "public" as *u8, "tictactoe" as *u8, "Tic-Tac-Toe" as *u8, "10" as *u8, "1" as *u8)
53 rn = g_row7(reg, rn, "newgame" as *u8, "beta" as *u8, "public" as *u8, "newgame" as *u8, "New Game" as *u8, "11" as *u8, "1" as *u8)
54 rn = g_row7(reg, rn, "notes" as *u8, "hub" as *u8, "member" as *u8, "notes" as *u8, "Family Notes" as *u8, "13" as *u8, "1" as *u8)
55 rn = g_row7(reg, rn, "gallery" as *u8, "hub" as *u8, "operator" as *u8, "gallery" as *u8, "Gallery" as *u8, "14" as *u8, "1" as *u8)
56 let roles: *u8 = sys_mmap(2048); var roln: i64 = 0
57 roln = g_row2(roles, roln, "operator_h" as *u8, "3" as *u8)
58 roln = g_row2(roles, roln, "member_h" as *u8, "2" as *u8)
59 roln = g_row2(roles, roln, "viewer_h" as *u8, "1" as *u8)
60 // sessions: token -> handle (SEAM: live = olg_whoami + olgd_idx_lookup)
61 let ses: *u8 = sys_mmap(2048); var sn: i64 = 0
62 sn = g_row2(ses, sn, "TOKOP" as *u8, "operator_h" as *u8)
63 sn = g_row2(ses, sn, "TOKMEM" as *u8, "member_h" as *u8)
64 sn = g_row2(ses, sn, "TOKVIEW" as *u8, "viewer_h" as *u8)
65
66 let rq: *u8 = sys_mmap(2048)
67 let st: *i64 = sys_mmap(8); let tgt: *u8 = sys_mmap(512); let req: *i64 = sys_mmap(8); let grant: *i64 = sys_mmap(8)
68 var pass: i64 = 0; var fail: i64 = 0
69 var rl: i64 = 0
70
71 rl = g_req(rq, "GET /tictactoe HTTP/1.1" as *u8, "" as *u8)
72 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
73 if st[0] == 200 { pass = pass + 1; gp(" T1 production no-token->200 PASS\n" as *u8) } else { fail = fail + 1; gp(" T1 FAIL status=" as *u8); gn(st[0]); gp("\n" as *u8) }
74
75 rl = g_req(rq, "GET /beta/newgame HTTP/1.1" as *u8, "" as *u8)
76 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
77 if st[0] == 200 { pass = pass + 1; gp(" T2 beta no-token->200 PASS\n" as *u8) } else { fail = fail + 1; gp(" T2 FAIL status=" as *u8); gn(st[0]); gp("\n" as *u8) }
78
79 rl = g_req(rq, "GET /hub/notes HTTP/1.1" as *u8, "TOKMEM" as *u8)
80 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
81 if st[0] == 200 { pass = pass + 1; gp(" T3 hub(member)+member->200 PASS\n" as *u8) } else { fail = fail + 1; gp(" T3 FAIL status=" as *u8); gn(st[0]); gp("\n" as *u8) }
82
83 rl = g_req(rq, "GET /hub/notes HTTP/1.1" as *u8, "TOKVIEW" as *u8)
84 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
85 if st[0] == 403 { pass = pass + 1; gp(" T4 (NEG) hub(member)+viewer->403 PASS\n" as *u8) } else { fail = fail + 1; gp(" T4 FAIL status=" as *u8); gn(st[0]); gp("\n" as *u8) }
86
87 rl = g_req(rq, "GET /hub/notes HTTP/1.1" as *u8, "" as *u8)
88 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
89 if st[0] == 302 { pass = pass + 1; gp(" T5 (NEG) hub+no-token->302 login PASS\n" as *u8) } else { fail = fail + 1; gp(" T5 FAIL status=" as *u8); gn(st[0]); gp("\n" as *u8) }
90
91 rl = g_req(rq, "GET /hub/gallery HTTP/1.1" as *u8, "TOKOP" as *u8)
92 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
93 if st[0] == 200 { pass = pass + 1; gp(" T6 hub(operator)+operator->200 PASS\n" as *u8) } else { fail = fail + 1; gp(" T6 FAIL status=" as *u8); gn(st[0]); gp("\n" as *u8) }
94
95 rl = g_req(rq, "GET /hub/gallery HTTP/1.1" as *u8, "TOKMEM" as *u8)
96 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
97 if st[0] == 403 { pass = pass + 1; gp(" T7 (NEG) hub(operator)+member->403 PASS\n" as *u8) } else { fail = fail + 1; gp(" T7 FAIL status=" as *u8); gn(st[0]); gp("\n" as *u8) }
98
99 rl = g_req(rq, "GET /notes HTTP/1.1" as *u8, "TOKOP" as *u8)
100 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
101 if st[0] == 404 { pass = pass + 1; gp(" T8 (NEG) hub-artifact@public-root->404 (no leak) PASS\n" as *u8) } else { fail = fail + 1; gp(" T8 FAIL LEAK status=" as *u8); gn(st[0]); gp("\n" as *u8) }
102
103 rl = g_req(rq, "GET /hub/doesnotexist HTTP/1.1" as *u8, "TOKOP" as *u8)
104 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
105 if st[0] == 404 { pass = pass + 1; gp(" T9 (NEG) unknown->404 PASS\n" as *u8) } else { fail = fail + 1; gp(" T9 FAIL status=" as *u8); gn(st[0]); gp("\n" as *u8) }
106
107 rl = g_req(rq, "GET /hub/notes HTTP/1.1" as *u8, "BOGUSXYZ" as *u8)
108 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
109 if st[0] == 302 { pass = pass + 1; gp(" T10 (NEG) bogus-token=anonymous->302 PASS\n" as *u8) } else { fail = fail + 1; gp(" T10 FAIL status=" as *u8); gn(st[0]); gp("\n" as *u8) }
110
111 rl = g_req(rq, "GET /hub/notes HTTP/1.1" as *u8, "TOKMEM" as *u8)
112 hgw_decide(rq, rl, reg, rn, roles, roln, ses, sn, st, tgt, 512, req, grant)
113 if slk_eq(tgt, g_slen(tgt), "notes" as *u8, 5) == 1 { pass = pass + 1; gp(" T11 SERVE target=notes PASS\n" as *u8) } else { fail = fail + 1; gp(" T11 FAIL target mismatch\n" as *u8) }
114
115 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
116 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
117 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
118}