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}