+38 -148 +/-12 browse
1 | diff --git a/cli/src/args.rs b/cli/src/args.rs |
2 | index 8e3e484..a1acaa4 100644 |
3 | --- a/cli/src/args.rs |
4 | +++ b/cli/src/args.rs |
5 | @@ -236,9 +236,6 @@ pub enum ErrorQueueCommand { |
6 | /// index of entry. |
7 | #[arg(long)] |
8 | index: Vec<i64>, |
9 | - /// JSON format. |
10 | - #[arg(long)] |
11 | - json: bool, |
12 | }, |
13 | /// Delete entry and print it in stdout. |
14 | Delete { |
15 | diff --git a/cli/src/main.rs b/cli/src/main.rs |
16 | index caee04d..d10f015 100644 |
17 | --- a/cli/src/main.rs |
18 | +++ b/cli/src/main.rs |
19 | @@ -530,24 +530,20 @@ fn run_app(opt: Opt) -> Result<()> { |
20 | } |
21 | ErrorQueue { cmd } => match cmd { |
22 | ErrorQueueCommand::List => { |
23 | - let errors = db.error_queue()?; |
24 | + let errors = db.queue(Queue::Error)?; |
25 | if errors.is_empty() { |
26 | println!("Error queue is empty."); |
27 | } else { |
28 | for e in errors { |
29 | println!( |
30 | "- {} {} {} {} {}", |
31 | - e["pk"], |
32 | - e["datetime"], |
33 | - e["from_address"], |
34 | - e["to_address"], |
35 | - e["subject"] |
36 | + e.pk, e.datetime, e.from_address, e.to_addresses, e.subject |
37 | ); |
38 | } |
39 | } |
40 | } |
41 | - ErrorQueueCommand::Print { index, json } => { |
42 | - let mut errors = db.error_queue()?; |
43 | + ErrorQueueCommand::Print { index } => { |
44 | + let mut errors = db.queue(Queue::Error)?; |
45 | if !index.is_empty() { |
46 | errors.retain(|el| index.contains(&el.pk())); |
47 | } |
48 | @@ -555,16 +551,12 @@ fn run_app(opt: Opt) -> Result<()> { |
49 | println!("Error queue is empty."); |
50 | } else { |
51 | for e in errors { |
52 | - if json { |
53 | - println!("{:#}", e); |
54 | - } else { |
55 | - println!("{}", e["message"]); |
56 | - } |
57 | + println!("{e:?}"); |
58 | } |
59 | } |
60 | } |
61 | ErrorQueueCommand::Delete { index, quiet } => { |
62 | - let mut errors = db.error_queue()?; |
63 | + let mut errors = db.queue(Queue::Error)?; |
64 | if !index.is_empty() { |
65 | errors.retain(|el| index.contains(&el.pk())); |
66 | } |
67 | @@ -576,10 +568,10 @@ fn run_app(opt: Opt) -> Result<()> { |
68 | if !quiet { |
69 | println!("Deleting error queue elements {:?}", &index); |
70 | } |
71 | - db.delete_from_error_queue(index)?; |
72 | + db.delete_from_queue(Queue::Error, index)?; |
73 | if !quiet { |
74 | for e in errors { |
75 | - println!("{}", e["message"]); |
76 | + println!("{e:?}"); |
77 | } |
78 | } |
79 | } |
80 | diff --git a/cli/tests/out_queue_flush.rs b/cli/tests/out_queue_flush.rs |
81 | index 7378c21..b1a82c7 100644 |
82 | --- a/cli/tests/out_queue_flush.rs |
83 | +++ b/cli/tests/out_queue_flush.rs |
84 | @@ -156,7 +156,7 @@ fn test_out_queue_flush() { |
85 | let out_queue = db.queue(Queue::Out).unwrap(); |
86 | assert_eq!(out_queue.len(), 2); |
87 | assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 2); |
88 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
89 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
90 | } |
91 | |
92 | log::info!("Flush out queue, subscription confirmations should be sent to the new users."); |
93 | @@ -340,7 +340,7 @@ fn test_list_requests_submission() { |
94 | let out_queue = db.queue(Queue::Out).unwrap(); |
95 | assert_eq!(out_queue.len(), 1); |
96 | assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 0); |
97 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
98 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
99 | } |
100 | |
101 | log::info!("Flush out queue, help reply should go to Αλίκη."); |
102 | diff --git a/core/src/db.rs b/core/src/db.rs |
103 | index a597138..38cb8e3 100644 |
104 | --- a/core/src/db.rs |
105 | +++ b/core/src/db.rs |
106 | @@ -65,8 +65,6 @@ mod templates; |
107 | pub use templates::*; |
108 | mod queue; |
109 | pub use queue::*; |
110 | - mod error_queue; |
111 | - pub use error_queue::*; |
112 | mod posts; |
113 | pub use posts::*; |
114 | mod subscriptions; |
115 | diff --git a/core/src/db/error_queue.rs b/core/src/db/error_queue.rs |
116 | deleted file mode 100644 |
117 | index effc6da..0000000 |
118 | --- a/core/src/db/error_queue.rs |
119 | +++ /dev/null |
120 | @@ -1,103 +0,0 @@ |
121 | - /* |
122 | - * This file is part of mailpot |
123 | - * |
124 | - * Copyright 2020 - Manos Pitsidianakis |
125 | - * |
126 | - * This program is free software: you can redistribute it and/or modify |
127 | - * it under the terms of the GNU Affero General Public License as |
128 | - * published by the Free Software Foundation, either version 3 of the |
129 | - * License, or (at your option) any later version. |
130 | - * |
131 | - * This program is distributed in the hope that it will be useful, |
132 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
133 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
134 | - * GNU Affero General Public License for more details. |
135 | - * |
136 | - * You should have received a copy of the GNU Affero General Public License |
137 | - * along with this program. If not, see <https://www.gnu.org/licenses/>. |
138 | - */ |
139 | - |
140 | - use serde_json::{json, Value}; |
141 | - |
142 | - use super::*; |
143 | - |
144 | - impl Connection { |
145 | - /// Insert a received email into the error queue. |
146 | - pub fn insert_to_error_queue( |
147 | - &self, |
148 | - list_pk: Option<i64>, |
149 | - env: &Envelope, |
150 | - raw: &[u8], |
151 | - reason: String, |
152 | - ) -> Result<i64> { |
153 | - let mut stmt = self.connection.prepare( |
154 | - "INSERT INTO queue(which, list, comment, to_addresses, from_address, subject, \ |
155 | - message_id, message) VALUES('error', ?, ?, ?, ?, ?, ?, ?) RETURNING pk;", |
156 | - )?; |
157 | - let pk = stmt.query_row( |
158 | - rusqlite::params![ |
159 | - &list_pk, |
160 | - &reason, |
161 | - &env.field_to_to_string(), |
162 | - &env.field_from_to_string(), |
163 | - &env.subject(), |
164 | - &env.message_id().to_string(), |
165 | - raw, |
166 | - ], |
167 | - |row| { |
168 | - let pk: i64 = row.get("pk")?; |
169 | - Ok(pk) |
170 | - }, |
171 | - )?; |
172 | - Ok(pk) |
173 | - } |
174 | - |
175 | - /// Fetch all error queue entries. |
176 | - pub fn error_queue(&self) -> Result<Vec<DbVal<Value>>> { |
177 | - let mut stmt = self |
178 | - .connection |
179 | - .prepare("SELECT * FROM queue WHERE which = 'error';")?; |
180 | - let error_iter = stmt.query_map([], |row| { |
181 | - let pk = row.get::<_, i64>("pk")?; |
182 | - Ok(DbVal( |
183 | - json!({ |
184 | - "pk" : pk, |
185 | - "error": row.get::<_, Option<String>>("comment")?, |
186 | - "to_addresses": row.get::<_, String>("to_addresses")?, |
187 | - "from_address": row.get::<_, String>("from_address")?, |
188 | - "subject": row.get::<_, String>("subject")?, |
189 | - "message_id": row.get::<_, String>("message_id")?, |
190 | - "message": row.get::<_, Vec<u8>>("message")?, |
191 | - "timestamp": row.get::<_, u64>("timestamp")?, |
192 | - "datetime": row.get::<_, String>("datetime")?, |
193 | - }), |
194 | - pk, |
195 | - )) |
196 | - })?; |
197 | - |
198 | - let mut ret = vec![]; |
199 | - for error in error_iter { |
200 | - let error = error?; |
201 | - ret.push(error); |
202 | - } |
203 | - Ok(ret) |
204 | - } |
205 | - |
206 | - /// Delete error queue entries. |
207 | - pub fn delete_from_error_queue(&mut self, index: Vec<i64>) -> Result<()> { |
208 | - let tx = self.connection.transaction()?; |
209 | - |
210 | - if index.is_empty() { |
211 | - tx.execute("DELETE FROM queue WHERE which = 'error';", [])?; |
212 | - } else { |
213 | - for i in index { |
214 | - tx.execute( |
215 | - "DELETE FROM queue WHERE which = 'error' AND pk = ?;", |
216 | - rusqlite::params![i], |
217 | - )?; |
218 | - } |
219 | - }; |
220 | - tx.commit()?; |
221 | - Ok(()) |
222 | - } |
223 | - } |
224 | diff --git a/core/src/db/posts.rs b/core/src/db/posts.rs |
225 | index d46ae0e..64c3e53 100644 |
226 | --- a/core/src/db/posts.rs |
227 | +++ b/core/src/db/posts.rs |
228 | @@ -75,7 +75,13 @@ impl Connection { |
229 | pub fn post(&mut self, env: &Envelope, raw: &[u8], _dry_run: bool) -> Result<()> { |
230 | let result = self.inner_post(env, raw, _dry_run); |
231 | if let Err(err) = result { |
232 | - return match self.insert_to_error_queue(None, env, raw, err.to_string()) { |
233 | + return match self.insert_to_queue(QueueEntry::new( |
234 | + Queue::Error, |
235 | + None, |
236 | + Some(Cow::Borrowed(env)), |
237 | + raw, |
238 | + Some(err.to_string()), |
239 | + )?) { |
240 | Ok(idx) => { |
241 | log::info!( |
242 | "Inserted mail from {:?} into error_queue at index {}", |
243 | diff --git a/core/src/db/queue.rs b/core/src/db/queue.rs |
244 | index 334516b..20574b5 100644 |
245 | --- a/core/src/db/queue.rs |
246 | +++ b/core/src/db/queue.rs |
247 | @@ -45,6 +45,8 @@ pub enum Queue { |
248 | Corrupt, |
249 | /// Emails that must be sent as soon as possible. |
250 | Out, |
251 | + /// Error queue |
252 | + Error, |
253 | } |
254 | |
255 | impl Queue { |
256 | @@ -56,6 +58,7 @@ impl Queue { |
257 | Self::Deferred => "deferred", |
258 | Self::Corrupt => "corrupt", |
259 | Self::Out => "out", |
260 | + Self::Error => "error", |
261 | } |
262 | } |
263 | } |
264 | diff --git a/core/tests/account.rs b/core/tests/account.rs |
265 | index 7cbf57f..5af5b56 100644 |
266 | --- a/core/tests/account.rs |
267 | +++ b/core/tests/account.rs |
268 | @@ -17,7 +17,7 @@ |
269 | * along with this program. If not, see <https://www.gnu.org/licenses/>. |
270 | */ |
271 | |
272 | - use mailpot::{models::*, Configuration, Connection, SendMail}; |
273 | + use mailpot::{models::*, Configuration, Connection, Queue, SendMail}; |
274 | use mailpot_tests::init_stderr_logging; |
275 | use tempfile::TempDir; |
276 | |
277 | @@ -67,7 +67,7 @@ fn test_accounts() { |
278 | .unwrap(); |
279 | |
280 | assert_eq!(post_policy.pk(), 1); |
281 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
282 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
283 | assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 0); |
284 | |
285 | let mut db = db.untrusted(); |
286 | @@ -89,7 +89,7 @@ MIME-Version: 1.0 |
287 | db.post(&envelope, subscribe_bytes, /* dry_run */ false) |
288 | .unwrap(); |
289 | assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 1); |
290 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
291 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
292 | |
293 | assert_eq!(db.account_by_address("user@example.com").unwrap(), None); |
294 | |
295 | @@ -115,7 +115,7 @@ MIME-Version: 1.0 |
296 | melib::Envelope::from_bytes(&set_password_bytes, None).expect("Could not parse message"); |
297 | db.post(&envelope, &set_password_bytes, /* dry_run */ false) |
298 | .unwrap(); |
299 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
300 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
301 | let acc = db.account_by_address("user@example.com").unwrap().unwrap(); |
302 | |
303 | assert_eq!( |
304 | @@ -136,7 +136,7 @@ MIME-Version: 1.0 |
305 | melib::Envelope::from_bytes(&set_password_bytes, None).expect("Could not parse message"); |
306 | db.post(&envelope, &set_password_bytes, /* dry_run */ false) |
307 | .unwrap(); |
308 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
309 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
310 | let acc = db.account_by_address("user@example.com").unwrap().unwrap(); |
311 | |
312 | assert!( |
313 | diff --git a/core/tests/error_queue.rs b/core/tests/error_queue.rs |
314 | index c7525e7..32c6613 100644 |
315 | --- a/core/tests/error_queue.rs |
316 | +++ b/core/tests/error_queue.rs |
317 | @@ -17,7 +17,7 @@ |
318 | * along with this program. If not, see <https://www.gnu.org/licenses/>. |
319 | */ |
320 | |
321 | - use mailpot::{melib, models::*, Configuration, Connection, SendMail}; |
322 | + use mailpot::{melib, models::*, Configuration, Connection, Queue, SendMail}; |
323 | use mailpot_tests::init_stderr_logging; |
324 | use tempfile::TempDir; |
325 | |
326 | @@ -73,7 +73,7 @@ fn test_error_queue() { |
327 | .unwrap(); |
328 | |
329 | assert_eq!(post_policy.pk(), 1); |
330 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
331 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
332 | |
333 | // drop privileges |
334 | let mut db = db.untrusted(); |
335 | @@ -88,5 +88,5 @@ fn test_error_queue() { |
336 | mailpot::ErrorKind::PostRejected(_reason) => {} |
337 | other => panic!("Got unexpected error: {}", other), |
338 | } |
339 | - assert_eq!(db.error_queue().unwrap().len(), 1); |
340 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 1); |
341 | } |
342 | diff --git a/core/tests/subscription.rs b/core/tests/subscription.rs |
343 | index c3a3f6f..1515af9 100644 |
344 | --- a/core/tests/subscription.rs |
345 | +++ b/core/tests/subscription.rs |
346 | @@ -17,7 +17,7 @@ |
347 | * along with this program. If not, see <https://www.gnu.org/licenses/>. |
348 | */ |
349 | |
350 | - use mailpot::{models::*, Configuration, Connection, SendMail}; |
351 | + use mailpot::{models::*, Configuration, Connection, Queue, SendMail}; |
352 | use mailpot_tests::init_stderr_logging; |
353 | use tempfile::TempDir; |
354 | |
355 | @@ -65,7 +65,7 @@ fn test_list_subscription() { |
356 | .unwrap(); |
357 | |
358 | assert_eq!(post_policy.pk(), 1); |
359 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
360 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
361 | assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 0); |
362 | |
363 | let mut db = db.untrusted(); |
364 | @@ -96,7 +96,7 @@ eT48L2h0bWw+ |
365 | mailpot::ErrorKind::PostRejected(_reason) => {} |
366 | other => panic!("Got unexpected error: {}", other), |
367 | } |
368 | - assert_eq!(db.error_queue().unwrap().len(), 1); |
369 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 1); |
370 | |
371 | let input_bytes_2 = b"From: Name <user@example.com> |
372 | To: <foo-chat+subscribe@example.com> |
373 | @@ -115,11 +115,11 @@ MIME-Version: 1.0 |
374 | db.post(&envelope, input_bytes_2, /* dry_run */ false) |
375 | .unwrap(); |
376 | assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 1); |
377 | - assert_eq!(db.error_queue().unwrap().len(), 1); |
378 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 1); |
379 | let envelope = |
380 | melib::Envelope::from_bytes(input_bytes_1, None).expect("Could not parse message"); |
381 | db.post(&envelope, input_bytes_1, /* dry_run */ false) |
382 | .unwrap(); |
383 | - assert_eq!(db.error_queue().unwrap().len(), 1); |
384 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 1); |
385 | assert_eq!(db.list_posts(foo_chat.pk(), None).unwrap().len(), 1); |
386 | } |
387 | diff --git a/core/tests/template_replies.rs b/core/tests/template_replies.rs |
388 | index 40c6bc0..8660b87 100644 |
389 | --- a/core/tests/template_replies.rs |
390 | +++ b/core/tests/template_replies.rs |
391 | @@ -65,7 +65,7 @@ fn test_template_replies() { |
392 | .unwrap(); |
393 | |
394 | assert_eq!(post_policy.pk(), 1); |
395 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
396 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
397 | assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 0); |
398 | |
399 | /* create custom subscribe confirm template, and check that it is used in |
400 | @@ -98,7 +98,7 @@ MIME-Version: 1.0 |
401 | let subenvelope = melib::Envelope::from_bytes(bytes, None).expect("Could not parse message"); |
402 | db.post(&subenvelope, bytes, /* dry_run */ false).unwrap(); |
403 | assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 1); |
404 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
405 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
406 | |
407 | let out_queue = db.queue(Queue::Out).unwrap(); |
408 | assert_eq!(out_queue.len(), 1); |
409 | @@ -138,7 +138,7 @@ MIME-Version: 1.0 |
410 | let envelope = melib::Envelope::from_bytes(unbytes, None).expect("Could not parse message"); |
411 | db.post(&envelope, unbytes, /* dry_run */ false).unwrap(); |
412 | assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 0); |
413 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
414 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
415 | |
416 | let out_queue = db.queue(Queue::Out).unwrap(); |
417 | assert_eq!(out_queue.len(), 2); |
418 | @@ -155,7 +155,7 @@ MIME-Version: 1.0 |
419 | |
420 | db.post(&subenvelope, bytes, /* dry_run */ false).unwrap(); |
421 | assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 1); |
422 | - assert_eq!(db.error_queue().unwrap().len(), 0); |
423 | + assert_eq!(db.queue(Queue::Error).unwrap().len(), 0); |
424 | |
425 | let out_queue = db.queue(Queue::Out).unwrap(); |
426 | |
427 | diff --git a/docs/mpot.1 b/docs/mpot.1 |
428 | index fdc434e..5bd2b28 100644 |
429 | --- a/docs/mpot.1 |
430 | +++ b/docs/mpot.1 |
431 | @@ -649,16 +649,13 @@ List. |
432 | |
433 | .br |
434 | |
435 | - mpot error\-queue print [\-\-index \fIINDEX\fR] [\-\-json \fIJSON\fR] |
436 | + mpot error\-queue print [\-\-index \fIINDEX\fR] |
437 | .br |
438 | |
439 | Print entry in RFC5322 or JSON format. |
440 | .TP |
441 | \-\-index \fIINDEX\fR |
442 | index of entry. |
443 | - .TP |
444 | - \-\-json |
445 | - JSON format. |
446 | .ie \n(.g .ds Aq \(aq |
447 | .el .ds Aq ' |
448 | .\fB |