Coverage Report

Created: 2026-03-11 06:17

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/pigeonhole/src/lib-sieve/sieve-message.h
Line
Count
Source
1
#ifndef SIEVE_MESSAGE_H
2
#define SIEVE_MESSAGE_H
3
4
#include "sieve-common.h"
5
#include "sieve-stringlist.h"
6
#include "sieve-objects.h"
7
8
/*
9
 * Message transmission
10
 */
11
12
const char *sieve_message_get_new_id(const struct sieve_instance *svinst);
13
14
/*
15
 * Message context
16
 */
17
18
struct sieve_message_context;
19
20
struct sieve_message_context *
21
sieve_message_context_create(struct sieve_instance *svinst,
22
           struct mail_user *mail_user,
23
           const struct sieve_message_data *msgdata);
24
void sieve_message_context_ref(struct sieve_message_context *msgctx);
25
void sieve_message_context_unref(struct sieve_message_context **msgctx);
26
27
void sieve_message_context_reset(struct sieve_message_context *msgctx);
28
29
pool_t sieve_message_context_pool(
30
  struct sieve_message_context *msgctx) ATTR_PURE;
31
void sieve_message_context_time(struct sieve_message_context *msgctx,
32
        struct timeval *time);
33
34
/* Extension support */
35
36
void sieve_message_context_extension_set(struct sieve_message_context *msgctx,
37
           const struct sieve_extension *ext,
38
           void *context);
39
void *sieve_message_context_extension_get(struct sieve_message_context *msgctx,
40
            const struct sieve_extension *ext);
41
42
/* Envelope */
43
44
const struct smtp_address *
45
sieve_message_get_final_recipient(struct sieve_message_context *msgctx);
46
const struct smtp_address *
47
sieve_message_get_orig_recipient(struct sieve_message_context *msgctx);
48
49
const struct smtp_address *
50
sieve_message_get_sender(struct sieve_message_context *msgctx);
51
52
/* Mail */
53
54
struct mail *sieve_message_get_mail(struct sieve_message_context *msgctx);
55
56
int sieve_message_substitute(struct sieve_message_context *msgctx,
57
           struct istream *input);
58
struct edit_mail *sieve_message_edit(struct sieve_message_context *msgctx);
59
void sieve_message_snapshot(struct sieve_message_context *msgctx);
60
61
/*
62
 * Header stringlist
63
 */
64
65
struct sieve_header_list {
66
  struct sieve_stringlist strlist;
67
68
  int (*next_item)(struct sieve_header_list *_hdrlist,
69
       const char **name_r, string_t **value_r) ATTR_NULL(2);
70
};
71
72
static inline int
73
sieve_header_list_next_item(struct sieve_header_list *hdrlist,
74
          const char **name_r, string_t **value_r)
75
          ATTR_NULL(2)
76
0
{
77
0
  return hdrlist->next_item(hdrlist, name_r, value_r);
78
0
}
Unexecuted instantiation: testsuite-common.c:sieve_header_list_next_item
Unexecuted instantiation: testsuite-message.c:sieve_header_list_next_item
Unexecuted instantiation: cmd-test-message.c:sieve_header_list_next_item
79
80
static inline void
81
sieve_header_list_reset(struct sieve_header_list *hdrlist)
82
0
{
83
0
  sieve_stringlist_reset(&hdrlist->strlist);
84
0
}
Unexecuted instantiation: testsuite-common.c:sieve_header_list_reset
Unexecuted instantiation: testsuite-message.c:sieve_header_list_reset
Unexecuted instantiation: cmd-test-message.c:sieve_header_list_reset
85
86
static inline int
87
sieve_header_list_get_length(struct sieve_header_list *hdrlist)
88
0
{
89
0
  return sieve_stringlist_get_length(&hdrlist->strlist);
90
0
}
Unexecuted instantiation: testsuite-common.c:sieve_header_list_get_length
Unexecuted instantiation: testsuite-message.c:sieve_header_list_get_length
Unexecuted instantiation: cmd-test-message.c:sieve_header_list_get_length
91
92
static inline void
93
sieve_header_list_set_trace(struct sieve_header_list *hdrlist, bool trace)
94
0
{
95
0
  sieve_stringlist_set_trace(&hdrlist->strlist, trace);
96
0
}
Unexecuted instantiation: testsuite-common.c:sieve_header_list_set_trace
Unexecuted instantiation: testsuite-message.c:sieve_header_list_set_trace
Unexecuted instantiation: cmd-test-message.c:sieve_header_list_set_trace
97
98
struct sieve_header_list *
99
sieve_message_header_list_create(const struct sieve_runtime_env *renv,
100
         struct sieve_stringlist *field_names,
101
         bool mime_decode);
102
103
/*
104
 * Message override
105
 */
106
107
/* Header override object */
108
109
struct sieve_message_override_def {
110
  struct sieve_object_def obj_def;
111
112
  unsigned int sequence;
113
114
  /* Context coding */
115
116
  bool (*dump_context)(const struct sieve_message_override *svmo,
117
           const struct sieve_dumptime_env *denv,
118
           sieve_size_t *address);
119
  int (*read_context)(const struct sieve_message_override *svmo,
120
          const struct sieve_runtime_env *renv,
121
          sieve_size_t *address, void **se_context);
122
123
  /* Override */
124
125
  int (*header_override)(const struct sieve_message_override *svmo,
126
             const struct sieve_runtime_env *renv,
127
             bool mime_decode,
128
             struct sieve_stringlist **headers);
129
};
130
131
struct sieve_message_override {
132
  struct sieve_object object;
133
134
  const struct sieve_message_override_def *def;
135
136
  void *context;
137
};
138
139
ARRAY_DEFINE_TYPE(sieve_message_override,
140
  struct sieve_message_override);
