NeoMutt  2025-12-11-694-ga89709
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
multipart.c
Go to the documentation of this file.
1
23
29
30#include "config.h"
31#include <stdbool.h>
32#include <stddef.h>
33#include "mutt/lib.h"
34#include "email/lib.h"
35#include "multipart.h"
36#include "sendlib.h"
37
43static int get_toplevel_encoding(struct Body *b)
44{
45 int e = ENC_7BIT;
46
47 for (; b; b = b->next)
48 {
49 if (b->encoding == ENC_BINARY)
50 return ENC_BINARY;
51 if (b->encoding == ENC_8BIT)
52 e = ENC_8BIT;
53 }
54
55 return e;
56}
57
59#define BOUNDARY_MAX_DEPTH 50
60
68static bool check_boundary(const char *boundary, struct Body *b, int depth)
69{
70 if (depth >= BOUNDARY_MAX_DEPTH)
71 return false;
72
73 char *p = NULL;
74
75 if (b->parts && check_boundary(boundary, b->parts, depth + 1))
76 return true;
77
78 if (b->next && check_boundary(boundary, b->next, depth))
79 return true;
80
81 p = mutt_param_get(&b->parameter, "boundary");
82 if (p && mutt_str_equal(p, boundary))
83 {
84 return true;
85 }
86 return false;
87}
88
93void mutt_generate_boundary(struct ParameterList *pl)
94{
95 char rs[MUTT_RANDTAG_LEN + 1];
96
97 mutt_rand_base32(rs, sizeof(rs) - 1);
98 rs[MUTT_RANDTAG_LEN] = 0;
99 mutt_param_set(pl, "boundary", rs);
100}
101
107struct Body *mutt_make_multipart(struct Body *b)
108{
109 struct Body *b_new = mutt_body_new();
110 b_new->type = TYPE_MULTIPART;
111 b_new->subtype = mutt_str_dup("mixed");
113 do
114 {
116 if (check_boundary(mutt_param_get(&b_new->parameter, "boundary"), b, 0))
117 mutt_param_delete(&b_new->parameter, "boundary");
118 } while (!mutt_param_get(&b_new->parameter, "boundary"));
119 b_new->use_disp = false;
120 b_new->disposition = DISP_INLINE;
121 b_new->parts = b;
122
123 return b_new;
124}
125
134{
135 struct Body *t = NULL;
136
137 if (b->parts)
138 {
139 t = b;
140 b = b->parts;
141 t->parts = NULL;
142 mutt_body_free(&t);
143 }
144 return b;
145}
void mutt_body_free(struct Body **ptr)
Free a Body.
Definition body.c:58
struct Body * mutt_body_new(void)
Create a new Body.
Definition body.c:44
Structs that make up an email.
@ ENC_7BIT
7-bit text
Definition mime.h:49
@ ENC_BINARY
Binary.
Definition mime.h:53
@ ENC_8BIT
8-bit text
Definition mime.h:50
@ TYPE_MULTIPART
Type: 'multipart/*'.
Definition mime.h:37
@ DISP_INLINE
Content is inline.
Definition mime.h:62
#define BOUNDARY_MAX_DEPTH
Maximum MIME nesting depth for boundary checking.
Definition multipart.c:59
struct Body * mutt_remove_multipart(struct Body *b)
Extract the multipart body if it exists.
Definition multipart.c:133
static int get_toplevel_encoding(struct Body *b)
Find the most restrictive encoding type.
Definition multipart.c:43
struct Body * mutt_make_multipart(struct Body *b)
Create a multipart email.
Definition multipart.c:107
static bool check_boundary(const char *boundary, struct Body *b, int depth)
Check for duplicate boundary.
Definition multipart.c:68
void mutt_generate_boundary(struct ParameterList *pl)
Create a unique boundary id for a MIME part.
Definition multipart.c:93
Manipulate multipart Emails.
Convenience wrapper for the library headers.
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition string.c:257
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:665
char * mutt_param_get(const struct ParameterList *pl, const char *s)
Find a matching Parameter.
Definition parameter.c:85
void mutt_param_delete(struct ParameterList *pl, const char *attribute)
Delete a matching Parameter.
Definition parameter.c:143
void mutt_param_set(struct ParameterList *pl, const char *attribute, const char *value)
Set a Parameter.
Definition parameter.c:111
void mutt_rand_base32(char *buf, size_t buflen)
Fill a buffer with a base32-encoded random string.
Definition random.c:106
Miscellaneous functions for sending an email.
#define MUTT_RANDTAG_LEN
Length of random tag for message boundaries.
Definition sendlib.h:36
The body of an email.
Definition body.h:36
struct Body * parts
parts of a multipart or message/rfc822
Definition body.h:73
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