code wiki / _hdl_build / nx_manga_get_gate.nx
nx_manga_get_gate.nx source
↩ module page · 135 lines · 9541 B
1import "nx_gate_grow.nx"
2import "nx_gate_gn.nx"
3import "nx_gate_read.nx"
4// nx_manga_get_gate.nx -- SOVEREIGN in-process referee for the R2a manga downloader's PURE logic (no network:
5// the TLS fetch is proven by nx_https_fetch_follow + the researcher; here we prove the extraction + assembly +
6// personal-area landing deterministically). chdir /tmp.
7// T1 mg_ext_from_url: .jpg/.jpeg/.png/.webp, ?query stripped, no-ext -> default .jpg, weird-ext -> .jpg
8// T2 mg_page_name: 3-digit zero-pad (page000/page007/page123)
9// T3 mg_img_magic_ok: JPEG/PNG/GIF/RIFF accepted; HTML "<htm" rejected (no-fake-green guard)
10// T4 nx_html_extract_imgs integration: a synthetic gallery HTML with 3 <img> (rel + abs) -> 3 URLs, resolved
11// absolute against the base
12// T5 mg_write_cbx: given 2 pages -> cbx.json has npages:2 + page000.jpg + page001.png (the reader manifest)
13// T6 end-to-end assembly WITHOUT network: place 2 real image files in the personal dir, write cbx.json,
14// rl_add_personal -> the book is in user A's private index and NOT user B's (privacy preserved through download)
15// GREEN iff 6/6. license_tier: ORIGINAL expect_exit: 0
16import "nx_syscalls.nx"
17import "nx_manga_get.nx" // mg_* under test (+ rl_*/zs_* transitively)
18
19func gw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
20func g_has(hay: *u8, n: i64, needle: *u8) -> i64 {
21 var nn: i64 = 0; while needle[nn] != (0 as u8) { nn = nn + 1 }
22 if nn == 0 { return 0 }
23 var i: i64 = 0
24 while i + nn <= n { var m: i64 = 1; var j: i64 = 0; while j < nn { if (hay[i + j] as i64) != (needle[j] as i64) { m = 0; j = nn } else { j = j + 1 } } if m == 1 { return 1 } i = i + 1 }
25 return 0
26}
27func g_streq(a: *u8, b: *u8) -> i64 { var i: i64=0; while a[i]!=(0 as u8){ if a[i]!=b[i]{return 0} i=i+1 } if b[i]==(0 as u8){return 1} return 0 }
28func g_mkdir(path: *u8) -> i64 { __syscall(258, 0 - 100, path as i64, 0x1ed, 0, 0, 0); return 0 }
29func g_unlink(path: *u8) -> i64 { __syscall(263, 0 - 100, path, 0, 0, 0, 0); return 0 }
30func g_wr(path: *u8, s: *u8, n: i64) -> i64 { let fd: i64 = sys_openat_wr(path, 0x1a4); if fd >= 0 { sys_write(fd, s, n); sys_close(fd) } return 0 }
31
32func main() -> i64 {
33 gw("manga-get SOVEREIGN gate (pure extraction + assembly + personal-area landing; network path = proven fetch primitive)\n" as *u8)
34 if sys_chdir("/tmp" as *u8) != 0 { gw("CHDIR /tmp FAIL\n" as *u8); sys_exit(1) }
35 g_mkdir("knowledge" as *u8); g_mkdir("knowledge/staging" as *u8); g_mkdir("knowledge/staging/media" as *u8); g_mkdir("knowledge/staging/media/reader" as *u8)
36 var pass: i64 = 0
37 let e: *u8 = sys_mmap(16)
38
39 // ---- T1 ext ----
40 var t1: i64 = 1
41 mg_ext_from_url("https://x.com/a/b/img.jpg" as *u8, e); if g_streq(e, ".jpg" as *u8) == 0 { t1 = 0 }
42 mg_ext_from_url("https://x.com/p.PNG?w=800&sig=zz" as *u8, e); if g_streq(e, ".png" as *u8) == 0 { t1 = 0 }
43 mg_ext_from_url("https://x.com/scan.webp#frag" as *u8, e); if g_streq(e, ".webp" as *u8) == 0 { t1 = 0 }
44 mg_ext_from_url("https://x.com/page.jpeg" as *u8, e); if g_streq(e, ".jpeg" as *u8) == 0 { t1 = 0 }
45 mg_ext_from_url("https://x.com/noext" as *u8, e); if g_streq(e, ".jpg" as *u8) == 0 { t1 = 0 }
46 mg_ext_from_url("https://x.com/weird.tar.gz" as *u8, e); if g_streq(e, ".jpg" as *u8) == 0 { t1 = 0 }
47 pass = pass + grow("T1 mg_ext_from_url: jpg/png/webp/jpeg + query-strip + default\x00" as *u8, t1)
48
49 // ---- T2 page name ----
50 let pn: *u8 = sys_mmap(64)
51 var t2: i64 = 1
52 mg_page_name(0, ".jpg" as *u8, pn); if g_streq(pn, "page000.jpg" as *u8) == 0 { t2 = 0 }
53 mg_page_name(7, ".png" as *u8, pn); if g_streq(pn, "page007.png" as *u8) == 0 { t2 = 0 }
54 mg_page_name(123, ".webp" as *u8, pn); if g_streq(pn, "page123.webp" as *u8) == 0 { t2 = 0 }
55 pass = pass + grow("T2 mg_page_name: 3-digit zero-pad\x00" as *u8, t2)
56
57 // ---- T3 COMPLETENESS guard (valid FULL file: header+trailer+size; truncated/blank/HTML rejected) ----
58 // a COMPLETE JPEG: ff d8 ... ff d9, >= MG_MIN_BYTES(1024)
59 let good: *u8 = sys_mmap(4096); good[0]=0xff as u8; good[1]=0xd8 as u8
60 var gi: i64 = 2; while gi < 2046 { good[gi] = (gi % 256) as u8; gi = gi + 1 } good[2046]=0xff as u8; good[2047]=0xd9 as u8
61 // a TRUNCATED JPEG: valid header, NO ff d9 trailer (cut off)
62 let trunc: *u8 = sys_mmap(4096); trunc[0]=0xff as u8; trunc[1]=0xd8 as u8
63 var ti: i64 = 2; while ti < 2048 { trunc[ti] = (ti % 256) as u8; ti = ti + 1 }
64 // a BLANK/tiny file (valid header+trailer but under the size floor)
65 let tiny: *u8 = sys_mmap(64); tiny[0]=0xff as u8; tiny[1]=0xd8 as u8; tiny[2]=0xff as u8; tiny[3]=0xd9 as u8
66 // an HTML error page
67 let hm: *u8 = sys_mmap(4096); hm[0]=0x3c as u8; hm[1]=0x68 as u8; hm[2]=0x74 as u8; hm[3]=0x6d as u8
68 var hi: i64 = 4; while hi < 2048 { hm[hi] = 65 as u8; hi = hi + 1 }
69 var t3: i64 = 0
70 if mg_img_complete(good, 2048) == 1 { if mg_img_complete(trunc, 2048) == 0 { if mg_img_complete(tiny, 4) == 0 { if mg_img_complete(hm, 2048) == 0 { t3 = 1 } } } }
71 pass = pass + grow("T3 mg_img_complete: full-JPEG ok; TRUNCATED/BLANK/HTML rejected (valid-full-file guarantee)\x00" as *u8, t3)
72
73 // ---- T4 extract from synthetic HTML ----
74 let html: *u8 = "<html><body><img src=\"/scans/p1.jpg\"><p>x</p><img src=\"p2.png\"><img src=\"https://cdn.example.com/p3.webp\"></body></html>" as *u8
75 var hl: i64 = 0; while html[hl] != (0 as u8) { hl = hl + 1 }
76 let base: *u8 = "https://example.com/manga/ch1/" as *u8
77 var bl: i64 = 0; while base[bl] != (0 as u8) { bl = bl + 1 }
78 let ub: *u8 = sys_mmap(65536)
79 let offs: *i64 = sys_mmap(8 * 64) as *i64
80 let lens: *i64 = sys_mmap(8 * 64) as *i64
81 let ni: i64 = nx_html_extract_imgs(html, hl, base, bl, ub, 65536, offs, lens, 64)
82 var t4: i64 = 0
83 if ni == 3 {
84 // reconstruct each url NUL-terminated + check resolution
85 let u0: *u8 = sys_mmap(512); var k: i64 = 0; while k < lens[0] { u0[k] = ub[offs[0]+k]; k = k + 1 } u0[lens[0]] = 0 as u8
86 let u2: *u8 = sys_mmap(512); k = 0; while k < lens[2] { u2[k] = ub[offs[2]+k]; k = k + 1 } u2[lens[2]] = 0 as u8
87 gw(" img0=" as *u8); gw(u0); gw(" img2=" as *u8); gw(u2); gw("\n" as *u8)
88 // /scans/p1.jpg resolves against host root; p3 is already absolute
89 if g_streq(u0, "https://example.com/scans/p1.jpg" as *u8) == 1 { if g_streq(u2, "https://cdn.example.com/p3.webp" as *u8) == 1 { t4 = 1 } }
90 }
91 pass = pass + grow("T4 nx_html_extract_imgs: 3 imgs, resolved absolute (rel-root + abs)\x00" as *u8, t4)
92
93 // ---- T5 cbx.json ----
94 g_mkdir("knowledge/staging/media/reader/mgtest" as *u8)
95 let exts: *i64 = sys_mmap(8 * 4) as *i64
96 exts[0] = ".jpg" as *u8 as i64
97 exts[1] = ".png" as *u8 as i64
98 mg_write_cbx("knowledge/staging/media/reader/mgtest" as *u8, "Test Gallery" as *u8, 2, exts)
99 let cb: *u8 = sys_mmap(4096)
100 let cn: i64 = g_read("knowledge/staging/media/reader/mgtest/cbx.json" as *u8, cb, 4096)
101 var t5: i64 = 0
102 if cn > 0 { if g_has(cb, cn, "\"npages\":2" as *u8) == 1 { if g_has(cb, cn, "page000.jpg" as *u8) == 1 { if g_has(cb, cn, "page001.png" as *u8) == 1 { if g_has(cb, cn, "\"title\":\"Test Gallery\"" as *u8) == 1 { t5 = 1 } } } } }
103 pass = pass + grow("T5 mg_write_cbx: reader manifest npages:2 + page000.jpg + page001.png\x00" as *u8, t5)
104
105 // ---- T6 end-to-end assembly into a PERSONAL area (no network) ----
106 let kA: *u8 = "elder_dd55ee66" as *u8
107 let kB: *u8 = "kelli_ff77aa88" as *u8
108 g_unlink("knowledge/staging/media/idx_book_personal_elder_dd55ee66.wsl" as *u8)
109 let pd: *u8 = sys_mmap(1024); rl_personal_slug_dir(kA, "downloaded_manga" as *u8, pd) // reader/u_<kA>_downloaded_manga
110 g_mkdir(pd)
111 // place 2 real image files + cbx
112 let pgp: *u8 = sys_mmap(1024)
113 var o: i64 = 0; while pd[o] != (0 as u8) { pgp[o] = pd[o]; o = o + 1 }
114 let jbytes: *u8 = sys_mmap(8); jbytes[0]=0xff as u8; jbytes[1]=0xd8 as u8; jbytes[2]=0xff as u8; jbytes[3]=0xe0 as u8
115 let p0: *u8 = sys_mmap(1024); var q: i64 = 0; while pd[q] != (0 as u8) { p0[q] = pd[q]; q = q + 1 } p0[q]=47 as u8; q=q+1; let f0: *u8="page000.jpg\x00" as *u8; var z: i64=0; while f0[z]!=(0 as u8){p0[q]=f0[z]; q=q+1; z=z+1} p0[q]=0 as u8
116 g_wr(p0, jbytes, 4)
117 let exts2: *i64 = sys_mmap(8) as *i64; exts2[0] = ".jpg" as *u8 as i64
118 mg_write_cbx(pd, "Downloaded Manga" as *u8, 1, exts2)
119 let addr: i64 = rl_add_personal(kA, "downloaded_manga" as *u8, "Downloaded Manga" as *u8, 16)
120 var t6: i64 = 0
121 if addr == 1 {
122 let la: *u8 = sys_mmap(4096); let lan: i64 = rl_list_personal_json(kA, la, 4096)
123 let lb: *u8 = sys_mmap(4096); let lbn: i64 = rl_list_personal_json(kB, lb, 4096)
124 if g_has(la, lan, "downloaded_manga" as *u8) == 1 { if g_has(lb, lbn, "downloaded_manga" as *u8) == 0 {
125 if rl_may_access(kA, "reader/u_elder_dd55ee66_downloaded_manga/page000.jpg" as *u8) == 1 {
126 if rl_may_access(kB, "reader/u_elder_dd55ee66_downloaded_manga/page000.jpg" as *u8) == 0 { t6 = 1 }
127 }
128 } }
129 }
130 pass = pass + grow("T6 end-to-end: pages+cbx land in A's PRIVATE area, registered, isolated from B\x00" as *u8, t6)
131
132 gw("pass=" as *u8); gn(pass); gw("/6\n" as *u8)
133 if pass == 6 { gw("verdict=GREEN (R2a downloader: extract+resolve+ext+magic-guard+cbx-assembly + lands in the private area, isolation preserved)\n" as *u8); sys_exit(0); return 0 }
134 gw("verdict=RED\n" as *u8); sys_exit(1); return 1
135}