/* Public domain */ /* Maximum message body size */ #define MESSAGE_SIZE_MAX 120000000 /* * Maximum e-mail address size in bytes. * WARNING: If this is changed, the active queue must be cleared. */ #define ADDRESS_MAX 128 /* Sync with csoftadmd. */ #define MAILBOX_PATH_MAX 128 #define RULE_COND_MAX 128 #define RULE_INSN_MAX 256 #define RULESET_MAX 1024 #define RULE_MAX_RECURSION_LVL 32 #define IP_ADDRESS_MAX 40 typedef struct mpd_msg_status { float score; /* SpamAssassin Score */ float req_score; /* Spam threshold */ int spam_status; /* Spam status (1=spam) */ #ifdef HAVE_SA SV *sv; /* PerMsgStatus object */ #endif } MPD_MsgStatus; typedef struct mpd_recipient { char addr[ADDRESS_MAX]; /* Recipient address */ char user_part[ADDRESS_MAX]; /* Recipient local@ part */ char domain_part[ADDRESS_MAX]; /* Recipient @domain.ext part */ ML_MailListReq *ml; /* Mailing list data */ TAILQ_ENTRY(mpd_recipient) rcpts; } MPD_Recipient; typedef struct mpd_message { char mail_from[ADDRESS_MAX]; /* Sender */ TAILQ_HEAD(,mpd_recipient) rcpts; /* Recipient list */ char *text; /* Message text */ size_t text_len; /* Message length (w/o NUL) */ #ifdef HAVE_SA SV *svParsed; /* SA parsed message */ SV *svRewrite; /* SA rewritten message (tmp) */ #endif MPD_MsgStatus status; /* Test results */ char ip[16]; /* IP from Received: header */ } MPD_Message; typedef struct mpd_rule { int flags; #define RULE_NEGATE 0x01 /* Negate the condition */ #define RULE_SMTP 0x02 /* SMTP policy server context */ uid_t uid; /* User */ gid_t gid; /* Group */ char *cond; /* Condition */ char *insn; /* Instruction */ TAILQ_ENTRY(mpd_rule) rules; } MPD_Rule; typedef struct mpd_ruleset { char key[ADDRESS_MAX]; TAILQ_HEAD(,mpd_rule) rules; } MPD_Ruleset; void MPD_MessageInit(MPD_Message *); MPD_Message *MPD_MessageNew(void); void MPD_MessageFree(MPD_Message *); int MPD_MessageProcess(MPD_Message *, MPD_Recipient *); int MPD_MessageClassify(MPD_Message *, MPD_Recipient *, MPD_Ruleset *, int); int MPD_ParseRecipientParts(MPD_Recipient *); MPD_Ruleset *MPD_RulesetParse(const char *, char *); void MPD_RulesetFree(MPD_Ruleset *); MPD_Recipient *MPD_MessageAddRecipient(MPD_Message *, const char *); int MPD_DomainForcedFiltering(const char *);