95 char length[5] = { 0 };
101 state_printf(state,
_(
"[-- Type: %s/%s%s%s, Encoding: %s, Size: %s --]\n"),
102 TYPE(b_email), b_email->
subtype, charset ?
"; charset=" :
"",
107 state_printf(state,
_(
"[-- Alternative Type #%d: %s/%s%s%s, Encoding: %s, Size: %s --]\n"),
108 n,
TYPE(b_email), b_email->
subtype, charset ?
"; charset=" :
"",
123 const char *ib = NULL;
133 iconv(cd, NULL, NULL, &ob, &obl);
158 memmove(bufi, ib, ibl);
182 while (((c = fgetc(state->
fp_in)) != EOF) && len--)
184 if ((c ==
'\r') && len)
186 const int ch = fgetc(state->
fp_in);
194 ungetc(ch, state->
fp_in);
199 if (l ==
sizeof(bufi))
219 if ((s[0] ==
'=') && (s[1] ==
'\0'))
223 if ((s[0] ==
'=') && isxdigit((
unsigned char) s[1]) && isxdigit((
unsigned char) s[2]))
242 char *d = NULL, *s = NULL;
250 for (d = dest, s = src; *s;)
268 if (!soft && (last ==
'\n'))
273 if ((kind == 0) && (c ==
'\r'))
310 char line[256] = { 0 };
311 char decline[512] = { 0 };
325 if (!fgets(line,
MIN((ssize_t)
sizeof(line), len + 1), state->
fp_in))
328 size_t linelen = strlen(line);
333 const int last = (linelen != 0) ? line[linelen - 1] : 0;
338 while ((linelen > 0) && isspace(line[linelen - 1]))
340 line[linelen] =
'\0';
360 if ((ch < 32) || (ch > 95))
374 char tmps[128] = { 0 };
384 if (!fgets(tmps,
sizeof(tmps), state->
fp_in))
392 if (!fgets(tmps,
sizeof(tmps), state->
fp_in))
400 for (
unsigned char c = 0; (c < linelen) && *pt;)
402 for (
char l = 2; (l <= 6) && pt[0] && pt[1]; l += 2)
441 char tmp[1024] = { 0 };
450 while ((p = strtok(p,
",")))
469 if ((plen != 0) && (buf[plen] ==
'/'))
487 char type[256] = { 0 };
490 snprintf(type,
sizeof(type),
"%s/%s",
TYPE(b), b->
subtype);
493 if (c_implicit_auto_view)
506 if (((i > 0) && (np->
data[i - 1] ==
'/') && (np->
data[i] ==
'*') &&
534 char buf[1024] = { 0 };
535 char type[256] = { 0 };
545 snprintf(type,
sizeof(type),
"%s/%s",
TYPE(b_email), b_email->
subtype);
584 fileno(fp_in), -1, -1,
EnvList);
610 while (fgets(buf,
sizeof(buf), fp_out))
619 if (fgets(buf,
sizeof(buf), fp_err))
629 while (fgets(buf,
sizeof(buf), fp_err))
640 if (fgets(buf,
sizeof(buf), fp_err))
695 while ((len > 0) && (buf[len - 1] ==
' '))
713 struct Body *b = NULL;
717 off_start = ftello(state->
fp_in);
748 chflags, state->
prefix, 0);
771 const char *str = NULL;
772 char strbuf[1024] = { 0 };
780 state_puts(state,
_(
"[-- Error: message/external-body has no access-type parameter --]\n"));
801 char pretty_size[10] = { 0 };
805 long size = strtol(
length, NULL, 10);
825 "[-- This %s/%s attachment (size %s byte) has been deleted --]\n"
827 "[-- This %s/%s attachment (size %s bytes) has been deleted --]\n"
848 "[-- This %s/%s attachment (size %s byte) has been deleted --]\n",
849 "[-- This %s/%s attachment (size %s bytes) has been deleted --]\n", size);
854 pretty_size[0] =
'\0';
864 str =
_(
"[-- This %s/%s attachment has been deleted --]\n[-- on %4$s --]\n");
871 str =
_(
"[-- This %s/%s attachment has been deleted --]\n");
875 snprintf(strbuf,
sizeof(strbuf), str,
TYPE(b_email->
parts),
899 snprintf(strbuf,
sizeof(strbuf),
900 _(
"[-- This %s/%s attachment is not included, --]\n[-- and the indicated external source has expired --]\n"),
921 snprintf(strbuf,
sizeof(strbuf),
922 _(
"[-- This %s/%s attachment is not included, --]\n[-- and the indicated access-type %s is unsupported --]\n"),
943 struct Body *
const head = b_email;
944 struct Body *choice = NULL;
945 struct Body *b = NULL;
946 bool mustfree =
false;
974 char *c = strchr(np->
data,
'/');
977 wild = ((c[1] ==
'*') && (c[2] ==
'\0'));
978 btlen = c - np->
data;
992 const char *bt =
TYPE(b);
1115 state_puts(state,
_(
"[-- Error: Could not display any parts of Multipart/Alternative --]\n"));
1131 struct Body *b = NULL;
1132 bool mustfree =
false;
1159 struct Body *choice = NULL;
1160 struct Body *first_part = NULL;
1161 struct Body *zxx_part = NULL;
1175 if (c_preferred_languages)
1192 mutt_debug(
LL_DEBUG2,
"RFC8255 >> comparing configuration preferred_language='%s' to mail part content-language='%s'\n",
1196 mutt_debug(
LL_DEBUG2,
"RFC8255 >> preferred_language='%s' matches content-language='%s' >> part selected to be displayed\n",
1239 struct Body *b = NULL, *p = NULL;
1261 for (p = b->
parts, count = 1; p; p = p->
next, count++)
1266 if (p->description || p->filename || p->form_name)
1269 state_printf(state,
_(
"[-- Attachment #%d: %s --]\n"), count,
1270 p->description ? p->description :
1271 p->filename ? p->filename :
1294 mutt_error(
_(
"One or more parts of this message could not be displayed"));
1329 const char *save_prefix = NULL;
1331 size_t tmplength = 0;
1332 LOFF_T tmpoffset = 0;
1336 struct Buffer *tempfile = NULL;
1346 size_t tempsize = 0;
1354 const int orig_type = b->
type;
1364 state->
fp_out = open_memstream(&temp, &tempsize);
1390 save_prefix = state->
prefix;
1416 state->
fp_in = fmemopen(temp, tempsize,
"r");
1434 state->
prefix = save_prefix;
1437 b->
type = orig_type;
1443 rc = handler(b, state);
1534 char buf[5] = { 0 };
1547 for (i = 0; (i < 4) && (len > 0); len--)
1549 ch = fgetc(state->
fp_in);
1552 if ((ch >= 0) && (ch < 128) && ((
base64val(ch) != -1) || (ch ==
'=')))
1567 ch = (c1 << 2) | (c2 >> 4);
1569 if (cr && (ch !=
'\n'))
1574 if (istext && (ch ==
'\r'))
1583 ch = ((c2 & 0xf) << 4) | (c3 >> 2);
1585 if (cr && (ch !=
'\n'))
1590 if (istext && (ch ==
'\r'))
1599 ch = ((c3 & 0x3) << 6) | c4;
1601 if (cr && (ch !=
'\n'))
1606 if (istext && (ch ==
'\r'))
1611 if ((l + 8) >=
sizeof(bufi))
1636 bool plaintext =
false;
1640 static unsigned short recurse_level = 0;
1642 const int oflags = state->
flags;
1657 state->
flags &= ~STATE_CHARCONV;
1669 handler = encrypted_handler;
1671 else if (c_reflow_text &&
1707 else if (!
mutt_str_equal(
"inline", c_show_multipart_alternative) &&
1715 mutt_error(
_(
"Error: multipart/signed has no protocol"));
1722 handler = encrypted_handler;
1727 handler = encrypted_handler;
1750 handler = encrypted_handler;
1755 handler = encrypted_handler;
1767 encrypted_handler && !c_include_encrypted)
1781 if (is_attachment_display)
1785 buf_strcpy(msg,
_(
"[-- This is an attachment --]\n"));
1795 char keystroke[128] = { 0 };
1802 buf_printf(msg,
_(
"[-- This is an attachment (use '%s' to view this part) --]\n"),
1809 buf_printf(msg,
_(
"[-- %s/%s is unsupported (use '%s' to view this part) --]\n"),
1817 buf_strcpy(msg,
_(
"[-- This is an attachment (need 'view-attachments' bound to key) --]\n"));
1822 buf_printf(msg,
_(
"[-- %s/%s is unsupported (need 'view-attachments' bound to key) --]\n"),
1917 const char *charset = b->
charset;
GUI display the mailboxes in a side panel.
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
const struct Slist * cs_subset_slist(const struct ConfigSubset *sub, const char *name)
Get a string-list config item by name.
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Convenience wrapper for the config headers.
const char * cc_charset(void)
Get the cached value of $charset.
const struct Slist * cc_assumed_charset(void)
Get the cached value of $assumed_charset.
int mutt_copy_hdr(FILE *fp_in, FILE *fp_out, LOFF_T off_start, LOFF_T off_end, CopyHeaderFlags chflags, const char *prefix, int wraplen)
Copy header from one file to another.
Duplicate the structure of an entire email.
#define CH_DECODE
Do RFC2047 header decoding.
#define CH_PREFIX
Quote header using $indent_string string?
#define CH_FROM
Retain the "From " message separator?
#define CH_WEED
Weed the headers?
#define CH_REORDER
Re-order output of headers (specified by 'hdr_order')
#define CH_DISPLAY
Display result to user.
uint32_t CopyHeaderFlags
Flags for mutt_copy_header(), e.g. CH_UPDATE.
Convenience wrapper for the core headers.
SecurityFlags mutt_is_application_smime(struct Body *b)
Does the message use S/MIME?
int mutt_is_valid_multipart_pgp_encrypted(struct Body *b)
Is this a valid multi-part encrypted message?
SecurityFlags mutt_is_malformed_multipart_pgp_encrypted(struct Body *b)
Check for malformed layout.
SecurityFlags mutt_is_application_pgp(const struct Body *b)
Does the message use PGP?
void buf_strip_formatting(struct Buffer *dest, const char *src, bool strip_markers)
Removes ANSI and backspace formatting.
void mutt_body_free(struct Body **ptr)
Free a Body.
struct Body * mutt_body_new(void)
Create a new Body.
Structs that make up an email.
struct Body * mutt_rfc822_parse_message(FILE *fp, struct Body *b)
Parse a Message/RFC822 body.
struct Body * mutt_parse_multipart(FILE *fp, const char *boundary, LOFF_T end_off, bool digest)
Parse a multipart structure.
bool mutt_is_message_type(int type, const char *subtype)
Determine if a mime type matches a message or not.
void mutt_env_free(struct Envelope **ptr)
Free an Envelope.
int mutt_file_copy_stream(FILE *fp_in, FILE *fp_out)
Copy the contents of one file into another.
char * mutt_file_read_line(char *line, size_t *size, FILE *fp, int *line_num, ReadLineFlags flags)
Read a line from a file.
int mutt_file_copy_bytes(FILE *fp_in, FILE *fp_out, size_t size)
Copy some content from one file to another.
long mutt_file_get_size_fp(FILE *fp)
Get the size of a file.
void mutt_file_sanitize_filename(char *path, bool slash)
Replace unsafe characters in a filename.
bool mutt_file_seek(FILE *fp, LOFF_T offset, int whence)
Wrapper for fseeko with error handling.
void mutt_file_unlink(const char *s)
Delete a file, carefully.
#define mutt_file_fclose(FP)
#define mutt_file_fopen(PATH, MODE)
#define MUTT_RL_NO_FLAGS
No flags are set.
bool OptDontHandlePgpKeys
(pseudo) used to extract PGP keys
struct ListHead AlternativeOrderList
List of preferred mime types to display.
struct ListHead AutoViewList
List of mime types to auto view.
char ** EnvList
Private copy of the environment variables.
int crypt_pgp_application_handler(struct Body *b_email, struct State *state)
Wrapper for CryptModuleSpecs::application_handler() - Implements handler_t -.
static int alternative_handler(struct Body *b_email, struct State *state)
Handler for multipart alternative emails - Implements handler_t -.
int text_enriched_handler(struct Body *b_email, struct State *state)
Handler for enriched text - Implements handler_t -.
static int text_plain_handler(struct Body *b_email, struct State *state)
Handler for plain text - Implements handler_t -.
int crypt_smime_application_handler(struct Body *b_email, struct State *state)
Wrapper for CryptModuleSpecs::application_handler() - Implements handler_t -.
static int autoview_handler(struct Body *b_email, struct State *state)
Handler for autoviewable attachments - Implements handler_t -.
int crypt_pgp_encrypted_handler(struct Body *b_email, struct State *state)
Wrapper for CryptModuleSpecs::encrypted_handler() - Implements handler_t -.
static int external_body_handler(struct Body *b_email, struct State *state)
Handler for external-body emails - Implements handler_t -.
int rfc3676_handler(struct Body *b_email, struct State *state)
Handler for format=flowed - Implements handler_t -.
static int malformed_pgp_encrypted_handler(struct Body *b_email, struct State *state)
Handler for invalid pgp-encrypted emails - Implements handler_t -.
static int valid_pgp_encrypted_handler(struct Body *b_email, struct State *state)
Handler for valid pgp-encrypted emails - Implements handler_t -.
static int message_handler(struct Body *b_email, struct State *state)
Handler for message/rfc822 body parts - Implements handler_t -.
static int multipart_handler(struct Body *b_email, struct State *state)
Handler for multipart emails - Implements handler_t -.
static int multilingual_handler(struct Body *b_email, struct State *state)
Handler for multi-lingual emails - Implements handler_t -.
int mutt_signed_handler(struct Body *b_email, struct State *state)
Handler for "multipart/signed" - Implements handler_t -.
#define mutt_message(...)
#define mutt_debug(LEVEL,...)
Convenience wrapper for the gui headers.
static bool is_autoview(struct Body *b)
Should email body be filtered by mailcap.
bool mutt_prefer_as_attachment(struct Body *b)
Do we want this part as an attachment?
static void decode_uuencoded(struct State *state, long len, bool istext, iconv_t cd)
Decode uuencoded text.
static void convert_to_state(iconv_t cd, char *bufi, size_t *l, struct State *state)
Convert text and write it to a file.
bool mutt_can_decode(struct Body *b)
Will decoding the attachment produce any output.
int mutt_body_handler(struct Body *b, struct State *state)
Handler for the Body of an email.
int(* handler_t)(struct Body *b_email, struct State *state)
void mutt_decode_base64(struct State *state, size_t len, bool istext, iconv_t cd)
Decode base64-encoded text.
static void print_part_line(struct State *state, struct Body *b_email, int n)
Print a separator for the Mime part.
static int run_decode_and_handler(struct Body *b, struct State *state, handler_t handler, bool plaintext)
Run an appropriate decoder for an email.
static unsigned char decode_byte(char ch)
Decode a uuencoded byte.
void mutt_decode_attachment(const struct Body *b, struct State *state)
Decode an email's attachment.
static void qp_decode_line(char *dest, char *src, size_t *l, int last)
Decode a line of quoted-printable text.
static void decode_quoted(struct State *state, long len, bool istext, iconv_t cd)
Decode an attachment encoded with quoted-printable.
static void decode_xbit(struct State *state, long len, bool istext, iconv_t cd)
Decode xbit-encoded text.
static bool is_mmnoask(const char *buf)
Metamail compatibility: should the attachment be autoviewed?
static int qp_decode_triple(char *s, char *d)
Decode a quoted-printable triplet.
Decide how to display email content.
struct Keymap * km_find_func(enum MenuType mtype, int func)
Find a function's mapping in a Menu.
int km_expand_key(char *s, size_t len, struct Keymap *map)
Get the key string bound to a Keymap.
@ LL_DEBUG2
Log at debug level 2.
@ LL_DEBUG1
Log at debug level 1.
void mailcap_entry_free(struct MailcapEntry **ptr)
Deallocate an struct MailcapEntry.
struct MailcapEntry * mailcap_entry_new(void)
Allocate memory for a new rfc1524 entry.
int mailcap_expand_command(struct Body *b, const char *filename, const char *type, struct Buffer *command)
Expand expandos in a command.
void mailcap_expand_filename(const char *nametemplate, const char *oldfile, struct Buffer *newfile)
Expand a new filename from a template or existing filename.
bool mailcap_lookup(struct Body *b, char *type, size_t typelen, struct MailcapEntry *entry, enum MailcapLookup opt)
Find given type in the list of mailcap files.
RFC1524 Mailcap routines.
@ MUTT_MC_AUTOVIEW
Mailcap autoview field.
@ ENC_UUENCODED
UUEncoded text.
@ ENC_BASE64
Base-64 encoded text.
@ ENC_QUOTED_PRINTABLE
Quoted-printable text.
#define MUTT_MIME_MAX_DEPTH
@ TYPE_MESSAGE
Type: 'message/*'.
@ TYPE_MULTIPART
Type: 'multipart/*'.
@ TYPE_APPLICATION
Type: 'application/*'.
@ TYPE_TEXT
Type: 'text/*'.
@ DISP_ATTACH
Content is attached.
@ DISP_INLINE
Content is inline.
size_t mutt_ch_iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft, const char **inrepls, const char *outrepl, int *iconverrno)
Change the encoding of a string.
iconv_t mutt_ch_iconv_open(const char *tocode, const char *fromcode, uint8_t flags)
Set up iconv for conversions.
const char * mutt_ch_get_default_charset(const struct Slist *const assumed_charset)
Get the default character set.
#define MUTT_ICONV_HOOK_FROM
apply charset-hooks to fromcode
#define ICONV_T_INVALID
Error value for iconv functions.
static bool iconv_t_valid(const iconv_t cd)
Is the conversion descriptor valid?
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
time_t mutt_date_parse_date(const char *s, struct Tz *tz_out)
Parse a date string in RFC822 format.
int filter_wait(pid_t pid)
Wait for the exit of a process and return its status.
pid_t filter_create_fd(const char *cmd, FILE **fp_in, FILE **fp_out, FILE **fp_err, int fdin, int fdout, int fderr, char **envlist)
Run a command on a pipe (optionally connect stdin/stdout)
pid_t filter_create(const char *cmd, FILE **fp_in, FILE **fp_out, FILE **fp_err, char **envlist)
Set up filter program.
Convenience wrapper for the library headers.
bool slist_is_empty(const struct Slist *list)
Is the slist empty?
void state_attach_puts(struct State *state, const char *t)
Write a string to the state.
void state_mark_attach(struct State *state)
Write a unique marker around content.
int state_printf(struct State *state, const char *fmt,...)
Write a formatted string to the State.
void state_prefix_put(struct State *state, const char *buf, size_t buflen)
Write a prefixed fixed-string to the State.
#define STATE_WEED
Weed headers even when not in display mode.
#define state_puts(STATE, STR)
#define state_set_prefix(state)
#define STATE_DISPLAY
Output is displayed to the user.
#define STATE_DISPLAY_ATTACH
We are displaying an attachment.
#define STATE_FIRSTDONE
The first attachment has been done.
#define state_reset_prefix(state)
#define state_putc(STATE, STR)
#define STATE_REPLYING
Are we replying?
#define STATE_VERIFY
Perform signature verification.
#define STATE_CHARCONV
Do character set conversions.
#define STATE_PRINTING
Are we printing? - STATE_DISPLAY "light".
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
char * mutt_str_dup(const char *str)
Copy a string, safely.
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
const char * mutt_str_getenv(const char *name)
Get an environment variable.
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
size_t mutt_str_copy(char *dest, const char *src, size_t dsize)
Copy a string into a buffer (guaranteeing NUL-termination)
size_t mutt_istr_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix, ignoring case.
bool mutt_istrn_equal(const char *a, const char *b, size_t num)
Check for equality of two strings ignoring case (to a maximum), safely.
Many unsorted constants and some structs.
void mutt_check_lookup_list(struct Body *b, char *type, size_t len)
Update the mime type.
void mutt_clear_error(void)
Clear the message line (bottom line of screen)
bool mutt_is_text_part(const struct Body *b)
Is this part of an email in plain text?
void mutt_str_pretty_size(char *buf, size_t buflen, size_t num)
Display an abbreviated size, like 3.4K.
Some miscellaneous functions.
API for encryption/signing of emails.
#define APPLICATION_PGP
Use PGP to encrypt/sign.
#define APPLICATION_SMIME
Use SMIME to encrypt/sign.
char * mutt_param_get(const struct ParameterList *pl, const char *s)
Find a matching Parameter.
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
#define STAILQ_FOREACH(var, head, field)
RFC3676 Format Flowed routines.
char * language
content-language (RFC8255)
struct Body * parts
parts of a multipart or message/rfc822
LOFF_T offset
offset where the actual data begins
struct Envelope * mime_headers
Memory hole protected headers.
bool is_autocrypt
Flag autocrypt-decrypted messages for replying.
LOFF_T length
length (in bytes) of attachment
char * charset
Send mode: charset of attached file as stored on disk.
struct ParameterList parameter
Parameters of the content-type.
unsigned int disposition
content-disposition, ContentDisposition
bool nowrap
Do not wrap the output in the pager.
struct Body * next
next attachment in the list
char * subtype
content-type subtype
unsigned int encoding
content-transfer-encoding, ContentEncoding
bool goodsig
Good cryptographic signature.
long hdr_offset
Offset in stream where the headers begin.
unsigned int type
content-type primary type, ContentType
char * filename
When sending a message, this is the file to which this structure refers.
String manipulation buffer.
Container for Accounts, Notifications.
struct ConfigSubset * sub
Inherited config items.
struct ListHead head
List containing values.
Keep track when processing files.
StateFlags flags
Flags, e.g. STATE_DISPLAY.
FILE * fp_out
File to write to.
FILE * fp_in
File to read from.
const char * prefix
String to add to the beginning of each output line.
int cs_subset_str_string_get(const struct ConfigSubset *sub, const char *name, struct Buffer *result)
Get a config item as a string.
@ MENU_PAGER
Pager pager (email viewer)