From d352206e2978306526f521a4ccc042a47b3d81cb Mon Sep 17 00:00:00 2001 From: Mylloon Date: Fri, 3 May 2024 12:49:50 +0200 Subject: [PATCH] wip: mail obfuscation (#51) --- src/misc/markdown.rs | 34 +++++++++++++++++++++++++++++ src/misc/utils.rs | 1 + static/js/mail_obfuscation.js | 6 +++++ templates/blog/post.html | 1 + templates/cours.html | 1 + templates/libs/mail_obfuscater.html | 1 + 6 files changed, 44 insertions(+) create mode 100644 static/js/mail_obfuscation.js create mode 100644 templates/libs/mail_obfuscater.html diff --git a/src/misc/markdown.rs b/src/misc/markdown.rs index 69b3c3c..735b907 100644 --- a/src/misc/markdown.rs +++ b/src/misc/markdown.rs @@ -100,6 +100,7 @@ pub struct Metadata { pub math: bool, pub mermaid: bool, pub syntax_highlight: bool, + pub mail_obfsucated: bool, } impl Metadata { @@ -212,6 +213,7 @@ fn fix_images_and_integration(path: &str, html: String) -> (String, Metadata) { math: false, mermaid: false, syntax_highlight: false, + mail_obfsucated: false, }; ( @@ -284,14 +286,17 @@ pub fn read_md( let mut html_content = String::from_utf8(html).unwrap(); let children_metadata; + let mail_obfsucated; (html_content, children_metadata) = fix_images_and_integration(path, html_content); html_content = custom_img_size(html_content); + (html_content, mail_obfsucated) = mail_obfuscation(html_content); let mut final_metadata = Metadata { info: metadata, mermaid: check_mermaid(root, mermaid_name), syntax_highlight: check_code(root, &[mermaid_name.into()]), math: check_math(&html_content), + mail_obfsucated, }; final_metadata.merge(children_metadata); @@ -424,3 +429,32 @@ fn hljs_replace<'a>(root: &'a AstNode<'a>, mermaid_str: &str) { } }); } + +/// Obfuscate email if email found +fn mail_obfuscation(html: String) -> (String, bool) { + let modified = Arc::new(AtomicBool::new(false)); + ( + rewrite_str( + &html, + RewriteStrSettings { + element_content_handlers: vec![element!("a[href^='mailto:']", |el| { + modified.store(true, Ordering::SeqCst); + + let link = el.get_attribute("href").unwrap(); + let (_uri, mail) = &link.split_at(7); + let (before, after) = mail.split_once('@').unwrap(); + + let modified_mail = format!("{}(at){}", before, after); + + el.set_inner_content(&modified_mail, ContentType::Html); + + // TODO: Change href + Ok(el.set_attribute("href", &link)?) + })], + ..RewriteStrSettings::default() + }, + ) + .unwrap(), + modified.load(Ordering::SeqCst), + ) +} diff --git a/src/misc/utils.rs b/src/misc/utils.rs index da27dec..3d5bf75 100644 --- a/src/misc/utils.rs +++ b/src/misc/utils.rs @@ -78,6 +78,7 @@ fn read_pdf(data: Vec) -> File { mermaid: false, syntax_highlight: false, math: false, + mail_obfsucated: false, }, content: format!( r#" { + Array.from(document.getElementsByClassName("at")).forEach((elem) => { + // TODO: Change link + elem.textContent = "@"; + }); +}); diff --git a/templates/blog/post.html b/templates/blog/post.html index 0254a33..bf48205 100644 --- a/templates/blog/post.html +++ b/templates/blog/post.html @@ -36,6 +36,7 @@ {{#mermaid}}{{>libs/mermaid_footer.html}}{{/mermaid}} {{#math}}{{>libs/katex_footer.html}}{{/math}} {{#syntax_highlight}}{{>libs/hljs_footer.html}}{{/syntax_highlight}} + {{#mail_obfsucated}}{{>libs/mail_obfuscater.html}}{{/mail_obfsucated}} {{/metadata}} {{/post}} {{/data}} diff --git a/templates/cours.html b/templates/cours.html index a898b23..2c0c674 100644 --- a/templates/cours.html +++ b/templates/cours.html @@ -24,6 +24,7 @@ {{#metadata}} {{#mermaid}}{{>libs/mermaid_footer.html}}{{/mermaid}} {{#math}}{{>libs/katex_footer.html}}{{/math}} {{#syntax_highlight}}{{>libs/hljs_footer.html}}{{/syntax_highlight}} + {{#mail_obfsucated}}{{>libs/mail_obfuscater.html}}{{/mail_obfsucated}} {{/metadata}} {{/content}} {{/data}} diff --git a/templates/libs/mail_obfuscater.html b/templates/libs/mail_obfuscater.html new file mode 100644 index 0000000..a242ff1 --- /dev/null +++ b/templates/libs/mail_obfuscater.html @@ -0,0 +1 @@ +