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;
}
示例#4
0
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;
}
示例#5
0
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;
}