Commit Graph

2094 Commits

Author SHA1 Message Date
Manos Pitsidianakis
48a10f7241
melib: remove unused BackendOp::fetch_flags() method 2023-07-18 16:13:58 +03:00
Manos Pitsidianakis
0219dc8707
melib/jmap: respect max_objects_in_get when fetching email
Fixes #144
2023-07-18 16:13:44 +03:00
Manos Pitsidianakis
c4c245ee19
melib/jmap: respect danger_accept_invalid_certs setting 2023-07-18 16:13:41 +03:00
Manos Pitsidianakis
53cba4beee
Update README.md relative file paths 2023-07-16 20:06:44 +03:00
Manos Pitsidianakis
561ba9c87b
listing: add relative_list_indices setting for thread listing 2023-07-16 14:13:55 +03:00
Manos Pitsidianakis
8abc9358a7
mail/pgp: add newline after Version: 1 header 2023-07-16 11:46:45 +03:00
Manos Pitsidianakis
e9cd800f49
melib/nntp: add support for storing read status locally 2023-07-16 11:46:33 +03:00
Manos Pitsidianakis
519257b08f
listing: add relative_menu_indices setting for menubar 2023-07-15 20:29:25 +03:00
Manos Pitsidianakis
ab418c1d39
pgp: refresh documentation, fix encryption/signing
Closes #259
2023-07-15 19:33:20 +03:00
Manos Pitsidianakis
cf9a04a591
Add metadata to Jobs, and add JobManager tab
Opened with command `manage-jobs`
2023-07-14 00:24:38 +03:00
Manos Pitsidianakis
369c1dbdac
view/html: show open command in status bar 2023-07-13 23:02:10 +03:00
Manos Pitsidianakis
4e55fbc90d
nntp: add SEEN flag to all envs, since NNTP has no flags 2023-07-13 21:03:55 +03:00
Manos Pitsidianakis
5ceddf412e
Update CHANGELOG.md 2023-07-13 17:21:10 +03:00
Manos Pitsidianakis
13fe64a027
Cache pgp signature verification results 2023-07-13 17:18:13 +03:00
Manos Pitsidianakis
6086a3789d
Fix libgpgme segfault error and re-enable gpg
Closes #255
2023-07-13 16:51:37 +03:00
Manos Pitsidianakis
5b5869a2ec
logging: re-enable print to stderr ifdef MELI_DEBUG_STDERR 2023-07-13 16:49:50 +03:00
Manos Pitsidianakis
866166eb8e
attachments: don't print parsing error for empty bytes 2023-07-13 16:48:59 +03:00
Manos Pitsidianakis
d4e605c098
Add tagref source code annotations
Source Code Annotation Tags:

