1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/*++
/* NAME
/* split_addr 3
/* SUMMARY
/* recipient localpart address splitter
/* SYNOPSIS
/* #include <split_addr.h>
/*
/* char *split_addr_internal(localpart, delimiter_set)
/* char *localpart;
/* const char *delimiter_set;
/* LEGACY SUPPORT
/* char *split_addr(localpart, delimiter_set)
/* char *localpart;
/* const char *delimiter_set;
/* DESCRIPTION
/* split_addr*() null-terminates \fIlocalpart\fR at the first
/* occurrence of the \fIdelimiter\fR character(s) found, and
/* returns a pointer to the remainder.
/*
/* With split_addr_internal(), the address must be in internal
/* (unquoted) form.
/*
/* split_addr() is a backwards-compatible form for legacy code.
/*
/* Reserved addresses are not split: postmaster, mailer-daemon,
/* double-bounce. Addresses that begin with owner-, or addresses
/* that end in -request are not split when the owner_request_special
/* parameter is set.
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*
/* Wietse Venema
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*--*/
/* System library. */
#include <sys_defs.h>
#include <string.h>
#ifdef STRCASECMP_IN_STRINGS_H
#include <strings.h>
#endif
/* Utility library. */
#include <split_at.h>
#include <stringops.h>
/* Global library. */
#include <mail_params.h>
#include <mail_addr.h>
#include <split_addr.h>
/* split_addr_internal - split address with extreme prejudice */
char *split_addr_internal(char *localpart, const char *delimiter_set)
{
ssize_t len;
/*
* Don't split these, regardless of what the delimiter is.
*/
if (strcasecmp(localpart, MAIL_ADDR_POSTMASTER) == 0)
return (0);
if (strcasecmp(localpart, MAIL_ADDR_MAIL_DAEMON) == 0)
return (0);
if (strcasecmp_utf8(localpart, var_double_bounce_sender) == 0)
return (0);
/*
* Backwards compatibility: don't split owner-foo or foo-request.
*/
if (strchr(delimiter_set, '-') != 0 && var_ownreq_special != 0) {
if (strncasecmp(localpart, "owner-", 6) == 0)
return (0);
if ((len = strlen(localpart) - 8) > 0
&& strcasecmp(localpart + len, "-request") == 0)
return (0);
}
/*
* Safe to split this address. Do not split the address if the result
* would have a null localpart.
*/
if ((len = strcspn(localpart, delimiter_set)) == 0 || localpart[len] == 0) {
return (0);
} else {
localpart[len] = 0;
return (localpart + len + 1);
}
}
|