code wiki / _hdl_build / nx_studio_freeform_ui_gate.nx
nx_studio_freeform_ui_gate.nx source
↩ module page · 83 lines · 6669 B
1// nx_studio_freeform_ui_gate.nx -- gate for the FREE-FORM CANVAS surface (web_assets/_studio/editor_freeform.html),
2// the power-user capability tier. STATIC: the canvas is a THIN SHIM -- it has the element palette, supports free
3// placement (pointer drag), assembles `tier|freeform` + `el|kind|x|y|w|text|href` lines, sets element text via
4// textContent (never innerHTML for user content), POSTs to a path-relative /build, and delegates display via
5// srcdoc with no engine logic of its own. BEHAVIOR: the EXACT payload format the canvas produces, fed to the
6// daemon's path (se_build_tier), yields a governed canvas page with placement honored; a hostile element is
7// escaped. Appends a CMSGATE row to knowledge/status/cms_gate.log on all-pass. license_tier: ORIGINAL
8import "nx_studio_tiers.nx"
9import "nx_syscalls.nx"
10
11func fuw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
12func fun(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); 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 i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
13func fucat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64=off; var k: i64=0; while s[k]!=(0 as u8){dst[o]=s[k];o=o+1;k=k+1} return o }
14func fucatn(dst: *u8, off: i64, v: i64) -> i64 { var o: i64=off; let t: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; 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 i: i64=0; while i<k{dst[o]=t[k-1-i];o=o+1;i=i+1} return o }
15func furow(id: i64, ok: i64, what: *u8) -> i64 { fuw("FUROW " as *u8); fun(id); fuw(" " as *u8); if ok==1 { fuw("PASS " as *u8) } else { fuw("FAIL " as *u8) } fuw(what); fuw("\n" as *u8); return ok }
16func fulen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
17func fuslurp(path: *u8, buf: *u8, cap: i64) -> i64 {
18 let fd: i64 = sys_openat_rd(path); if fd < 0 { return 0 - 1 }
19 var total: i64 = 0; var go: i64 = 1
20 while go == 1 { let r: i64 = sys_read(fd, buf + total, cap - total); if r <= 0 { go = 0 } if r > 0 { total = total + r } if total >= cap { go = 0 } }
21 sys_close(fd); return total
22}
23func fuhas(hay: *u8, hn: i64, needle: *u8) -> i64 {
24 var nl: i64=0; while needle[nl]!=(0 as u8){nl=nl+1}
25 if nl==0 { return 1 } if nl>hn { return 0 }
26 let last: i64=hn-nl; var i: i64=0
27 while i<=last { var j: i64=0; var hit: i64=1; while j<nl { if (hay[i+j] as i64)!=(needle[j] as i64){hit=0;j=nl} if hit==1{j=j+1} } if hit==1 { return 1 } i=i+1 }
28 return 0
29}
30
31func main() -> i64 {
32 let html: *u8 = sys_mmap(262144)
33 let hn: i64 = fuslurp("web_assets/_studio/editor_freeform.html" as *u8, html, 262143)
34 let out: *u8 = sys_mmap(262144)
35
36 var rows: i64 = 0
37 var pass: i64 = 0
38 var ok: i64 = 0
39
40 // R0 (static): element palette present
41 ok = 0; if hn>0 { if fuhas(html,hn,"data-add=\"heading\"" as *u8)==1 { if fuhas(html,hn,"data-add=\"text\"" as *u8)==1 { if fuhas(html,hn,"data-add=\"button\"" as *u8)==1 { if fuhas(html,hn,"data-add=\"image\"" as *u8)==1 { ok=1 } } } } }
42 rows=rows+1; pass=pass+furow(0, ok, "canvas has the element palette (heading/text/button/image)" as *u8)
43
44 // R1 (static): assembles tier|freeform + el| lines
45 ok = 0; if fuhas(html,hn,"tier|freeform" as *u8)==1 { if fuhas(html,hn,"el|" as *u8)==1 { ok=1 } }
46 rows=rows+1; pass=pass+furow(1, ok, "canvas assembles tier|freeform + el|kind|x|y|w|text|href lines" as *u8)
47
48 // R2 (static): free placement via pointer drag
49 ok = 0; if fuhas(html,hn,"pointerdown" as *u8)==1 { if fuhas(html,hn,"pointermove" as *u8)==1 { ok=1 } }
50 rows=rows+1; pass=pass+furow(2, ok, "free placement: elements draggable via pointer events" as *u8)
51
52 // R3 (static): POSTs to a path-relative /build
53 ok = 0; if fuhas(html,hn,"location.pathname" as *u8)==1 { if fuhas(html,hn,"/build" as *u8)==1 { if fuhas(html,hn,"POST" as *u8)==1 { ok=1 } } }
54 rows=rows+1; pass=pass+furow(3, ok, "canvas POSTs to a path-relative /build (works at /freeform and /webdev)" as *u8)
55
56 // R4 (static): THIN SHIM -- safe text via textContent, delegates via srcdoc, no engine logic
57 ok = 0; if fuhas(html,hn,"textContent" as *u8)==1 { if fuhas(html,hn,"srcdoc" as *u8)==1 { if fuhas(html,hn,"sg_build" as *u8)==0 { ok=1 } } }
58 rows=rows+1; pass=pass+furow(4, ok, "THIN SHIM: user text via textContent, delegates via srcdoc, no engine logic" as *u8)
59
60 // R5 (behavior): the canvas's payload format -> the daemon path (se_build_tier) -> governed canvas, placement honored
61 let l5: i64 = se_build_tier("tier|freeform\ntitle|Free-form page\nel|heading|60|60|360|My Heading|#link\nel|button|60|200|180|Click me|#go\n" as *u8, fulen("tier|freeform\ntitle|Free-form page\nel|heading|60|60|360|My Heading|#link\nel|button|60|200|180|Click me|#go\n" as *u8), out, 262143)
62 ok = 0; if l5>0 { if fuhas(out,l5,"My Heading" as *u8)==1 { if fuhas(out,l5,"left:60px;top:60px;width:360px" as *u8)==1 { if fuhas(out,l5,"href=\"#go\"" as *u8)==1 { ok=1 } } } }
63 rows=rows+1; pass=pass+furow(5, ok, "BEHAVIOR: canvas payload -> daemon path -> governed canvas, placement honored" as *u8)
64
65 // R6 (behavior): a hostile element is escaped
66 let l6: i64 = se_build_tier("tier|freeform\nel|heading|0|0|100|<script>alert(8)</script>|\n" as *u8, fulen("tier|freeform\nel|heading|0|0|100|<script>alert(8)</script>|\n" as *u8), out, 262143)
67 ok = 0; if l6>0 { if fuhas(out,l6,"<script>alert(8)" as *u8)==0 { if fuhas(out,l6,"<script>alert(8)" as *u8)==1 { ok=1 } } }
68 rows=rows+1; pass=pass+furow(6, ok, "BEHAVIOR: a hostile canvas element is escaped (no raw <script>)" as *u8)
69
70 fuw("NX-STUDIO-FREEFORM-UI-GATE rows=" as *u8); fun(rows); fuw(" pass=" as *u8); fun(pass); fuw("\n" as *u8)
71 if pass == rows {
72 let line: *u8 = sys_mmap(256)
73 var off: i64 = fucat(line, 0, "CMSGATE row=nx_studio_freeform_ui freeform-canvas-surface rows=" as *u8)
74 off = fucatn(line, off, rows); off = fucat(line, off, " pass=" as *u8); off = fucatn(line, off, pass)
75 off = fucat(line, off, " verdict=PASS (drag-drop canvas thin-shim + payload builds governed)\n" as *u8)
76 let gf: i64 = sys_openat_append("knowledge/status/cms_gate.log" as *u8, 0x1a4)
77 if gf >= 0 { sys_write(gf, line, off); sys_close(gf) }
78 fuw("NX-STUDIO-FREEFORM-UI-GATE verdict=PASS -- free-form canvas surface (power-user tier) thin-shim + governed\n" as *u8)
79 sys_exit(0); return 0
80 }
81 fuw("NX-STUDIO-FREEFORM-UI-GATE verdict=FAIL -- NOT recorded (no fake-green)\n" as *u8)
82 sys_exit(1); return 1
83}