code wiki / _hdl_build / nx_ad_banner_builder_gate.nx
nx_ad_banner_builder_gate.nx source
↩ module page · 76 lines · 5087 B
1// nx_ad_banner_builder_gate.nx -- GATE for the server-rendered banner builder. Proves: the GET form has the
2// fields and is ZERO-JS; a POST renders a clean generated banner (correct size + animation) with the form
3// repopulated; an injected sponsor stays escaped; empty input yields no banner. Emits the builder page
4// samples to knowledge/staging/ad/ as evidence. Sovereign, no gcc/.sh. license_tier: ORIGINAL
5import "nx_ad_banner_builder.nx"
6import "nx_ad_serve.nx"
7import "nx_syscalls.nx"
8import "nx_gate_verdict.nx"
9
10func g_p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
11func g_write(fname: *u8, buf: *u8, n: i64) -> i64 { let fd: i64 = sys_openat_wr(fname, 420); if fd >= 0 { sys_write(fd, buf, n); sys_close(fd) } return 0 }
12
13func main(argc: i64, argv: *i64) -> i64 {
14 g_p("=== nx_ad_banner_builder_gate ===\n" as *u8)
15 let page: *u8 = sys_mmap(65536)
16 var pass: i64 = 0
17 var tot: i64 = 0
18
19 // ---- T1: GET (empty body) -> the form, zero JS, no preview yet.
20 let empty: *u8 = sys_mmap(8); empty[0] = 0 as u8
21 let g1: i64 = abb_page(empty, 0, page)
22 g_write("knowledge/staging/ad/banner_builder.html" as *u8, page, g1)
23 tot = tot + 1; var ok1: i64 = 1
24 if as_contains(page, g1, "name='business'" as *u8) != 1 { ok1 = 0 }
25 if as_contains(page, g1, "leaderboard" as *u8) != 1 { ok1 = 0 }
26 if as_contains(page, g1, "dynamic" as *u8) != 1 { ok1 = 0 }
27 if as_contains(page, g1, "<script" as *u8) != 0 { ok1 = 0 } // builder is ZERO-JS
28 if as_contains(page, g1, "Preview" as *u8) != 0 { ok1 = 0 } // nothing generated yet
29 if ok1 == 1 { pass = pass + 1; g_p("PASS T1 GET form: fields present, zero-JS, no preview\n" as *u8) } else { g_p("FAIL T1\n" as *u8) }
30
31 // ---- T2: POST a submission -> generated banner preview (728x90 dynamic) + repopulated + copy box, zero-JS.
32 let post: *u8 = "business=Acme+Co&headline=Big+sale&body=Up+to+40%25+off&cta=Shop+now&link=https://acme.test/&size=leaderboard+728x90&theme=dark&kind=dynamic+(animated)" as *u8
33 let pn: i64 = as_len(post)
34 let g2: i64 = abb_page(post, pn, page)
35 g_write("knowledge/staging/ad/banner_builder_filled.html" as *u8, page, g2)
36 tot = tot + 1; var ok2: i64 = 1
37 if as_contains(page, g2, "width:728px" as *u8) != 1 { ok2 = 0 } // requested size honored
38 if as_contains(page, g2, "@keyframes" as *u8) != 1 { ok2 = 0 } // dynamic animation present
39 if as_contains(page, g2, "Preview" as *u8) != 1 { ok2 = 0 } // preview rendered
40 if as_contains(page, g2, "<textarea" as *u8) != 1 { ok2 = 0 } // copy-paste HTML box
41 if as_contains(page, g2, "value='Acme Co'" as *u8) != 1 { ok2 = 0 } // form repopulated (decoded)
42 if as_contains(page, g2, "<script" as *u8) != 0 { ok2 = 0 } // STILL zero-JS
43 if ok2 == 1 { pass = pass + 1; g_p("PASS T2 POST: 728x90 dynamic preview + repopulated + copy box, zero-JS\n" as *u8) } else { g_p("FAIL T2\n" as *u8) }
44
45 // ---- T3: abb_render direct -> non-empty for a real form, and EMPTY (0) when no business given.
46 let buf: *u8 = sys_mmap(16384)
47 let r1: i64 = abb_render(post, pn, buf)
48 let noform: *u8 = "headline=x" as *u8
49 let r0: i64 = abb_render(noform, as_len(noform), buf)
50 tot = tot + 1; var ok3: i64 = 1
51 if r1 <= 0 { ok3 = 0 }
52 if r0 != 0 { ok3 = 0 } // no business -> no banner (fail-closed on empty)
53 if ok3 == 1 { pass = pass + 1; g_p("PASS T3 abb_render: generates for a form, returns 0 with no business\n" as *u8) } else { g_p("FAIL T3\n" as *u8) }
54
55 // ---- T4: ESCAPING neg-control -> an injected sponsor never appears raw in the page (escaped in BOTH
56 // the repopulated form value and the generated banner).
57 let inj: *u8 = "business=<script>alert(1)</script>&headline=H&size=rectangle&kind=static" as *u8
58 let g4: i64 = abb_page(inj, as_len(inj), page)
59 tot = tot + 1; var ok4: i64 = 1
60 if as_contains(page, g4, "<script" as *u8) != 0 { ok4 = 0 } // raw injection absent
61 if as_contains(page, g4, "<script" as *u8) != 1 { ok4 = 0 } // present only escaped
62 if ok4 == 1 { pass = pass + 1; g_p("PASS T4 escaping: injected sponsor stays <script (no raw tag)\n" as *u8) } else { g_p("FAIL T4\n" as *u8) }
63
64 g_p("nx_ad_banner_builder_gate pass=" as *u8)
65 let nb: *u8 = sys_mmap(16); let nn: i64 = ab_uitoa(nb, 0, pass); sys_write(1, nb, nn)
66 g_p("/" as *u8); let tb: *u8 = sys_mmap(16); let tn: i64 = ab_uitoa(tb, 0, tot); sys_write(1, tb, tn)
67 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
68 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
69 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
70 let ctr__dry: *i64 = gv_ctr()
71 ctr__dry[0] = pass
72 ctr__dry[1] = tot
73 let rc__dry: i64 = gv_verdict("AD-BANNER-BUILDER-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
74 sys_exit(rc__dry)
75 return rc__dry
76}