code wiki / _hdl_build / nx_gallery_serve_tamper.nx

nx_gallery_serve_tamper.nx source

↩ module page · 298 lines · 16552 B

1// GENERATED BY nx_eg (generalized emitter-of-emitters) -- control flow synthesized from a structural DATA spec, compiled by nx_cc. license_tier: ORIGINAL 2import "nx_syscalls.nx" 3import "nx_seg_store.nx" 4import "nx_canon_cid.nx" 5const K_MAGIC_8192: i64 = 8192 6const K_MAGIC_4194304: i64 = 4194304 7const K_MAGIC_18091: i64 = 18091 8func eh_find(buf: *u8, n: i64, pat: *u8, plen: i64) -> i64 { 9 var i: i64 = 0 10 while i + plen <= n { 11 var j: i64 = 0 12 var ok: i64 = 1 13 while j < plen { 14 if buf[i+j] != pat[j] { ok = 0 } 15 j = j + 1 16 } 17 if ok == 1 { return 1 } 18 i = i + 1 19 } 20 return 0 21} 22func gs_cat(dst: *u8, off: i64, s: *u8) -> i64 { 23 var i: i64 = 0 24 while s[i] != (0 as u8) { dst[off+i] = s[i]; i = i + 1 } 25 return off + i 26} 27func gs_u(dst: *u8, off: i64, v: i64) -> i64 { 28 var m: i64 = v 29 let t: *u8 = sys_mmap(28) 30 var k: i64 = 0 31 if m == 0 { t[0] = 48 as u8; k = 1 } 32 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 33 var o: i64 = off 34 var i: i64 = 0 35 while i < k { dst[o] = t[k-1-i]; o = o + 1; i = i + 1 } 36 return o 37} 38func gs_grid_body(body: *u8, off: i64, prefix: *u8) -> i64 { 39 var o: i64 = off 40 let segs: *i64 = sys_mmap(8 * K_MAGIC_8192) as *i64 41 let ns: i64 = ss_manifest_cap(prefix, segs, K_MAGIC_8192) 42 var s: i64 = 0 43 while s < ns { 44 let path: *u8 = sys_mmap(512) 45 var po: i64 = 0 46 po = gs_cat(path, po, prefix) 47 po = gs_cat(path, po, segs[s] as *u8) 48 po = gs_cat(path, po, ".docs" as *u8) 49 path[po] = 0 as u8 50 let szp: *i64 = sys_mmap(16) as *i64 51 let b: *u8 = sys_read_file(path, szp) 52 let sz: i64 = szp[0] 53 var i: i64 = 0 54 while i + 9 <= sz { 55 let kl: i64 = ss_r32(b, i + 1) 56 let koff: i64 = i + 5 57 let vl: i64 = ss_r32(b, koff + kl) 58 let voff: i64 = koff + kl + 4 59 var isimg: i64 = 0 60 if kl == 73 { 61 isimg = 1 62 if b[koff] != (105 as u8) { isimg = 0 } 63 if b[koff+1] != (109 as u8) { isimg = 0 } 64 if b[koff+2] != (103 as u8) { isimg = 0 } 65 if b[koff+3] != (58 as u8) { isimg = 0 } 66 } 67 if isimg == 1 { 68 o = gs_cat(body, o, "<a class=\"cell\" href=\"/img/" as *u8) 69 var c: i64 = 0 70 while c < 69 { body[o] = b[koff + 4 + c]; o = o + 1; c = c + 1 } 71 o = gs_cat(body, o, "\"><img loading=lazy src=\"/img/" as *u8) 72 c = 0 73 while c < 69 { body[o] = b[koff + 4 + c]; o = o + 1; c = c + 1 } 74 o = gs_cat(body, o, "\" width=\"160\"><div>" as *u8) 75 c = 0 76 while c < 69 { body[o] = b[koff + 4 + c]; o = o + 1; c = c + 1 } 77 o = gs_cat(body, o, "</div></a>\n" as *u8) 78 } 79 i = voff + vl 80 } 81 s = s + 1 82 } 83 return o 84} 85func gs_grid(rbuf: *u8, prefix: *u8) -> i64 { 86 let body: *u8 = sys_mmap(K_MAGIC_4194304) 87 var bo: i64 = 0 88 bo = gs_cat(body, bo, "<!doctype html><meta charset=utf-8><title>Nishi Gallery</title><style>:root{--bg:#0b0d10;--fg:#e6e8eb;--mut:#8b929c;--card:#15181d;--acc:#5b9dff;--bd:#222831}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--fg);font:14px/1.5 Inter,system-ui,sans-serif}h1{font-size:18px;font-weight:600;padding:14px 20px;margin:0;position:sticky;top:0;background:rgba(11,13,16,.92);border-bottom:1px solid var(--bd);z-index:5}h1 .count{font-size:12px;color:var(--mut);font-weight:400;margin-left:12px}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px;padding:16px}.cell{position:relative;display:block;border-radius:10px;overflow:hidden;background:var(--card);border:1px solid var(--bd);cursor:pointer;aspect-ratio:1;transition:transform .12s,border-color .12s}.cell:hover{transform:translateY(-2px);border-color:var(--acc)}.cell img{width:100%;height:100%;object-fit:cover;display:block}.cell>div{display:none}#lb{position:fixed;inset:0;background:rgba(0,0,0,.93);display:none;z-index:50}#lb.on{display:grid;grid-template-columns:1fr 340px}#lbimg{display:flex;align-items:center;justify-content:center;padding:24px;overflow:hidden}#lbimg img{max-width:100%;max-height:100%;object-fit:contain;border-radius:8px}#lbside{background:var(--card);border-left:1px solid var(--bd);padding:22px;overflow:auto}#lbside h2{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--mut);margin:18px 0 8px}#lbside h2:first-child{margin-top:0}.fac{font-size:12px;display:flex;justify-content:space-between;gap:12px;padding:5px 0;border-bottom:1px solid var(--bd)}.fac b{color:var(--mut);font-weight:500;white-space:nowrap}.fac span{text-align:right;word-break:break-word}#rng{width:100%;margin:6px 0}#rval{font-size:26px;font-weight:700;color:var(--acc)}#rbtn{width:100%;background:var(--acc);color:#06101f;border:0;border-radius:8px;padding:11px;font-weight:600;cursor:pointer;margin-top:8px}#rmsg{font-size:12px;color:#5ad08a;min-height:16px;margin-top:6px}#lbx{position:absolute;top:12px;right:16px;color:#fff;font-size:30px;cursor:pointer;opacity:.7;z-index:60}#lbx:hover{opacity:1}.nav{position:absolute;top:50%;transform:translateY(-50%);font-size:44px;color:#fff;opacity:.45;cursor:pointer;padding:16px;user-select:none;z-index:60}.nav:hover{opacity:1}#pv{left:6px}#nx{right:348px}</style><body><h1>Nishi Gallery</h1><div class=grid>\n" as *u8) 89 bo = gs_grid_body(body, bo, prefix) 90 bo = gs_cat(body, bo, "</div><script>(function(){var g=document.querySelector('.grid');if(!g)return;var cells=[].slice.call(g.querySelectorAll('.cell'));var cids=cells.map(function(c){return c.getAttribute('href').replace('/img/','')});var i=-1;var lb=document.createElement('div');lb.id='lb';lb.innerHTML='<div id=lbimg><img id=lbi></div><span id=lbx>&times;</span><span class=nav id=pv>&#8249;</span><span class=nav id=nx>&#8250;</span><div id=lbside><h2>Generation factors</h2><div id=fac></div><h2>Rate this image</h2><div id=rval>500</div><input type=range min=0 max=1000 value=500 id=rng><button id=rbtn>Submit rating</button><div id=rmsg></div></div>';document.body.appendChild(lb);var lbi=document.getElementById('lbi'),fac=document.getElementById('fac'),rng=document.getElementById('rng'),rval=document.getElementById('rval'),rmsg=document.getElementById('rmsg');function esc(s){return String(s).replace(/[<]/g,'&lt;')}function show(n){i=n;var cid=cids[i];lbi.src='/img/'+cid;lb.classList.add('on');rmsg.textContent='';rng.value=500;rval.textContent='500';fac.innerHTML='<div class=fac><b>loading</b></div>';fetch('/meta/'+cid).then(function(r){return r.json()}).then(function(m){var k=Object.keys(m);fac.innerHTML=k.length?k.map(function(x){return '<div class=fac><b>'+esc(x)+'</b><span>'+esc(m[x])+'</span></div>'}).join(''):'<div class=fac><b>no factors</b></div>'}).catch(function(){fac.innerHTML='<div class=fac><b>factors unavailable</b></div>'})}function hide(){lb.classList.remove('on');i=-1}g.addEventListener('click',function(e){var a=e.target.closest('.cell');if(a){e.preventDefault();show(cells.indexOf(a))}});document.getElementById('lbx').onclick=hide;document.getElementById('pv').onclick=function(){if(i>0)show(i-1)};document.getElementById('nx').onclick=function(){if(i<cids.length-1)show(i+1)};rng.oninput=function(){rval.textContent=rng.value};document.getElementById('rbtn').onclick=function(){var cid=cids[i];fetch('/rate',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'img='+cid+'&score='+rng.value}).then(function(r){rmsg.textContent=r.ok?'Saved - score '+rng.value:'Error '+r.status}).catch(function(){rmsg.textContent='Network error'})};document.addEventListener('keydown',function(e){if(i<0)return;if(e.key==='Escape')hide();else if(e.key==='ArrowLeft'&&i>0)show(i-1);else if(e.key==='ArrowRight'&&i<cids.length-1)show(i+1)});var h=document.querySelector('h1');if(h){var s=document.createElement('span');s.className='count';s.textContent=cids.length+' images';h.appendChild(s)}})();</script></body>" as *u8) 91 var o: i64 = 0 92 o = gs_cat(rbuf, o, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: " as *u8) 93 o = gs_u(rbuf, o, bo) 94 o = gs_cat(rbuf, o, "\r\nConnection: close\r\n\r\n" as *u8) 95 var i: i64 = 0 96 while i < bo { rbuf[o] = body[i]; o = o + 1; i = i + 1 } 97 return o 98} 99func gs_peel_cid(req: *u8, rn: i64, cidout: *u8) -> i64 { 100 let pat: *u8 = "GET /img/" as *u8 101 var i: i64 = 0 102 var at: i64 = 0 - 1 103 while i + 9 <= rn { 104 var j: i64 = 0 105 var ok: i64 = 1 106 while j < 9 { if req[i+j] != pat[j] { ok = 0 } j = j + 1 } 107 if ok == 1 { if at < 0 { at = i + 9 } } 108 i = i + 1 109 } 110 if at < 0 { return 0 } 111 var c: i64 = 0 112 while c < 69 { cidout[c] = req[at + c]; c = c + 1 } 113 cidout[69] = 0 as u8 114 return 1 115} 116func gs_sidecar(cid: *u8, pathout: *u8) -> i64 { 117 let szp: *i64 = sys_mmap(16) as *i64 118 let b: *u8 = sys_read_file("knowledge/status/galx_cid_paths.tsv" as *u8, szp) 119 let sz: i64 = szp[0] 120 if (b as i64) == 0 { return 0 } 121 var i: i64 = 0 122 var ls: i64 = 0 123 while i < sz { 124 if b[i] == (10 as u8) { 125 var eq: i64 = 1 126 var k: i64 = 0 127 while k < 69 { if b[ls + k] != cid[k] { eq = 0 } k = k + 1 } 128 if b[ls + 69] != (9 as u8) { eq = 0 } 129 if eq == 1 { 130 var po: i64 = 0 131 var p: i64 = ls + 70 132 while p < i { pathout[po] = b[p]; po = po + 1; p = p + 1 } 133 pathout[po] = 0 as u8 134 return 1 135 } 136 ls = i + 1 137 } 138 i = i + 1 139 } 140 return 0 141} 142func gs_serve_png(rbuf: *u8, req: *u8, rn: i64, root: *u8) -> i64 { 143 let cid: *u8 = sys_mmap(96) 144 let havec: i64 = gs_peel_cid(req, rn, cid) 145 if havec == 0 { return gs_cat(rbuf, 0, "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 9\r\nConnection: close\r\n\r\nnot found" as *u8) } 146 let path: *u8 = sys_mmap(512) 147 let havep: i64 = gs_sidecar(cid, path) 148 if havep == 0 { return gs_cat(rbuf, 0, "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 9\r\nConnection: close\r\n\r\nnot found" as *u8) } 149 let szp: *i64 = sys_mmap(16) as *i64 150 let png: *u8 = sys_read_file(path, szp) 151 let plen: i64 = szp[0] 152 if (png as i64) == 0 { return gs_cat(rbuf, 0, "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 9\r\nConnection: close\r\n\r\nnot found" as *u8) } 153 var o: i64 = 0 154 o = gs_cat(rbuf, o, "HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nContent-Length: " as *u8) 155 o = gs_u(rbuf, o, plen) 156 o = gs_cat(rbuf, o, "\r\nConnection: close\r\n\r\n" as *u8) 157 var i: i64 = 0 158 while i < plen { rbuf[o] = png[i]; o = o + 1; i = i + 1 } 159 return o 160} 161func gs_rate(rbuf: *u8, req: *u8, rn: i64) -> i64 { 162 // same-origin: must carry our own Host. A cross-site form post carries a foreign Origin: header. 163 let okhost: i64 = eh_find(req, rn, "Host: 127.0.0.1:18090" as *u8, 21) 164 if okhost != 1 { return gs_cat(rbuf, 0, "HTTP/1.1 403 Forbidden\r\nContent-Type: text/plain\r\nContent-Length: 9\r\nConnection: close\r\n\r\nforbidden" as *u8) } 165 // reject any foreign Origin (cross-origin attacker sets Origin to their site). Only our own Origin or none is allowed. 166 let hasorigin: i64 = eh_find(req, rn, "Origin: " as *u8, 8) 167 let okorigin: i64 = eh_find(req, rn, "Origin: http://127.0.0.1:18090" as *u8, 30) 168 var crossorigin: i64 = 0 169 if hasorigin == 1 { crossorigin = 1 } 170 if okorigin == 1 { crossorigin = 0 } 171 if crossorigin == 1 { return gs_cat(rbuf, 0, "HTTP/1.1 403 Forbidden\r\nContent-Type: text/plain\r\nContent-Length: 9\r\nConnection: close\r\n\r\nforbidden" as *u8) } 172 // locate the body (after the blank line CRLFCRLF) 173 var i: i64 = 0 174 var bodyat: i64 = 0 - 1 175 while i + 4 <= rn { 176 var ok: i64 = 1 177 if req[i] != (13 as u8) { ok = 0 } 178 if req[i+1] != (10 as u8) { ok = 0 } 179 if req[i+2] != (13 as u8) { ok = 0 } 180 if req[i+3] != (10 as u8) { ok = 0 } 181 if ok == 1 { if bodyat < 0 { bodyat = i + 4 } } 182 i = i + 1 183 } 184 if bodyat < 0 { return gs_cat(rbuf, 0, "HTTP/1.1 400 Bad Request\r\nContent-Type: text/plain\r\nContent-Length: 3\r\nConnection: close\r\n\r\nbad" as *u8) } 185 // locate "img=" in the body, then copy the value up to '&' or end. 186 let img: *u8 = sys_mmap(128) 187 var im: i64 = 0 188 var iat: i64 = 0 - 1 189 var pi: i64 = bodyat 190 while pi + 4 <= rn { 191 var oki: i64 = 1 192 if req[pi] != (105 as u8) { oki = 0 } 193 if req[pi+1] != (109 as u8) { oki = 0 } 194 if req[pi+2] != (103 as u8) { oki = 0 } 195 if req[pi+3] != (61 as u8) { oki = 0 } 196 if oki == 1 { if iat < 0 { iat = pi + 4 } } 197 pi = pi + 1 198 } 199 if iat >= 0 { 200 var p: i64 = iat 201 var go: i64 = 1 202 while p < rn { if go == 1 { if req[p] == (38 as u8) { go = 0 } else { img[im] = req[p]; im = im + 1 } } p = p + 1 } 203 } 204 img[im] = 0 as u8 205 // locate "score=" in the body, then copy the digits. 206 let score: *u8 = sys_mmap(32) 207 var sm: i64 = 0 208 var sat: i64 = 0 - 1 209 var ps: i64 = bodyat 210 while ps + 6 <= rn { 211 var oks: i64 = 1 212 let sp: *u8 = "score=" as *u8 213 var jj: i64 = 0 214 while jj < 6 { if req[ps+jj] != sp[jj] { oks = 0 } jj = jj + 1 } 215 if oks == 1 { if sat < 0 { sat = ps + 6 } } 216 ps = ps + 1 217 } 218 if sat >= 0 { 219 var q: i64 = sat 220 var god: i64 = 1 221 while q < rn { if god == 1 { if req[q] >= (48 as u8) { if req[q] <= (57 as u8) { score[sm] = req[q]; sm = sm + 1 } else { god = 0 } } else { god = 0 } } q = q + 1 } 222 } 223 score[sm] = 0 as u8 224 // append EXACTLY one EVAL O-line 225 let logfd: i64 = sys_openat_append("knowledge/status/eval_lanes.log" as *u8, 0x1a4) 226 if logfd >= 0 { 227 let line: *u8 = sys_mmap(256) 228 var lo: i64 = 0 229 lo = gs_cat(line, lo, "EVAL img=" as *u8) 230 lo = gs_cat(line, lo, img) 231 lo = gs_cat(line, lo, " lane=O score=" as *u8) 232 lo = gs_cat(line, lo, score) 233 lo = gs_cat(line, lo, "\n" as *u8) 234 sys_write(logfd, line, lo) 235 sys_close(logfd) 236 } 237 return gs_cat(rbuf, 0, "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 5\r\nConnection: close\r\n\r\nrated" as *u8) 238} 239func main() -> i64 { 240 let port: i64 = K_MAGIC_18091 241 let addr: *u8 = sys_mmap(16) 242 addr[0] = 2 as u8 243 addr[1] = 0 as u8 244 addr[2] = ((port >> 8) & 0xff) as u8 245 addr[3] = (port & 0xff) as u8 246 addr[4] = 127 as u8 247 addr[5] = 0 as u8 248 addr[6] = 0 as u8 249 addr[7] = 1 as u8 250 addr[8] = 0 as u8 251 addr[9] = 0 as u8 252 addr[10] = 0 as u8 253 addr[11] = 0 as u8 254 addr[12] = 0 as u8 255 addr[13] = 0 as u8 256 addr[14] = 0 as u8 257 addr[15] = 0 as u8 258 let lfd: i64 = sys_socket(2, 1, 0) 259 if lfd < 0 { return 10 } 260 let optval: *u8 = sys_mmap(4) 261 optval[0] = 1 as u8 262 optval[1] = 0 as u8 263 optval[2] = 0 as u8 264 optval[3] = 0 as u8 265 sys_setsockopt(lfd, 1, 2, optval, 4) 266 let brc: i64 = sys_bind(lfd, addr, 16) 267 if brc < 0 { return 20 } 268 let lrc: i64 = sys_listen(lfd, 16) 269 if lrc < 0 { return 30 } 270 let req: *u8 = sys_mmap(K_MAGIC_8192) 271 let nf404: *u8 = "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 9\r\nConnection: close\r\n\r\nnot found" as *u8 272 var served: i64 = 0 273 while 1 == 1 { 274 let cfd: i64 = sys_accept(lfd) 275 if cfd < 0 { continue } 276 let pid: i64 = sys_fork() 277 if pid == 0 { 278 sys_close(lfd) 279 let rn: i64 = sys_read(cfd, req, K_MAGIC_8192) 280 var rbuf: *u8 = sys_mmap(K_MAGIC_4194304) 281 var rlen: i64 = 0 282 let is_root: i64 = eh_find(req, rn, "XXXXXX" as *u8, 6) 283 if is_root == 1 { rlen = gs_grid(rbuf, "knowledge/store/galx-prod-" as *u8) } 284 let is_img: i64 = eh_find(req, rn, "XXXXXXXXX" as *u8, 9) 285 if is_img == 1 { rlen = gs_serve_png(rbuf, req, rn, "knowledge/store/galx-prod-" as *u8) } 286 let is_rate: i64 = eh_find(req, rn, "XXXXXXXXXX" as *u8, 10) 287 if is_rate == 1 { rlen = gs_rate(rbuf, req, rn) } 288 if rlen == 0 { rlen = gs_cat(rbuf, 0, nf404) } 289 sys_write(cfd, rbuf, rlen) 290 sys_close(cfd) 291 sys_exit(0) 292 } 293 sys_close(cfd) 294 served = served + 1 295 } 296 sys_close(lfd) 297 return 0 298}