static const response* chkdns_sender(str* sender, str* params) { str domstr, dbltxt; int i; unsigned char ansbuf[512]; if(sender->len == 0) return 0; /* bounce */ i = str_findlast(sender, '@'); if(i < 0) { return &resp_badfrom; /* no domain */ } str_init(&domstr); str_copyb(&domstr, sender->s+i+1, sender->len-i-1); if(domstr.len == 0) { /* null domain */ str_free(&domstr); return &resp_badfrom; } /* first check dbl */ if(dblchk(&domstr, &dbltxt)) { session_setenv("RBLSMTPD", dbltxt.s, 0); session_setnum("dblfrom", 1); session_setnum("sump", 1); msg2("MAIL FROM in DBL ",dbltxt.s); str_free(&domstr); if(getenv("DBLREJECT")) { resp_baddbl.message = dbltxt.s; return &resp_baddbl; } return 0; } i = res_query(domstr.s, C_IN, T_MX, ansbuf, sizeof(ansbuf)); if(i > 0 && ((HEADER *)ansbuf)->ancount != 0) { /* has an MX */ str_free(&domstr); return 0; } i = res_query(domstr.s, C_IN, T_A, ansbuf, sizeof(ansbuf)); if(i > 0 && ((HEADER *)ansbuf)->ancount != 0) { /* has an A */ str_free(&domstr); return 0; } i = res_query(domstr.s, C_IN, T_AAAA, ansbuf, sizeof(ansbuf)); str_free(&domstr); if(i > 0 && ((HEADER *)ansbuf)->ancount != 0) return 0; /* has an AAAA */ return &resp_badfrom; (void)params; }
static const response* get_seq(void) { str sql; str_init(&sql); /* do IPv6 differently */ if(strchr(remote_ip, ':')) { if(!str_copy5s(&sql, "INSERT INTO mail SET serial=NULL,mailtime=NULL,server6=INET_PTO6('", local_ip, "'),sourceip6=INET_PTO6('", remote_ip, "')")) return &resp_internal; } else { if(!str_copy5s(&sql, "INSERT INTO mail SET serial=NULL,mailtime=NULL,server=INET_ATON('", local_ip, "'),sourceip=INET_ATON('", remote_ip, "')")) return &resp_internal; } if(!sqlquery(&sql, &sqlseq) || !str_init(&sqlseqstr) || !str_catu(&sqlseqstr, sqlseq)) return &resp_internal; msg2("assigned seq ",sqlseqstr.s); session_setnum("sqlseq", (unsigned long)sqlseq); return 0; }
static const response* chkdns_helo(str* hostname, str* capabilities) { str dbltxt; /* hack, don't check numeric, guess from first character */ if(hostname->s[0] >= '0' && hostname->s[0] <= '9') return 0; if(dblchk(hostname, &dbltxt)) { session_setenv("RBLSMTPD", dbltxt.s, 0); session_setnum("dblhelo", 1); session_setnum("sump", 1); msg4("HELO ", hostname->s, " in DBL ",dbltxt.s); if(getenv("DBLREJECT")) { resp_baddbl.message = dbltxt.s; return &resp_baddbl; } } return 0; (void) capabilities; }
static const response* apply_rule(const struct rule* rule) { const response* resp; unsigned long maxdatabytes; resp = build_response(rule->code, &rule->response); apply_environment(&rule->environment); maxdatabytes = session_getnum("maxdatabytes", ~0UL); if (maxdatabytes == 0 || (rule->databytes > 0 && maxdatabytes > rule->databytes)) session_setnum("maxdatabytes", rule->databytes); return resp; }
static int cmd_STARTTLS(void) { if (!respond(&resp_start)) return 0; if (!starttls()) return 0; tls_available = 0; session_setnum("tls_state", 1); /* Remove UCSPITLS from environment to indicate it no longer available. */ unsetenv("UCSPITLS"); return 1; }