NeoMutt  2025-12-11-596-g7cc1dd
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
pgp_encrypt_message()

PGP encrypt an email. More...

+ Collaboration diagram for pgp_encrypt_message():

Functions

struct Bodypgp_gpgme_encrypt_message (struct Body *b, char *keylist, bool sign, const struct AddressList *from)
 PGP encrypt an email - Implements CryptModuleSpecs::pgp_encrypt_message() -.
 
struct Bodypgp_class_encrypt_message (struct Body *b, char *keylist, bool sign, const struct AddressList *from)
 PGP encrypt an email - Implements CryptModuleSpecs::pgp_encrypt_message() -.
 

Detailed Description

PGP encrypt an email.

Parameters
bBody of email to encrypt
keylistList of keys, or fingerprints (space separated)
signIf true, sign the message too
fromFrom line, to choose the key to sign
Return values
ptrEncrypted Body
NULLError

Encrypt the mail body to all the given keys.

Function Documentation

◆ pgp_gpgme_encrypt_message()

struct Body * pgp_gpgme_encrypt_message ( struct Body * b,
char * keylist,
bool sign,
const struct AddressList * from )

PGP encrypt an email - Implements CryptModuleSpecs::pgp_encrypt_message() -.

Definition at line 1043 of file crypt_gpgme.c.

1045{
1046 if (sign)
1048 gpgme_data_t plaintext = body_to_data_object(b, false);
1049 if (!plaintext)
1050 return NULL;
1051
1052 char *outfile = encrypt_gpgme_object(plaintext, keylist, false, sign, from);
1053 gpgme_data_release(plaintext);
1054 if (!outfile)
1055 return NULL;
1056
1057 struct Body *b_enc = mutt_body_new();
1058 b_enc->type = TYPE_MULTIPART;
1059 b_enc->subtype = mutt_str_dup("encrypted");
1060 b_enc->encoding = ENC_7BIT;
1061 b_enc->use_disp = false;
1062 b_enc->disposition = DISP_INLINE;
1063
1065 mutt_param_set(&b_enc->parameter, "protocol", "application/pgp-encrypted");
1066
1067 b_enc->parts = mutt_body_new();
1068 b_enc->parts->type = TYPE_APPLICATION;
1069 b_enc->parts->subtype = mutt_str_dup("pgp-encrypted");
1070 b_enc->parts->encoding = ENC_7BIT;
1071
1072 b_enc->parts->next = mutt_body_new();
1073 b_enc->parts->next->type = TYPE_APPLICATION;
1074 b_enc->parts->next->subtype = mutt_str_dup("octet-stream");
1075 b_enc->parts->next->encoding = ENC_7BIT;
1076 b_enc->parts->next->filename = outfile;
1077 b_enc->parts->next->use_disp = true;
1078 b_enc->parts->next->disposition = DISP_ATTACH;
1079 b_enc->parts->next->unlink = true; /* delete after sending the message */
1080 b_enc->parts->next->d_filename = mutt_str_dup("msg.asc"); /* non pgp/mime
1081 can save */
1082
1083 return b_enc;
1084}
void crypt_convert_to_7bit(struct Body *b)
Convert an email to 7bit encoding.
Definition crypt.c:809
static gpgme_data_t body_to_data_object(struct Body *b, bool convert)
Create GPGME object from the mail body.
static char * encrypt_gpgme_object(gpgme_data_t plaintext, char *keylist, bool use_smime, bool combined_signed, const struct AddressList *from)
Encrypt the GPGPME data object.
struct Body * mutt_body_new(void)
Create a new Body.
Definition body.c:44
@ ENC_7BIT
7-bit text
Definition mime.h:49
@ TYPE_MULTIPART
Type: 'multipart/*'.
Definition mime.h:37
@ TYPE_APPLICATION
Type: 'application/*'.
Definition mime.h:33
@ DISP_ATTACH
Content is attached.
Definition mime.h:63
@ DISP_INLINE
Content is inline.
Definition mime.h:62
void mutt_generate_boundary(struct ParameterList *pl)
Create a unique boundary id for a MIME part.
Definition multipart.c:93
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition string.c:257
void mutt_param_set(struct ParameterList *pl, const char *attribute, const char *value)
Set a Parameter.
Definition parameter.c:111
The body of an email.
Definition body.h:36
char * d_filename
filename to be used for the content-disposition header If NULL, filename is used instead.
Definition body.h:56
struct Body * parts
parts of a multipart or message/rfc822
Definition body.h:73
bool unlink
If true, filename should be unlink()ed before free()ing this structure.
Definition body.h:68
struct ParameterList parameter
Parameters of the content-type.
Definition body.h:63
bool use_disp
Content-Disposition uses filename= ?
Definition body.h:47
unsigned int disposition
content-disposition, ContentDisposition
Definition body.h:42
struct Body * next
next attachment in the list
Definition body.h:72
char * subtype
content-type subtype
Definition body.h:61
unsigned int encoding
content-transfer-encoding, ContentEncoding
Definition body.h:41
unsigned int type
content-type primary type, ContentType
Definition body.h:40
char * filename
When sending a message, this is the file to which this structure refers.
Definition body.h:59
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pgp_class_encrypt_message()

