Coverage Report

Created: 2025-11-15 06:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dovecot/src/lib-smtp/smtp-params.h
Line
Count
Source
1
#ifndef SMTP_PARAMS_H
2
#define SMTP_PARAMS_H
3
4
#include "array-decl.h"
5
6
#include "smtp-common.h"
7
8
struct smtp_param;
9
10
ARRAY_DEFINE_TYPE(smtp_param, struct smtp_param);
11
12
enum smtp_param_mail_body_type {
13
  SMTP_PARAM_MAIL_BODY_TYPE_UNSPECIFIED = 0,
14
  SMTP_PARAM_MAIL_BODY_TYPE_7BIT,
15
  SMTP_PARAM_MAIL_BODY_TYPE_8BITMIME,
16
  SMTP_PARAM_MAIL_BODY_TYPE_BINARYMIME,
17
  SMTP_PARAM_MAIL_BODY_TYPE_EXTENSION
18
};
19
20
enum smtp_param_mail_ret {
21
  SMTP_PARAM_MAIL_RET_UNSPECIFIED = 0,
22
  SMTP_PARAM_MAIL_RET_HDRS,
23
  SMTP_PARAM_MAIL_RET_FULL,
24
};
25
26
enum smtp_param_rcpt_notify {
27
  SMTP_PARAM_RCPT_NOTIFY_UNSPECIFIED = 0x00,
28
  SMTP_PARAM_RCPT_NOTIFY_SUCCESS     = 0x01,
29
  SMTP_PARAM_RCPT_NOTIFY_FAILURE     = 0x02,
30
  SMTP_PARAM_RCPT_NOTIFY_DELAY       = 0x04,
31
  SMTP_PARAM_RCPT_NOTIFY_NEVER       = 0x80
32
};
33
34
struct smtp_param {
35
  const char *keyword;
36
  const char *value;
37
};
38
39
struct smtp_params_mail {
40
  /* AUTH: RFC 4954 */
41
  const struct smtp_address *auth;
42
  /* BODY: RFC 6152 */
43
  struct {
44
    enum smtp_param_mail_body_type type;
45
    const char *ext;
46
  } body;
47
  /* ENVID: RFC 3461, Section 4.4 */
48
  const char *envid;
49
  /* RET: RFC 3461, Section 4.3 */
50
  enum smtp_param_mail_ret ret;
51
  /* SIZE: RFC 1870 */
52
  uoff_t size;
53
  /* SMTPUTF8: RFC 6531 */
54
  bool smtputf8;
55
  /* extra parameters */
56
  ARRAY_TYPE(smtp_param) extra_params;
57
};
58
59
struct smtp_params_rcpt {
60
  /* ORCPT: RFC 3461, Section 4.2 */
61
  struct {
62
    const char *addr_type;
63
    /* addr_type=rfc822 */
64
    const struct smtp_address *addr;
65
    /* raw value */
66
    const char *addr_raw;
67
  } orcpt;
68
  /* NOTIFY: RFC 3461, Section 4.1 */
69
  enum smtp_param_rcpt_notify notify;
70
  /* extra parameters */
71
  ARRAY_TYPE(smtp_param) extra_params;
72
};
73
74
enum smtp_param_parse_error {
75
  SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX = 0,
76
  SMTP_PARAM_PARSE_ERROR_NOT_SUPPORTED
77
};
78
79
/*
80
 * Common
81
 */
82
83
/* parse */
84
85
int smtp_param_parse(pool_t pool, const char *text,
86
         struct smtp_param *param_r, const char **error_r);
87
88
/* manipulate */
89
90
void smtp_params_copy(pool_t pool, ARRAY_TYPE(smtp_param) *dst,
91
          const ARRAY_TYPE(smtp_param) *src) ATTR_NULL(3);
92
93
void smtp_params_add_one(ARRAY_TYPE(smtp_param) *params, pool_t pool,
94
       const char *keyword, const char *value);
95
void smtp_params_add_encoded(ARRAY_TYPE(smtp_param) *params, pool_t pool,
96
           const char *keyword, const unsigned char *value,
97
           size_t value_len);
98
99
bool smtp_params_drop_one(ARRAY_TYPE(smtp_param) *params, const char *keyword,
100
        const char **value_r);
101
102
/* write */
103
104
void smtp_param_write(string_t *out, const struct smtp_param *param);
105
106
/* evaluate */
107
108
const struct smtp_param *
109
smtp_params_get_param(const ARRAY_TYPE(smtp_param) *params,
110
          const char *keyword);
111
int smtp_params_decode_param(const ARRAY_TYPE(smtp_param) *params,
112
           const char *keyword, string_t **value_r,
113
           bool allow_nul, const char **error_r);
114
115
bool smtp_params_equal(const ARRAY_TYPE(smtp_param) *params1,
116
           const ARRAY_TYPE(smtp_param) *params2);
117
118
/*
119
 * MAIL parameters
120
 */
