code wiki / _hdl_build / nx_cms_admin_gate.nx

nx_cms_admin_gate.nx source

↩ module page · 106 lines · 5617 B

1// nx_cms_admin_gate.nx -- SOVEREIGN front-end gate for the andelinwest CMS admin: spawns the admin 2// daemon (fork/exec /tmp/nx_cms_admin.sov.elf) against the local dev site, then over REAL HTTP (sovereign 3// nx_http_client) asserts the THREE login surfaces render: home has both login links, /admin = lawyer/staff 4// login, /portal = client login. This is the "verify/gate" stage of local->dev->live -- repeatable, no curl. 5// Exit 0 iff all rows pass; appends a verdict line to knowledge/status/cms_admin_gate.log. license_tier: ORIGINAL 6import "nx_http_client.nx" 7import "nx_sha256.nx" 8import "nx_syscalls.nx" 9 10const G_PORT: i64 = 8093 11const G_SITE: *u8 = "/mnt/c/Users/elder/AppData/Local/Temp/awcms" as *u8 12const G_ADMIN: *u8 = "/tmp/nx_cms_admin.sov.elf" as *u8 13const G_ADMINPW: *u8 = "/mnt/c/Users/elder/AppData/Local/Temp/awcms/admin_pw.sha256" as *u8 14const G_CLIENTPW: *u8 = "/mnt/c/Users/elder/AppData/Local/Temp/awcms/client_pw.sha256" as *u8 15 16// write sha256(pw) hex (64 chars, 0600) to outpath -- sets a CMS role credential for the dev gate. 17func g_setpw(outpath: *u8, pw: *u8) -> i64 { 18 var n: i64 = 0 19 while pw[n] != (0 as u8) { n = n + 1 } 20 let dig: *u8 = sys_mmap(32) 21 sha256_digest(pw, n, dig) 22 let hexs: *u8 = sys_mmap(80) 23 let hxc: *u8 = "0123456789abcdef" as *u8 24 var i: i64 = 0 25 while i < 32 { hexs[i*2] = hxc[((dig[i] as i64) >> 4) & 15]; hexs[i*2+1] = hxc[(dig[i] as i64) & 15]; i = i + 1 } 26 let fd: i64 = sys_openat_wr(outpath, 0x180) 27 if fd < 0 { return 0 } 28 sys_write(fd, hexs, 64); sys_close(fd) 29 return 1 30} 31 32func g_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 33func g_num(v: i64) -> i64 { let b: *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;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1}; sys_write(1,b,k); return 0 } 34func g_len(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 35func g_find(buf: *u8, n: i64, pat: *u8, plen: i64) -> i64 { 36 if plen==0 { return 0-1 } 37 var i: i64=0 38 while i+plen<=n { var j: i64=0; var ok: i64=1; while j<plen { if (buf[i+j] as i64)!=(pat[j] as i64){ok=0;j=plen} else {j=j+1} } if ok==1 { return i } i=i+1 } 39 return 0-1 40} 41func g_get(path: *u8, buf: *u8, cap: i64) -> i64 { 42 let addr: *u8 = sys_mmap(16) 43 nx_http_client_sockaddr_ipv4(addr, 127, 0, 0, 1, G_PORT) 44 let v: *i64 = sys_mmap(8) as *i64 45 return nx_http_client_get(addr, path, g_len(path), "127.0.0.1" as *u8, 9, buf, cap, v) 46} 47func g_row(id: i64, ok: i64, label: *u8) -> i64 { 48 g_w("GATEROW " as *u8); g_num(id); g_w(" " as *u8) 49 if ok==1 { g_w("PASS " as *u8) } else { g_w("FAIL " as *u8) } 50 g_w(label); g_w("\n" as *u8) 51 return ok 52} 53 54func main() -> i64 { 55 // set the two role credentials (dev creds; real ones set by the operator before live) 56 g_setpw(G_ADMINPW, "attorney-dev-2026" as *u8) 57 g_setpw(G_CLIENTPW, "client-dev-2026" as *u8) 58 let pid: i64 = sys_fork() 59 if pid == 0 { 60 let argv: *i64 = sys_mmap(64) as *i64 61 argv[0] = G_ADMIN as i64 62 argv[1] = "8093" as *u8 as i64 63 argv[2] = G_SITE as i64 64 argv[3] = "120" as *u8 as i64 65 argv[4] = 0 66 let envp: *i64 = sys_mmap(16) as *i64; envp[0] = 0 67 sys_execve(G_ADMIN, argv, envp) 68 sys_exit(127) 69 } 70 let buf: *u8 = sys_mmap(262144) 71 // wait for the daemon to bind: retry GET / (bounded) 72 var got: i64 = 0 73 var tries: i64 = 0 74 while tries < 300 { 75 got = g_get("/" as *u8, buf, 262143) 76 if got > 0 { tries = 300 } else { tries = tries + 1 } 77 } 78 var pass: i64 = 0 79 var rows: i64 = 0 80 var ok: i64 = 0 81 if got > 0 { if g_find(buf, got, "Attorney / Staff Login" as *u8, 22) >= 0 { if g_find(buf, got, "Client Portal" as *u8, 13) >= 0 { ok = 1 } } } 82 rows=rows+1; pass=pass+g_row(0, ok, "GET / serves the law-firm page with BOTH login links" as *u8) 83 84 ok = 0; if got > 0 { if g_find(buf, got, "(801) 555-0100" as *u8, 14) >= 0 { ok = 1 } } 85 rows=rows+1; pass=pass+g_row(1, ok, "GET / renders the editable PHONE field (business control)" as *u8) 86 87 ok = 0; if got > 0 { if g_find(buf, got, "Family Law" as *u8, 10) >= 0 { ok = 1 } } 88 rows=rows+1; pass=pass+g_row(2, ok, "GET / renders the editable PRACTICE AREAS field (multi-line)" as *u8) 89 90 let b2: i64 = g_get("/admin" as *u8, buf, 262143) 91 ok = 0; if b2 > 0 { if g_find(buf, b2, "Editor Login" as *u8, 12) >= 0 { ok = 1 } } 92 rows=rows+1; pass=pass+g_row(3, ok, "GET /admin = lawyer/staff login form" as *u8) 93 94 let b3: i64 = g_get("/portal" as *u8, buf, 262143) 95 ok = 0; if b3 > 0 { if g_find(buf, b3, "Client Portal" as *u8, 13) >= 0 { if g_find(buf, b3, "/portal/login" as *u8, 13) >= 0 { ok = 1 } } } 96 rows=rows+1; pass=pass+g_row(4, ok, "GET /portal = client login form" as *u8) 97 98 g_w("CMS-ADMIN-GATE rows=" as *u8); g_num(rows); g_w(" pass=" as *u8); g_num(pass); g_w("\n" as *u8) 99 __syscall(129, pid, 9, 0, 0, 0, 0) // kill(pid, SIGKILL). rv64 kill=129 -- the raw x86 62 this used to pass is an RV64 KEY the backend translated to lseek(8), so the kill never happened (debt idx 2277) 100 if pass == rows { 101 let gf: i64 = sys_openat_append("knowledge/status/cms_admin_gate.log" as *u8, 0x1a4) 102 if gf >= 0 { sys_write(gf, "CMS-ADMIN-GATE andelinwest lawyer+client login surfaces verdict=PASS\n" as *u8, 68); sys_close(gf) } 103 g_w("CMS-ADMIN-GATE verdict=PASS\n" as *u8); sys_exit(0); return 0 104 } 105 g_w("CMS-ADMIN-GATE verdict=FAIL\n" as *u8); sys_exit(1); return 1 106}