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}