31 #define CHK_DOMAIN_OK 0 32 #define CHK_DOMAIN_YES 1 33 #define CHK_DOMAIN_LOCAL 2 34 #define CHK_DOMAIN_REJECT 3 35 #define CHK_DOMAIN_TEMPFAIL 4 36 #define CHK_DOMAIN_SPAMTRAP 5 40 #define CHK_RCPT_REJECT 1 41 #define CHK_RCPT_SPAMTRAP 2 42 #define CHK_RCPT_IGNORE 3 43 #define CHK_RCPT_TEMPFAIL 4 44 #define CHK_RCPT_NET_LOCAL 5 45 #define CHK_RCPT_NET_DOMAIN 6 46 #define CHK_RCPT_NET_FRIEND 7 47 #define CHK_RCPT_NET_KNOWN 8 48 #define CHK_RCPT_USER_UNKNOWN 9 50 #define CHK_RCPT_UNDEF -1 53 static int decode_domain_check(
char *);
54 static int chk_rcpt_decode(
char *);
56 static int check_rcpt_net_access(
int,
char *,
char *,
int);
85 #define RCPT_PREFIX "RcptAccess" 86 #define DOMAIN_PREFIX "CheckRcptDomain" 99 char *kemail = NULL, *kbemail = NULL;
106 ASSERT(email != NULL && strlen(email) > 0);
113 if ((kemail = strdup(email)) == NULL) {
125 for (p = email, q = kemail; *p !=
'\0'; p++) {
126 if (ok && *p ==
'+') {
130 if (!ok && *p ==
'@')
144 if ((kbemail = strdup(kemail)) == NULL) {
149 rcpt = domain = NULL;
175 memset(buf, 0,
sizeof (buf));
205 access = decode_domain_check(buf);
242 memset(buf, 0,
sizeof (buf));
259 size = strlen(kemail) + 16;
260 if ((kbuf = malloc(size)) == NULL) {
277 if (rcpt != NULL && strlen(rcpt) > 0) {
278 snprintf(kbuf, size,
"%s@", rcpt);
282 if (strlen(buf) > 0) {
291 if ((p =
strchr(rcpt,
'+')) != NULL) {
293 snprintf(kbuf, size,
"%s@", rcpt);
297 if (strlen(buf) > 0) {
309 if (domain != NULL) {
311 while (p != NULL && strlen(p) > 0) {
312 snprintf(kbuf, size,
"%s", p);
316 if (strlen(buf) > 0) {
321 if ((p =
strchr(p,
'.')) != NULL)
363 result = chk_rcpt_decode(buf);
372 result = check_rcpt_net_access(result, ip, name, netclass);
410 decode_domain_check(s)
416 if (strcasecmp(s,
"NO") == 0)
419 if (strcasecmp(s,
"YES") == 0)
422 if (strcasecmp(s,
"REJECT") == 0)
425 if (strcasecmp(s,
"TEMPFAIL") == 0)
428 if (strcasecmp(s,
"SPAMTRAP") == 0)
431 if (strcasecmp(s,
"LOCAL") == 0)
444 chk_rcpt_decode(code)
447 if (code == NULL || strlen(code) == 0)
450 if (strcasecmp(code,
"OK") == 0)
453 if (strcasecmp(code,
"REJECT") == 0)
456 if (strcasecmp(code,
"TEMPFAIL") == 0)
459 if (strcasecmp(code,
"SPAMTRAP") == 0)
462 if (strcasecmp(code,
"IGNORE") == 0)
465 if (strcasecmp(code,
"LOCAL-NET") == 0)
468 if (strcasecmp(code,
"DOMAIN-NET") == 0)
471 if (strcasecmp(code,
"FRIEND-NET") == 0)
474 if (strcasecmp(code,
"KNOWN-NET") == 0)
477 if (strcasecmp(code,
"USER-UNKNOWN") == 0)
487 #define CHECK_NET_CLASS(check, netclass) \ 488 if (netclass != NET_UNKNOWN) { \ 489 bool classok = FALSE; \ 491 classok = IS_LOCAL(netclass) || IS_AUTH(netclass); \ 492 if (classok && check == CHK_RCPT_NET_LOCAL) \ 495 classok = classok || IS_DOMAIN(netclass); \ 496 if (classok && check == CHK_RCPT_NET_DOMAIN) \ 499 classok = classok || IS_FRIEND(netclass); \ 500 if (classok && check == CHK_RCPT_NET_FRIEND) \ 503 classok = classok || IS_KNOWN(netclass); \ 504 if (classok && check == CHK_RCPT_NET_KNOWN) \ 509 check_rcpt_net_access(check, ip, name, netclass)
#define CHK_RCPT_TEMPFAIL
#define CHK_RCPT_NET_DOMAIN
#define CHK_DOMAIN_TEMPFAIL
int GetClientNetClass(char *ip, char *name, netclass_T *class, char *label, size_t sz)
#define CHK_RCPT_NET_LOCAL
#define CHK_DOMAIN_SPAMTRAP
#define CHECK_NET_CLASS(check, netclass)
#define RCPT_USER_UNKNOWN
#define ZE_MessageNotice(level,...)
#define RCPT_ACCESS_DENIED
char * get_name_by_id(name2id_T *, int)
#define ZE_MessageInfo(level,...)
#define CHK_RCPT_USER_UNKNOWN
bool db_rcpt_check_domain(char *prefix, char *key, char *bufout, size_t szbuf, uint32_t flags)
#define ZE_LogSysError(...)
int check_rcpt(char *email, char *ip, char *name, int netclass)
bool db_rcpt_check_email(char *prefix, char *key, char *bufout, size_t szbuf)
char * rcpt_code_string(int code)
#define CHK_RCPT_NET_KNOWN
#define CHK_DOMAIN_REJECT
#define CHK_RCPT_SPAMTRAP
#define CHK_RCPT_NET_FRIEND