code wiki / _hdl_build / nx_meet_serve_gate.nx

nx_meet_serve_gate.nx source

↩ module page · 110 lines · 6355 B

1// nx_meet_serve_gate.nx -- liar-kill gate for the P2-LIVE socket route. Binds a port, forks a child running the 2// REAL daemon path (meet_serve_one -> accept -> meet_http_handle), and drives it as a sovereign loopback HTTP 3// CLIENT. Asserts over a real socket: a clean apply POST -> 200 + "passed our checks" (SCREENED), a honeypot POST 4// -> 200 + "under review" (FLAGGED), a GET -> 405. Distinguishing teeth: screened != flagged response. expect_exit: 0 5import "nx_syscalls.nx" 6import "nx_connect.nx" // bounded connect: a raw sys_connect hangs ~127s on a black-holed host 7import "nx_meet_lib.nx" 8import "nx_meet_serve_lib.nx" 9 10func sg_find(buf: *u8, n: i64, needle: *u8) -> i64 { 11 var nl: i64 = 0; while needle[nl] != (0 as u8) { nl = nl + 1 } 12 if nl == 0 { return 0 - 1 } 13 var i: i64 = 0 14 while i + nl <= n { var j: i64=0; var ok: i64=1; while j<nl { if buf[i+j]!=needle[j]{ok=0;j=nl} else {j=j+1} } if ok==1 {return i} i=i+1 } 15 return 0 - 1 16} 17func sg_has(buf: *u8, n: i64, needle: *u8) -> i64 { if sg_find(buf, n, needle) >= 0 { return 1 } return 0 } 18func sg_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64=off; var i: i64=0; while s[i]!=(0 as u8){dst[o]=s[i];o=o+1;i=i+1} return o } 19func sg_itoa(dst: *u8, off: i64, v: i64) -> i64 { let t: *u8=sys_mmap(28); var m: i64=v; var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var o: i64=off; var q: i64=k-1; while q>=0{dst[o]=t[q];o=o+1;q=q-1} return o } 20func sg_nap(ms: i64) -> i64 { let ts: *i64 = sys_mmap(16) as *i64; ts[0]=0; ts[1]=ms*1000000; __syscall(35, ts as i64, 0, 0, 0, 0, 0); return 0 } 21 22func build_post(path: *u8, body: *u8, out: *u8) -> i64 { 23 var bl: i64 = 0; while body[bl] != (0 as u8) { bl = bl + 1 } 24 var o: i64 = 0 25 o = sg_cat(out, o, "POST " as *u8); o = sg_cat(out, o, path) 26 o = sg_cat(out, o, " HTTP/1.0\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: " as *u8) 27 o = sg_itoa(out, o, bl) 28 o = sg_cat(out, o, "\r\nConnection: close\r\n\r\n" as *u8) 29 o = sg_cat(out, o, body) 30 return o 31} 32// connect 127.0.0.1:port (retry until bound), send raw, read response. returns bytes read or -1. 33func cg_send(port: i64, raw: *u8, rawlen: i64, resp: *u8, cap: i64) -> i64 { 34 var tries: i64 = 0 35 while tries < 120 { 36 let fd: i64 = sys_socket(2, 1, 0) 37 if fd >= 0 { 38 let tv: *u8 = sys_mmap(16); tv[0]=3 as u8; var tz: i64=1; while tz<16 { tv[tz]=0 as u8; tz=tz+1 } 39 sys_setsockopt(fd, 1, 20, tv, 16) 40 let addr: *u8 = sys_mmap(16) 41 addr[0]=2 as u8; addr[1]=0 as u8; addr[2]=((port>>8)&0xff) as u8; addr[3]=(port&0xff) as u8 42 addr[4]=127 as u8; addr[5]=0 as u8; addr[6]=0 as u8; addr[7]=1 as u8 43 var z: i64=8; while z<16 { addr[z]=0 as u8; z=z+1 } 44 if nx_connect_bounded(fd, addr, 16, NX_CONN_DEFAULT_MS) == 0 { 45 sys_write(fd, raw, rawlen) 46 let n: i64 = sys_read(fd, resp, cap) 47 sys_close(fd) 48 return n 49 } 50 sys_close(fd) 51 } 52 sg_nap(15) 53 tries = tries + 1 54 } 55 return 0 - 1 56} 57 58func main() -> i64 { 59 mputs("=== nx_meet_serve_gate: live socket route over loopback (real HTTP POST -> handler -> response) ===\n" as *u8) 60 let port: i64 = 18099 61 62 // bind+listen in the PARENT, then fork the server child (inherits the listening socket) 63 let addr: *u8 = sys_mmap(16) 64 addr[0]=2 as u8; addr[1]=0 as u8; addr[2]=((port>>8)&0xff) as u8; addr[3]=(port&0xff) as u8 65 var zi: i64=4; while zi<16 { addr[zi]=0 as u8; zi=zi+1 } 66 let lfd: i64 = sys_socket(2, 1, 0) 67 let optv: *u8 = sys_mmap(4); optv[0]=1 as u8 68 sys_setsockopt(lfd, 1, 2, optv, 4) 69 if sys_bind(lfd, addr, 16) < 0 { mputs("BIND-FAIL\n" as *u8); sys_exit(1); return 1 } 70 if sys_listen(lfd, 16) < 0 { mputs("LISTEN-FAIL\n" as *u8); sys_exit(1); return 1 } 71 72 let pid: i64 = sys_fork() 73 if pid == 0 { 74 meet_serve_one(lfd, 1) 75 meet_serve_one(lfd, 2) 76 meet_serve_one(lfd, 3) 77 sys_close(lfd); sys_exit(0) 78 } 79 sys_close(lfd) 80 81 let raw: *u8 = sys_mmap(4096) 82 let resp: *u8 = sys_mmap(131072) 83 var pass: i64 = 0; var fail: i64 = 0 84 85 // 1) clean apply 86 var rl: i64 = build_post("/apply" as *u8, "name=Jane+Doe&email=jane%40example.com&resume=Built+12000+jane%40example.com+github&website=" as *u8, raw) 87 let n1: i64 = cg_send(port, raw, rl, resp, 131072) 88 if sg_has(resp, n1, "200 OK" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; mputs(" FAIL clean-no-200\n" as *u8) } 89 if sg_has(resp, n1, "passed our checks" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; mputs(" FAIL clean-not-screened\n" as *u8) } 90 if sg_has(resp, n1, "under review" as *u8) == 0 { pass=pass+1 } else { fail=fail+1; mputs(" FAIL clean-shows-review\n" as *u8) } 91 92 // 2) honeypot bot -> flagged 93 rl = build_post("/apply" as *u8, "name=Bot&email=b%40x.com&resume=Built+12000+github&website=spam" as *u8, raw) 94 let n2: i64 = cg_send(port, raw, rl, resp, 131072) 95 if sg_has(resp, n2, "under review" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; mputs(" FAIL bot-not-flagged\n" as *u8) } 96 if sg_has(resp, n2, "passed our checks" as *u8) == 0 { pass=pass+1 } else { fail=fail+1; mputs(" FAIL bot-shows-screened\n" as *u8) } 97 98 // 3) GET -> 405 99 rl = sg_cat(raw, 0, "GET /apply HTTP/1.0\r\nConnection: close\r\n\r\n" as *u8) 100 let n3: i64 = cg_send(port, raw, rl, resp, 131072) 101 if sg_has(resp, n3, "405" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; mputs(" FAIL get-no-405\n" as *u8) } 102 103 __syscall(129, pid, 9, 0, 0, 0, 0) // rv64 kill=129; raw x86 62 is an RV64 KEY translated to lseek(8) -- the kill never happened (debt idx 2277) 104 let st: *i64 = sys_mmap(8) as *i64; var rr: i64 = 0; while rr < 20 { sys_wait4(0 - 1, st, 1); rr = rr + 1 } 105 106 mputs(" port=" as *u8); mnum(port); mputs(" bytes: clean=" as *u8); mnum(n1); mputs(" bot=" as *u8); mnum(n2); mputs(" get=" as *u8); mnum(n3); mputs("\n" as *u8) 107 mputs("MEET-SERVE-GATE pass=" as *u8); mnum(pass); mputs(" fail=" as *u8); mnum(fail) 108 if fail == 0 { mputs(" verdict=GREEN (live socket route: real HTTP POST over loopback -> screen -> respond; screened != flagged)\n" as *u8); sys_exit(0); return 0 } 109 mputs(" verdict=RED\n" as *u8); sys_exit(1); return 1 110}