141
142
/*
143
 * Message override operand
144
 */
145
146
#define SIEVE_EXT_DEFINE_MESSAGE_OVERRIDE(SVMO) SIEVE_EXT_DEFINE_OBJECT(SVMO)
147
#define SIEVE_EXT_DEFINE_MESSAGE_OVERRIDES(SVMOS) SIEVE_EXT_DEFINE_OBJECTS(SMOS)
148
149
#define SIEVE_OPT_MESSAGE_OVERRIDE (-2)
150
151
extern const struct sieve_operand_class
152
  sieve_message_override_operand_class;
153
154
static inline void
155
sieve_opr_message_override_emit(struct sieve_binary_block *sblock,
156
        const struct sieve_extension *ext,
157
        const struct sieve_message_override_def *seff)
158
0
{
159
0
  sieve_opr_object_emit(sblock, ext, &seff->obj_def);
160
0
}
Unexecuted instantiation: testsuite-common.c:sieve_opr_message_override_emit
Unexecuted instantiation: testsuite-message.c:sieve_opr_message_override_emit
Unexecuted instantiation: cmd-test-message.c:sieve_opr_message_override_emit
161
162
bool sieve_opr_message_override_dump(const struct sieve_dumptime_env *denv,
163
             sieve_size_t *address);
164
int sieve_opr_message_override_read(const struct sieve_runtime_env *renv,
165
            sieve_size_t *address,
166
            struct sieve_message_override *svmo);
167
168
/*
169
 * Optional operands
170
 */
171
172
int sieve_message_opr_optional_dump(const struct sieve_dumptime_env *denv,
173
            sieve_size_t *address,
174
            signed int *opt_code);
175
176
int sieve_message_opr_optional_read(const struct sieve_runtime_env *renv,
177
            sieve_size_t *address, signed int *opt_code,
178
            int *exec_status,
179
            struct sieve_address_part *addrp,
180
            struct sieve_match_type *mcht,
181
            struct sieve_comparator *cmp,
182
            ARRAY_TYPE(sieve_message_override) *svmos);
183
184
/*
185
 * Message header
186
 */
187
188
int sieve_message_get_header_fields(const struct sieve_runtime_env *renv,
189
            struct sieve_stringlist *field_names,
190
            ARRAY_TYPE(sieve_message_override) *svmos,
191
            bool mime_decode,
192
            struct sieve_stringlist **fields_r);
193
194
/*
195
 * Message part
196
 */
197
198
struct sieve_message_part;
199
200
struct sieve_message_part_data {
201
  const char *content_type;
202
  const char *content_disposition;
203
204
  const char *content;
205
  unsigned long size;
206
};
207
208
struct sieve_message_part *
209
sieve_message_part_parent(struct sieve_message_part *mpart) ATTR_PURE;
210
struct sieve_message_part *
211
sieve_message_part_next(struct sieve_message_part *mpart) ATTR_PURE;
212
struct sieve_message_part *
213
sieve_message_part_children(struct sieve_message_part *mpart) ATTR_PURE;
214
215
const char *
216
sieve_message_part_content_type(struct sieve_message_part *mpart) ATTR_PURE;
217
const char *
218
sieve_message_part_content_disposition(struct sieve_message_part *mpart)
219
               ATTR_PURE;
220
221
int sieve_message_part_get_first_header(struct sieve_message_part *mpart,
222
          const char *field,
223
          const char **value_r);
224
225
void sieve_message_part_get_data(struct sieve_message_part *mpart,
226
         struct sieve_message_part_data *data,
227
         bool text);
228
229
/*
230
 * Message body
231
 */
232
233
int sieve_message_body_get_content(const struct sieve_runtime_env *renv,
234
           const char *const *content_types,
235
           struct sieve_message_part_data **parts_r);
236
int sieve_message_body_get_text(const struct sieve_runtime_env *renv,
237
        struct sieve_message_part_data **parts_r);
238
int sieve_message_body_get_raw(const struct sieve_runtime_env *renv,
239
             struct sieve_message_part_data **parts_r);
240
241
/*
242
 * Message part iterator
243
 */
244
245
struct sieve_message_part_iter {
246
  const struct sieve_runtime_env *renv;
247
  struct sieve_message_part *root;
248
  unsigned int index, offset;
249
};
250
251
int sieve_message_part_iter_init(struct sieve_message_part_iter *iter,
252
         const struct sieve_runtime_env *renv);
253
void sieve_message_part_iter_subtree(struct sieve_message_part_iter *iter,
254
             struct sieve_message_part_iter *subtree);
255
void sieve_message_part_iter_children(struct sieve_message_part_iter *iter,
256
              struct sieve_message_part_iter *child);
257
258
struct sieve_message_part *
259
sieve_message_part_iter_current(struct sieve_message_part_iter *iter);
260
struct sieve_message_part *
261
sieve_message_part_iter_next(struct sieve_message_part_iter *iter);
262
263
void sieve_message_part_iter_reset(struct sieve_message_part_iter *iter);
264
265
/*
266
 * MIME header list
267
 */
268
269
struct sieve_header_list *
270
sieve_mime_header_list_create(const struct sieve_runtime_env *renv,
271
            struct sieve_stringlist *field_names,
272
            struct sieve_message_part_iter *part_iter,
273
            bool mime_decode, bool children);
274
275
#endif