code wiki / _hdl_build / nx_cms_booking_gate.nx

nx_cms_booking_gate.nx source

↩ module page · 71 lines · 5450 B

1// nx_cms_booking_gate.nx -- proves the consultation-booking backend (the scheduler<->email crash rung) by 2// calling the real nx_cms_booking logic in-process: 3// VALIDATE : a good client email accepted, a bad one rejected (neg control) 4// STORE : the booking persists as a real nx_cms_store record and reads back (name/matter/status) 5// CONFIRM : the RFC 5322 confirmation email is addressed to the client + carries the matter + firm identity 6// SECURITY : a CRLF-injection attempt in a header value does NOT inject a new header (Cardinal 12) 7// REMINDER : a same-day reminder is registered on the nx_cron core (job count increments) 8// GREEN iff 8/8. Durable knowledge/status/cms_booking_gate.log. license_tier: ORIGINAL 9import "nx_syscalls.nx" 10import "nx_cms_booking.nx" 11 12func 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 } 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_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 } 15func g_ww(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 } 16func g_eqn(buf: *u8, n: i64, lit: *u8) -> i64 { 17 var i: i64=0; while i<n { if buf[i]!=lit[i] { return 0 } i=i+1 } if lit[n]!=(0 as u8) { return 0 } return 1 18} 19func g_contains(hay: *u8, n: i64, needle: *u8) -> i64 { 20 var nl: i64=0; while needle[nl]!=(0 as u8){nl=nl+1} if nl==0 { return 0 } 21 var i: i64=0 22 while i+nl<=n { var j: i64=0; var ok: i64=1; while j<nl { if hay[i+j]!=needle[j] { ok=0; j=nl } else { j=j+1 } } if ok==1 { return 1 } i=i+1 } 23 return 0 24} 25func g_row(id: i64, ok: i64, what: *u8) -> i64 { 26 g_w(" R" as *u8); g_num(id); g_w(" " as *u8); g_w(what); g_w(": " as *u8) 27 if ok==1 { g_w("YES PASS\n" as *u8) } else { g_w("NO FAIL\n" as *u8) } 28 return ok 29} 30 31func main() -> i64 { 32 g_w("=== CMS BOOKING GATE (scheduler<->email: validate+store+confirm+secure+remind) ===\n" as *u8) 33 var pass: i64=0; let rows: i64=8 34 let out: *u8 = sys_mmap(4096) 35 36 pass=pass+g_row(1, email_addr_valid("jane@example.com" as *u8), "valid client email accepted" as *u8) 37 var bad: i64=1; if email_addr_valid("not-an-email" as *u8)==1 { bad=0 } 38 pass=pass+g_row(2, bad, "invalid email rejected (neg control)" as *u8) 39 40 let rec: *u8 = sys_mmap(8192) 41 let rl: i64 = bk_store("Jane Roe" as *u8, "801-555-1212" as *u8, "jane@example.com" as *u8, "Estate Planning" as *u8, "2026-07-01" as *u8, "Morning" as *u8, rec) 42 let nlen: i64 = cst_get(rec, rl, "name" as *u8, out, 4096) 43 var r3: i64=0; if g_eqn(out, nlen, "Jane Roe" as *u8)==1 { let mlen: i64=cst_get(rec, rl, "matter" as *u8, out, 4096); if g_eqn(out, mlen, "Estate Planning" as *u8)==1 { r3=1 } } 44 pass=pass+g_row(3, r3, "booking record stores + reads back (name + matter)" as *u8) 45 let slen: i64 = cst_get(rec, rl, "status" as *u8, out, 4096) 46 pass=pass+g_row(4, g_eqn(out, slen, "requested" as *u8), "booking status = requested" as *u8) 47 48 let msg: *u8 = sys_mmap(8192) 49 let ml: i64 = bk_confirm("Jane Roe" as *u8, "jane@example.com" as *u8, "Estate Planning" as *u8, "2026-07-01" as *u8, "Morning" as *u8, msg) 50 pass=pass+g_row(5, g_contains(msg, ml, "To: jane@example.com" as *u8), "confirmation addressed to the client" as *u8) 51 var r6: i64=0; if g_contains(msg,ml,"Estate Planning" as *u8)==1 { if g_contains(msg,ml,"We received your consultation request" as *u8)==1 { if g_contains(msg,ml,"intake@andelinwest.com" as *u8)==1 { r6=1 } } } 52 pass=pass+g_row(6, r6, "confirmation carries matter + firm identity" as *u8) 53 54 // SECURITY: CRLF in the matter (Subject header value) must NOT inject a new header line 55 let evil: *u8 = sys_mmap(8192) 56 let el: i64 = bk_confirm("Jane Roe" as *u8, "jane@example.com" as *u8, "Estate\r\nBcc: evil@example.com" as *u8, "2026-07-01" as *u8, "Morning" as *u8, evil) 57 var r7: i64=0; if g_contains(evil, el, "\nBcc:" as *u8)==0 { r7=1 } 58 pass=pass+g_row(7, r7, "CRLF header-injection neutralized (no \\nBcc: line)" as *u8) 59 60 let c0: i64 = nx_cron_count_jobs() 61 let v: i64 = bk_reminder("reminder-jane-1" as *u8, 15, 2000000000) 62 let c1: i64 = nx_cron_count_jobs() 63 var r8: i64=0; if v==NX_CRON_VERDICT_JOB_REGISTERED { if c1==c0+1 { r8=1 } } 64 pass=pass+g_row(8, r8, "same-day reminder registered on nx_cron (count++)" as *u8) 65 66 g_w("----\nCMS-BOOKING rows=" as *u8); g_num(rows); g_w(" pass=" as *u8); g_num(pass); g_w("\n" as *u8) 67 let lg: i64=sys_openat_append("knowledge/status/cms_booking_gate.log" as *u8, 0x1a4) 68 if lg>=0 { g_ww(lg, "CMS-BOOKING rows=" as *u8); g_wn(lg, rows); g_ww(lg, " pass=" as *u8); g_wn(lg, pass); if pass==rows { g_ww(lg, " verdict=GREEN\n" as *u8) } else { g_ww(lg, " verdict=RED\n" as *u8) } sys_close(lg) } 69 if pass==rows { g_w("CMS-BOOKING GREEN -- scheduler<->email backend logic finished + gated (live daemon wiring = next rung)\n" as *u8); sys_exit(0); return 0 } 70 g_w("CMS-BOOKING RED\n" as *u8); sys_exit(1); return 1 71}