121
122
/* parse */
123
124
int smtp_params_mail_parse(pool_t pool, const char *args,
125
         enum smtp_capability caps,
126
         const char *const *param_extensions,
127
         const char *const *body_param_extensions,
128
         struct smtp_params_mail *params_r,
129
         enum smtp_param_parse_error *error_code_r,
130
         const char **error_r) ATTR_NULL(4, 5);
131
132
/* manipulate */
133
134
void smtp_params_mail_copy(pool_t pool, struct smtp_params_mail *dst,
135
         const struct smtp_params_mail *src);
136
137
void smtp_params_mail_add_extra(struct smtp_params_mail *params, pool_t pool,
138
        const char *keyword, const char *value)
139
        ATTR_NULL(4);
140
void smtp_params_mail_encode_extra(struct smtp_params_mail *params, pool_t pool,
141
           const char *keyword,
142
           const unsigned char *value,
143
           size_t value_len);
144
bool smtp_params_mail_drop_extra(struct smtp_params_mail *params,
145
         const char *keyword, const char **value_r)
146
         ATTR_NULL(3);
147
148
/* write */
149
150
void smtp_params_mail_write(string_t *buffer, enum smtp_capability caps,
151
          const char *const *extra_params,
152
          const struct smtp_params_mail *params) ATTR_NULL(3);
153
154
/* evaluate */
155
156
const struct smtp_param *
157
smtp_params_mail_get_extra(const struct smtp_params_mail *params,
158
         const char *keyword);
159
int smtp_params_mail_decode_extra(const struct smtp_params_mail *params,
160
          const char *keyword, string_t **value_r,
161
          bool allow_nul, const char **error_r);
162
163
/* events */
164
165
void smtp_params_mail_add_to_event(const struct smtp_params_mail *params,
166
           struct event *event);
167
168
/*
169
 * RCPT parameters
170
 */
171
172
/* parse */
173
174
enum smtp_param_rcpt_parse_flags {
175
  /* Allow address values without a domain part */
176
  SMTP_PARAM_RCPT_FLAG_ORCPT_ALLOW_LOCALPART = BIT(0),
177
};
178
179
int smtp_params_rcpt_parse(pool_t pool, const char *args,
180
         enum smtp_param_rcpt_parse_flags flags,
181
         enum smtp_capability caps,
182
         const char *const *param_extensions,
183
         struct smtp_params_rcpt *params_r,
184
         enum smtp_param_parse_error *error_code_r,
185
         const char **error_r) ATTR_NULL(4);
186
187
/* manipulate */
188
189
void smtp_params_rcpt_copy(pool_t pool, struct smtp_params_rcpt *dst,
190
         const struct smtp_params_rcpt *src) ATTR_NULL(3);
191
192
void smtp_params_rcpt_add_extra(struct smtp_params_rcpt *params, pool_t pool,
193
        const char *keyword, const char *value)
194
        ATTR_NULL(4);
195
void smtp_params_rcpt_encode_extra(struct smtp_params_rcpt *params, pool_t pool,
196
           const char *keyword,
197
           const unsigned char *value,
198
           size_t value_len);
199
bool smtp_params_rcpt_drop_extra(struct smtp_params_rcpt *params,
200
         const char *keyword, const char **value_r)
201
         ATTR_NULL(3);
202
203
void smtp_params_rcpt_set_orcpt(struct smtp_params_rcpt *params, pool_t pool,
204
        struct smtp_address *rcpt);
205
206
/* write */
207
208
void smtp_params_rcpt_write(string_t *buffer, enum smtp_capability caps,
209
          const char *const *extra_params,
210
          const struct smtp_params_rcpt *params) ATTR_NULL(3);
211
212
/* evaluate */
213
214
const struct smtp_param *
215
smtp_params_rcpt_get_extra(const struct smtp_params_rcpt *params,
216
         const char *keyword);
217
int smtp_params_rcpt_decode_extra(const struct smtp_params_rcpt *params,
218
          const char *keyword, string_t **value_r,
219
          bool allow_nul, const char **error_r);
220
221
bool smtp_params_rcpt_equal(const struct smtp_params_rcpt *params1,
222
          const struct smtp_params_rcpt *params2);
223
224
static inline bool
225
smtp_params_rcpt_has_orcpt(const struct smtp_params_rcpt *params)
226
0
{
227
0
  return (params->orcpt.addr_type != NULL);
228
0
}
Unexecuted instantiation: fuzz-smtp-server.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-data.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-reply.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-command.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-recipient.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-transaction.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-connection.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-params.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-helo.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-starttls.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-auth.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-mail.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-rcpt.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-rset.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-noop.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-quit.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-vrfy.c:smtp_params_rcpt_has_orcpt
Unexecuted instantiation: smtp-server-cmd-xclient.c:smtp_params_rcpt_has_orcpt
229
230
/* events */
231
232
void smtp_params_rcpt_add_to_event(const struct smtp_params_rcpt *params,
233
           struct event *event);
234
235
#endif