struct Body * pgp_class_encrypt_message ( struct Body * b,
char * keylist,
bool sign,
const struct AddressList * from )

PGP encrypt an email - Implements CryptModuleSpecs::pgp_encrypt_message() -.

Warning
"b" is no longer freed in this routine, you need to free it later. This is necessary for $fcc_attach.

Definition at line 1593 of file pgp.c.

1595{
1596 char buf[1024] = { 0 };
1597 FILE *fp_pgp_in = NULL, *fp_tmp = NULL;
1598 struct Body *b_enc = NULL;
1599 bool err = false;
1600 bool empty = false;
1601 pid_t pid;
1602 struct Buffer *tempfile = buf_pool_get();
1603 struct Buffer *pgpinfile = buf_pool_get();
1604
1605 buf_mktemp(tempfile);
1606 FILE *fp_out = mutt_file_fopen(buf_string(tempfile), "w+");
1607 if (!fp_out)
1608 {
1609 mutt_perror("%s", buf_string(tempfile));
1610 goto cleanup;
1611 }
1612
1613 FILE *fp_pgp_err = mutt_file_mkstemp();
1614 if (!fp_pgp_err)
1615 {
1616 mutt_perror(_("Can't create temporary file"));
1617 unlink(buf_string(tempfile));
1618 mutt_file_fclose(&fp_out);
1619 goto cleanup;
1620 }
1621
1622 buf_mktemp(pgpinfile);
1623 fp_tmp = mutt_file_fopen(buf_string(pgpinfile), "w");
1624 if (!fp_tmp)
1625 {
1626 mutt_perror("%s", buf_string(pgpinfile));
1627 unlink(buf_string(tempfile));
1628 mutt_file_fclose(&fp_out);
1629 mutt_file_fclose(&fp_pgp_err);
1630 goto cleanup;
1631 }
1632
1633 if (sign)
1635
1636 mutt_write_mime_header(b, fp_tmp, NeoMutt->sub);
1637 fputc('\n', fp_tmp);
1638 mutt_write_mime_body(b, fp_tmp, NeoMutt->sub);
1639 mutt_file_fclose(&fp_tmp);
1640
1641 pid = pgp_invoke_encrypt(&fp_pgp_in, NULL, NULL, -1, fileno(fp_out),
1642 fileno(fp_pgp_err), buf_string(pgpinfile), keylist, sign);
1643 if (pid == -1)
1644 {
1645 mutt_file_fclose(&fp_out);
1646 mutt_file_fclose(&fp_pgp_err);
1647 unlink(buf_string(pgpinfile));
1648 goto cleanup;
1649 }
1650
1651 if (sign)
1652 {
1653 if (!pgp_use_gpg_agent())
1654 fputs(PgpPass, fp_pgp_in);
1655 fputc('\n', fp_pgp_in);
1656 }
1657 mutt_file_fclose(&fp_pgp_in);
1658
1659 const bool c_pgp_check_exit = cs_subset_bool(NeoMutt->sub, "pgp_check_exit");
1660 if (filter_wait(pid) && c_pgp_check_exit)
1661 empty = true;
1662
1663 unlink(buf_string(pgpinfile));
1664
1665 fflush(fp_out);
1666 rewind(fp_out);
1667 if (!empty)
1668 empty = (fgetc(fp_out) == EOF);
1669 mutt_file_fclose(&fp_out);
1670
1671 fflush(fp_pgp_err);
1672 rewind(fp_pgp_err);
1673 while (fgets(buf, sizeof(buf) - 1, fp_pgp_err))
1674 {
1675 err = true;
1676 fputs(buf, stdout);
1677 }
1678 mutt_file_fclose(&fp_pgp_err);
1679
1680 /* pause if there is any error output from PGP */
1681 if (err)
1683
1684 if (empty)
1685 {
1686 /* fatal error while trying to encrypt message */
1687 if (sign)
1688 pgp_class_void_passphrase(); /* just in case */
1689 unlink(buf_string(tempfile));
1690 goto cleanup;
1691 }
1692
1693 b_enc = mutt_body_new();
1694 b_enc->type = TYPE_MULTIPART;
1695 b_enc->subtype = mutt_str_dup("encrypted");
1696 b_enc->encoding = ENC_7BIT;
1697 b_enc->use_disp = false;
1698 b_enc->disposition = DISP_INLINE;
1699
1701 mutt_param_set(&b_enc->parameter, "protocol", "application/pgp-encrypted");
1702
1703 b_enc->parts = mutt_body_new();
1704 b_enc->parts->type = TYPE_APPLICATION;
1705 b_enc->parts->subtype = mutt_str_dup("pgp-encrypted");
1706 b_enc->parts->encoding = ENC_7BIT;
1707
1708 b_enc->parts->next = mutt_body_new();
1709 b_enc->parts->next->type = TYPE_APPLICATION;
1710 b_enc->parts->next->subtype = mutt_str_dup("octet-stream");
1711 b_enc->parts->next->encoding = ENC_7BIT;
1712 b_enc->parts->next->filename = buf_strdup(tempfile);
1713 b_enc->parts->next->use_disp = true;
1714 b_enc->parts->next->disposition = DISP_ATTACH;
1715 b_enc->parts->next->unlink = true; /* delete after sending the message */
1716 b_enc->parts->next->d_filename = mutt_str_dup("msg.asc"); /* non pgp/mime can save */
1717
1718cleanup:
1719 buf_pool_release(&tempfile);
1720 buf_pool_release(&pgpinfile);
1721 return b_enc;
1722}
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
Definition buffer.c:571
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
int mutt_any_key_to_continue(const char *s)
Prompt the user to 'press any key' and wait.
Definition curs_lib.c:173
#define mutt_file_fclose(FP)
Definition file.h:139
#define mutt_file_fopen(PATH, MODE)
Definition file.h:138
void pgp_class_void_passphrase(void)
Forget the cached passphrase - Implements CryptModuleSpecs::void_passphrase() -.
Definition pgp.c:75
#define mutt_perror(...)
Definition logging2.h:95
int filter_wait(pid_t pid)
Wait for the exit of a process and return its status.
Definition filter.c:228
#define _(a)
Definition message.h:28
static char PgpPass[1024]
Cached PGP Passphrase.
Definition pgp.c:68
bool pgp_use_gpg_agent(void)
Does the user want to use the gpg agent?
Definition pgp.c:126
pid_t pgp_invoke_encrypt(FILE **fp_pgp_in, FILE **fp_pgp_out, FILE **fp_pgp_err, int fd_pgp_in, int fd_pgp_out, int fd_pgp_err, const char *fname, const char *uids, bool sign)
Use PGP to encrypt a file.
Definition pgpinvoke.c:229
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
int mutt_write_mime_body(struct Body *b, FILE *fp, struct ConfigSubset *sub)
Write a MIME part.
Definition body.c:302
int mutt_write_mime_header(struct Body *b, FILE *fp, struct ConfigSubset *sub)
Create a MIME header.
Definition header.c:757
String manipulation buffer.
Definition buffer.h:36
Container for Accounts, Notifications.
Definition neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition neomutt.h:49
#define buf_mktemp(buf)
Definition tmp.h:33
#define mutt_file_mkstemp()
Definition tmp.h:36
+ Here is the call graph for this function: