NeoMutt  2023-11-03-85-g512e01
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
pgp_invoke_import()

Import a key from a message into the user's public key ring. More...

+ Collaboration diagram for pgp_invoke_import():

Functions

void pgp_gpgme_invoke_import (const char *fname)
 Import a key from a message into the user's public key ring - Implements CryptModuleSpecs::pgp_invoke_import() -.
 
void pgp_class_invoke_import (const char *fname)
 Import a key from a message into the user's public key ring - Implements CryptModuleSpecs::pgp_invoke_import() -.
 

Detailed Description

Import a key from a message into the user's public key ring.

Parameters
fnameFile containing the message

Function Documentation

◆ pgp_gpgme_invoke_import()

void pgp_gpgme_invoke_import ( const char *  fname)

Import a key from a message into the user's public key ring - Implements CryptModuleSpecs::pgp_invoke_import() -.

Definition at line 2261 of file crypt_gpgme.c.

2262{
2263 gpgme_ctx_t ctx = create_gpgme_context(false);
2264 gpgme_data_t keydata = NULL;
2265 gpgme_import_result_t impres = NULL;
2266 gpgme_import_status_t st = NULL;
2267 bool any;
2268
2269 FILE *fp_in = mutt_file_fopen(fname, "r");
2270 if (!fp_in)
2271 {
2272 mutt_perror("%s", fname);
2273 goto leave;
2274 }
2275 /* Note that the stream, "fp_in", needs to be kept open while the keydata
2276 * is used. */
2277 gpgme_error_t err = gpgme_data_new_from_stream(&keydata, fp_in);
2278 if (err != GPG_ERR_NO_ERROR)
2279 {
2280 mutt_error(_("error allocating data object: %s"), gpgme_strerror(err));
2281 goto leave;
2282 }
2283
2284 err = gpgme_op_import(ctx, keydata);
2285 if (err != 0)
2286 {
2287 mutt_error(_("Error importing key: %s"), gpgme_strerror(err));
2288 goto leave;
2289 }
2290
2291 /* Print infos about the imported keys to stdout. */
2292 impres = gpgme_op_import_result(ctx);
2293 if (!impres)
2294 {
2295 fputs("oops: no import result returned\n", stdout);
2296 goto leave;
2297 }
2298
2299 for (st = impres->imports; st; st = st->next)
2300 {
2301 if (st->result)
2302 continue;
2303 printf("key %s imported (", NONULL(st->fpr));
2304 /* Note that we use the singular even if it is possible that
2305 * several uids etc are new. This simply looks better. */
2306 any = false;
2307 if (st->status & GPGME_IMPORT_SECRET)
2308 {
2309 printf("secret parts");
2310 any = true;
2311 }
2312 if ((st->status & GPGME_IMPORT_NEW))
2313 {
2314 printf("%snew key", any ? ", " : "");
2315 any = true;
2316 }
2317 if ((st->status & GPGME_IMPORT_UID))
2318 {
2319 printf("%snew uid", any ? ", " : "");
2320 any = true;
2321 }
2322 if ((st->status & GPGME_IMPORT_SIG))
2323 {
2324 printf("%snew sig", any ? ", " : "");
2325 any = true;
2326 }
2327 if ((st->status & GPGME_IMPORT_SUBKEY))
2328 {
2329 printf("%snew subkey", any ? ", " : "");
2330 any = true;
2331 }
2332 printf("%s)\n", any ? "" : "not changed");
2333 /* Fixme: Should we lookup each imported key and print more infos? */
2334 }
2335 /* Now print keys which failed the import. Unfortunately in most
2336 * cases gpg will bail out early and not tell GPGME about. */
2337 /* FIXME: We could instead use the new GPGME_AUDITLOG_DIAG to show
2338 * the actual gpg diagnostics. But I fear that would clutter the
2339 * output too much. Maybe a dedicated prompt or option to do this
2340 * would be helpful. */
2341 for (st = impres->imports; st; st = st->next)
2342 {
2343 if (st->result == 0)
2344 continue;
2345 printf("key %s import failed: %s\n", NONULL(st->fpr), gpgme_strerror(st->result));
2346 }
2347 fflush(stdout);
2348
2349leave:
2350 gpgme_release(ctx);
2351 gpgme_data_release(keydata);
2352 mutt_file_fclose(&fp_in);
2353}
gpgme_ctx_t create_gpgme_context(bool for_smime)
Create a new GPGME context.
Definition: crypt_gpgme.c:360
FILE * mutt_file_fopen(const char *path, const char *mode)
Call fopen() safely.
Definition: file.c:636
int mutt_file_fclose(FILE **fp)
Close a FILE handle (and NULL the pointer)
Definition: file.c:152
#define mutt_error(...)
Definition: logging2.h:92
#define mutt_perror(...)
Definition: logging2.h:93
#define _(a)
Definition: message.h:28
#define NONULL(x)
Definition: string2.h:37
+ Here is the call graph for this function:

◆ pgp_class_invoke_import()

void pgp_class_invoke_import ( const char *  fname)

Import a key from a message into the user's public key ring - Implements CryptModuleSpecs::pgp_invoke_import() -.

Definition at line 405 of file pgpinvoke.c.

406{
407 char cmd[STR_COMMAND] = { 0 };
408 struct PgpCommandContext cctx = { 0 };
409
410 struct Buffer *buf_fname = buf_pool_get();
411
412 buf_quote_filename(buf_fname, fname, true);
413 cctx.fname = buf_string(buf_fname);
414 const char *const c_pgp_sign_as = cs_subset_string(NeoMutt->sub, "pgp_sign_as");
415 const char *const c_pgp_default_key = cs_subset_string(NeoMutt->sub, "pgp_default_key");
416 if (c_pgp_sign_as)
417 cctx.signas = c_pgp_sign_as;
418 else
419 cctx.signas = c_pgp_default_key;
420
421 const char *const c_pgp_import_command = cs_subset_string(NeoMutt->sub, "pgp_import_command");
422 mutt_pgp_command(cmd, sizeof(cmd), &cctx, c_pgp_import_command);
423 if (mutt_system(cmd) != 0)
424 mutt_debug(LL_DEBUG1, "Error running \"%s\"\n", cmd);
425
426 buf_pool_release(&buf_fname);
427}
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:93
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:292
void buf_quote_filename(struct Buffer *buf, const char *filename, bool add_outer)
Quote a filename to survive the shell's quoting rules.
Definition: file.c:936
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
@ LL_DEBUG1
Log at debug level 1.
Definition: logging2.h:43
static void mutt_pgp_command(char *buf, size_t buflen, struct PgpCommandContext *cctx, const char *fmt)
Prepare a PGP Command.
Definition: pgpinvoke.c:173
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:81
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:94
int mutt_system(const char *cmd)
Run an external command.
Definition: system.c:50
#define STR_COMMAND
Enough space for a long command line.
Definition: string2.h:35
String manipulation buffer.
Definition: buffer.h:34
Container for Accounts, Notifications.
Definition: neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:45
Data for a PGP command.
Definition: pgp.h:45
const char * signas
a
Definition: pgp.h:49
const char * fname
f
Definition: pgp.h:47
+ Here is the call graph for this function:
+ Here is the caller graph for this function: