Author: Manos Pitsidianakis [manos@pitsidianak.is]
Hash: 73a7abab98c6bda5db1e98712954b73ecfa93d7f
Timestamp: Fri, 09 Jun 2023 13:34:23 +0000 (1 year ago)

+36 -22 +/-6 browse
core,web: move StripCarets trait to core
1diff --git a/Cargo.lock b/Cargo.lock
2index 4d1ed8e..d9c0270 100644
3--- a/Cargo.lock
4+++ b/Cargo.lock
5 @@ -2020,6 +2020,7 @@ dependencies = [
6 "mailpot-tests",
7 "melib",
8 "minijinja",
9+ "percent-encoding",
10 "reqwest",
11 "rusqlite",
12 "serde",
13 diff --git a/core/Cargo.toml b/core/Cargo.toml
14index 92bd33d..6d9911d 100644
15--- a/core/Cargo.toml
16+++ b/core/Cargo.toml
17 @@ -18,6 +18,7 @@ jsonschema = { version = "0.17", default-features = false }
18 log = "0.4"
19 melib = { version = "*", default-features = false, features = ["smtp", "unicode_algorithms", "maildir_backend"], git = "https://github.com/meli/meli", rev = "2447a2c" }
20 minijinja = { version = "0.31.0", features = ["source", ] }
21+ percent-encoding = { version = "^2.1" }
22 rusqlite = { version = "^0.28", features = ["bundled", "functions", "trace", "hooks", "serde_json", "array", "chrono", "unlock_notify"] }
23 serde = { version = "^1", features = ["derive", ] }
24 serde_json = "^1"
25 diff --git a/core/src/lib.rs b/core/src/lib.rs
26index f6520c3..55f28a4 100644
27--- a/core/src/lib.rs
28+++ b/core/src/lib.rs
29 @@ -207,3 +207,29 @@ pub struct MailtoAddress {
30 #[doc = include_str!("../../README.md")]
31 #[cfg(doctest)]
32 pub struct ReadmeDoctests;
33+
34+ /// Trait for stripping carets ('<','>') from Message IDs.
35+ pub trait StripCarets {
36+ /// If `self` is surrounded by carets, strip them.
37+ fn strip_carets(&self) -> &str;
38+ }
39+
40+ impl StripCarets for &str {
41+ fn strip_carets(&self) -> &str {
42+ let mut self_ref = self.trim();
43+ if self_ref.starts_with('<') && self_ref.ends_with('>') {
44+ self_ref = &self_ref[1..self_ref.len().saturating_sub(1)];
45+ }
46+ self_ref
47+ }
48+ }
49+
50+ use percent_encoding::CONTROLS;
51+ pub use percent_encoding::{utf8_percent_encode, AsciiSet};
52+
53+ // from https://github.com/servo/rust-url/blob/master/url/src/parser.rs
54+ const FRAGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b'<').add(b'>').add(b'`');
55+ const PATH: &AsciiSet = &FRAGMENT.add(b'#').add(b'?').add(b'{').add(b'}');
56+
57+ /// Set for percent encoding URL components.
58+ pub const PATH_SEGMENT: &AsciiSet = &PATH.add(b'/').add(b'%');
59 diff --git a/web/src/lists.rs b/web/src/lists.rs
60index fa756db..0eb225d 100644
61--- a/web/src/lists.rs
62+++ b/web/src/lists.rs
63 @@ -583,7 +583,11 @@ pub async fn list_post_eml(
64 );
65 response.headers_mut().insert(
66 http::header::CONTENT_DISPOSITION,
67- http::HeaderValue::try_from(format!("attachment; filename=\"{}.eml\"", msg_id)).unwrap(),
68+ http::HeaderValue::try_from(format!(
69+ "attachment; filename=\"{}.eml\"",
70+ msg_id.trim().strip_carets()
71+ ))
72+ .unwrap(),
73 );
74
75 Ok(response)
76 diff --git a/web/src/minijinja_utils.rs b/web/src/minijinja_utils.rs
77index d333d2e..de0d471 100644
78--- a/web/src/minijinja_utils.rs
79+++ b/web/src/minijinja_utils.rs
80 @@ -22,7 +22,7 @@
81 use std::fmt::Write;
82
83 use mailpot::models::ListOwner;
84- use percent_encoding::utf8_percent_encode;
85+ pub use mailpot::StripCarets;
86
87 use super::*;
88
89 @@ -77,20 +77,6 @@ lazy_static::lazy_static! {
90 };
91 }
92
93- pub trait StripCarets {
94- fn strip_carets(&self) -> &str;
95- }
96-
97- impl StripCarets for &str {
98- fn strip_carets(&self) -> &str {
99- let mut self_ref = self.trim();
100- if self_ref.starts_with('<') && self_ref.ends_with('>') {
101- self_ref = &self_ref[1..self_ref.len().saturating_sub(1)];
102- }
103- self_ref
104- }
105- }
106-
107 #[derive(Debug, PartialEq, Eq, Clone, serde::Deserialize, serde::Serialize)]
108 pub struct MailingList {
109 pub pk: i64,
110 diff --git a/web/src/typed_paths.rs b/web/src/typed_paths.rs
111index e51d801..9429756 100644
112--- a/web/src/typed_paths.rs
113+++ b/web/src/typed_paths.rs
114 @@ -17,15 +17,11 @@
115 * along with this program. If not, see <https://www.gnu.org/licenses/>.
116 */
117
118- use percent_encoding::{utf8_percent_encode, AsciiSet, CONTROLS};
119+ pub use mailpot::PATH_SEGMENT;
120+ use percent_encoding::utf8_percent_encode;
121
122 use super::*;
123
124- // from https://github.com/servo/rust-url/blob/master/url/src/parser.rs
125- const FRAGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b'<').add(b'>').add(b'`');
126- const PATH: &AsciiSet = &FRAGMENT.add(b'#').add(b'?').add(b'{').add(b'}');
127- pub const PATH_SEGMENT: &AsciiSet = &PATH.add(b'/').add(b'%');
128-
129 pub trait IntoCrumb: TypedPath {
130 fn to_crumb(&self) -> Cow<'static, str> {
131 Cow::from(self.to_uri().to_string())