nx_site_chrome_body_gate_t138.nx source
↩ module page · 80 lines · 6845 B
1// nx_site_chrome_search_gate_t53.nx -- Validates and processes shared surface navigation data with HTML escaping and route checks.
2import "nx_site_chrome_body_t138.nx"
3import "nx_gate_verdict.nx"
4func t48_len(p:*u8)->i64 {var n:i64=0;while p[n]!=(0 as u8) {n=n+1};return n}
5func t48_has(p:*u8,n:i64,t:*u8)->i64 {let m:i64=t48_len(t);var i:i64=0;while i+m<=n {var j:i64=0;while j<m {if p[i+j]!=t[j] {break};j=j+1};if j==m {return 1};i=i+1};return 0}
6func main()->i64 {
7 let c:*i64=gv_ctr();let sz:*i64=sys_mmap(16) as *i64
8 let registry:*u8=sys_read_file("/volume1/homes/elderwesto/nishihost/surfaces.reg" as *u8,sz)
9 gv_check("actual shared surface registry read" as *u8,(registry as i64)>0&&sz[0]>0,c)
10 if (registry as i64)<=0||sz[0]<=0 {return 3}
11 let out:*u8=sys_mmap(65537);out[65536]=173 as u8
12 let n:i64=sc_nav_buffer(out,0,65536,registry,sz[0])
13 gv_check("shared navigation composes into bounded destination" as *u8,n>0&&n<65536,c)
14 gv_check("navigation keeps adjacent guard" as *u8,out[65536]==(173 as u8),c)
15 let exact:*u8=sys_mmap(n+1);exact[n]=173 as u8
16 let actual:i64=sc_nav_buffer(exact,0,n,registry,sz[0])
17 gv_check("exact destination succeeds without terminator overrun" as *u8,actual==n&&exact[n]==(173 as u8),c)
18 var same:i64=1;var i:i64=0;while i<n {if exact[i]!=out[i] {same=0};i=i+1}
19 gv_check("repeat emits byte-identical shared component" as *u8,same==1,c)
20 let short:*u8=sys_mmap(n+1);short[n-1]=173 as u8
21 gv_check("short destination refused" as *u8,sc_nav_buffer(short,0,n-1,registry,sz[0])<0,c)
22 gv_check("short destination never crosses boundary" as *u8,short[n-1]==(173 as u8),c)
23 gv_check("invalid starting offset refused" as *u8,sc_nav_buffer(short,n+1,n,registry,sz[0])<0,c)
24
25 let fieldout:*u8=sys_mmap(9);fieldout[8]=173 as u8
26 gv_check("oversize field refuses before copy" as *u8,sc_field("123456789" as *u8,0,9,0,fieldout,8)<0&&fieldout[8]==(173 as u8),c)
27 gv_check("exact field retains terminator and guard" as *u8,sc_field("1234567" as *u8,0,7,0,fieldout,8)==7&&fieldout[7]==(0 as u8)&&fieldout[8]==(173 as u8),c)
28 let invalid:*u8="/x|Play||x|public|1|desc" as *u8
29 gv_check("missing title refused without output" as *u8,sc_nav_buffer(out,0,65536,invalid,t48_len(invalid))<0,c)
30 gv_check("external scheme refused" as *u8,sc_route_ok("javascript:alert(1)" as *u8)==0,c)
31 gv_check("network relative route refused" as *u8,sc_route_ok("//evil.test" as *u8)==0,c)
32 gv_check("internal route accepted" as *u8,sc_route_ok("/beta/beach?x=1&y=2" as *u8)==1,c)
33 var esc:SiteChromeSink;esc.fd=-1;esc.data=out;esc.pos=0;esc.capacity=65536;esc.failed=0
34 sc_escape(&esc,"<&>" as *u8);out[esc.pos]=0 as u8
35 gv_check("HTML text escaped" as *u8,streq(out,"<&>" as *u8)==1,c)
36 gv_check("invalid output descriptor propagated" as *u8,mark_svg(999999)!=0&&css_nav(999999)!=0,c)
37
38
39 let longrow:*u8=sys_mmap(2048);let prefix:*u8="/x|Play|";var k:i64=0
40 while k<8 {longrow[k]=prefix[k];k=k+1};while k<264 {longrow[k]=65 as u8;k=k+1}
41 let suffix:*u8="|x|public|1|desc";var q:i64=0;while suffix[q]!=(0 as u8) {longrow[k]=suffix[q];k=k+1;q=q+1}
42 out[0]=173 as u8
43 gv_check("long registry title refused before output" as *u8,sc_nav_buffer(out,0,65536,longrow,k)<0&&out[0]==(173 as u8),c)
44 let inj:*u8="/x?a=1&b=2|Play|<title>|x|public|1|<desc>" as *u8
45 let safe:i64=sc_nav_buffer(out,0,65536,inj,t48_len(inj))
46 gv_check("actual registry href and text escaped" as *u8,safe>0&&t48_has(out,safe,"/x?a=1&b=2" as *u8)==1&&t48_has(out,safe,"<title>" as *u8)==1&&t48_has(out,safe,"<desc>" as *u8)==1,c)
47 gv_check("native details has no singleton checkbox" as *u8,t48_has(out,safe,"<details" as *u8)==1&&t48_has(out,safe,"nxtgl" as *u8)==0,c)
48 let malformed:*u8="/x|Other|Title|x|public|1|desc" as *u8
49 gv_check("unknown section refused" as *u8,sc_registry_ok(malformed,t48_len(malformed))==0,c)
50
51 let crlf:*u8="/x|Play|Title|x|public|1|desc\r\n" as *u8
52 gv_check("CRLF registry accepted" as *u8,sc_registry_ok(crlf,t48_len(crlf))==1,c)
53 let legacy:*u8=sys_mmap(512)
54 gv_check("legacy five argument field remains callable" as *u8,field(crlf,0,t48_len(crlf)-1,0,legacy)==2&&streq(legacy,"/x" as *u8)==1,c)
55 let crn:i64=sc_nav_buffer(out,0,65536,crlf,t48_len(crlf))
56 gv_check("CSS separator is real newline" as *u8,crn>0&&t48_has(out,crn,"}\\n.nxgrp" as *u8)==0&&t48_has(out,crn,"}\n.nxgrp" as *u8)==1,c)
57
58 let searchn:i64=sc_nav_buffer(out,0,65536,registry,sz[0])
59 gv_check("shared navigation emits Nishi Search form" as *u8,searchn>0&&t48_has(out,searchn,"Nishi Search" as *u8)==1&&t48_has(out,searchn,"role=" as *u8)==1,c)
60 gv_check("hardcoded four-link bar absent" as *u8,t48_has(out,searchn,"nxlinks" as *u8)==0,c)
61 gv_check("browse remains explicitly discoverable" as *u8,t48_has(out,searchn,">Browse</summary>" as *u8)==1&&t48_has(out,searchn,"/compare" as *u8)==1&&t48_has(out,searchn,"/gallery" as *u8)==1&&t48_has(out,searchn,"/library" as *u8)==1&&t48_has(out,searchn,"/research" as *u8)==1,c)
62 gv_check("menu border box stays inside available height" as *u8,t48_has(out,searchn,".nxpanel{box-sizing:border-box;" as *u8)==1,c)
63 gv_check("zero available space also removes vertical padding" as *u8,t48_has(out,searchn,"padding:min(8px,calc(var(--nx-menu-height,50dvh)/2)) 8px" as *u8)==1,c)
64 let fd:i64=sys_openat_wr("/tmp/nishi-search-navigation-compat-t138.html" as *u8,420)
65 gv_check("private nav output writable" as *u8,fd>=0,c)
66 if fd>=0 {let wrote:i64=sys_write(fd,out,searchn);sys_close(fd);gv_check("actual nav output retained" as *u8,wrote==searchn,c)}
67 gv_check("both equality APIs accept two empty strings",streq("","")==1&&sc_text_equal("","")==1,c)
68 gv_check("both equality APIs reject empty versus nonempty",streq("","a")==0&&sc_text_equal("","a")==0,c)
69 gv_check("both equality APIs reject nonempty versus empty",streq("a","")==0&&sc_text_equal("a","")==0,c)
70 gv_check("both equality APIs accept exact bytes",streq("beach","beach")==1&&sc_text_equal("beach","beach")==1,c)
71 gv_check("both equality APIs reject shorter prefix",streq("beach","beaches")==0&&sc_text_equal("beach","beaches")==0,c)
72 gv_check("both equality APIs reject longer prefix",streq("beaches","beach")==0&&sc_text_equal("beaches","beach")==0,c)
73 gv_check("both equality APIs reject first differing byte",streq("reach","beach")==0&&sc_text_equal("reach","beach")==0,c)
74 gv_check("both equality APIs reject late differing byte",streq("beach","beack")==0&&sc_text_equal("beach","beack")==0,c)
75 let nul_a:*u8=sys_mmap(4);let nul_b:*u8=sys_mmap(4)
76 nul_a[0]=97 as u8;nul_a[1]=0 as u8;nul_a[2]=98 as u8;nul_a[3]=0 as u8
77 nul_b[0]=97 as u8;nul_b[1]=0 as u8;nul_b[2]=99 as u8;nul_b[3]=0 as u8
78 gv_check("both APIs stop at terminator despite different trailing bytes",streq(nul_a,nul_b)==1&&sc_text_equal(nul_a,nul_b)==1,c)
79 return gv_verdict("SITE-CHROME-COMPOSABLE",c,"Private shared foundation seam; no browser or page adoption")
80}