code wiki / _hdl_build / nx_sitegen_video_gate.nx

nx_sitegen_video_gate.nx source

↩ module page · 107 lines · 7919 B

1// nx_sitegen_video_gate.nx -- gate for the VIDEO-GALLERY page type (nx_sitegen_video). Proves a YouTube-for-pets 2// page builds from data: every video's title/thumbnail/source renders, the inline player + responsive grid + 3// onsite search are present, a malicious title is injection-ESCAPED, a 2nd different gallery is genuinely 4// different (data-driven, not one-off), and the same data builds byte-identical (reproducible). Positive AND 5// negative controls. Appends "CMSGATE row=nx_sitegen_video site-builder-video ... verdict=PASS" to 6// knowledge/status/cms_gate.log on all-pass. license_tier: ORIGINAL 7import "nx_sitegen_video.nx" 8import "nx_syscalls.nx" 9 10func vg_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 11func vg_num(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 } 12func vg_cat(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 } 13func vg_catnum(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 } 14func vg_row(id: i64, ok: i64, what: *u8) -> i64 { vg_w("VGROW " as *u8); vg_num(id); vg_w(" " as *u8); if ok==1 { vg_w("PASS " as *u8) } else { vg_w("FAIL " as *u8) } vg_w(what); vg_w("\n" as *u8); return ok } 15func vg_slurp(path: *u8, buf: *u8, cap: i64) -> i64 { 16 let fd: i64 = sys_openat_rd(path); if fd < 0 { return 0 - 1 } 17 var total: i64 = 0; var go: i64 = 1 18 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 } } 19 sys_close(fd); return total 20} 21func vg_has(hay: *u8, hn: i64, needle: *u8) -> i64 { 22 var nl: i64=0; while needle[nl]!=(0 as u8){nl=nl+1} 23 if nl==0 { return 1 } if nl>hn { return 0 } 24 let last: i64=hn-nl; var i: i64=0 25 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 } 26 return 0 27} 28func vg_eq(a: *u8, an: i64, b: *u8, bn: i64) -> i64 { if an!=bn { return 0 } var i: i64=0; while i<an { if (a[i] as i64)!=(b[i] as i64){return 0} i=i+1 } return 1 } 29func vg_build_file(path: *u8, title: *u8, heading: *u8, t: *i64, th: *i64, u: *i64, n: i64, buf: *u8, cap: i64) -> i64 { 30 let fd: i64 = sys_openat_wr(path, 0x1a4) 31 if fd >= 0 { vid_build(fd, title, heading, t, th, u, n); sys_close(fd) } 32 return vg_slurp(path, buf, cap) 33} 34 35func main() -> i64 { 36 // the pets gallery (data) 37 let t: *i64 = sys_mmap(8*8) as *i64 38 let th: *i64 = sys_mmap(8*8) as *i64 39 let u: *i64 = sys_mmap(8*8) as *i64 40 t[0]="Whiskers naps in the sun" as *u8 as i64; th[0]="/thumbs/whiskers.jpg" as *u8 as i64; u[0]="/vids/whiskers.mp4" as *u8 as i64 41 t[1]="Rex fetches the ball" as *u8 as i64; th[1]="/thumbs/rex.jpg" as *u8 as i64; u[1]="/vids/rex.mp4" as *u8 as i64 42 t[2]="Goldie swims laps" as *u8 as i64; th[2]="/thumbs/goldie.jpg" as *u8 as i64; u[2]="/vids/goldie.mp4" as *u8 as i64 43 44 let buf1: *u8 = sys_mmap(262144) 45 let n1: i64 = vg_build_file("/tmp/nx_video_pets.html" as *u8, "Nishi Pets -- watch our family pets" as *u8, "Latest pet videos" as *u8, t, th, u, 3, buf1, 262143) 46 47 var pass: i64 = 0 48 var rows: i64 = 0 49 var ok: i64 = 0 50 51 // R0: built + 3 videos 52 let len1: i64 = vg_slurp("/tmp/nx_video_pets.html" as *u8, buf1, 262143) 53 ok = 0; if n1 > 0 { if len1 > 0 { ok = 1 } } 54 rows=rows+1; pass=pass+vg_row(0, ok, "video gallery builds from data, non-empty (3 videos proven in R1/R2)" as *u8) 55 56 // R1: every video title rendered 57 ok = 0; if vg_has(buf1,len1,"Whiskers naps in the sun" as *u8)==1 { if vg_has(buf1,len1,"Rex fetches the ball" as *u8)==1 { if vg_has(buf1,len1,"Goldie swims laps" as *u8)==1 { ok=1 } } } 58 rows=rows+1; pass=pass+vg_row(1, ok, "all 3 video titles rendered (list walked from data)" as *u8) 59 60 // R2: every video source rendered 61 ok = 0; if vg_has(buf1,len1,"/vids/whiskers.mp4" as *u8)==1 { if vg_has(buf1,len1,"/vids/rex.mp4" as *u8)==1 { if vg_has(buf1,len1,"/vids/goldie.mp4" as *u8)==1 { ok=1 } } } 62 rows=rows+1; pass=pass+vg_row(2, ok, "all 3 video sources + posters rendered (data-driven)" as *u8) 63 64 // R3: inline player present (the YouTube-like grid of players) 65 ok = 0; if vg_has(buf1,len1,"<video controls" as *u8)==1 { if vg_has(buf1,len1,"poster=" as *u8)==1 { ok=1 } } 66 rows=rows+1; pass=pass+vg_row(3, ok, "inline video players present (controls + poster)" as *u8) 67 68 // R4: responsive by construction + onsite search 69 ok = 0; if vg_has(buf1,len1,"auto-fit" as *u8)==1 { if vg_has(buf1,len1,"width=device-width" as *u8)==1 { if vg_has(buf1,len1,"role=\"search\"" as *u8)==1 { ok=1 } } } 70 rows=rows+1; pass=pass+vg_row(4, ok, "responsive grid + viewport + onsite search present" as *u8) 71 72 // R5 (NEG): a malicious video title is ESCAPED 73 let t2: *i64 = sys_mmap(8*8) as *i64; let th2: *i64 = sys_mmap(8*8) as *i64; let u2: *i64 = sys_mmap(8*8) as *i64 74 t2[0]="<script>alert(5)</script>" as *u8 as i64; th2[0]="/t.jpg" as *u8 as i64; u2[0]="/v.mp4" as *u8 as i64 75 let bufi: *u8 = sys_mmap(65536) 76 let leni: i64 = vg_build_file("/tmp/nx_video_inj.html" as *u8, "T" as *u8, "H" as *u8, t2, th2, u2, 1, bufi, 65535) 77 ok = 0; if vg_has(bufi,leni,"<script>alert(5)" as *u8)==0 { if vg_has(bufi,leni,"&lt;script&gt;alert(5)" as *u8)==1 { ok=1 } } 78 rows=rows+1; pass=pass+vg_row(5, ok, "malicious video title escaped, no raw <script> (neg control)" as *u8) 79 80 // R6 (data-driven): a 2nd different gallery is genuinely different 81 let t3: *i64 = sys_mmap(8*8) as *i64; let th3: *i64 = sys_mmap(8*8) as *i64; let u3: *i64 = sys_mmap(8*8) as *i64 82 t3[0]="A Totally Different Cat" as *u8 as i64; th3[0]="/d.jpg" as *u8 as i64; u3[0]="/dcat.mp4" as *u8 as i64 83 let bufd: *u8 = sys_mmap(65536) 84 let lend: i64 = vg_build_file("/tmp/nx_video_d.html" as *u8, "Other Site" as *u8, "Other" as *u8, t3, th3, u3, 1, bufd, 65535) 85 ok = 0; if vg_has(bufd,lend,"A Totally Different Cat" as *u8)==1 { if vg_has(bufd,lend,"Whiskers naps in the sun" as *u8)==0 { ok=1 } } 86 rows=rows+1; pass=pass+vg_row(6, ok, "2nd different gallery, no bleed from the 1st (general, not one-off)" as *u8) 87 88 // R7 (determinism): same data -> byte-identical 89 let buf2: *u8 = sys_mmap(262144) 90 let len2: i64 = vg_build_file("/tmp/nx_video_pets2.html" as *u8, "Nishi Pets -- watch our family pets" as *u8, "Latest pet videos" as *u8, t, th, u, 3, buf2, 262143) 91 ok = vg_eq(buf1, len1, buf2, len2) 92 rows=rows+1; pass=pass+vg_row(7, ok, "deterministic: same data -> byte-identical build (reproducible)" as *u8) 93 94 vg_w("NX-SITEGEN-VIDEO-GATE rows=" as *u8); vg_num(rows); vg_w(" pass=" as *u8); vg_num(pass); vg_w("\n" as *u8) 95 if pass == rows { 96 let line: *u8 = sys_mmap(256) 97 var off: i64 = vg_cat(line, 0, "CMSGATE row=nx_sitegen_video site-builder-video rows=" as *u8) 98 off = vg_catnum(line, off, rows); off = vg_cat(line, off, " pass=" as *u8); off = vg_catnum(line, off, pass) 99 off = vg_cat(line, off, " verdict=PASS\n" as *u8) 100 let gf: i64 = sys_openat_append("knowledge/status/cms_gate.log" as *u8, 0x1a4) 101 if gf >= 0 { sys_write(gf, line, off); sys_close(gf) } 102 vg_w("NX-SITEGEN-VIDEO-GATE verdict=PASS -- video-gallery page type recorded in cms_gate.log\n" as *u8) 103 sys_exit(0); return 0 104 } 105 vg_w("NX-SITEGEN-VIDEO-GATE verdict=FAIL -- NOT recorded (no fake-green)\n" as *u8) 106 sys_exit(1); return 1 107}