code wiki / _hdl_build / nx_hr_admin_gate.nx
nx_hr_admin_gate.nx source
↩ module page · 90 lines · 7530 B
1// nx_hr_admin_gate.nx -- referee for NISHI HR ADMIN (the admin-operations layer). PROVES, each with a negative
2// control / leak-check:
3// owner enrolled active -> is_superadmin=1 ; member invited -> is_invited=1 but NO access (resolve 0) and
4// NOT superadmin (leak-check) ; claim invited -> active@level, then NOT invited (re-register blocked) ;
5// re-claim = no-op (idempotent) ; suspend -> 0 ; REALM ISOLATION (same handle "brad", different realm =
6// different cred_id, an invite in one realm is invisible in the other) ; provision-by-handle id == derived id ;
7// deny-by-default for unknown handles ; roster counts (active vs invited).
8// GREEN iff every row matches. Durable -> knowledge/status/hr_admin_gate.log.
9import "nx_hr_admin.nx"
10import "nx_g_puts_lib.nx"
11import "nx_syscalls.nx"
12
13func g_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
14func g_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
15func g_wn(fd: i64, v: i64) -> i64 { let bb: *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 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
16func g_mkpfx(base: *u8, ms: i64, out: *u8) -> i64 { var o: i64=0; while base[o]!=(0 as u8){out[o]=base[o];o=o+1} let t: *u8=sys_mmap(28); var m: i64=ms; var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var z: i64=k-1; while z>=0{out[o]=t[z];o=o+1;z=z-1} out[o]=0 as u8; return o }
17func g_streq(a: *u8, b: *u8) -> i64 { var i: i64=0; while 1==1 { let ca: i64=a[i] as i64; let cb: i64=b[i] as i64; if ca!=cb { return 0 } if ca==0 { return 1 } i=i+1 } return 1 }
18func chk(got: i64, want: i64, label: *u8) -> i64 {
19 g_puts(" "); g_puts(label); g_puts(" got="); g_num(got); g_puts(" want="); g_num(want)
20 if got == want { g_puts(" PASS\n"); return 1 }
21 g_puts(" FAIL\n"); return 0
22}
23
24func main() -> i64 {
25 g_puts("=== NISHI HR ADMIN GATE (invite/claim/suspend, superadmin-by-construction, realm isolation) ===\n" as *u8)
26 var pass: i64=0; var rows: i64=0
27 let ms: i64 = sys_now_ms()
28 let nishi: *u8 = sys_mmap(96); g_mkpfx("/tmp/nx_hra_n_" as *u8, ms, nishi)
29 let andel: *u8 = sys_mmap(96); g_mkpfx("/tmp/nx_hra_a_" as *u8, ms, andel)
30 let NR: *u8 = "nishi_site_admin" as *u8; let NRN: i64 = 16
31 let AR: *u8 = "andelinwest_admin" as *u8; let ARN: i64 = 17
32 let fam: *u8 = "andelin" as *u8
33
34 let cid_owner: *u8 = sys_mmap(96)
35 let cid_brad: *u8 = sys_mmap(96)
36 let cid_brad_a: *u8 = sys_mmap(96)
37 let cid_chk: *u8 = sys_mmap(96)
38
39 // owner = elderwesto enrolled ACTIVE at level 3 (mirrors reality: elderwesto already has an OPAQUE account)
40 rows=rows+1; pass=pass+chk(hra_enroll(nishi, NR, NRN, "elderwesto" as *u8, 10, HRA_LVL_OWNER, fam, 1000, "system" as *u8, cid_owner), 0, "enroll elderwesto owner(3) active" as *u8)
41 rows=rows+1; pass=pass+chk(hra_is_superadmin(nishi, cid_owner, 64), 1, " -> owner is_superadmin=1 (auto-everything by construction)" as *u8)
42
43 // member brad invited -> is_invited but NO access yet, NOT superadmin
44 rows=rows+1; pass=pass+chk(hra_invite(nishi, NR, NRN, "brad" as *u8, 4, HRA_LVL_MEMBER, fam, 1000, "elderwesto" as *u8, cid_brad), 0, "invite brad(member)" as *u8)
45 rows=rows+1; pass=pass+chk(hra_is_invited(nishi, NR, NRN, "brad" as *u8, 4), 1, " -> brad is_invited=1" as *u8)
46 rows=rows+1; pass=pass+chk(hra_resolve_level(nishi, cid_brad, 64), 0, " -> invited brad has NO access yet (resolve 0)" as *u8)
47 rows=rows+1; pass=pass+chk(hra_is_superadmin(nishi, cid_brad, 64), 0, " -> member brad NOT superadmin (leak-check)" as *u8)
48
49 // claim (the LAN signup completing): invited -> active@1
50 rows=rows+1; pass=pass+chk(hra_claim(nishi, NR, NRN, "brad" as *u8, 4, fam, 2000, "self" as *u8), 1, "claim brad -> level 1" as *u8)
51 rows=rows+1; pass=pass+chk(hra_resolve_level(nishi, cid_brad, 64), 1, " -> claimed brad resolves to 1 (active)" as *u8)
52 rows=rows+1; pass=pass+chk(hra_is_invited(nishi, NR, NRN, "brad" as *u8, 4), 0, " -> claimed brad NOT invited (re-register blocked)" as *u8)
53 rows=rows+1; pass=pass+chk(hra_claim(nishi, NR, NRN, "brad" as *u8, 4, fam, 2001, "self" as *u8), 0, " -> re-claim is no-op (idempotent #10)" as *u8)
54
55 // suspend
56 rows=rows+1; pass=pass+chk(hra_suspend(nishi, NR, NRN, "brad" as *u8, 4, fam, 3000, "elderwesto" as *u8), 0, "suspend brad" as *u8)
57 rows=rows+1; pass=pass+chk(hra_resolve_level(nishi, cid_brad, 64), 0, " -> suspended brad -> 0" as *u8)
58
59 // REALM ISOLATION: brad is NOT invited in the andelinwest realm (different store + different cred_id)
60 rows=rows+1; pass=pass+chk(hra_is_invited(andel, AR, ARN, "brad" as *u8, 4), 0, "brad NOT invited in andelinwest realm (isolation)" as *u8)
61 rows=rows+1; pass=pass+chk(hra_invite(andel, AR, ARN, "brad" as *u8, 4, HRA_LVL_OWNER, fam, 1000, "elderwesto" as *u8, cid_brad_a), 0, " -> invite brad as admin on andelinwest" as *u8)
62 rows=rows+1; pass=pass+chk(g_streq(cid_brad, cid_brad_a), 0, " -> SAME handle 'brad' = DIFFERENT cred_id per realm" as *u8)
63 rows=rows+1; pass=pass+chk(hra_resolve_level(nishi, cid_brad, 64), 0, " -> nishifamily brad UNAFFECTED by andelinwest invite" as *u8)
64
65 // provision-by-handle stability (the SSOT correctness property): invite's cred_id == hr_cred_id re-derived
66 hrs_cred_id(NR, NRN, "brad" as *u8, 4, cid_chk)
67 rows=rows+1; pass=pass+chk(g_streq(cid_brad, cid_chk), 1, "cred_id STABLE (provision-by-handle == re-derived)" as *u8)
68
69 // deny-by-default for unknown handles
70 rows=rows+1; pass=pass+chk(hra_is_invited(nishi, NR, NRN, "stranger" as *u8, 8), 0, "unknown handle is_invited=0 (deny-by-default)" as *u8)
71 rows=rows+1; pass=pass+chk(hra_is_superadmin(nishi, "0000000000000000000000000000000000000000000000000000000000000000" as *u8, 64), 0, "unknown cred is_superadmin=0 (deny-by-default)" as *u8)
72
73 // roster counts: invite jensen+kelli -> active=1 (owner), invited=2 (jensen,kelli; brad now suspended)
74 let cid_j: *u8 = sys_mmap(96); let cid_k: *u8 = sys_mmap(96)
75 hra_invite(nishi, NR, NRN, "jensen" as *u8, 6, HRA_LVL_MEMBER, fam, 1000, "elderwesto" as *u8, cid_j)
76 hra_invite(nishi, NR, NRN, "kelli" as *u8, 5, HRA_LVL_MEMBER, fam, 1000, "elderwesto" as *u8, cid_k)
77 rows=rows+1; pass=pass+chk(hra_roster_count(nishi, HRA_ST_ACTIVE), 1, "roster active logins = 1 (elderwesto)" as *u8)
78 rows=rows+1; pass=pass+chk(hra_roster_count(nishi, HRA_ST_INVITED), 2, "roster pending invites = 2 (jensen,kelli)" as *u8)
79
80 g_puts("----\nNISHI-HR-ADMIN-GATE rows=" as *u8); g_num(rows); g_puts(" pass=" as *u8); g_num(pass)
81 if pass==rows { g_puts(" verdict=GREEN\n" as *u8) } else { g_puts(" verdict=RED\n" as *u8) }
82 let lg: i64=sys_openat_append("knowledge/status/hr_admin_gate.log" as *u8, 0x1a4)
83 if lg>=0 {
84 g_w(lg, "NISHI-HR-ADMIN-GATE rows=" as *u8); g_wn(lg, rows); g_w(lg, " pass=" as *u8); g_wn(lg, pass)
85 if pass==rows { g_w(lg, " verdict=GREEN\n" as *u8) } else { g_w(lg, " verdict=RED\n" as *u8) }
86 sys_close(lg)
87 }
88 if pass==rows { sys_exit(0); return 0 }
89 sys_exit(1); return 1
90}