code wiki / _hdl_build / nx_lan_signup_daemon.nx

nx_lan_signup_daemon.nx source

↩ module page · 79 lines · 4177 B

1// nx_lan_signup_daemon.nx -- the FAMILY SIGNUP + HR ADMIN surface, served (by the Nishi Publisher) ONLY to the LAN. 2// SEPARATE & additive: it does NOT touch the live public login daemon (whose registration stays CLOSED). Thin main 3// over the shared router nx_lan_signup_routes (lsd_route) -- the routes + gating are documented there; the socket 4// referee (nx_lan_signup_socket_gate) drives the SAME lsd_route over a real loopback socket (rule #15 DRY). 5// 6// Routes (each LAN-gated by the real accept() peer IP, never a spoofable header): 7// POST /register -> ls_signup_allowed (LAN AND invited) -> OPAQUE register -> hra_claim ; else 403 8// GET /hr -> owner-gated roster console (hap_emit) ; non-owner/non-LAN -> stub 9// POST /hr/invite -> owner-only: hra_invite ; POST /hr/suspend -> owner-only: hra_suspend 10// Run with the SAME server-keys path + realm (nishi_site_admin) as the hub /login daemon so session tokens validate. 11// 12// argv: [1]=port [2]=keys [3]=opaque-store [4]=budget [5]=hr-store [6]=realm(opt, default nishi_site_admin) [7]=argon2_m(opt) 13// One binary serves every property: run with [6]=andelinwest_admin + andelinwest's own keys + andelinwest_hr.log. 14import "nx_lan_signup_routes.nx" // lsd_route / lsd_atoi / lsd_slen / LSD_REALM / LSD_REALM_N 15import "nx_opaque_login.nx" // olg_ctx_setup + NxAuthContext 16import "nx_lan_signup.nx" // ls_ip4_from_sockaddr 17const LSD_MAGIC_16384: i64 = 16384 18const LSD_MAGIC_16383: i64 = 16383 19 20const LSD_PROD_M: i64 = 65536 21 22func main(argc: i64, argv: *i64) -> i64 { 23 if argc < 6 { 24 let um: *u8 = "usage: nx_lan_signup_daemon <port> <keys> <opaque-store> <budget> <hr-store> [realm] [argon2_m]\n" as *u8 25 sys_write(1, um, lsd_slen(um)) 26 sys_exit(2); return 2 27 } 28 let port: i64 = lsd_atoi(argv[1] as *u8) 29 let keys_path: *u8 = argv[2] as *u8 30 let store_path: *u8 = argv[3] as *u8 31 let budget: i64 = lsd_atoi(argv[4] as *u8) 32 let hr_store: *u8 = argv[5] as *u8 33 var realm: *u8 = LSD_REALM; var realm_n: i64 = LSD_REALM_N // argv[6] overrides -> serve any property (andelinwest) 34 if argc > 6 { realm = argv[6] as *u8; realm_n = lsd_slen(realm) } 35 var m_cost: i64 = LSD_PROD_M 36 if argc > 7 { m_cost = lsd_atoi(argv[7] as *u8) } 37 38 let ctx: *NxAuthContext = sys_mmap(256) as *NxAuthContext 39 if olg_ctx_setup(ctx, keys_path, store_path, realm, realm_n, "Nishi family signup" as *u8, 19, m_cost, 3, 4) != 0 { 40 sys_write(1, "CTX-INIT-FAIL\n" as *u8, 14); sys_exit(1); return 1 41 } 42 43 let addr: *u8 = sys_mmap(16) 44 addr[0]=2 as u8; addr[1]=0 as u8 45 addr[2]=((port>>8)&0xff) as u8; addr[3]=(port&0xff) as u8 46 var zi: i64=4; while zi<16 { addr[zi]=0 as u8; zi=zi+1 } 47 let lfd: i64 = sys_socket(2, 1, 0) 48 if lfd < 0 { sys_write(1, "SOCKET-FAIL\n" as *u8, 12); sys_exit(1); return 1 } 49 let optv: *u8 = sys_mmap(4); optv[0]=1 as u8 50 sys_setsockopt(lfd, 1, 2, optv, 4) 51 if sys_bind(lfd, addr, 16) < 0 { sys_write(1, "BIND-FAIL\n" as *u8, 10); sys_exit(1); return 1 } 52 if sys_listen(lfd, 16) < 0 { sys_write(1, "LISTEN-FAIL\n" as *u8, 12); sys_exit(1); return 1 } 53 sys_write(1, "LAN-SIGNUP-UP\n" as *u8, 14) 54 55 let paddr: *u8 = sys_mmap(16) 56 let palen: *i64 = sys_mmap(8) as *i64 57 var served: i64 = 0 58 while served < budget { 59 palen[0] = 16 60 let cfd: i64 = sys_accept_with_addr(lfd, paddr, palen) 61 if cfd >= 0 { 62 sys_set_socket_timeout(cfd, 5) 63 let ip4: *u8 = sys_mmap(8) 64 ls_ip4_from_sockaddr(paddr, ip4) 65 let req: *u8 = sys_mmap(LSD_MAGIC_16384) 66 let rn: i64 = sys_read(cfd, req, LSD_MAGIC_16383) 67 if rn > 0 { 68 let he: i64 = lsd_find(req, rn, "\r\n\r\n" as *u8, 4) 69 var body: *u8 = req; var bn: i64 = 0 70 if he >= 0 { body = ((req as i64) + he + 4) as *u8; bn = rn - he - 4 } 71 let now: i64 = sys_now_realtime_sec() 72 lsd_route(ctx, realm, realm_n, ip4, req, rn, he, body, bn, now, hr_store, cfd) 73 } 74 sys_close(cfd) 75 } 76 served = served + 1 77 } 78 sys_close(lfd); sys_exit(0); return 0 79}