code wiki / _hdl_build / nx_cms_multipart_test.nx
nx_cms_multipart_test.nx source
↩ module page · 55 lines · 3093 B
1// nx_cms_multipart_test.nx -- KAT for the corrected multipart parser. Builds a 2-part body
2// (a text field + a file part with TWO headers and a binary-ish payload), asserts both parts'
3// names, filename, and body bytes are recovered exactly, and that a body with NO closing delimiter
4// is rejected. expect_exit: 0
5import "nx_cms_multipart.nx"
6import "nx_syscalls.nx"
7
8func t_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64=off; var k: i64=0; while s[k]!=(0 as u8){dst[o]=s[k];o=o+1;k=k+1} return o }
9func t_catn(dst: *u8, off: i64, s: *u8, n: i64) -> i64 { var o: i64=off; var k: i64=0; while k<n{dst[o]=s[k];o=o+1;k=k+1} return o }
10func t_streq(a: *u8, n: i64, b: *u8) -> i64 { var i: i64=0; while i<n { if a[i]!=b[i] { return 0 } i=i+1 } if b[n]!=(0 as u8) { return 0 } return 1 }
11
12func main() -> i64 {
13 var bad: i64 = 0
14 let pay: *u8 = sys_mmap(128)
15 pay[0]=0x89 as u8; pay[1]=0x50 as u8; pay[2]=0x4e as u8; pay[3]=0x47 as u8
16 var pi: i64=4; while pi<40 { pay[pi]=((pi*7+3)&0xff) as u8; pi=pi+1 }
17 let body: *u8 = sys_mmap(8192)
18 var o: i64 = t_cat(body, 0, "--nxgate7B\r\nContent-Disposition: form-data; name=\"csrf\"\r\n\r\nTOKEN1234\r\n--nxgate7B\r\nContent-Disposition: form-data; name=\"file\"; filename=\"logo.png\"\r\nContent-Type: application/octet-stream\r\n\r\n" as *u8)
19 o = t_catn(body, o, pay, 40)
20 o = t_cat(body, o, "\r\n--nxgate7B--\r\n" as *u8)
21 let blen: i64 = o
22
23 let parts: *i64 = sys_mmap(8 * 4 * 4) as *i64
24 let np: i64 = cms_mp_parse(body, blen, "nxgate7B" as *u8, 8, parts, 4)
25 if np != 2 { bad = bad + 1 }
26 if np == 2 {
27 // part 0 = csrf field, body "TOKEN1234"
28 let nm0: *u8 = sys_mmap(64)
29 let nl0: i64 = cms_mp_field(body, parts[0], parts[0]+parts[1], " name=\"" as *u8, nm0, 60)
30 if t_streq(nm0, nl0, "csrf" as *u8) != 1 { bad = bad + 1 }
31 if parts[3] != 9 { bad = bad + 1 }
32 if t_streq(((body as i64)+parts[2]) as *u8, parts[3], "TOKEN1234" as *u8) != 1 { bad = bad + 1 }
33 // part 1 = file, filename logo.png, body = 40 bytes byte-exact
34 let nm1: *u8 = sys_mmap(64)
35 let nl1: i64 = cms_mp_field(body, parts[4], parts[4]+parts[5], " name=\"" as *u8, nm1, 60)
36 if t_streq(nm1, nl1, "file" as *u8) != 1 { bad = bad + 1 }
37 let fn1: *u8 = sys_mmap(64)
38 let fl1: i64 = cms_mp_field(body, parts[4], parts[4]+parts[5], "filename=\"" as *u8, fn1, 60)
39 if t_streq(fn1, fl1, "logo.png" as *u8) != 1 { bad = bad + 1 }
40 if parts[7] != 40 { bad = bad + 1 }
41 var beq: i64 = 1
42 var q: i64 = 0
43 while q < 40 { if body[parts[6]+q] != pay[q] { beq = 0; q = 40 } q = q + 1 }
44 if beq != 1 { bad = bad + 1 }
45 }
46 // malformed: no closing delimiter -> rejected
47 let bad2: *u8 = sys_mmap(256)
48 let bn2: i64 = t_cat(bad2, 0, "--nxgate7B\r\nContent-Disposition: form-data; name=\"x\"\r\n\r\nval" as *u8)
49 let parts2: *i64 = sys_mmap(8*4*4) as *i64
50 if cms_mp_parse(bad2, bn2, "nxgate7B" as *u8, 8, parts2, 4) >= 0 { bad = bad + 1 }
51
52 if bad == 0 { sys_exit(0) }
53 sys_exit(1)
54 return 1
55}