#![cfg(feature = "fetch")]
#[path = "render/common.rs"]
mod common;
use common::*;
use std::io::{Read, Write};
use std::net::TcpListener;
use std::sync::mpsc;
fn valid_png_bytes() -> Vec<u8> {
let img = image::RgbImage::from_pixel(1, 1, image::Rgb([90, 40, 180]));
let mut buf = Vec::new();
image::DynamicImage::ImageRgb8(img)
.write_to(&mut std::io::Cursor::new(&mut buf), image::ImageFormat::Png)
.expect("encode fixture png");
buf
}
#[test]
fn remote_image_refused_when_allow_remote_images_false() {
unsafe {
std::env::set_var("MARKDOWN2PDF_ALLOW_PRIVATE_NETWORK", "1");
}
let listener = TcpListener::bind("127.0.0.1:0").expect("bind local listener");
let port = listener.local_addr().expect("local addr").port();
let (tx, rx) = mpsc::channel();
std::thread::spawn(move || {
if let Ok((mut stream, _)) = listener.accept() {
let _ = tx.send(());
let mut discard = [0u8; 1024];
let _ = stream.read(&mut discard);
let body = valid_png_bytes();
let header = format!(
"HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nContent-Length: {}\r\nConnection: close\r\n\r\n",
body.len()
);
let _ = stream.write_all(header.as_bytes());
let _ = stream.write_all(&body);
}
});
let cfg = "[security]\nallow_remote_images = false\n";
let md = format!("\n");
let bytes = render(&md, cfg);
assert!(pdf_well_formed(&bytes), "PDF not well-formed");
assert!(
contains_text(&bytes, "[image: sec remote]"),
"remote image must fall back to alt text when allow_remote_images = false"
);
assert!(
rx.try_recv().is_err(),
"guard failed to block: the local PNG server observed a connection — \
the fetch reached the network even though allow_remote_images = false"
);
unsafe {
std::env::remove_var("MARKDOWN2PDF_ALLOW_PRIVATE_NETWORK");
}
}