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}