From 575589d02e80b864e92612c83743eeb4fdd0e57c Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Wed, 31 Jul 2019 18:56:29 -0700 Subject: [PATCH] Add option to scan mailboxes during first run The scanner will disable the header cache, allowing scanning all messages in the mailbox. Co-authored-by: Richard Russon --- autocrypt/autocrypt.c | 69 +++++++++++++++++++++++++++++++++++ autocrypt/autocrypt_db.c | 1 + autocrypt/autocrypt_private.h | 1 + 3 files changed, 71 insertions(+) diff --git a/autocrypt/autocrypt.c b/autocrypt/autocrypt.c index 3d7dd09fb..d8b8a0fb8 100644 --- a/autocrypt/autocrypt.c +++ b/autocrypt/autocrypt.c @@ -35,6 +35,8 @@ #include "curs_lib.h" #include "globals.h" #include "mutt_curses.h" +#include "muttlib.h" +#include "mx.h" #include "ncrypt/ncrypt.h" #include "send.h" @@ -795,3 +797,70 @@ int mutt_autocrypt_generate_gossip_list(struct Email *hdr) mutt_autocrypt_db_peer_free(&peer); return rv; } + +/* This is invoked during the first autocrypt initialization, + * to scan one or more mailboxes for autocrypt headers. + * + * Due to the implementation, header-cached headers are not scanned, + * so this routine just opens up the mailboxes with $header_cache + * temporarily disabled. + */ +void mutt_autocrypt_scan_mailboxes(void) +{ + int scan; + struct Buffer *folderbuf = NULL; + struct Context *ctx = NULL; + +#ifdef USE_HCACHE + char *old_hdrcache = C_HeaderCache; + C_HeaderCache = NULL; +#endif + + folderbuf = mutt_buffer_pool_get(); + + /* L10N: + The first time autocrypt is enabled, Mutt will ask to scan + through one or more mailboxes for Autocrypt: headers. + Those headers are then captured in the database as peer records + and used for encryption. + If this is answered yes, they will be prompted for a mailbox. + */ + scan = mutt_yesorno(_("Scan a mailbox for autocrypt headers?"), MUTT_YES); + while (scan == MUTT_YES) + { + /* L10N: + The prompt for a mailbox to scan for Autocrypt: headers + */ + if ((!mutt_buffer_enter_fname(_("Scan mailbox"), folderbuf, 1)) && + mutt_buffer_len(folderbuf)) + { + mutt_buffer_expand_path_regex(folderbuf, false); + struct Mailbox *m = mx_path_resolve(mutt_b2s(folderbuf)); + /* NOTE: I am purposely *not* executing folder hooks here, + * as they can do all sorts of things like push into the getch() buffer. + * Authentication should be in account-hooks. */ + ctx = mx_mbox_open(m, MUTT_READONLY); + mx_mbox_close(&ctx); + mutt_buffer_reset(folderbuf); + } + + /* outside of the MUTTMENU system, we have to deal with issues + * like the file browser not being cleared from the screen... */ + move(0, 0); + clrtobot(); + + /* L10N: + This is the second prompt to see if the user would like + to scan more than one mailbox for Autocrypt headers. + I'm purposely being extra verbose; asking first then prompting + for a mailbox. This is because this is a one-time operation + and I don't want them to accidentally ctrl-g and abort it. + */ + scan = mutt_yesorno(_("Scan another mailbox for autocrypt headers?"), MUTT_YES); + } + +#ifdef USE_HCACHE + C_HeaderCache = old_hdrcache; +#endif + mutt_buffer_pool_release(&folderbuf); +} diff --git a/autocrypt/autocrypt_db.c b/autocrypt/autocrypt_db.c index 3c2c510e0..2043870df 100644 --- a/autocrypt/autocrypt_db.c +++ b/autocrypt/autocrypt_db.c @@ -79,6 +79,7 @@ int mutt_autocrypt_db_init(int can_create) goto cleanup; /* Don't abort the whole init process because account creation failed */ mutt_autocrypt_account_init(1); + mutt_autocrypt_scan_mailboxes(); } else { diff --git a/autocrypt/autocrypt_private.h b/autocrypt/autocrypt_private.h index d1a5bf27c..2c7fc79e2 100644 --- a/autocrypt/autocrypt_private.h +++ b/autocrypt/autocrypt_private.h @@ -30,6 +30,7 @@ struct AddressList; struct Buffer; int mutt_autocrypt_account_init (int prompt); +void mutt_autocrypt_scan_mailboxes (void); int mutt_autocrypt_db_init (int can_create); void mutt_autocrypt_db_close (void); -- 2.49.0