+36 -22 +/-6 browse
1 | diff --git a/Cargo.lock b/Cargo.lock |
2 | index 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 |
14 | index 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 |
26 | index 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 |
60 | index 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 |
77 | index 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 |
111 | index 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()) |