Commit graph

1156 commits

Author SHA1 Message Date
Manos Pitsidianakis
6ae2cf0b6b
Bump version to 0.8.7
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-30 17:23:38 +03:00
Manos Pitsidianakis
e329097d0b
melib/jmap: fix EmailBodyPart schema mismatch
EmailBodyPart required partId and blobId to be non-null, which is
invalid. Make them Option<_>s instead.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-30 17:23:38 +03:00
Manos Pitsidianakis
f2e9cac38e
melib/jmap: use suggested minimum for maxObjectsInGet
Instead of using the actual maxObjectsInGet batch size when fetching
email, use min(maxObjectsInGet, 500). This makes things not time-out
this easily when the maxObjectsInGet is large (e.g. 4096)

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-30 12:51:25 +03:00
Manos Pitsidianakis
41d07fbcef
melib/jmap: newState in EmailImportResponse cannot be null
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-30 12:51:20 +03:00
Manos Pitsidianakis
52c75e92b5
melib/jmap/email.rs: use HeaderName constants
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-30 12:08:22 +03:00
Manos Pitsidianakis
8b568f6e3b
melib/jmap: add if_in_state argument in Set::new()
JMAP code should be using if_in_state wherever possible, to detect
mismatch between current server state and current client state.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-30 12:06:45 +03:00
Manos Pitsidianakis
46df4b573b
melib/attachments: remove unused function stub
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-30 12:05:39 +03:00
Manos Pitsidianakis
85a55ed633
melib/backends: add some missing ErrorKinds to errors
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-30 12:04:10 +03:00
Manos Pitsidianakis
824de287b4
melib/jmap: fix make_address! use
make_address! macro was called with a .take() expression, which was
substituted in the macro more than once hence take() would be called
more than once.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-30 11:00:38 +03:00
Manos Pitsidianakis
197132cca0
melib/imap: support fetching with BODY[] for buggy servers
It appears icloud IMAP servers do not support fetching RFC822 items with
the FETCH command. They reply to the fetch successfully but with the
item missing. To support this clearly non-standard and buggy behavior,
retry one more time by fetching with BODY[] instead if the RFC822 is
missing.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-30 10:54:54 +03:00
Manos Pitsidianakis
97af00cd83
melib/jmap: respect timeout value from user configuration
While the timeout value was parsed, it was only used for mutex lock
timeouts and not the http connection.

This commit sets the isahc HTTP connections timeouts using the value, if
provided.

Fixes #422

Resolves: https://git.meli-email.org/meli/meli/issues/422
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-24 17:29:52 +03:00
Manos Pitsidianakis
15eeac5191
melib/jmap: enable dns_cache, tcp_keepalive & tcp_nodelay
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-24 17:29:52 +03:00
Manos Pitsidianakis
afccebf331
melib/imap: add AUTH=PLAIN support
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-18 11:01:57 +03:00
Manos Pitsidianakis
f5f1e06878
melib/imap: add UIDPLUS support
Add UIDPLUS extension support (Only UID EXPUNGE)

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-18 11:00:59 +03:00
Manos Pitsidianakis
06437e607c
melib/LazyCountSet: set not_yet_seen to 0 when inserting existing
Not yet seen behavior is unreliable and leads to false unread counts.
Set it to 0 instead when inserting an existing count.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-17 18:26:03 +03:00
Manos Pitsidianakis
96cc02a000
melib/imap/error: do not use ErrorKind::Configuration
Do not use ErrorKind::Configuration for ValidationError

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-17 16:54:15 +03:00
Manos Pitsidianakis
91fdef9820
melib/imap/cache: return NotFound on cache miss
Set error kind to NotFound instead of Bug, since it is possible a
mailbox state is not cached. Also add convenience function
ignore_not_found() that converts NotFound Err Results to Ok(()).

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-17 16:54:15 +03:00
Manos Pitsidianakis
86f9b213bf
melib/jmap: add timeout conf field in validate()
`timeout` while valid was not checked in the validate() function, so it
could not be used: the validation would reject it.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-13 22:11:30 +03:00
Manos Pitsidianakis
073aef8671
Fix lints/errors when compiling specific feature combos
- Building with sqlite3 non-bundled may result in compile-time error if
  the system version is not new enough; the bindgen feature must be
  enabled to create ffi bindings from the system version.
- Some unused code warnings show up if some features are disabled,
  refactor code to make them go away.
