code wiki / _hdl_build / nx_apistack_schema_gate.nx

nx_apistack_schema_gate.nx source

↩ module page · 40 lines · 2687 B

1import "nx_gate_gn.nx" 2import "nx_gate_base.nx" 3// nx_apistack_schema_gate.nx -- hermetic gate for CAP-API-SCHEMA. Proves required-field validation accepts a 4// complete body, rejects a missing required field, treats optional as optional, and matches at token boundaries 5// (not substrings). expect_exit: 0 6import "nx_syscalls.nx" 7import "nx_apistack_schema.nx" 8 9func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 10" as *u8); return ok } 11func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 12func 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 } 13 14func main(argc: i64, argv: *i64) -> i64 { 15 gp("=== nx_apistack_schema_gate (machine-readable request validation) ===\n" as *u8) 16 // schema: target REQUIRED, confirm OPTIONAL 17 let sc: *u8 = sys_mmap(256); var scn: i64 = 0 18 scn = g_app(sc, scn, "target" as *u8); sc[scn]=9 as u8; scn=scn+1; sc[scn]=49 as u8; scn=scn+1; sc[scn]=9 as u8; scn=scn+1; scn=g_app(sc, scn, "string" as *u8); sc[scn]=10 as u8; scn=scn+1 19 scn = g_app(sc, scn, "confirm" as *u8); sc[scn]=9 as u8; scn=scn+1; sc[scn]=48 as u8; scn=scn+1; sc[scn]=9 as u8; scn=scn+1; scn=g_app(sc, scn, "string" as *u8); sc[scn]=10 as u8; scn=scn+1 20 var pass: i64 = 0; var fail: i64 = 0 21 22 let b1: *u8 = "target=x&confirm=yes" as *u8 23 if sc_validate(sc, scn, b1, g_slen(b1)) == 1 { pass=pass+1; gp(" T1 complete body -> valid PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL\n" as *u8) } 24 25 let b2: *u8 = "confirm=yes" as *u8 26 if sc_validate(sc, scn, b2, g_slen(b2)) == 0 { pass=pass+1; gp(" T2 missing required 'target' -> invalid PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL accepted\n" as *u8) } 27 28 let b3: *u8 = "target=x" as *u8 29 if sc_validate(sc, scn, b3, g_slen(b3)) == 1 { pass=pass+1; gp(" T3 optional omitted -> still valid PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL\n" as *u8) } 30 31 let b4: *u8 = "a=1&target=x" as *u8 32 if sc_field_present(b4, g_slen(b4), "target" as *u8, 6) == 1 { pass=pass+1; gp(" T4 field found after '&' PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL\n" as *u8) } 33 34 let b5: *u8 = "mytarget=x" as *u8 35 if sc_field_present(b5, g_slen(b5), "target" as *u8, 6) == 0 { pass=pass+1; gp(" T5 boundary-safe (mytarget != target) PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL substring match\n" as *u8) } 36 37 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail) 38 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 39 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1 40}