code wiki / _hdl_build / nx_connect_group.nx
nx_connect_group.nx source
↩ module page · 91 lines · 5132 B
1// nx_connect_group.nx -- FUNCTIONALITY rung: group chat + broadcast channels with a
2// by-construction permission model. Extends the messaging core to multi-member conversations.
3//
4// Roles: OWNER(3) > ADMIN(2) > MEMBER(1) > none(0). Permission rules, by construction:
5// - only ADMIN+ may add/remove members; the OWNER can never be removed;
6// - an admin cannot remove a peer/higher (tr>=ar denied) -> no admin coup;
7// - only the OWNER may promote/demote;
8// - CHANNEL mode = broadcast: only ADMIN+ may post, everyone else is a read-only subscriber;
9// GROUP mode = every member may post.
10// Safety continuity: a group carries an intent LANE; a MINOR can never be added to a romance
11// (DATE) lane group -- the minor<->romance wall (R2/R3) extends to group membership.
12// 7 checks incl. a negative control (a member cannot remove the owner -> anti-takeover).
13// 100% sovereign. license_tier: ORIGINAL expect_exit: 0
14import "nx_syscalls.nx"
15
16import "nx_connect_group_lib.nx"
17
18func sw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
19func sn(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 }
20
21func tcheck(pass: i64, label: *u8, fails: *i64) -> i64 {
22 sw(" " as *u8); sw(label); sw(": " as *u8)
23 if pass==1 { sw("PASS\n" as *u8) } else { sw("FAIL\n" as *u8); fails[0]=fails[0]+1 }
24 return 0
25}
26
27func main() -> i64 {
28 let fails: *i64 = sys_mmap(16) as *i64
29 fails[0]=0
30
31 // GROUP gA: owner=1, GROUP mode, LANGUAGE lane
32 let ma: *i64 = sys_mmap(64) as *i64
33 let ea: *i64 = sys_mmap(512) as *i64
34 grp_create(ma, ea, 1, MODE_GROUP, LANE_LANG)
35
36 let add2: i64 = grp_add(ma,ea, 1, 2, 0) // owner adds 2
37 let promo2: i64 = grp_promote(ma,ea, 1, 2, ROLE_ADMIN) // owner promotes 2 -> ADMIN
38 let add3: i64 = grp_add(ma,ea, 2, 3, 0) // admin(2) adds 3 (member)
39 let grp_post_member: i64 = grp_can_post(ma,ea, 3) // member can post in a GROUP
40 let add_by_member: i64 = grp_add(ma,ea, 3, 4, 0) // member(3) tries to add -> DENIED
41 let mem_promote: i64 = grp_promote(ma,ea, 3, 3, ROLE_ADMIN) // member tries to promote -> DENIED
42 let mem_rm_owner: i64 = grp_remove(ma,ea, 3, 1) // member tries to remove OWNER -> DENIED (neg-control)
43 let admin_rm_member: i64 = grp_remove(ma,ea, 2, 3) // admin removes member -> OK
44 let admin_rm_owner: i64 = grp_remove(ma,ea, 2, 1) // admin tries to remove OWNER -> DENIED
45 let add_minor_lang: i64 = grp_add(ma,ea, 1, 5, 1) // owner adds a MINOR to a LANGUAGE group -> OK
46
47 // CHANNEL cC: owner=1, CHANNEL mode
48 let mc: *i64 = sys_mmap(64) as *i64
49 let ec: *i64 = sys_mmap(512) as *i64
50 grp_create(mc, ec, 1, MODE_CHANNEL, LANE_LANG)
51 grp_add(mc,ec, 1, 2, 0) // 2 is a subscriber (MEMBER)
52 let chan_post_admin: i64 = grp_can_post(mc,ec, 1) // owner/admin can post
53 let chan_post_sub: i64 = grp_can_post(mc,ec, 2) // subscriber CANNOT post
54
55 // SAFETY group dD: DATE lane
56 let md: *i64 = sys_mmap(64) as *i64
57 let ed: *i64 = sys_mmap(512) as *i64
58 grp_create(md, ed, 1, MODE_GROUP, LANE_DATE)
59 let add_minor_date: i64 = grp_add(md,ed, 1, 5, 1) // add MINOR to a DATE group -> DENIED
60
61 sw("=== nx_connect_group -- group chat + channels (roles, permissions, safety) ===\n" as *u8)
62 sw(" gA members after admin removes 3 = " as *u8); sn(ma[3]); sw(" (owner+admin+minor)\n" as *u8)
63 sw("-- gate checks --\n" as *u8)
64
65 var t1: i64=0; if add2==1 { if promo2==1 { if add3==1 { t1=1 } } }
66 tcheck(t1, "T1 create + owner-add + owner-promote-to-admin + admin-add" as *u8, fails)
67
68 var t2: i64=0; if add_by_member==0 { if mem_promote==0 { t2=1 } }
69 tcheck(t2, "T2 members cannot add or promote (permission by construction)" as *u8, fails)
70
71 var t3: i64=0; if admin_rm_member==1 { if admin_rm_owner==0 { t3=1 } }
72 tcheck(t3, "T3 admin removes member; OWNER can never be removed" as *u8, fails)
73
74 var t4: i64=0; if mem_rm_owner==0 { t4=1 }
75 tcheck(t4, "T4 NEG-CONTROL member cannot remove owner (anti-takeover)" as *u8, fails)
76
77 var t5: i64=0; if chan_post_admin==1 { if chan_post_sub==0 { if grp_post_member==1 { t5=1 } } }
78 tcheck(t5, "T5 channel = admin-post/subscriber-read; group = members post" as *u8, fails)
79
80 var t6: i64=0; if add_minor_date==0 { if add_minor_lang==1 { t6=1 } }
81 tcheck(t6, "T6 SAFETY minor barred from romance group, allowed in language group" as *u8, fails)
82
83 var t7: i64=0; if ma[3]==3 { t7=1 } // owner(1) + admin(2) + minor(5); member(3) was removed
84 tcheck(t7, "T7 membership accounting correct after add/remove" as *u8, fails)
85
86 sw(" fails=" as *u8); sn(fails[0]); sw("\n" as *u8)
87 if fails[0]==0 { sw("VERDICT: GREEN (group + channel roles/permissions correct; owner protected; minors safe)\n" as *u8); sys_exit(0) }
88 sw("VERDICT: RED\n" as *u8)
89 sys_exit(1)
90 return 1
91}