c0c76322cc9581d60c8a760b22e5e68fb93f63c9
[exim.git] / src / src / routers / redirect.c
1 /* $Cambridge: exim/src/src/routers/redirect.c,v 1.8 2005/03/22 15:02:34 ph10 Exp $ */
2
3 /*************************************************
4 * Exim - an Internet mail transport agent *
5 *************************************************/
6
7 /* Copyright (c) University of Cambridge 1995 - 2005 */
8 /* See the file NOTICE for conditions of use and distribution. */
9
10
11 #include "../exim.h"
12 #include "rf_functions.h"
13 #include "redirect.h"
14
15
16
17 /* Options specific to the redirect router. */
18
19 optionlist redirect_router_options[] = {
20 { "allow_defer", opt_bit | (RDON_DEFER << 16),
21 (void *)offsetof(redirect_router_options_block, bit_options) },
22 { "allow_fail", opt_bit | (RDON_FAIL << 16),
23 (void *)offsetof(redirect_router_options_block, bit_options) },
24 { "allow_filter", opt_bit | (RDON_FILTER << 16),
25 (void *)offsetof(redirect_router_options_block, bit_options) },
26 { "allow_freeze", opt_bit | (RDON_FREEZE << 16),
27 (void *)offsetof(redirect_router_options_block, bit_options) },
28 { "check_ancestor", opt_bool,
29 (void *)offsetof(redirect_router_options_block, check_ancestor) },
30 { "check_group", opt_bool,
31 (void *)offsetof(redirect_router_options_block, check_group) },
32 { "check_owner", opt_bool,
33 (void *)offsetof(redirect_router_options_block, check_owner) },
34 { "data", opt_stringptr,
35 (void *)offsetof(redirect_router_options_block, data) },
36 { "directory_transport",opt_stringptr,
37 (void *)offsetof(redirect_router_options_block, directory_transport_name) },
38 { "file", opt_stringptr,
39 (void *)offsetof(redirect_router_options_block, file) },
40 { "file_transport", opt_stringptr,
41 (void *)offsetof(redirect_router_options_block, file_transport_name) },
42 { "forbid_blackhole", opt_bit | (RDON_BLACKHOLE << 16),
43 (void *)offsetof(redirect_router_options_block, bit_options) },
44 { "forbid_exim_filter", opt_bit | (RDON_EXIM_FILTER << 16),
45 (void *)offsetof(redirect_router_options_block, bit_options) },
46 { "forbid_file", opt_bool,
47 (void *)offsetof(redirect_router_options_block, forbid_file) },
48 { "forbid_filter_dlfunc", opt_bit | (RDON_DLFUNC << 16),
49 (void *)offsetof(redirect_router_options_block, bit_options) },
50 { "forbid_filter_existstest", opt_bit | (RDON_EXISTS << 16),
51 (void *)offsetof(redirect_router_options_block, bit_options) },
52 { "forbid_filter_logwrite",opt_bit | (RDON_LOG << 16),
53 (void *)offsetof(redirect_router_options_block, bit_options) },
54 { "forbid_filter_lookup", opt_bit | (RDON_LOOKUP << 16),
55 (void *)offsetof(redirect_router_options_block, bit_options) },
56 { "forbid_filter_perl", opt_bit | (RDON_PERL << 16),
57 (void *)offsetof(redirect_router_options_block, bit_options) },
58 { "forbid_filter_readfile", opt_bit | (RDON_READFILE << 16),
59 (void *)offsetof(redirect_router_options_block, bit_options) },
60 { "forbid_filter_readsocket", opt_bit | (RDON_READSOCK << 16),
61 (void *)offsetof(redirect_router_options_block, bit_options) },
62 { "forbid_filter_reply",opt_bool,
63 (void *)offsetof(redirect_router_options_block, forbid_filter_reply) },
64 { "forbid_filter_run", opt_bit | (RDON_RUN << 16),
65 (void *)offsetof(redirect_router_options_block, bit_options) },
66 { "forbid_include", opt_bit | (RDON_INCLUDE << 16),
67 (void *)offsetof(redirect_router_options_block, bit_options) },
68 { "forbid_pipe", opt_bool,
69 (void *)offsetof(redirect_router_options_block, forbid_pipe) },
70 { "forbid_sieve_filter",opt_bit | (RDON_SIEVE_FILTER << 16),
71 (void *)offsetof(redirect_router_options_block, bit_options) },
72 { "hide_child_in_errmsg", opt_bool,
73 (void *)offsetof(redirect_router_options_block, hide_child_in_errmsg) },
74 { "ignore_eacces", opt_bit | (RDON_EACCES << 16),
75 (void *)offsetof(redirect_router_options_block, bit_options) },
76 { "ignore_enotdir", opt_bit | (RDON_ENOTDIR << 16),
77 (void *)offsetof(redirect_router_options_block, bit_options) },
78 { "include_directory", opt_stringptr,
79 (void *)offsetof(redirect_router_options_block, include_directory) },
80 { "modemask", opt_octint,
81 (void *)offsetof(redirect_router_options_block, modemask) },
82 { "one_time", opt_bool,
83 (void *)offsetof(redirect_router_options_block, one_time) },
84 { "owners", opt_uidlist,
85 (void *)offsetof(redirect_router_options_block, owners) },
86 { "owngroups", opt_gidlist,
87 (void *)offsetof(redirect_router_options_block, owngroups) },
88 { "pipe_transport", opt_stringptr,
89 (void *)offsetof(redirect_router_options_block, pipe_transport_name) },
90 { "qualify_domain", opt_stringptr,
91 (void *)offsetof(redirect_router_options_block, qualify_domain) },
92 { "qualify_preserve_domain", opt_bool,
93 (void *)offsetof(redirect_router_options_block, qualify_preserve_domain) },
94 { "repeat_use", opt_bool | opt_public,
95 (void *)offsetof(router_instance, repeat_use) },
96 { "reply_transport", opt_stringptr,
97 (void *)offsetof(redirect_router_options_block, reply_transport_name) },
98 { "rewrite", opt_bit | (RDON_REWRITE << 16),
99 (void *)offsetof(redirect_router_options_block, bit_options) },
100 { "sieve_vacation_directory", opt_stringptr,
101 (void *)offsetof(redirect_router_options_block, sieve_vacation_directory) },
102 { "skip_syntax_errors", opt_bool,
103 (void *)offsetof(redirect_router_options_block, skip_syntax_errors) },
104 #ifdef EXPERIMENTAL_SRS
105 { "srs", opt_stringptr,
106 (void *)offsetof(redirect_router_options_block, srs) },
107 { "srs_alias", opt_stringptr,
108 (void *)offsetof(redirect_router_options_block, srs_alias) },
109 { "srs_condition", opt_stringptr,
110 (void *)offsetof(redirect_router_options_block, srs_condition) },
111 { "srs_db", opt_stringptr,
112 (void *)offsetof(redirect_router_options_block, srs_db) },
113 #endif
114 { "syntax_errors_text", opt_stringptr,
115 (void *)offsetof(redirect_router_options_block, syntax_errors_text) },
116 { "syntax_errors_to", opt_stringptr,
117 (void *)offsetof(redirect_router_options_block, syntax_errors_to) }
118 };
119
120 /* Size of the options list. An extern variable has to be used so that its
121 address can appear in the tables drtables.c. */
122
123 int redirect_router_options_count =
124 sizeof(redirect_router_options)/sizeof(optionlist);
125
126 /* Default private options block for the redirect router. */
127
128 redirect_router_options_block redirect_router_option_defaults = {
129 NULL, /* directory_transport */
130 NULL, /* file_transport */
131 NULL, /* pipe_transport */
132 NULL, /* reply_transport */
133 NULL, /* data */
134 NULL, /* directory_transport_name */
135 NULL, /* file */
136 NULL, /* file_dir */
137 NULL, /* file_transport_name */
138 NULL, /* include_directory */
139 NULL, /* pipe_transport_name */
140 NULL, /* reply_transport_name */
141 NULL, /* sieve_vacation_directory */
142 NULL, /* syntax_errors_text */
143 NULL, /* syntax_errors_to */
144 NULL, /* qualify_domain */
145 NULL, /* owners */
146 NULL, /* owngroups */
147 #ifdef EXPERIMENTAL_SRS
148 NULL, /* srs */
149 NULL, /* srs_condition */
150 NULL, /* srs_db */
151 NULL, /* srs_alias */
152 #endif
153 022, /* modemask */
154 RDO_REWRITE, /* bit_options */
155 FALSE, /* check_ancestor */
156 TRUE_UNSET, /* check_owner */
157 TRUE_UNSET, /* check_group */
158 FALSE, /* forbid_file */
159 FALSE, /* forbid_filter_reply */
160 FALSE, /* forbid_pipe */
161 FALSE, /* hide_child_in_errmsg */
162 FALSE, /* one_time */
163 FALSE, /* qualify_preserve_domain */
164 FALSE /* skip_syntax_errors */
165 };
166
167
168
169 /*************************************************
170 * Initialization entry point *
171 *************************************************/
172
173 /* Called for each instance, after its options have been read, to enable
174 consistency checks to be done, or anything else that needs to be set up. */
175
176 void redirect_router_init(router_instance *rblock)
177 {
178 redirect_router_options_block *ob =
179 (redirect_router_options_block *)(rblock->options_block);
180
181 /* Either file or data must be set, but not both */
182
183 if ((ob->file == NULL) == (ob->data == NULL))
184 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n "
185 "%sone of \"file\" or \"data\" must be specified",
186 rblock->name, (ob->file == NULL)? "" : "only ");
187
188 /* Onetime aliases can only be real addresses. Headers can't be manipulated.
189 The combination of one_time and unseen is not allowed. We can't check the
190 expansion of "unseen" here, but we assume that if it is set to anything other
191 than false, there is likely to be a problem. */
192
193 if (ob->one_time)
194 {
195 ob->forbid_pipe = ob->forbid_file = ob->forbid_filter_reply = TRUE;
196 if (rblock->extra_headers != NULL || rblock->remove_headers != NULL)
197 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n "
198 "\"headers_add\" and \"headers_remove\" are not permitted with "
199 "\"one_time\"", rblock->name);
200 if (rblock->unseen || rblock->expand_unseen != NULL)
201 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n "
202 "\"unseen\" may not be used with \"one_time\"", rblock->name);
203 }
204
205 /* The defaults for check_owner and check_group depend on other settings. The
206 defaults are: Check the owner if check_local_user or owners is set; check the
207 group if check_local_user is set without a restriction on the group write bit,
208 or if owngroups is set. */
209
210 if (ob->check_owner == TRUE_UNSET)
211 ob->check_owner = rblock->check_local_user ||
212 (ob->owners != NULL && ob->owners[0] != 0);
213
214 if (ob->check_group == TRUE_UNSET)
215 ob->check_group = (rblock->check_local_user && (ob->modemask & 020) == 0) ||
216 (ob->owngroups != NULL && ob->owngroups[0] != 0);
217
218 /* If explicit qualify domain set, the preserve option is locked out */
219
220 if (ob->qualify_domain != NULL && ob->qualify_preserve_domain)
221 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n "
222 "only one of \"qualify_domain\" or \"qualify_preserve_domain\" must be set",
223 rblock->name);
224
225 /* If allow_filter is set, either user or check_local_user must be set. */
226
227 if (!rblock->check_local_user &&
228 !rblock->uid_set &&
229 rblock->expand_uid == NULL &&
230 (ob->bit_options & RDO_FILTER) != 0)
231 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n "
232 "\"user\" or \"check_local_user\" must be set with \"allow_filter\"",
233 rblock->name);
234 }
235
236
237
238 /*************************************************
239 * Get errors address and header mods *
240 *************************************************/
241
242 /* This function is called when new addresses are generated, in order to
243 sort out errors address and header modifications. We put the errors address
244 into the parent address (even though it is never used from there because that
245 address is never transported) so that it can be retrieved if any of the
246 children gets routed by an "unseen" router. The clone of the child that is
247 passed on must have the original errors_address value.
248
249 Arguments:
250 rblock the router control block
251 addr the address being routed
252 verify true if verifying
253 addr_prop point to the propagated block, which is where the
254 new values are to be placed
255
256 Returns: the result of rf_get_errors_address() or rf_get_munge_headers(),
257 which is either OK or DEFER
258 */
259
260 static int
261 sort_errors_and_headers(router_instance *rblock, address_item *addr,
262 BOOL verify, address_item_propagated *addr_prop)
263 {
264 int frc = rf_get_errors_address(addr, rblock, verify,
265 &(addr_prop->errors_address));
266 if (frc != OK) return frc;
267 addr->p.errors_address = addr_prop->errors_address;
268 return rf_get_munge_headers(addr, rblock, &(addr_prop->extra_headers),
269 &(addr_prop->remove_headers));
270 }
271
272
273
274 /*************************************************
275 * Process a set of generated new addresses *
276 *************************************************/
277
278 /* This function sets up a set of newly generated child addresses and puts them
279 on the new address chain. Copy in the uid, gid and permission flags for use by
280 pipes and files, set the parent, and "or" its af_ignore_error flag. Also record
281 the setting for any starting router.
282
283 If the generated address is the same as one of its ancestors, and the
284 check_ancestor flag is set, do not use this generated address, but replace it
285 with a copy of the input address. This is to cope with cases where A is aliased
286 to B and B has a .forward file pointing to A, though it is usually set on the
287 forwardfile rather than the aliasfile. We can't just pass on the old
288 address by returning FAIL, because it must act as a general parent for
289 generated addresses, and only get marked "done" when all its children are
290 delivered.
291
292 Arguments:
293 rblock router block
294 addr_new new address chain
295 addr original address
296 generated list of generated addresses
297 addr_prop the propagated block, containing the errors_address,
298 header modification stuff, and address_data
299 ugidptr points to uid/gid data for files, pipes, autoreplies
300 pw password entry, set if ob->check_local_user is TRUE
301
302 Returns: nothing
303 */
304
305 static void
306 add_generated(router_instance *rblock, address_item **addr_new,
307 address_item *addr, address_item *generated,
308 address_item_propagated *addr_prop, ugid_block *ugidptr, struct passwd *pw)
309 {
310 redirect_router_options_block *ob =
311 (redirect_router_options_block *)(rblock->options_block);
312
313 while (generated != NULL)
314 {
315 address_item *parent;
316 address_item *next = generated;
317 uschar *errors_address = next->p.errors_address;
318
319 generated = next->next;
320 next->parent = addr;
321 orflag(next, addr, af_ignore_error);
322 next->start_router = rblock->redirect_router;
323 addr->child_count++;
324
325 next->next = *addr_new;
326 *addr_new = next;
327
328 /* Don't do the "one_time" thing for the first pass of a 2-stage queue run. */
329
330 if (ob->one_time && !queue_2stage)
331 {
332 for (parent = addr; parent->parent != NULL; parent = parent->parent);
333 next->onetime_parent = parent->address;
334 }
335
336 if (ob->hide_child_in_errmsg) setflag(next, af_hide_child);
337
338 /* If check_ancestor is set, we want to know if any ancestor of this address
339 is the address we are about to generate. The check must be done caselessly
340 unless the ancestor was routed by a case-sensitive router. */
341
342 if (ob->check_ancestor)
343 {
344 for (parent = addr; parent != NULL; parent = parent->parent)
345 {
346 if (((parent->router != NULL && parent->router->caseful_local_part)?
347 Ustrcmp(next->address, parent->address)
348 :
349 strcmpic(next->address, parent->address)
350 ) == 0)
351 {
352 DEBUG(D_route) debug_printf("generated parent replaced by child\n");
353 next->address = string_copy(addr->address);
354 break;
355 }
356 }
357 }
358
359 /* A user filter may, under some circumstances, set up an errors address.
360 If so, we must take care to re-instate it when we copy in the propagated
361 data so that it overrides any errors_to setting on the router. */
362
363 next->p = *addr_prop;
364 if (errors_address != NULL) next->p.errors_address = errors_address;
365
366 /* For pipes, files, and autoreplies, record this router as handling them,
367 because they don't go through the routing process again. Then set up uid,
368 gid, home and current directories for transporting. */
369
370 if (testflag(next, af_pfr))
371 {
372 next->router = rblock;
373 rf_set_ugid(next, ugidptr); /* Will contain pw values if not overridden */
374
375 /* When getting the home directory out of the password information, wrap it
376 in \N...\N to avoid expansion later. In Cygwin, home directories can
377 contain $ characters. */
378
379 if (rblock->home_directory != NULL)
380 next->home_dir = rblock->home_directory;
381 else if (rblock->check_local_user)
382 next->home_dir = string_sprintf("\\N%s\\N", pw->pw_dir);
383 else if (rblock->router_home_directory != NULL &&
384 testflag(addr, af_home_expanded))
385 {
386 next->home_dir = deliver_home;
387 setflag(next, af_home_expanded);
388 }
389
390 next->current_dir = rblock->current_directory;
391
392 /* Permission options */
393
394 if (!ob->forbid_pipe) setflag(next, af_allow_pipe);
395 if (!ob->forbid_file) setflag(next, af_allow_file);
396 if (!ob->forbid_filter_reply) setflag(next, af_allow_reply);
397
398 /* If the transport setting fails, the error gets picked up at the outer
399 level from the setting of basic_errno in the address. */
400
401 if (next->address[0] == '|')
402 {
403 address_pipe = next->address;
404 if (rf_get_transport(ob->pipe_transport_name, &(ob->pipe_transport),
405 next, rblock->name, US"pipe_transport"))
406 next->transport = ob->pipe_transport;
407 address_pipe = NULL;
408 }
409 else if (next->address[0] == '>')
410 {
411 if (rf_get_transport(ob->reply_transport_name, &(ob->reply_transport),
412 next, rblock->name, US"reply_transport"))
413 next->transport = ob->reply_transport;
414 }
415 else /* must be file or directory */
416 {
417 int len = Ustrlen(next->address);
418 address_file = next->address;
419 if (next->address[len-1] == '/')
420 {
421 if (rf_get_transport(ob->directory_transport_name,
422 &(ob->directory_transport), next, rblock->name,
423 US"directory_transport"))
424 next->transport = ob->directory_transport;
425 }
426 else
427 {
428 if (rf_get_transport(ob->file_transport_name, &(ob->file_transport),
429 next, rblock->name, US"file_transport"))
430 next->transport = ob->file_transport;
431 }
432 address_file = NULL;
433 }
434 }
435
436 DEBUG(D_route)
437 {
438 debug_printf("%s router generated %s\n %serrors_to=%s transport=%s\n",
439 rblock->name,
440 next->address,
441 testflag(next, af_pfr)? "pipe, file, or autoreply\n " : "",
442 next->p.errors_address,
443 (next->transport == NULL)? US"NULL" : next->transport->name);
444
445 if (testflag(next, af_uid_set))
446 debug_printf(" uid=%ld ", (long int)(next->uid));
447 else
448 debug_printf(" uid=unset ");
449
450 if (testflag(next, af_gid_set))
451 debug_printf("gid=%ld ", (long int)(next->gid));
452 else
453 debug_printf("gid=unset ");
454
455 debug_printf("home=%s\n", next->home_dir);
456 }
457 }
458 }
459
460
461 /*************************************************
462 * Main entry point *
463 *************************************************/
464
465 /* See local README for interface description. This router returns:
466
467 DECLINE
468 . empty address list, or filter did nothing significant
469
470 DEFER
471 . verifying the errors address caused a deferment or a big disaster such
472 as an expansion failure (rf_get_errors_address)
473 . expanding a headers_{add,remove} string caused a deferment or another
474 expansion error (rf_get_munge_headers)
475 . :defer: or "freeze" in a filter
476 . error in address list or filter
477 . skipped syntax errors, but failed to send the message
478
479 DISCARD
480 . address was :blackhole:d or "seen finish"ed
481
482 FAIL
483 . :fail:
484
485 OK
486 . new addresses added to addr_new
487 */
488
489 int redirect_router_entry(
490 router_instance *rblock, /* data for this instantiation */
491 address_item *addr, /* address we are working on */
492 struct passwd *pw, /* passwd entry after check_local_user */
493 BOOL verify, /* TRUE when verifying */
494 address_item **addr_local, /* add it to this if it's local */
495 address_item **addr_remote, /* add it to this if it's remote */
496 address_item **addr_new, /* put new addresses on here */
497 address_item **addr_succeed) /* put old address here on success */
498 {
499 redirect_router_options_block *ob =
500 (redirect_router_options_block *)(rblock->options_block);
501 address_item *generated = NULL;
502 uschar *save_qualify_domain_recipient = qualify_domain_recipient;
503 uschar *discarded = US"discarded";
504 address_item_propagated addr_prop;
505 error_block *eblock = NULL;
506 ugid_block ugid;
507 redirect_block redirect;
508 int filtertype = FILTER_UNSET;
509 int yield = OK;
510 int options = ob->bit_options;
511 int frc = 0;
512 int xrc = 0;
513
514 addr_local = addr_local; /* Keep picky compilers happy */
515 addr_remote = addr_remote;
516
517 /* Initialize the data to be propagated to the children */
518
519 addr_prop.address_data = deliver_address_data;
520 addr_prop.domain_data = deliver_domain_data;
521 addr_prop.localpart_data = deliver_localpart_data;
522 addr_prop.errors_address = NULL;
523 addr_prop.extra_headers = NULL;
524 addr_prop.remove_headers = NULL;
525
526 /* When verifying and testing addresses, the "logwrite" command in filters
527 must be bypassed. */
528
529 if (!verify && !address_test_mode) options |= RDO_REALLOG;
530
531 /* Sort out the fixed or dynamic uid/gid. This uid is used (a) for reading the
532 file (and interpreting a filter) and (b) for running the transports for
533 generated file and pipe addresses. It is not (necessarily) the same as the uids
534 that may own the file. Exim panics if an expanded string is not a number and
535 can't be found in the password file. Other errors set the freezing bit. */
536
537 if (!rf_get_ugid(rblock, addr, &ugid)) return DEFER;
538
539 if (!ugid.uid_set && pw != NULL)
540 {
541 ugid.uid = pw->pw_uid;
542 ugid.uid_set = TRUE;
543 }
544
545 if (!ugid.gid_set && pw != NULL)
546 {
547 ugid.gid = pw->pw_gid;
548 ugid.gid_set = TRUE;
549 }
550
551 #ifdef EXPERIMENTAL_SRS
552 /* For reverse SRS, fill the srs_recipient expandsion variable,
553 on failure, return decline/fail as relevant */
554 if(ob->srs != NULL)
555 {
556 BOOL usesrs = TRUE;
557
558 if(ob->srs_condition != NULL)
559 usesrs = expand_check_condition(ob->srs_condition, "srs_condition expansion failed", NULL);
560
561 if(usesrs)
562 if(Ustrcmp(ob->srs, "reverse") == 0 || Ustrcmp(ob->srs, "reverseandforward") == 0)
563 {
564 uschar *res;
565 int n_srs;
566
567 srs_orig_recipient = addr->address;
568 eximsrs_init();
569 if(ob->srs_db)
570 eximsrs_db_set(TRUE, ob->srs_db);
571 if((n_srs = eximsrs_reverse(&res, addr->address)) != OK)
572 return n_srs;
573 srs_recipient = res;
574 eximsrs_done();
575 DEBUG(D_any)
576 debug_printf("SRS: Recipient '%s' rewritten to '%s'\n", srs_orig_recipient, srs_recipient);
577 }
578 }
579 #endif
580
581 /* Call the function that interprets redirection data, either inline or from a
582 file. This is a separate function so that the system filter can use it. It will
583 run the function in a subprocess if necessary. If qualify_preserve_domain is
584 set, temporarily reset qualify_domain_recipient to the current domain so that
585 any unqualified addresses get qualified with the same domain as the incoming
586 address. Otherwise, if a local qualify_domain is provided, set that up. */
587
588 if (ob->qualify_preserve_domain)
589 qualify_domain_recipient = addr->domain;
590 else if (ob->qualify_domain != NULL)
591 {
592 uschar *new_qdr = rf_expand_data(addr, ob->qualify_domain, &xrc);
593 if (new_qdr == NULL) return xrc;
594 qualify_domain_recipient = new_qdr;
595 }
596
597 redirect.owners = ob->owners;
598 redirect.owngroups = ob->owngroups;
599 redirect.modemask = ob->modemask;
600 redirect.check_owner = ob->check_owner;
601 redirect.check_group = ob->check_group;
602 redirect.pw = pw;
603
604 if (ob->file != NULL)
605 {
606 redirect.string = ob->file;
607 redirect.isfile = TRUE;
608 }
609 else
610 {
611 redirect.string = ob->data;
612 redirect.isfile = FALSE;
613 }
614
615 frc = rda_interpret(&redirect, options, ob->include_directory,
616 ob->sieve_vacation_directory, &ugid, &generated, &(addr->message),
617 ob->skip_syntax_errors? &eblock : NULL, &filtertype,
618 string_sprintf("%s router (recipient is %s)", rblock->name, addr->address));
619
620 qualify_domain_recipient = save_qualify_domain_recipient;
621
622 /* Handle exceptional returns from filtering or processing an address list.
623 For FAIL and FREEZE we honour any previously set up deliveries by a filter. */
624
625 switch (frc)
626 {
627 case FF_NONEXIST:
628 addr->message = addr->user_message = NULL;
629 return DECLINE;
630
631 case FF_BLACKHOLE:
632 DEBUG(D_route) debug_printf("address :blackhole:d\n");
633 generated = NULL;
634 discarded = US":blackhole:";
635 frc = FF_DELIVERED;
636 break;
637
638 /* FF_DEFER and FF_FAIL can arise only as a result of explicit commands
639 (:fail: in an alias file or "fail" in a filter). If a configured message was
640 supplied, allow it to be included in an SMTP response after verifying. */
641
642 case FF_DEFER:
643 if (addr->message == NULL) addr->message = US"forced defer";
644 else addr->user_message = addr->message;
645 return DEFER;
646
647 case FF_FAIL:
648 if ((xrc = sort_errors_and_headers(rblock, addr, verify, &addr_prop)) != OK)
649 return xrc;
650 add_generated(rblock, addr_new, addr, generated, &addr_prop, &ugid, pw);
651 if (addr->message == NULL) addr->message = US"forced rejection";
652 else addr->user_message = addr->message;
653 return FAIL;
654
655 /* As in the case of a system filter, a freeze does not happen after a manual
656 thaw. In case deliveries were set up by the filter, we set the child count
657 high so that their completion does not mark the original address done. */
658
659 case FF_FREEZE:
660 if (!deliver_manual_thaw)
661 {
662 if ((xrc = sort_errors_and_headers(rblock, addr, verify, &addr_prop))
663 != OK) return xrc;
664 add_generated(rblock, addr_new, addr, generated, &addr_prop, &ugid, pw);
665 if (addr->message == NULL) addr->message = US"frozen by filter";
666 addr->special_action = SPECIAL_FREEZE;
667 addr->child_count = 9999;
668 return DEFER;
669 }
670 frc = FF_NOTDELIVERED;
671 break;
672
673 /* Handle syntax errors and :include: failures and lookup defers */
674
675 case FF_ERROR:
676 case FF_INCLUDEFAIL:
677
678 /* If filtertype is still FILTER_UNSET, it means that the redirection data
679 was never inspected, so the error was an expansion failure or failure to open
680 the file, or whatever. In these cases, the existing error message is probably
681 sufficient. */
682
683 if (filtertype == FILTER_UNSET) return DEFER;
684
685 /* If it was a filter and skip_syntax_errors is set, we want to set up
686 the error message so that it can be logged and mailed to somebody. */
687
688 if (filtertype != FILTER_FORWARD && ob->skip_syntax_errors)
689 {
690 eblock = store_get(sizeof(error_block));
691 eblock->next = NULL;
692 eblock->text1 = addr->message;
693 eblock->text2 = NULL;
694 addr->message = addr->user_message = NULL;
695 }
696
697 /* Otherwise set up the error for the address and defer. */
698
699 else
700 {
701 addr->basic_errno = ERRNO_BADREDIRECT;
702 addr->message = string_sprintf("error in %s %s: %s",
703 (filtertype != FILTER_FORWARD)? "filter" : "redirect",
704 (ob->data == NULL)? "file" : "data",
705 addr->message);
706 return DEFER;
707 }
708 }
709
710
711 /* Yield is either FF_DELIVERED (significant action) or FF_NOTDELIVERED (no
712 significant action). Before dealing with these, however, we must handle the
713 effect of skip_syntax_errors.
714
715 If skip_syntax_errors was set and there were syntax errors in an address list,
716 error messages will be present in eblock. Log them and send a message if so
717 configured. We cannot do this earlier, because the error message must not be
718 sent as the local user. If there were no valid addresses, generated will be
719 NULL. In this case, the router declines.
720
721 For a filter file, the error message has been fudged into an eblock. After
722 dealing with it, the router declines. */
723
724 if (eblock != NULL)
725 {
726 if (!moan_skipped_syntax_errors(
727 rblock->name, /* For message content */
728 eblock, /* Ditto */
729 (verify || address_test_mode)?
730 NULL : ob->syntax_errors_to, /* Who to mail */
731 generated != NULL, /* True if not all failed */
732 ob->syntax_errors_text)) /* Custom message */
733 return DEFER;
734
735 if (filtertype != FILTER_FORWARD || generated == NULL)
736 {
737 addr->message = US"syntax error in redirection data";
738 return DECLINE;
739 }
740 }
741
742 /* Sort out the errors address and any header modifications, and handle the
743 generated addresses, if any. If there are no generated addresses, we must avoid
744 calling sort_errors_and_headers() in case this router declines - that function
745 may modify the errors_address field in the current address, and we don't want
746 to do that for a decline. */
747
748 if (generated != NULL)
749 {
750 if ((xrc = sort_errors_and_headers(rblock, addr, verify, &addr_prop)) != OK)
751 return xrc;
752 add_generated(rblock, addr_new, addr, generated, &addr_prop, &ugid, pw);
753 }
754
755 /* FF_DELIVERED with no generated addresses is what we get when an address list
756 contains :blackhole: or a filter contains "seen finish" without having
757 generated anything. Log what happened to this address, and return DISCARD. */
758
759 if (frc == FF_DELIVERED)
760 {
761 if (generated == NULL && !verify && !address_test_mode)
762 {
763 log_write(0, LOG_MAIN, "=> %s <%s> R=%s", discarded, addr->address,
764 rblock->name);
765 yield = DISCARD;
766 }
767 }
768
769 /* For an address list, FF_NOTDELIVERED always means that no addresses were
770 generated. For a filter, addresses may or may not have been generated. If none
771 were, it's the same as an empty address list, and the router declines. However,
772 if addresses were generated, we can't just decline because successful delivery
773 of the base address gets it marked "done", so deferred generated addresses
774 never get tried again. We have to generate a new version of the base address,
775 as if there were a "deliver" command in the filter file, with the original
776 address as parent. */
777
778 else
779 {
780 address_item *next;
781
782 if (generated == NULL) return DECLINE;
783
784 next = deliver_make_addr(addr->address, FALSE);
785 next->parent = addr;
786 addr->child_count++;
787 next->next = *addr_new;
788 *addr_new = next;
789
790 /* Copy relevant flags (af_propagate is a name for the set), and set the
791 data that propagates. */
792
793 copyflag(next, addr, af_propagate);
794 next->p = addr_prop;
795
796 DEBUG(D_route) debug_printf("%s router autogenerated %s\n%s%s%s",
797 rblock->name,
798 next->address,
799 (addr_prop.errors_address != NULL)? " errors to " : "",
800 (addr_prop.errors_address != NULL)? addr_prop.errors_address : US"",
801 (addr_prop.errors_address != NULL)? "\n" : "");
802 }
803
804 #ifdef EXPERIMENTAL_SRS
805 /* On successful redirection, check for SRS forwarding and adjust sender */
806 if(ob->srs != NULL)
807 {
808 BOOL usesrs = TRUE;
809
810 if(ob->srs_condition != NULL)
811 usesrs = expand_check_condition(ob->srs_condition, "srs_condition expansion failed", NULL);
812
813 if(usesrs)
814 if((Ustrcmp(ob->srs, "forward") == 0 || Ustrcmp(ob->srs, "reverseandforward") == 0) && !verify)
815 {
816 uschar *res;
817 uschar *usedomain;
818 int n_srs;
819
820 srs_orig_sender = sender_address;
821 eximsrs_init();
822 if(ob->srs_db)
823 eximsrs_db_set(FALSE, ob->srs_db);
824
825 if(ob->srs_alias != NULL ? (usedomain = expand_string(ob->srs_alias)) == NULL : 1)
826 usedomain = deliver_domain;
827
828 if((n_srs = eximsrs_forward(&res, sender_address, usedomain)) != OK)
829 return n_srs;
830 sender_address = res;
831 DEBUG(D_any)
832 debug_printf("SRS: Sender '%s' rewritten to '%s'\n", srs_orig_sender, sender_address);
833 }
834 }
835 #endif
836
837 /* Control gets here only when the address has been completely handled. Put the
838 original address onto the succeed queue so that any retry items that get
839 attached to it get processed. */
840
841 addr->next = *addr_succeed;
842 *addr_succeed = addr;
843
844 return yield;
845 }
846
847 /* End of routers/redirect.c */