From bfd5e12bea38a645453da8daecfeac5c0ae3d910 Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Mon, 22 Jul 2024 16:39:59 -0700 Subject: [PATCH] Make URL joining more robust --- server/src/lib.rs | 46 +++++++++++++++++++++++----------------- server/src/newsreader.rs | 25 +++++++++++----------- server/src/nm.rs | 2 +- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/server/src/lib.rs b/server/src/lib.rs index 6d65015..7b2018e 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -5,7 +5,7 @@ pub mod nm; use css_inline::{CSSInliner, InlineError, InlineOptions}; use linkify::{LinkFinder, LinkKind}; -use log::error; +use log::{error, info}; use lol_html::{element, errors::RewritingError, rewrite_str, RewriteStrSettings}; use maplit::{hashmap, hashset}; use thiserror::Error; @@ -50,31 +50,15 @@ pub fn linkify_html(text: &str) -> String { pub fn sanitize_html( html: &str, cid_prefix: &str, - base_url: &Url, + base_url: &Option, ) -> Result { - let element_content_handlers = vec![ + let mut element_content_handlers = vec![ // Open links in new tab element!("a[href]", |el| { el.set_attribute("target", "_blank").unwrap(); Ok(()) }), - // Make links with relative URLs absolute - element!("a[href]", |el| { - if let Some(Ok(href)) = el.get_attribute("href").map(|href| base_url.join(&href)) { - el.set_attribute("href", &href.as_str()).unwrap(); - } - - Ok(()) - }), - // Make images with relative srcs absolute - element!("img[src]", |el| { - if let Some(Ok(src)) = el.get_attribute("src").map(|src| base_url.join(&src)) { - el.set_attribute("src", &src.as_str()).unwrap(); - } - - Ok(()) - }), // Replace mixed part CID images with URL element!("img[src]", |el| { let src = el @@ -98,6 +82,30 @@ pub fn sanitize_html( Ok(()) }), ]; + if let Some(base_url) = base_url { + element_content_handlers.extend(vec![ + // Make links with relative URLs absolute + element!("a[href]", |el| { + if let Some(Ok(href)) = el.get_attribute("href").map(|href| { + info!("href {href:?}"); + base_url.join(&href) + }) { + el.set_attribute("href", &href.as_str()).unwrap(); + } + + Ok(()) + }), + // Make images with relative srcs absolute + element!("img[src]", |el| { + if let Some(Ok(src)) = el.get_attribute("src").map(|src| base_url.join(&src)) { + info!("src {src:?}"); + el.set_attribute("src", &src.as_str()).unwrap(); + } + + Ok(()) + }), + ]); + } let inline_opts = InlineOptions { inline_style_tags: true, diff --git a/server/src/newsreader.rs b/server/src/newsreader.rs index ea227f2..dafd350 100644 --- a/server/src/newsreader.rs +++ b/server/src/newsreader.rs @@ -5,7 +5,6 @@ use std::{ }; use async_graphql::connection::{self, Connection, Edge}; -use log::info; use sqlx::postgres::PgPool; use url::Url; @@ -185,18 +184,18 @@ pub async fn thread(pool: &PgPool, thread_id: String) -> Result { let text = if text.len() > MAX_RAW_MESSAGE_SIZE {