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}