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}