- Update libloading to 0.8 to prevent dual dependencies in
  Cargo.lock (rusqlite's bundled feature requires it)

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-13 18:30:35 +03:00
Manos Pitsidianakis
1e50911c55
melib/imap: add utils module to protocol_parser
Add utils module with parser helpers for syntax items that can be NIL

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-12 16:04:32 +03:00
Manos Pitsidianakis
2429f17b44
melib/jmap: on invalid conf value, print what value is expected
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-11 09:06:34 +03:00
Manos Pitsidianakis
d1499242b2
melib/error: add From<Infallible> impl
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-09 11:01:54 +03:00
Manos Pitsidianakis
386208664b
melib/error: detect DNS lookup std::io::Error
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-09 11:01:17 +03:00
Manos Pitsidianakis
100fa8b3d1
melib/utils: fix edge case in ShellExpandTrait
If there is no "/" prefix after stripping the argument prefix, the
result was reverted.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-09 09:37:55 +03:00
Manos Pitsidianakis
39e903b1d3
melib/utils: fix issues with ShellExpandTrait
ShellExpandTrait was not expanding paths properly: tilde was expanded
even if it wasn't the first byte in the sequence. Since $HOME tends to
be an absolute path, the entire value of the path accumulator up till
that point was overwritten, meaning a /path/to/~/some/file would get
expanded to ${HOME}/some/file.

ShellExpandTrait was also not completing paths properly, especially
between the generic impl and the linux specialized one. This commit adds
test to make sure their behavior is synced and changes the result type
to an enum to make the result more descriptive.

Concerns #431.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-07-07 22:38:47 +03:00
Manos Pitsidianakis
5110813e87
melib/maildir: refactor MaildirOp and watch()
Refactor to remove unwraps and add None checks with returning errors
where appropriate.

Hopefully addresses #426

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-29 14:58:07 +03:00
Manos Pitsidianakis
84d93d6555
melib/imap: add support for ID extension (opt-in)
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:11 +03:00
Manos Pitsidianakis
af6838c20c
melib: add metadata field to MailBackendCapabilities
Add field for arbitrary metadata as a serde_json::Value.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:11 +03:00
Manos Pitsidianakis
d40ee6928f
melib/imap: extract tests mod from protocol_parser
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:11 +03:00
Manos Pitsidianakis
7c47f70217
melib/sieve: extract test and parser modules to files
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:11 +03:00
Manos Pitsidianakis
ebc1fa3b8a
melib/sieve: move module to self dir
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:11 +03:00
Manos Pitsidianakis
e96e9789db
melib/imap: don't discard pre-auth capabilities
The library user can retrieve capabilities from a mail backend, and they
might want to see pre-auth capabilities as well.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:10 +03:00
Manos Pitsidianakis
e3c1656e05
melib/imap: fix LOGINDISABLED support
LOGINDISABLED disables the LOGIN command, not authenticating in general;
doh! 🤦🤦🤦🤦

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:10 +03:00
Manos Pitsidianakis
9fb5bc41b4
melib/imap: impl AUTH=ANONYMOUS (RFC4505)
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:09 +03:00
Manos Pitsidianakis
1cce8c1162
melib/imap: accept invalid "+" CRLF cont req
Some servers erroneously send a "+" CRLF sequence instead of "+" SP
CRLF.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:09 +03:00
Manos Pitsidianakis
a9e9d952d5
melib/imap: change termination_string arg to Option
Change ImapConnection::read_lines function argument termination_string
from &[u8] to Option<&[u8]>.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:09 +03:00
Manos Pitsidianakis
6e1fea8059
melib/jmap: show suggestions on Unauthorized error
Show suggestions for solving Unauthorized connection errors.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:08 +03:00
Manos Pitsidianakis
f9a3b33397
melib/imap/operations: return NotFound on empty FETCH
If UID FETCH returns an OK response but without untagged fetch
responses, it means the UID was not found. Return a NotFound error in
this case and a ProtocolError in other error cases.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:08 +03:00
Manos Pitsidianakis
8c880dc747
melib/error: add {Error,ErrorKind}::is_recoverable()
Add methods to guess whether the error is transient and can be recovered
from.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:08 +03:00
Manos Pitsidianakis
7200589a9e
melib/error: add ErrorKind::NotFound
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:08 +03:00
Manos Pitsidianakis
6da4e2eca6
Replace stringify! in Debug impls with type checked macro
Add identify! macro which expands to stringify! but also const type
checks the value to prevent typos/wrong values.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:07 +03:00
Manos Pitsidianakis
e107d613a0
melib/backends: add prelude module for import cleanup
Add a prelude module under melib::backends that exports all types needed
to interact with a mail backend. This reduces the number of imports in
every related file.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-28 11:15:05 +03:00
Andrei Zisu
c04b593bdf
Use BODY instead of RFC822
RFC3501 seems to prefer BODY attributes as the more modern equivalent
to RFC822. For example, this also allows us to use BODY.PEEK. Since the
fetch methods in melib are tightly coupled with the parser, we have to
add this here if we want to use BODY attributes during fetch.
2024-06-28 11:14:05 +03:00
Manos Pitsidianakis
0ffe7fa5b3
melib: add text/plain or text/html arg for text decoding
In the function that decodes attachments to text, the default was
Text::Plain. Now it's passed via an argument so that Text::Html can also
be used.
2024-06-28 11:14:05 +03:00
Andrei Zisu
b4579075a8
melib/imap: Allow XOAUTH2 string passed as string
For cases in which the user of melib already knows the token and auth
string and doesn't have to call an outside command.
2024-06-28 11:14:04 +03:00
Andrei Zisu
6f61176a99
Remove unecessary mut modifier
This also makes sense semantically since as_bytes shouldn't be
performing any mutations.
2024-06-28 11:14:01 +03:00
Manos Pitsidianakis
7e8d19afc7
melib/email.rs: add Envelope::sender_any
Similar to Envelope::recipient_any, this method searches if its argument
exists in From: or Author: headers.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-15 16:45:09 +03:00
Manos Pitsidianakis
d3a45b3442
melib/notmuch: make default shared lib name a const
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-15 16:45:09 +03:00
Manos Pitsidianakis
ff3fe07758
Fix new 1.79.0 clippy lints
Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
2024-06-15 16:45:09 +03:00
Damian Poddebniak
7856ea33f0 refactor: Transition more to imap-codec 2024-06-08 17:50:35 +03:00