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}