Global tags (in tagref format <https://github.com/stepchowfun/tagref>)
for source code annotation:

- [tag:hardcoded_color_value] Replace hardcoded color values with user
   configurable ones.
- [tag:needs_unit_test]
- [tag:needs_user_doc]
- [tag:needs_dev_doc]
- [tag:FIXME]
- [tag:TODO]
- [tag:VERIFY] Verify whether this is the correct way to do something
- [tag:DEBT] Technical debt
2023-07-13 16:47:11 +03:00
Manos Pitsidianakis
a5770c89f4
Add Woodpecker-CI check pipeline 2023-07-11 13:05:52 +03:00
Manos Pitsidianakis
74e15316db
view/envelope: open message/rfc822 attachments in subview instead of new tab 2023-07-10 08:34:35 +03:00
Manos Pitsidianakis
d93ee413a7
melib/datetime: add timestamp_to_string_utc
Tests were using `timestamp_to_string` which in turn uses `localtime_r`
which assumes the local machine's time zone. Use gmtime_r instead.

Fixes #252
2023-07-09 18:50:35 +03:00
Manos Pitsidianakis
c2ed3e283f
view/envelope: fix Source::* view showing only envelope body
Instead of the entire envelope source
2023-07-08 13:59:09 +03:00
Manos Pitsidianakis
b0e867eb68
Move src to meli/src 2023-07-08 13:58:32 +03:00
Manos Pitsidianakis
b5657201db
melib: fix doctest compilation errors 2023-07-08 13:58:15 +03:00
rek2
3803d788ab
if auth is false checks if config has password entry 2023-07-07 14:00:16 +03:00
rek2
b5f205b77b add availability to use server_password_command in the nntp backend like in the IMAP backend 2023-07-06 05:23:24 +02:00
Damian Poddebniak
7c33f8999b chore: Use published imap-codec 0.10.0. 2023-07-05 14:46:39 +02:00
Damian Poddebniak
34a54d3c05 docs: Add some TODO(#222)s. 2023-07-04 21:32:07 +02:00
Damian Poddebniak
9d51b6bd52 chore: Update imap-codec. 2023-07-04 20:56:51 +02:00
Manos Pitsidianakis
7998e1e77e
melib/datetime: add missing LC libc constants for openbsd target_os
Fixes #242

"Compilation failure on master on OpenBSD" #242
2023-07-04 00:23:47 +03:00
Manos Pitsidianakis
957abf4e72
Update cargo dependencies
Concerns #242 - "Compilation failure on master on OpenBSD"
2023-07-04 00:21:16 +03:00
Manos Pitsidianakis
e3dfeaad7e
Fix compilation error when building without gpgme feature 2023-07-03 14:59:37 +03:00
Manos Pitsidianakis
619fbef129
melib/thread: recursively calculate update_show_subject()
Walk the entire thread tree and update show_subject collectively when a
new entry is added.
2023-07-03 11:05:16 +03:00
Manos Pitsidianakis
342df091a0
mail/view: don't set all thread to seen when opening a thread entry 2023-07-03 11:04:49 +03:00
Manos Pitsidianakis
1bcc0bbece
melib/mbox: add mbox parsing test 2023-07-03 11:00:51 +03:00
Manos Pitsidianakis
e8e49e741b
melib/mbox: fix wrong per message offset 2023-07-03 11:00:49 +03:00
Manos Pitsidianakis
1dc1d86848
melib/shellexpand: fix infinite loop bug
Introduced in recent "fixing clippy lints" commit
2023-07-03 09:52:03 +03:00
Manos Pitsidianakis
ba7f5dce1c
listing/thread: fix display of threaded conversations tree structure
When missing intermediate and/or parent messages in a thread, the
printed thread tree branches were completely invalid. This commit makes
sure thread node entries that have no corresponding envelopes are
accounted for in the tree structure.
2023-07-03 09:46:28 +03:00
Manos Pitsidianakis
0b258a1f05
meli: clippy lint fixes 2023-07-03 09:38:51 +03:00
Manos Pitsidianakis
5f29faa640
melib: clippy lint fixes 2023-07-03 09:38:47 +03:00
Manos Pitsidianakis
6858ee1fab
meli: move subcommand handling to its own module 2023-07-03 09:38:43 +03:00
Manos Pitsidianakis
f98e36cee5
melib: Replace old-style /*! module doc comments with //! 2023-07-03 09:38:37 +03:00
Manos Pitsidianakis
f0d88005fb
melib/email: change message/rfc822 Display repr
Put subject first.
2023-07-03 09:37:56 +03:00
Manos Pitsidianakis
e64923eeaa
melib/email/headers/names: fix debug_assert condition
On invalid parsings, _cnt can be equal to probe and chunk len because
the value won't be a valid header
2023-06-22 14:06:39 +03:00
Manos Pitsidianakis
65179d4816
composer: fix cursor/widget focus scrolling logic
Scrolling up/down with scroll_{up,down} shortcuts didn't work correctly,
because the form widget used its own shortcuts. This commit refactors
the cursor logic.
2023-06-22 13:23:27 +03:00
Manos Pitsidianakis
0c0a678cff
state.rs: fix overlay widgets not being reaped after Unrealize event 2023-06-21 12:11:01 +03:00
Manos Pitsidianakis
f5cfbd32e6
melib/imap: on set_flags, update {un,}seen sets in all mailboxes
Some envelopes might be in several mailboxes, for example in Gmail's
implementation of IMAP.
2023-06-20 13:22:52 +03:00
Manos Pitsidianakis
363f493099
listing: add {previous,next}_entry shortcuts to quickly open other mail entries
When reading a mail entry, with Ctrl+n you can switch to the next entry,
and with Ctrl+p to the previous one. They can be reconfigured by setting
the shortcuts.listing.next_entry and shortcuts.listing.previous_entry
settings.
2023-06-19 22:15:06 +03:00
Manos Pitsidianakis
8cab9d9da8
listing/thread: add option to hide consecutive identical From values inside a thread
The config setting is listing.threaded_repeat_identical_from_values and
the default value is false

Before:

data:image/webp;base64,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

After:

data:image/webp;base64,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
2023-06-19 10:01:02 +03:00
Manos Pitsidianakis
b05d929975
account: impl exponential backoff when retrying connection
When connection fails to be established because of network issues,
perform an exponential back-off reconnection.

https://cloud.google.com/iot/docs/how-tos/exponential-backoff

This will limit maximum waiting time before next attempt and also
prevent reconnecting without wait when there's no reason to (network or
remote server is down).

The algorithm is really crude:

Instead of uniformly sampling 1..=1000 milliseconds, we sample (4 *
random::<u8>()) which is at most 4 * 255 = 1020 which is good enough.

1. Try to connect immediately
2. If it fails, set retries = 1.
3. Try to reconnect after retries * (4 * random::<u8>())
4. If it fails, set retries *= 2 = 2.
5. Try to reconnect after retries * (4 * random::<u8>())
6. If it fails, set retries *= 2 = 4.
7. Try to reconnect after retries * (4 * random::<u8>())
8. If it fails, set retries *= 2 = 8. Stop increasing retries from now
   on.
9. Try to reconnect in a loop after retries * (4 * random::<u8>())
2023-06-19 10:01:02 +03:00