2342{
2344 gpgme_data_t keydata = NULL;
2345 gpgme_import_result_t impres = NULL;
2346 gpgme_import_status_t st = NULL;
2347 bool any;
2348
2350 if (!fp_in)
2351 {
2353 goto leave;
2354 }
2355
2356
2357 gpgme_error_t err = gpgme_data_new_from_stream(&keydata, fp_in);
2358 if (err != GPG_ERR_NO_ERROR)
2359 {
2360 mutt_error(
_(
"error allocating data object: %s"), gpgme_strerror(err));
2361 goto leave;
2362 }
2363
2364 err = gpgme_op_import(ctx, keydata);
2365 if (err != GPG_ERR_NO_ERROR)
2366 {
2367 mutt_error(
_(
"Error importing key: %s"), gpgme_strerror(err));
2368 goto leave;
2369 }
2370
2371
2372 impres = gpgme_op_import_result(ctx);
2373 if (!impres)
2374 {
2375 fputs("oops: no import result returned\n", stdout);
2376 goto leave;
2377 }
2378
2379 for (st = impres->imports; st; st = st->next)
2380 {
2381 if (st->result)
2382 continue;
2383 printf(
"key %s imported (",
NONULL(st->fpr));
2384
2385
2386 any = false;
2387 if (st->status & GPGME_IMPORT_SECRET)
2388 {
2389 printf("secret parts");
2390 any = true;
2391 }
2392 if ((st->status & GPGME_IMPORT_NEW))
2393 {
2394 printf("%snew key", any ? ", " : "");
2395 any = true;
2396 }
2397 if ((st->status & GPGME_IMPORT_UID))
2398 {
2399 printf("%snew uid", any ? ", " : "");
2400 any = true;
2401 }
2402 if ((st->status & GPGME_IMPORT_SIG))
2403 {
2404 printf("%snew sig", any ? ", " : "");
2405 any = true;
2406 }
2407 if ((st->status & GPGME_IMPORT_SUBKEY))
2408 {
2409 printf("%snew subkey", any ? ", " : "");
2410 any = true;
2411 }
2412 printf("%s)\n", any ? "" : "not changed");
2413
2414 }
2415
2416
2417
2418
2419
2420
2421 for (st = impres->imports; st; st = st->next)
2422 {
2423 if (st->result == 0)
2424 continue;
2425 printf(
"key %s import failed: %s\n",
NONULL(st->fpr), gpgme_strerror(st->result));
2426 }
2427 fflush(stdout);
2428
2429leave:
2430 gpgme_release(ctx);
2431 gpgme_data_release(keydata);
2433}
gpgme_ctx_t create_gpgme_context(bool for_smime)
Create a new GPGME context.
#define mutt_file_fclose(FP)
#define mutt_file_fopen(PATH, MODE)