summaryrefslogtreecommitdiffstats
path: root/autocrypt
diff options
context:
space:
mode:
authorKevin McCarthy <kevin@8t8.us>2019-08-07 14:12:43 -0700
committerKevin McCarthy <kevin@8t8.us>2019-08-07 14:12:43 -0700
commitd55b0390971e3fa977bc15f390bcdadc80d86532 (patch)
tree5234a51ef321605eabc05356832d5ed43e68b45b /autocrypt
parent769a7765d8ac90413719bf73b0b1908aea0b5147 (diff)
Add ability to create autocrypt account from an existing key.
This is useful when adding accounts, or for users who want to use an existing key from the keyring during initial account creation.
Diffstat (limited to 'autocrypt')
-rw-r--r--autocrypt/autocrypt.c2
-rw-r--r--autocrypt/autocrypt_gpgme.c85
-rw-r--r--autocrypt/autocrypt_private.h2
3 files changed, 88 insertions, 1 deletions
diff --git a/autocrypt/autocrypt.c b/autocrypt/autocrypt.c
index 7e139870..4ef47a8d 100644
--- a/autocrypt/autocrypt.c
+++ b/autocrypt/autocrypt.c
@@ -171,7 +171,7 @@ int mutt_autocrypt_account_init (int prompt)
goto cleanup;
}
- if (mutt_autocrypt_gpgme_create_key (addr, keyid, keydata))
+ if (mutt_autocrypt_gpgme_select_or_create_key (addr, keyid, keydata))
goto cleanup;
/* L10N:
diff --git a/autocrypt/autocrypt_gpgme.c b/autocrypt/autocrypt_gpgme.c
index 64619168..da540166 100644
--- a/autocrypt/autocrypt_gpgme.c
+++ b/autocrypt/autocrypt_gpgme.c
@@ -185,6 +185,91 @@ cleanup:
return rv;
}
+int mutt_autocrypt_gpgme_select_key (BUFFER *keyid, BUFFER *keydata)
+{
+ int rv = -1;
+ gpgme_ctx_t ctx = NULL;
+ gpgme_key_t key = NULL;
+
+ set_option (OPTAUTOCRYPTGPGME);
+ if (mutt_gpgme_select_secret_key (keyid))
+ goto cleanup;
+
+ if (create_gpgme_context (&ctx))
+ goto cleanup;
+
+ if (gpgme_get_key (ctx, mutt_b2s (keyid), &key, 0))
+ goto cleanup;
+
+ if (key->revoked || key->expired || key->disabled || key->invalid ||
+ !key->can_encrypt || !key->can_sign)
+ {
+ /* L10N:
+ After selecting a key for an autocrypt account,
+ this is displayed if the key was revoked/expired/disabled/invalid
+ or can't be used for both signing and encryption.
+ %s is the key fingerprint.
+ */
+ mutt_error (_("The key %s is not usable for autocrypt"), mutt_b2s (keyid));
+ mutt_sleep (1);
+ goto cleanup;
+ }
+
+ if (export_keydata (ctx, key, keydata))
+ goto cleanup;
+
+ rv = 0;
+
+cleanup:
+ unset_option (OPTAUTOCRYPTGPGME);
+ gpgme_key_unref (key);
+ gpgme_release (ctx);
+ return rv;
+}
+
+int mutt_autocrypt_gpgme_select_or_create_key (ADDRESS *addr, BUFFER *keyid, BUFFER *keydata)
+{
+ int rv = -1;
+ char *prompt, *letters;
+ int choice;
+
+ /* L10N:
+ During autocrypt account creation, this prompt asks the
+ user whether they want to create a new GPG key for the account,
+ or select an existing account from the keyring.
+ */
+ prompt = _("(c)reate new, or (s)elect existing GPG key? ");
+ /* L10N:
+ The letters corresponding to the
+ "(c)reate new, or (s)elect existing GPG key?" prompt.
+ */
+ letters = _("cs");
+
+ choice = mutt_multi_choice (prompt, letters);
+ switch (choice)
+ {
+ case 2: /* select existing */
+ rv = mutt_autocrypt_gpgme_select_key (keyid, keydata);
+ if (rv == 0)
+ break;
+
+ /* L10N:
+ During autocrypt account creation, if selecting an existing key fails
+ for some reason, we prompt to see if they want to create a key instead.
+ */
+ if (mutt_yesorno (_("Create a new gpg key for this account, instead?"),
+ MUTT_YES) == MUTT_NO)
+ break;
+
+ /* otherwise fall through to create new key */
+
+ case 1: /* create new */
+ rv = mutt_autocrypt_gpgme_create_key (addr, keyid, keydata);
+ }
+
+ return rv;
+}
+
int mutt_autocrypt_gpgme_import_key (const char *keydata, BUFFER *keyid)
{
int rv = -1;
diff --git a/autocrypt/autocrypt_private.h b/autocrypt/autocrypt_private.h
index 43b6b29d..37b4f311 100644
--- a/autocrypt/autocrypt_private.h
+++ b/autocrypt/autocrypt_private.h
@@ -55,7 +55,9 @@ int mutt_autocrypt_schema_init (void);
int mutt_autocrypt_schema_update (void);
int mutt_autocrypt_gpgme_init (void);
+int mutt_autocrypt_gpgme_select_or_create_key (ADDRESS *addr, BUFFER *keyid, BUFFER *keydata);
int mutt_autocrypt_gpgme_create_key (ADDRESS *addr, BUFFER *keyid, BUFFER *keydata);
+int mutt_autocrypt_gpgme_select_key (BUFFER *keyid, BUFFER *keydata);
int mutt_autocrypt_gpgme_import_key (const char *keydata, BUFFER *keyid);
int mutt_autocrypt_gpgme_is_valid_key (const char *keyid);