NeoMutt  2025-12-11-1039-g550ac6
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
smime_invoke_import()

Add a certificate and update index file (externally). More...

Collaboration diagram for smime_invoke_import():

Functions

void smime_class_invoke_import (const char *infile, const char *mailbox)
 Add a certificate and update index file (externally) - Implements CryptModuleSpecs::smime_invoke_import() -.

Detailed Description

Add a certificate and update index file (externally).

Parameters
infileFile containing certificate
mailboxMailbox

Function Documentation

◆ smime_class_invoke_import()

void smime_class_invoke_import ( const char * infile,
const char * mailbox )

Add a certificate and update index file (externally) - Implements CryptModuleSpecs::smime_invoke_import() -.

Definition at line 1006 of file smime.c.

1007{
1008 char *certfile = NULL;
1009 struct Buffer *buf = NULL;
1010
1011 FILE *fp_out = NULL;
1012 FILE *fp_err = mutt_file_mkstemp();
1013 if (!fp_err)
1014 {
1015 mutt_perror(_("Can't create temporary file"));
1016 goto done;
1017 }
1018
1019 fp_out = mutt_file_mkstemp();
1020 if (!fp_out)
1021 {
1022 mutt_perror(_("Can't create temporary file"));
1023 goto done;
1024 }
1025
1026 buf = buf_pool_get();
1027 const bool c_smime_ask_cert_label = cs_subset_bool(NeoMutt->sub, "smime_ask_cert_label");
1028 if (c_smime_ask_cert_label)
1029 {
1030 if ((mw_get_field(_("Label for certificate: "), buf, MUTT_COMP_NONE,
1031 HC_OTHER, NULL, NULL) != 0) ||
1032 buf_is_empty(buf))
1033 {
1034 goto done;
1035 }
1036 }
1037
1038 mutt_endwin();
1039 certfile = smime_extract_certificate(infile);
1040 if (certfile)
1041 {
1042 mutt_endwin();
1043
1044 const struct Expando *c_smime_import_cert_command =
1045 cs_subset_expando(NeoMutt->sub, "smime_import_cert_command");
1046 FILE *fp_smime_in = NULL;
1047 pid_t pid = smime_invoke(&fp_smime_in, NULL, NULL, -1, fileno(fp_out),
1048 fileno(fp_err), certfile, NULL, NULL, NULL, NULL,
1049 NULL, NULL, c_smime_import_cert_command);
1050 if (pid == -1)
1051 {
1052 mutt_message(_("Error: unable to create OpenSSL subprocess"));
1053 goto done;
1054 }
1055 fputs(buf_string(buf), fp_smime_in);
1056 fputc('\n', fp_smime_in);
1057 mutt_file_fclose(&fp_smime_in);
1058
1059 filter_wait(pid);
1060
1061 mutt_file_unlink(certfile);
1062 FREE(&certfile);
1063 }
1064
1065 fflush(fp_out);
1066 fseek(fp_out, 0, SEEK_SET);
1067 clearerr(fp_out);
1068 fflush(fp_err);
1069 fseek(fp_err, 0, SEEK_SET);
1070 clearerr(fp_err);
1071
1072 mutt_file_copy_stream(fp_out, stdout);
1073 mutt_file_copy_stream(fp_err, stdout);
1074
1075done:
1076 mutt_file_fclose(&fp_out);
1077 mutt_file_fclose(&fp_err);
1078 buf_pool_release(&buf);
1079}
bool buf_is_empty(const struct Buffer *buf)
Is the Buffer empty?
Definition buffer.c:298
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition helpers.c:47
const struct Expando * cs_subset_expando(const struct ConfigSubset *sub, const char *name)
Get an Expando config item by name.
void mutt_endwin(void)
Shutdown curses.
Definition curs_lib.c:152
@ MUTT_COMP_NONE
No flags are set.
Definition wdata.h:46
int mutt_file_copy_stream(FILE *fp_in, FILE *fp_out)
Copy the contents of one file into another.
Definition file.c:224
void mutt_file_unlink(const char *s)
Delete a file, carefully.
Definition file.c:156
#define mutt_file_fclose(FP)
Definition file.h:144
int mw_get_field(const char *prompt, struct Buffer *buf, CompletionFlags complete, enum HistoryClass hclass, const struct CompleteOps *comp_api, void *cdata)
Ask the user for a string -.
Definition window.c:502
#define mutt_message(...)
Definition logging2.h:93
#define mutt_perror(...)
Definition logging2.h:95
@ HC_OTHER
Miscellaneous strings.
Definition lib.h:61
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
int filter_wait(pid_t pid)
Wait for the exit of a process and return its status.
Definition filter.c:231
#define _(a)
Definition message.h:28
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
static char * smime_extract_certificate(const char *infile)
Extract an SMIME certificate from a file.
Definition smime.c:817
static pid_t smime_invoke(FILE **fp_smime_in, FILE **fp_smime_out, FILE **fp_smime_err, int fp_smime_infd, int fp_smime_outfd, int fp_smime_errfd, const char *fname, const char *sig_fname, const char *cryptalg, const char *digestalg, const char *key, const char *certificates, const char *intermediates, const struct Expando *exp)
Run an SMIME command.
Definition smime.c:214
String manipulation buffer.
Definition buffer.h:36
Parsed Expando trees.
Definition expando.h:41
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
#define mutt_file_mkstemp()
Definition tmp.h:36
Here is the call graph for this function: