code wiki / _hdl_build / nx_docportal_admin_gate.nx

nx_docportal_admin_gate.nx source

↩ module page · 148 lines · 9334 B

1// nx_docportal_admin_gate.nx -- MEASURED gate for the admin.<domain> document-portal handler. Self-contained 2// (nx_status_daemon pattern: craft HTTP request byte-buffers, call da_handle directly, assert the response bytes 3// AND the real side effects in the sovereign store -- no socket, no fork, deterministic). Proves the admin 4// capability the operator asked for: authenticated per-domain upload with public/private classification + RBAC 5// deny-by-default. 6// T1 authed client upload (level 1) -> 200 OK + UPLOADED, and the doc is in the domain's PUBLIC shard 7// T2 anonymous upload (level 0) -> 401 Unauthorized, and NOTHING is ingested (deny-by-default) 8// T3 private upload routing -> lands in the PRIVATE shard, not the public one 9// T4 per-domain isolation -> the upload is not readable from another domain's shard 10// T5 unknown route -> 404 11// GREEN iff 5/5. Appends knowledge/status/docportal_admin_gate.log. license_tier: ORIGINAL 12import "nx_docportal_admin_lib.nx" 13import "nx_g_puts_lib.nx" 14 15func g_num(v: i64) -> i64 { 16 let bb: *u8 = sys_mmap(28); var m: i64 = v 17 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } 18 let t: *u8 = sys_mmap(28); var k: i64 = 0 19 if m == 0 { t[0] = 48 as u8; k = 1 } 20 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 21 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0 22} 23func g_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 } 24func g_wn(fd: i64, v: i64) -> i64 { 25 let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { m = 0 - m } 26 let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 } 27 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 28 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(fd, bb, k); return 0 29} 30func g_contains(hay: *u8, n: i64, ndl: *u8) -> i64 { 31 var nl: i64 = 0; while ndl[nl] != (0 as u8) { nl = nl + 1 } 32 if nl == 0 { return 0 } 33 var i: i64 = 0 34 while i + nl <= n { var j: i64 = 0; var hit: i64 = 1; while j < nl { if hay[i + j] != ndl[j] { hit = 0; j = nl } else { j = j + 1 } } if hit == 1 { return 1 } i = i + 1 } 35 return 0 36} 37// build a request: head (request line + headers + CRLFCRLF) followed by body bytes; returns total length 38func g_mkreq(out: *u8, head: *u8, body: *u8, blen: i64) -> i64 { 39 var o: i64 = 0; var i: i64 = 0 40 while head[i] != (0 as u8) { out[o] = head[i]; o = o + 1; i = i + 1 } 41 var j: i64 = 0; while j < blen { out[o] = body[j]; o = o + 1; j = j + 1 } 42 return o 43} 44func g_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 45 46func main() -> i64 { 47 g_puts("=== DOCPORTAL ADMIN GATE (admin.<domain> upload + RBAC deny-by-default; per-domain public/private) ===\n" as *u8) 48 let ctx0: *DaCtx = sys_mmap(16) as *DaCtx; ctx0.user_level = 0 49 let ctx1: *DaCtx = sys_mmap(16) as *DaCtx; ctx1.user_level = 1 50 let ctx2: *DaCtx = sys_mmap(16) as *DaCtx; ctx2.user_level = 2 51 52 let req: *u8 = sys_mmap(8192) 53 let out: *u8 = sys_mmap(8192) 54 let body1: *u8 = "Public legal guide about wills and probate in Utah." as *u8 55 let body2: *u8 = "Should not be stored because the uploader is anonymous." as *u8 56 let body3: *u8 = "CONFIDENTIAL client privileged retainer agreement." as *u8 57 let cid1: i64 = dp_cid(body1, g_slen(body1)) 58 let cid2: i64 = dp_cid(body2, g_slen(body2)) 59 let cid3: i64 = dp_cid(body3, g_slen(body3)) 60 let pq: *i64 = sys_mmap(16) as *i64; let lq: *i64 = sys_mmap(16) as *i64 61 var pass: i64 = 0 62 63 // ---- T1: authed client (level 1) public upload -> 200 + stored ---- 64 let h1: *u8 = "POST /admin/upload?domain=daadmin&visibility=public HTTP/1.1\r\nContent-Length: 51\r\n\r\n" as *u8 65 let n1: i64 = g_mkreq(req, h1, body1, g_slen(body1)) 66 let o1: i64 = da_handle(ctx1, req, n1, out) 67 var t1: i64 = 0 68 if g_contains(out, o1, "200 OK" as *u8) == 1 { if g_contains(out, o1, "UPLOADED" as *u8) == 1 { if dp_read("daadmin" as *u8, DP_VIS_PUBLIC, cid1, pq, lq) == 1 { t1 = 1 } } } 69 pass = pass + t1 70 g_puts(" T1 authed upload stored: "); if t1 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 71 72 // ---- T2: anonymous (level 0) upload denied -> 401 + nothing ingested ---- 73 let h2: *u8 = "POST /admin/upload?domain=daadmin&visibility=public HTTP/1.1\r\nContent-Length: 55\r\n\r\n" as *u8 74 let n2: i64 = g_mkreq(req, h2, body2, g_slen(body2)) 75 let o2: i64 = da_handle(ctx0, req, n2, out) 76 var t2: i64 = 0 77 let denied: i64 = g_contains(out, o2, "401" as *u8) 78 let leaked: i64 = dp_read("daadmin" as *u8, DP_VIS_PUBLIC, cid2, pq, lq) 79 if denied == 1 { if leaked == 0 { t2 = 1 } } 80 pass = pass + t2 81 g_puts(" T2 anon upload denied+not-stored (401="); g_num(denied); g_puts(" leaked="); g_num(leaked); g_puts("): ") 82 if t2 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 83 84 // ---- T3: private upload routes to the private shard only ---- 85 let h3: *u8 = "POST /admin/upload?domain=daadmin&visibility=private HTTP/1.1\r\nContent-Length: 50\r\n\r\n" as *u8 86 let n3: i64 = g_mkreq(req, h3, body3, g_slen(body3)) 87 da_handle(ctx1, req, n3, out) 88 var t3: i64 = 0 89 let in_prv: i64 = dp_read("daadmin" as *u8, DP_VIS_PRIVATE, cid3, pq, lq) 90 let in_pub: i64 = dp_read("daadmin" as *u8, DP_VIS_PUBLIC, cid3, pq, lq) 91 if in_prv == 1 { if in_pub == 0 { t3 = 1 } } 92 pass = pass + t3 93 g_puts(" T3 private routed (prv="); g_num(in_prv); g_puts(" pub="); g_num(in_pub); g_puts("): ") 94 if t3 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 95 96 // ---- T4: per-domain isolation -- daadmin's doc not readable from daother ---- 97 var t4: i64 = 0 98 if dp_read("daother" as *u8, DP_VIS_PUBLIC, cid1, pq, lq) == 0 { t4 = 1 } 99 pass = pass + t4 100 g_puts(" T4 per-domain isolation: "); if t4 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 101 102 // ---- T5: unknown route -> 404 ---- 103 let h5: *u8 = "GET /admin/nope HTTP/1.1\r\n\r\n" as *u8 104 let n5: i64 = g_mkreq(req, h5, "" as *u8, 0) 105 let o5: i64 = da_handle(ctx2, req, n5, out) 106 var t5: i64 = 0 107 if g_contains(out, o5, "404" as *u8) == 1 { t5 = 1 } 108 pass = pass + t5 109 g_puts(" T5 unknown route 404: "); if t5 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 110 111 // ---- T6: the owner FLAGS usage at upload (ai_blog ON via the request) ---- 112 let body6: *u8 = "Public estate planning FAQ the firm cleared for AI blog use." as *u8 113 let cid6: i64 = dp_cid(body6, g_slen(body6)) 114 let h6: *u8 = "POST /admin/upload?domain=daadmin&visibility=public&pub_search=1&ai_blog=1 HTTP/1.1\r\nContent-Length: 60\r\n\r\n" as *u8 115 let n6: i64 = g_mkreq(req, h6, body6, g_slen(body6)) 116 let o6: i64 = da_handle(ctx1, req, n6, out) 117 var t6: i64 = 0 118 if g_contains(out, o6, "200 OK" as *u8) == 1 { if dp_may("daadmin" as *u8, DP_VIS_PUBLIC, cid6, DP_USE_AI_BLOG) == 1 { t6 = 1 } } 119 pass = pass + t6 120 g_puts(" T6 upload-with-flags sets ai_blog ON: "); if t6 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 121 122 // ---- T7: the owner AMENDS via POST /admin/policy (withdraw ai_blog) -> enforced live ---- 123 let req7: *u8 = sys_mmap(512); var q7: i64 = 0 124 let h7: *u8 = "POST /admin/policy?domain=daadmin&visibility=public&cid=" as *u8 125 var ci: i64 = 0; while h7[ci] != (0 as u8) { req7[q7] = h7[ci]; q7 = q7 + 1; ci = ci + 1 } 126 let dd: *u8 = sys_mmap(28); var mm: i64 = cid6; var kk: i64 = 0; if mm == 0 { dd[0] = 48 as u8; kk = 1 } else { while mm > 0 { dd[kk] = (48 + (mm % 10)) as u8; mm = mm / 10; kk = kk + 1 } } 127 var zz: i64 = 0; while zz < kk { req7[q7] = dd[kk - 1 - zz]; q7 = q7 + 1; zz = zz + 1 } 128 let tail7: *u8 = "&pub_search=1 HTTP/1.1\r\n\r\n" as *u8 129 var ti: i64 = 0; while tail7[ti] != (0 as u8) { req7[q7] = tail7[ti]; q7 = q7 + 1; ti = ti + 1 } 130 let o7: i64 = da_handle(ctx1, req7, q7, out) 131 var t7: i64 = 0 132 if g_contains(out, o7, "POLICY-UPDATED" as *u8) == 1 { if dp_may("daadmin" as *u8, DP_VIS_PUBLIC, cid6, DP_USE_AI_BLOG) == 0 { t7 = 1 } } 133 pass = pass + t7 134 g_puts(" T7 amend policy via endpoint (withdraw ai_blog): "); if t7 == 1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 135 136 g_puts("----\nDOCPORTAL-ADMIN rows=7 pass="); g_num(pass); g_puts("\n" as *u8) 137 let lg: i64 = sys_openat_append("knowledge/status/docportal_admin_gate.log" as *u8, 0x1a4) 138 if lg >= 0 { 139 g_w(lg, "DOCPORTAL-ADMIN authed_upload="); g_wn(lg, t1); g_w(lg, " anon_denied="); g_wn(lg, t2) 140 g_w(lg, " private_routed="); g_wn(lg, t3); g_w(lg, " per_domain_iso="); g_wn(lg, t4); g_w(lg, " unknown_404="); g_wn(lg, t5) 141 g_w(lg, " flag_at_upload="); g_wn(lg, t6); g_w(lg, " amend_endpoint="); g_wn(lg, t7) 142 g_w(lg, " rows=7 pass="); g_wn(lg, pass) 143 if pass == 7 { g_w(lg, " verdict=GREEN\n" as *u8) } else { g_w(lg, " verdict=RED\n" as *u8) } 144 sys_close(lg) 145 } 146 if pass == 7 { g_puts("DOCPORTAL-ADMIN GREEN (authed per-domain public/private upload + owner usage flags, deny-by-default -- measured)\n" as *u8); sys_exit(0); return 0 } 147 g_puts("DOCPORTAL-ADMIN RED\n" as *u8); sys_exit(1); return 1 148}