diff thrlib/cmn_defs.h @ 0:c7f6b056b673

First import of vendor version
author Peter Gervai <grin@grin.hu>
date Tue, 10 Mar 2009 13:49:58 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/thrlib/cmn_defs.h	Tue Mar 10 13:49:58 2009 +0100
@@ -0,0 +1,297 @@
+/* Distributed Checksum Clearinghouse
+ *
+ * common threaded client definitions
+ *
+ * Copyright (c) 2008 by Rhyolite Software, LLC
+ *
+ * This agreement is not applicable to any entity which sells anti-spam
+ * solutions to others or provides an anti-spam solution as part of a
+ * security solution sold to other entities, or to a private network
+ * which employs the DCC or uses data provided by operation of the DCC
+ * but does not provide corresponding data to other users.
+ *
+ * Permission to use, copy, modify, and distribute this software without
+ * changes for any purpose with or without fee is hereby granted, provided
+ * that the above copyright notice and this permission notice appear in all
+ * copies and any distributed versions or copies are either unchanged
+ * or not called anything similar to "DCC" or "Distributed Checksum
+ * Clearinghouse".
+ *
+ * Parties not eligible to receive a license under this agreement can
+ * obtain a commercial license to use DCC by contacting Rhyolite Software
+ * at sales@rhyolite.com.
+ *
+ * A commercial license would be for Distributed Checksum and Reputation
+ * Clearinghouse software.  That software includes additional features.  This
+ * free license for Distributed ChecksumClearinghouse Software does not in any
+ * way grant permision to use Distributed Checksum and Reputation Clearinghouse
+ * software
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC
+ * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ *
+ * Rhyolite Software DCC 1.3.103-1.88 $Revision$
+ */
+
+#ifndef CLNT_DEFS_H
+#define CLNT_DEFS_H
+
+#include "dcc_ck.h"
+#include "dcc_xhdr.h"
+#include "dcc_heap_debug.h"
+#ifdef HAVE_PTHREAD_H
+#include <pthread.h>
+#else
+#include <sys/pthread.h>
+#endif
+#include <sys/un.h>
+#include <sys/resource.h>
+#include <arpa/inet.h>
+#include <signal.h>
+
+
+/* what to do about checksums whose counts say "spam" */
+typedef enum {
+    CMN_REJECT = 0,			/* tell sendmail to reject spam */
+    CMN_DISCARD,			/* discard spam */
+    CMN_IGNORE				/* ignore spam reports */
+} CMN_ACTION;
+extern CMN_ACTION action;
+
+typedef enum {
+    SETHDR, ADDHDR, NOHDR
+} CHGHDR;
+extern CHGHDR chghdr;
+
+
+typedef struct {
+    int	    msgs;			/* total messages */
+    int	    tgts;			/* total addressees */
+    int	    tgts_discarded;		/* discarded for this many addressess */
+    int	    tgts_rejected;
+    int	    tgts_ignored;
+    int	    tgts_embargoed;
+    int	    msgs_embargoed;
+    int	    msgs_spam;
+    time_t  msg_prev, msg_next;
+} TOTALS;
+extern TOTALS totals;
+
+
+/* This is a wild guess of open files hidden in libraries and elsewhere.
+ * Some systems such as Solaris seem to have an amazing number of them
+ * Each whitelist context involves an open hash table file */
+#define EXTRA_FILES	(32 + NUM_CWFS)
+
+#define MAX_SELECT_WORK ((FD_SETSIZE-EXTRA_FILES)/FILES_PER_JOB)
+/*  dccm and dccifd have differing values for FILES_PER_JOB */
+#define MIN_MAX_WORK    2
+extern int max_max_work;
+extern const char *max_max_work_src;
+extern int max_work;
+extern int init_work;
+extern int total_work;
+
+
+typedef struct {
+    const char *log_result;		/* "reject" etc. for log */
+    const char *rcode;
+    const char *xcode;
+    const char *str;
+    char    str_buf[REPLY_BUF_LEN];
+} REPLY_STRS;
+#define DCC_RCODE   "550"
+#define DCC_XCODE   "5.7.1"
+extern REPLY_TPLT reject_reply;
+extern REPLY_TPLT grey_reply;
+extern REPLY_TPLT reputation_reply;
+extern REPLY_TPLT dcc_fail_reply;
+extern REPLY_TPLT dnsbl_timeo_reply;
+
+
+/* Some of these flags are computed for all recipients (e.g. white- or
+ *	blacklisting from the main whiteclnt file) in the common flags and
+ *	then copied to individual recipient flags words.
+ *	Others are kept only in the common word. */
+typedef u_short RCPT_FGS;
+#    define	 RCPT_FG_NULL_WHITECLNT	0x0001	/* no entries in it */
+#    define	 RCPT_FG_REJ_FILTER	0x0002	/* rejected by dccifd or dccm */
+#    define	 RCPT_FG_BAD_USERNAME	0x0004	/* user bad & rejected by MTA */
+#    define	 RCPT_FG_WLIST_ISSPAM	0x0008	/* whiteclnt blacklisted */
+#    define	 RCPT_FG_WLIST_NOTSPAM	0x0010	/* whiteclnt whitelisted */
+#    define	 RCPT_FG_WHITE		0x0020
+#    define	 RCPT_FG_BLACK		0x0040
+#    define	 RCPT_FG_ISSPAM		0x0080	/* result for this target */
+#    define	 RCPT_FG_GREY_END	0x0100	/* end of greylist embargo */
+#    define	 RCPT_FG_GREY_WHITE	0x0200	/* whitelisted for greylist */
+#    define	 RCPT_FG_INCOMPAT_REJ	0x0400  /* incompatible & so rejected */
+
+/* per-recipient state */
+typedef struct rcpt_st {
+    struct rcpt_st  *fwd;
+    struct cmn_work *cwp;
+    off_t	    log_pos_to;		/* env_To line in main log file */
+    off_t	    log_pos_white;
+    DCC_CKS_WTGTS   wtgts;
+    DCC_TGTS	    env_to_tgts, user_tgts;
+    ASK_GREY_RESULT grey_result;
+    u_int	    embargo_num;
+    DCC_SUM	    wf_sum;
+    DCC_CKSUM_THOLDS tholds_rej;
+    FLTR_SWS	    sws;
+    RCPT_FGS	    fgs;
+    RCPT_FGS	    global_env_to_fgs;
+    RCPT_FGS	    env_to_fgs;
+#    define	     RCTP_MAXNAME 257	/* sendmail MAXNAME limit */
+    char	    env_to[RCTP_MAXNAME];   /* env_to */
+    char	    user[RCTP_MAXNAME];	/* mailbox */
+    char	    rej_msg[REPLY_BUF_LEN];
+    const char	    *rej_result;
+    DCC_SUM	    env_to_sum;
+    DCC_SUM	    user_sum;
+    DCC_SUM	    msg_sum;
+    DCC_SUM	    triple_sum;
+    DCC_PATH	    dir;		/* recipient's whitelist and logdir */
+    DCC_PATH	    user_log_nm;
+} RCPT_ST;
+
+
+/* per message state common to threaded DCC clients */
+typedef struct cmn_work {
+    struct work	*wp;
+    DCC_CLNT_CTXT *dcc_ctxt;
+    u_int	dcc_ctxt_sn;
+    struct timeval ldate;
+    CMN_ACTION	action;
+    u_int	xhdr_fname_len;
+    char	xhdr_fname[sizeof(DCC_XHDR_START)+sizeof(DCC_BRAND)+1];
+    char	clnt_name[DCC_MAXDOMAINLEN];	/* SMTP client */
+    char	clnt_str[INET6_ADDRSTRLEN+1];
+    struct in6_addr clnt_addr;
+    char	sender_name[DCC_MAXDOMAINLEN];	/* source of mail message */
+    char	sender_str[INET6_ADDRSTRLEN+1];
+    char	helo[DCC_HELO_MAX];
+    char	env_from[DCC_ENV_FROM_MAX+1];
+    char	mail_host[DCC_MAXDOMAINLEN];  /* Mail_From host name */
+    char	id[DCC_MSG_ID_LEN+1];
+    DCC_EMSG	emsg;
+    DCC_PATH    tmp_nm;
+    DCC_PATH	log_nm;			/* log file for this message */
+    int		num_rcpts;
+#    define	 MAX_RCPTS 1024
+    RCPT_ST	*rcpt_st_first, *rcpt_st_last;
+    int		log_fd;			/* -1=none */
+    int		tmp_fd;			/* copy of entire message */
+    DCC_HEADER_BUF header;
+    EARLY_LOG	early_log;
+
+    u_short	cmn_fgs;
+#    define	 CMN_FG_ENV_LOGGED  0x0001  /* have logged the envelope */
+#    define	 CMN_FG_LOG_EARLY   0x0002  /* too early to write to log file */
+#    define	 CMN_FG_CHECK_REP   0x0004  /* check DCC reputations */
+#    define	 CMN_FG_FROM_MX	    0x0008  /* don't reject MX secondary */
+#    define	 CMN_FG_FROM_SUBMIT 0x0010  /* SMTP submission clients */
+#    define	 CMN_FG_LOCAL_SPAM  0x0020
+#    define	 CMN_FG_LOG_ENV_TO  0x0040  /* env_to checksum to log */
+#    define	 CMN_FG_THOLDS_SET  0x0080
+
+    DCC_GOT_CKS	cks;
+
+#define CMN_WORK_ZERO log_ip_pos	/* here down cleared for each msg */
+
+    off_t	log_ip_pos;		/* position and length of IP: line */
+    int		log_ip_len;
+    off_t	log_pos_to_first;	/* first env_To line in log file */
+    off_t	log_pos_to_end;		/* end of env_To lines in log file */
+    off_t	log_pos_white_first;	/* first whitelist result */
+    off_t	log_pos_white_last;	/* last whitelist result */
+    off_t	log_pos_ask_error;	/* final DCC errors */
+    u_int	max_embargo_num;
+    REPLY_STRS	reply;
+    DCC_TGTS	tgts;			/* total accepted Mail_From values */
+    DCC_TGTS	white_tgts;		/* # of ->tgts whitelisting message */
+    DCC_TGTS	reject_tgts;		/* # of ->tgts rejecting message */
+    DCC_TGTS	deliver_tgts;		/* # of ->tgts wanting the message */
+    DCC_TGTS	mta_rej_tgts;		/* not accepted by order of MTA */
+    DCC_TGTS	early_grey_tgts;	/* report to DCC if embargoed */
+    DCC_TGTS	late_grey_tgts;		/* don't report to DCC if delivered */
+    DCC_TGTS	local_tgts;		/* what we told the DCC server */
+    size_t	log_size;
+    DCC_CKS_WTGTS wtgts;
+    FLTR_SWS	init_sws;		/* initial value for rcpt_st->sws */
+    FLTR_SWS	rcpts_sws;		/* common among recipients */
+    RCPT_FGS	rcpt_fgs;
+    ASK_ST	ask_st;			/* ASK_ST_* */
+} CMN_WORK;
+
+
+extern u_int dcc_ctxt_sn;		/* change X-DCC header server name */
+
+extern RCPT_ST *rcpt_st_free;
+
+const char *userdirs;
+
+extern u_char dcc_query_only;
+extern u_char cannot_discard;		/* cannot trim targets after DATA */
+extern u_char cannot_reject;		/* cannot reject RCPT_TO targets */
+extern u_char try_extra_hard;		/* 0 or DCC_CLNT_FG_NO_FAIL */
+extern u_char to_white_only;
+extern const char *mapfile_nm;
+extern const char *main_white_nm;
+
+extern pthread_mutex_t user_log_mutex;
+extern pthread_t user_log_owner;
+
+extern void clnt_sigs_off(sigset_t *);
+
+extern void parse_userdirs(const char *);
+extern u_char get_user_dir(RCPT_ST *, const char *, int, const char *, int);
+extern void make_tplt(REPLY_TPLT *, u_char,
+		      const char *, const char *, const char *, const char *);
+extern void parse_reply_arg(const char *);
+extern void make_reply(REPLY_STRS *, const REPLY_TPLT *,
+		       const CMN_WORK *, const DNSBL_GROUP *);
+extern void finish_replies(void);
+extern void cmn_init(void);
+extern void cmn_create(CMN_WORK *);
+extern u_char cmn_open_tmp(CMN_WORK *);
+extern void cmn_close_tmp(CMN_WORK *);
+extern u_char cmn_write_tmp(CMN_WORK *cwp, const void *, int);
+extern u_char check_mx_listing(CMN_WORK *);
+extern void cmn_clear(CMN_WORK *, struct work *, u_char);
+extern void free_rcpt_sts(CMN_WORK *, u_char);
+extern RCPT_ST *alloc_rcpt_st(CMN_WORK *, u_char);
+extern void log_start(CMN_WORK *);
+extern void log_stop(CMN_WORK *);
+extern void log_write(CMN_WORK *, const void *, u_int);
+extern void log_body_write(CMN_WORK *, const char *, u_int);
+#define LOG_CMN_CAPTION(cwp, s) log_write(cwp, s, LITZ(s))
+#define LOG_CMN_EOL(cwp) LOG_CMN_CAPTION(cwp, "\n")
+#define LOG_CAPTION(wp, s) LOG_CMN_CAPTION(&(wp)->cw, s)
+#define LOG_EOL(wp) LOG_CAPTION(wp, "\n")
+extern off_t log_lseek_get(CMN_WORK *);
+extern void thr_log_late(CMN_WORK *);
+extern void thr_log_envelope(CMN_WORK *, u_char);
+extern u_char ck_dcc_ctxt(CMN_WORK *);
+extern u_char cmn_compat_whitelist(CMN_WORK *, RCPT_ST *);
+extern void cmn_ask_white(CMN_WORK *);
+extern int cmn_ask_dcc(CMN_WORK *);
+extern void users_process(CMN_WORK *);
+extern void users_log_result(CMN_WORK *, const char *);
+
+extern void user_reject_discard(CMN_WORK *, RCPT_ST *);
+extern void log_smtp_reply(CMN_WORK *);
+
+extern void totals_init(void);
+extern void totals_stop(void);
+extern void totals_msg(void);
+extern void work_clean(void);
+
+
+#endif /* CLNT_DEFS_H */