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}