12
14
/*************************************************
15
* Test a header for matching name *
16
*************************************************/
18
/* This function tests the name of a header. It is made into a function because
19
it isn't just a string comparison: spaces and tabs are permitted between the
20
name and the colon. The h->text field should nowadays never be NULL, but check
24
h points to the header
26
len the length of the name
27
notdel if TRUE, force FALSE for deleted headers
29
Returns: TRUE or FALSE
33
header_testname(header_line *h, uschar *name, int len, BOOL notdel)
36
if (h->type == '*' && notdel) return FALSE;
37
if (h->text == NULL || strncmpic(h->text, name, len) != 0) return FALSE;
39
while (*tt == ' ' || *tt == '\t') tt++;
43
/* This is a copy of the function above, only that it is possible to pass
44
only the beginning of a header name. It simply does a front-anchored
45
substring match. Arguments and Return codes are the same as for
46
header_testname() above. */
49
header_testname_incomplete(header_line *h, uschar *name, int len, BOOL notdel)
51
if (h->type == '*' && notdel) return FALSE;
52
if (h->text == NULL || strncmpic(h->text, name, len) != 0) return FALSE;
57
/*************************************************
58
* Add new header backend function *
59
*************************************************/
61
/* The header_last variable points to the last header during message reception
62
and delivery; otherwise it is NULL. We add new headers only when header_last is
63
not NULL. The function may get called sometimes when it is NULL (e.g. during
64
address verification where rewriting options exist). When called from a filter,
65
there may be multiple header lines in a single string.
67
This is an internal static function that is the common back end to the external
68
functions defined below. The general interface allows the header to be inserted
69
before or after a given occurrence of a given header.
71
(a) if "name" is NULL, the header is added at the end of all the existing
72
headers if "after" is true, or at the start if it is false. The "topnot"
75
(b) If "name" is not NULL, the first existing header with that name is sought.
76
If "after" is false, the new header is added before it. If "after" is true,
77
a check is made for adjacent headers with the same name, and the new header
78
is added after the last of them. If a header of the given name is not
79
found, the new header is added first if "topnot" is true, and at the bottom
83
after TRUE for "after", FALSE for "before"
84
name name if adding at a specific header, else NULL
85
topnot TRUE to add at top if no header found
86
type Exim header type character (htype_something)
88
ap va_list value for format arguments
94
header_add_backend(BOOL after, uschar *name, BOOL topnot, int type,
95
char *format, va_list ap)
101
uschar buffer[HEADER_ADD_BUFFER_SIZE];
103
if (header_last == NULL) return;
105
if (!string_vformat(buffer, sizeof(buffer), format, ap))
106
log_write(0, LOG_MAIN|LOG_PANIC_DIE, "string too long in header_add: "
107
"%.100s ...", buffer);
109
/* Find where to insert this header */
115
hptr = &(header_last->next);
127
int len = Ustrlen(name);
129
/* Find the first non-deleted header witht the correct name. */
131
for (hptr = &header_list; (h = *hptr) != NULL; hptr = &(h->next))
133
if (header_testname(h, name, len, TRUE)) break;
136
/* Handle the case where no header is found. To insert at the bottom, nothing
148
/* Handle the case where a header is found. Check for more if "after" is
149
true. In this case, we want to include deleted headers in the block. */
155
if (h->next == NULL || !header_testname(h, name, len, FALSE)) break;
162
/* Loop for multiple header lines, taking care about continuations. At this
163
point, we have hptr pointing to the link field that will point to the new
164
header, and h containing the following header, or NULL. */
166
for (p = q = buffer; *p != 0; )
170
q = Ustrchr(q, '\n');
171
if (q == NULL) q = p + Ustrlen(p);
172
if (*(++q) != ' ' && *q != '\t') break;
175
new = store_get(sizeof(header_line));
176
new->text = string_copyn(p, q - p);
184
if (h == NULL) header_last = new;
190
/*************************************************
191
* Add new header anywhere in the chain *
192
*************************************************/
194
/* This is an external interface to header_add_backend().
197
after TRUE for "after", FALSE for "before"
198
name name if adding at a specific header, else NULL
199
topnot TRUE to add at top if no header found
200
type Exim header type character (htype_something)
201
format sprintf format
208
header_add_at_position(BOOL after, uschar *name, BOOL topnot, int type,
212
va_start(ap, format);
213
header_add_backend(after, name, topnot, type, format, ap);
219
/*************************************************
13
220
* Add new header on end of chain *
14
221
*************************************************/
16
/* header_last points to the last header during message reception and delivery;
17
otherwise it is NULL. We add new headers only when header_last is not NULL.
18
The function may get called sometimes when it is NULL (e.g. during address
19
verification where rewriting options exist).
223
/* This is now a convenience interface to header_add_backend().
22
226
type Exim header type character
30
234
header_add(int type, char *format, ...)
34
uschar buffer[HEADER_ADD_BUFFER_SIZE];
36
if (header_last == NULL) return;
38
237
va_start(ap, format);
39
if (!string_vformat(buffer, sizeof(buffer), format, ap))
40
log_write(0, LOG_MAIN|LOG_PANIC_DIE, "string too long in header_add: %.100s ...",
238
header_add_backend(TRUE, NULL, FALSE, type, format, ap);
44
new = store_get(sizeof(header_line));
45
new->text = string_copy(buffer);
47
new->slen = Ustrlen(buffer);
51
header_last->next = new;
244
/*************************************************
245
* Remove (mark as old) a header *
246
*************************************************/
248
/* This function is used by the filter code; it is also exported in the
249
local_scan() API. If no header is found, the function does nothing.
252
occ the occurrence number for multiply-defined headers
253
<= 0 means "all"; deleted headers are not counted
260
header_remove(int occ, uschar *name)
264
int len = Ustrlen(name);
265
for (h = header_list; h != NULL; h = h->next)
267
if (header_testname(h, name, len, TRUE) && (occ <= 0 || ++hcount == occ))
56
277
/*************************************************
98
319
return htype_other;
323
/*************************************************
324
* Scan a header for certain strings *
325
*************************************************/
327
/* This function is used for the "personal" test. It scans a particular header
328
line for any one of a number of strings, matched caselessly either as plain
329
strings, or as regular expressions. If the header line contains a list of
330
addresses, each match is applied only to the operative part of each address in
331
the header, and non-regular expressions must be exact matches.
333
The patterns can be provided either as a chain of string_item structures, or
334
inline in the argument list, or both. If there is more than one header of the
335
same name, they are all searched.
338
name header name, including the trailing colon
339
has_addresses TRUE if the header contains a list of addresses
340
cond value to return if the header contains any of the strings
341
strings points to a chain of string_item blocks
342
count number of inline strings
343
... the inline strings
345
Returns: cond if the header exists and contains one of the strings;
350
/* First we have a local subroutine to handle a single pattern */
353
one_pattern_match(uschar *name, int slen, BOOL has_addresses, uschar *pattern)
357
const pcre *re = NULL;
359
/* If the pattern is a regex, compile it. Bomb out if compiling fails; these
360
patterns are all constructed internally and should be valid. */
362
if (*pattern == '^') re = regex_must_compile(pattern, TRUE, FALSE);
364
/* Scan for the required header(s) and scan each one */
366
for (h = header_list; !yield && h != NULL; h = h->next)
368
if (h->type == htype_old || slen > h->slen ||
369
strncmpic(name, h->text, slen) != 0)
372
/* If the header is a list of addresses, extract each one in turn, and scan
373
it. A non-regex scan must be an exact match for the address. */
377
uschar *s = h->text + slen;
379
while (!yield && *s != 0)
381
uschar *error, *next;
382
uschar *e = parse_find_address_end(s, FALSE);
384
int start, end, domain;
386
/* Temporarily terminate the string at the address end while extracting
387
the operative address within. */
390
next = parse_extract_address(s, &error, &start, &end, &domain, FALSE);
393
/* Move on, ready for the next address */
398
/* If there is some kind of syntax error, just give up on this header
401
if (next == NULL) break;
403
/* Otherwise, test for the pattern; a non-regex must be an exact match */
405
yield = (re == NULL)?
406
(strcmpic(next, pattern) == 0)
408
(pcre_exec(re, NULL, CS next, Ustrlen(next), 0, PCRE_EOPT, NULL, 0)
413
/* For headers that are not lists of addresses, scan the entire header line,
414
and just require "contains" for non-regex patterns. */
418
yield = (re == NULL)?
419
(strstric(h->text, pattern, FALSE) != NULL)
421
(pcre_exec(re, NULL, CS h->text, h->slen, 0, PCRE_EOPT, NULL, 0) >= 0);
429
/* The externally visible interface */
432
header_match(uschar *name, BOOL has_addresses, BOOL cond, string_item *strings,
438
int slen = Ustrlen(name);
440
for (s = strings; s != NULL; s = s->next)
442
if (one_pattern_match(name, slen, has_addresses, s->text)) return cond;
446
for (i = 0; i < count; i++)
448
if (one_pattern_match(name, slen, has_addresses, va_arg(ap, uschar *)))
101
456
/* End of header.c */