use std::sync::atomic::{AtomicU64, Ordering};
pub fn generate_boundary() -> String {
static COUNTER: AtomicU64 = AtomicU64::new(1);
let pid = std::process::id();
let counter = COUNTER.fetch_add(1, Ordering::Relaxed);
let rng = quick_rng();
format!("mailrs_{pid:x}_{counter:x}_{rng:08x}")
}
fn quick_rng() -> u32 {
use std::time::{SystemTime, UNIX_EPOCH};
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_nanos() as u64)
.unwrap_or(0);
let mut z = now.wrapping_add(0x9E3779B97F4A7C15);
z = (z ^ (z >> 30)).wrapping_mul(0xBF58476D1CE4E5B9);
z = (z ^ (z >> 27)).wrapping_mul(0x94D049BB133111EB);
((z ^ (z >> 31)) >> 32) as u32
}
#[derive(Debug, Clone)]
pub struct PartBytes {
pub headers: Vec<u8>,
pub body: Vec<u8>,
}
pub fn multipart_envelope(parts: &[PartBytes]) -> (String, Vec<u8>) {
let boundary = pick_non_colliding_boundary(parts);
let boundary_line = format!("--{boundary}");
let closing_line = format!("--{boundary}--");
let mut out = Vec::new();
for part in parts {
out.extend_from_slice(boundary_line.as_bytes());
out.extend_from_slice(b"\r\n");
out.extend_from_slice(&part.headers);
if !part.headers.ends_with(b"\r\n") {
out.extend_from_slice(b"\r\n");
}
out.extend_from_slice(b"\r\n");
out.extend_from_slice(&part.body);
if !part.body.ends_with(b"\r\n") {
out.extend_from_slice(b"\r\n");
}
}
out.extend_from_slice(closing_line.as_bytes());
out.extend_from_slice(b"\r\n");
(boundary, out)
}
fn pick_non_colliding_boundary(parts: &[PartBytes]) -> String {
for _ in 0..8 {
let b = generate_boundary();
let needle_open = format!("--{b}");
let mut collides = false;
for part in parts {
if contains_subslice(&part.headers, needle_open.as_bytes())
|| contains_subslice(&part.body, needle_open.as_bytes())
{
collides = true;
break;
}
}
if !collides {
return b;
}
}
format!("mailrs_fallback_{:016x}", quick_rng() as u64 | ((quick_rng() as u64) << 32))
}
fn contains_subslice(haystack: &[u8], needle: &[u8]) -> bool {
if needle.is_empty() || needle.len() > haystack.len() {
return false;
}
haystack.windows(needle.len()).any(|w| w == needle)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn boundary_format_is_mailrs_prefix() {
let b = generate_boundary();
assert!(b.starts_with("mailrs_"), "got {b:?}");
assert!(b.is_ascii());
for c in b.chars() {
assert!(c.is_ascii_alphanumeric() || c == '_', "bad char in boundary: {c:?}");
}
}
#[test]
fn boundary_is_unique_across_calls() {
let a = generate_boundary();
let b = generate_boundary();
assert_ne!(a, b);
}
#[test]
fn envelope_simple_two_part() {
let parts = vec![
PartBytes {
headers: b"Content-Type: text/plain; charset=utf-8\r\n".to_vec(),
body: b"hello\r\n".to_vec(),
},
PartBytes {
headers: b"Content-Type: text/html; charset=utf-8\r\n".to_vec(),
body: b"<p>hi</p>\r\n".to_vec(),
},
];
let (boundary, bytes) = multipart_envelope(&parts);
let s = std::str::from_utf8(&bytes).unwrap();
let open = format!("--{boundary}");
let close = format!("--{boundary}--");
assert_eq!(s.matches(&open).count(), 3); assert!(s.contains(&close));
assert!(s.contains("text/plain"));
assert!(s.contains("text/html"));
assert!(s.contains("hello"));
assert!(s.contains("<p>hi</p>"));
}
#[test]
fn envelope_avoids_collision_with_body() {
let parts = vec![
PartBytes {
headers: b"Content-Type: text/plain\r\n".to_vec(),
body: b"--mailrs_should_not_collide\r\nbody continues\r\n".to_vec(),
},
];
let (boundary, bytes) = multipart_envelope(&parts);
let s = std::str::from_utf8(&bytes).unwrap();
assert!(s.contains("--mailrs_should_not_collide"));
assert!(
!boundary.contains("should_not_collide"),
"boundary leaked into body's fake marker: {boundary}",
);
}
}