mailer_check_to(): ensures that there all the to addresses are
qualified. mailer_check_from(): ensures that there is only one address, and it is qualified.
Showing
2 changed files
with
62 additions
and
17 deletions
... | @@ -26,25 +26,28 @@ extern "C" { | ... | @@ -26,25 +26,28 @@ extern "C" { |
26 | 26 | ||
27 | extern int mailer_create __P ((mailer_t *, const char *)); | 27 | extern int mailer_create __P ((mailer_t *, const char *)); |
28 | extern void mailer_destroy __P ((mailer_t *)); | 28 | extern void mailer_destroy __P ((mailer_t *)); |
29 | |||
30 | extern int mailer_open __P ((mailer_t, int flags)); | 29 | extern int mailer_open __P ((mailer_t, int flags)); |
31 | extern int mailer_close __P ((mailer_t)); | 30 | extern int mailer_close __P ((mailer_t)); |
32 | |||
33 | extern int mailer_send_message __P ((mailer_t, message_t, address_t from, address_t to)); | 31 | extern int mailer_send_message __P ((mailer_t, message_t, address_t from, address_t to)); |
34 | 32 | ||
33 | /* Accessor functions. */ | ||
35 | extern int mailer_get_property __P ((mailer_t, property_t *)); | 34 | extern int mailer_get_property __P ((mailer_t, property_t *)); |
36 | /* stream settings */ | ||
37 | extern int mailer_get_stream __P ((mailer_t, stream_t *)); | 35 | extern int mailer_get_stream __P ((mailer_t, stream_t *)); |
38 | extern int mailer_set_stream __P ((mailer_t, stream_t)); | 36 | extern int mailer_set_stream __P ((mailer_t, stream_t)); |
39 | |||
40 | /* stream settings */ | ||
41 | extern int mailer_get_debug __P ((mailer_t, mu_debug_t *)); | 37 | extern int mailer_get_debug __P ((mailer_t, mu_debug_t *)); |
42 | extern int mailer_set_debug __P ((mailer_t, mu_debug_t)); | 38 | extern int mailer_set_debug __P ((mailer_t, mu_debug_t)); |
43 | |||
44 | extern int mailer_get_observable __P ((mailer_t, observable_t *)); | 39 | extern int mailer_get_observable __P ((mailer_t, observable_t *)); |
45 | |||
46 | extern int mailer_get_url __P ((mailer_t, url_t *)); | 40 | extern int mailer_get_url __P ((mailer_t, url_t *)); |
47 | 41 | ||
42 | /* Utility functions, primarily for use of implementing concrete mailers. */ | ||
43 | |||
44 | /* A valid from address_t contains a single address that has a qualified | ||
45 | email address. */ | ||
46 | extern int mailer_check_from __P((address_t from)); | ||
47 | /* A valid to address_t contains 1 or more addresses, that are | ||
48 | qualified email addresses. */ | ||
49 | extern int mailer_check_to __P((address_t to)); | ||
50 | |||
48 | #ifdef __cplusplus | 51 | #ifdef __cplusplus |
49 | } | 52 | } |
50 | #endif | 53 | #endif | ... | ... |
... | @@ -27,6 +27,7 @@ | ... | @@ -27,6 +27,7 @@ |
27 | 27 | ||
28 | #include <mailutils/address.h> | 28 | #include <mailutils/address.h> |
29 | #include <mailutils/debug.h> | 29 | #include <mailutils/debug.h> |
30 | #include <mailutils/errno.h> | ||
30 | #include <mailutils/iterator.h> | 31 | #include <mailutils/iterator.h> |
31 | #include <mailutils/observer.h> | 32 | #include <mailutils/observer.h> |
32 | #include <mailutils/property.h> | 33 | #include <mailutils/property.h> |
... | @@ -174,34 +175,75 @@ mailer_close (mailer_t mailer) | ... | @@ -174,34 +175,75 @@ mailer_close (mailer_t mailer) |
174 | return mailer->_close (mailer); | 175 | return mailer->_close (mailer); |
175 | } | 176 | } |
176 | 177 | ||
177 | /* messages */ | 178 | |
179 | int | ||
180 | mailer_check_from(address_t from) | ||
181 | { | ||
182 | size_t n = 0; | ||
183 | |||
184 | if(!from) | ||
185 | return EINVAL; | ||
186 | |||
187 | if(address_get_count(from, &n) || n != 1) | ||
188 | return MU_ERR_MAILER_BAD_FROM; | ||
189 | |||
190 | if(address_get_email_count(from, &n) || n == 0) | ||
191 | return MU_ERR_MAILER_BAD_FROM; | ||
192 | |||
193 | return 0; | ||
194 | } | ||
195 | |||
196 | int | ||
197 | mailer_check_to(address_t to) | ||
198 | { | ||
199 | size_t count = 0; | ||
200 | size_t emails = 0; | ||
201 | size_t groups = 0; | ||
202 | |||
203 | if(!to) | ||
204 | return EINVAL; | ||
205 | |||
206 | if(address_get_count(to, &count)) | ||
207 | return MU_ERR_MAILER_BAD_TO; | ||
208 | |||
209 | if(address_get_email_count(to, &emails)) | ||
210 | return MU_ERR_MAILER_BAD_TO; | ||
211 | |||
212 | if(emails == 0) | ||
213 | return MU_ERR_MAILER_NO_RCPT_TO; | ||
214 | |||
215 | if(address_get_group_count(to, &groups)) | ||
216 | return MU_ERR_MAILER_BAD_TO; | ||
217 | |||
218 | if(count - emails - groups != 0) | ||
219 | /* then not everything is a group or an email address */ | ||
220 | return MU_ERR_MAILER_BAD_TO; | ||
221 | |||
222 | return 0; | ||
223 | } | ||
224 | |||
178 | int | 225 | int |
179 | mailer_send_message (mailer_t mailer, message_t msg, address_t from, address_t to) | 226 | mailer_send_message (mailer_t mailer, message_t msg, address_t from, address_t to) |
180 | { | 227 | { |
181 | int status; | 228 | int status; |
182 | size_t count = 0; | ||
183 | 229 | ||
184 | if (mailer == NULL || mailer->_send_message == NULL) | 230 | if (mailer == NULL || mailer->_send_message == NULL) |
185 | return ENOSYS; | 231 | return ENOSYS; |
186 | 232 | ||
187 | /* Common API checking. */ | 233 | /* Common API checking. */ |
188 | 234 | ||
235 | /* FIXME: this should be done in the concrete APIs, sendmail doesn't | ||
236 | yet, though, so do it here. */ | ||
189 | if (from) | 237 | if (from) |
190 | { | 238 | { |
191 | if ((status = address_get_email_count (from, &count)) != 0) | 239 | if ((status = mailer_check_from (from)) != 0) |
192 | return status; | 240 | return status; |
193 | |||
194 | if (count != 1) | ||
195 | return EINVAL; | ||
196 | } | 241 | } |
197 | 242 | ||
198 | if (to) | 243 | if (to) |
199 | { | 244 | { |
200 | if ((status = address_get_email_count (to, &count)) != 0) | 245 | if ((status = mailer_check_to (to)) != 0) |
201 | return status; | 246 | return status; |
202 | |||
203 | if (count < 1) | ||
204 | return EINVAL; | ||
205 | } | 247 | } |
206 | 248 | ||
207 | return mailer->_send_message (mailer, msg, from, to); | 249 | return mailer->_send_message (mailer, msg, from, to); | ... | ... |
-
Please register or sign in to post a comment