/* GNU Mailutils -- a suite of utilities for electronic mail Copyright (C) 2007-2019 Free Software Foundation, Inc. GNU Mailutils is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Mailutils is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Mailutils. If not, see . */ #if defined(HAVE_CONFIG_H) # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYSEXITS_H # include #else # define EX_OK 0 /* successful termination */ # define EX__BASE 64 /* base value for error messages */ # define EX_USAGE 64 /* command line usage error */ # define EX_DATAERR 65 /* data format error */ # define EX_NOINPUT 66 /* cannot open input */ # define EX_NOUSER 67 /* addressee unknown */ # define EX_NOHOST 68 /* host name unknown */ # define EX_UNAVAILABLE 69 /* service unavailable */ # define EX_SOFTWARE 70 /* internal software error */ # define EX_OSERR 71 /* system error (e.g., can't fork) */ # define EX_OSFILE 72 /* critical OS file missing */ # define EX_CANTCREAT 73 /* can't create (user) output file */ # define EX_IOERR 74 /* input/output error */ # define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */ # define EX_PROTOCOL 76 /* remote error in protocol */ # define EX_NOPERM 77 /* permission denied */ # define EX_CONFIG 78 /* configuration error */ # define EX__MAX 78 /* maximum listed value */ #endif #ifndef INADDR_LOOPBACK # define INADDR_LOOPBAK 0x7f000001 #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined (ENABLE_DBM) || defined (USE_SQL) # define USE_MAILBOX_QUOTAS 1 #endif #include "tcpwrap.h" #include "muscript.h" /* Debug */ extern int debug_level; #define dbg() if (debug_level) debug /* mailquota settings */ #define MQUOTA_OK 0 #define MQUOTA_EXCEEDED 1 #define MQUOTA_UNLIMITED 2 #define MAXFD 64 #define EX_QUOTA() (ex_quota_tempfail ? EX_TEMPFAIL : EX_UNAVAILABLE) enum maidag_mode { mode_mda, mode_url, mode_lmtp }; extern enum maidag_mode maidag_mode; extern int exit_code; extern int log_to_stderr; extern int multiple_delivery; extern int ex_quota_tempfail; extern uid_t current_uid; extern char *quotadbname; extern char *quota_query; extern char *forward_file; extern int forward_file_checks; extern char *sender_address; extern char *default_domain; extern mu_list_t script_list; extern char *message_id_header; extern int sieve_debug_flags; extern int sieve_enable_log; extern mu_m_server_t server; extern char *lmtp_url_string; extern int reuse_lmtp_address; extern mu_list_t lmtp_groups; extern mu_acl_t maidag_acl; extern int maidag_transcript; void close_fds (void); int switch_user_id (struct mu_auth_data *auth, int user); typedef int (*maidag_delivery_fn) (mu_message_t, char *, char **); int deliver_to_url (mu_message_t msg, char *dest_id, char **errp); int deliver_to_user (mu_message_t msg, char *dest_id, char **errp); int maidag_stdio_delivery (maidag_delivery_fn fun, int argc, char **argv); int maidag_lmtp_server (void); int lmtp_connection (int fd, struct sockaddr *sa, int salen, struct mu_srv_config *pconf, void *data); void maidag_error (const char *fmt, ...) MU_PRINTFLIKE(1, 2); void notify_biff (mu_mailbox_t mbox, char *name, size_t size); void guess_retval (int ec); int sieve_test (struct mu_auth_data *auth, mu_message_t msg); int check_quota (struct mu_auth_data *auth, mu_off_t size, mu_off_t *rest); enum maidag_forward_result { maidag_forward_none, maidag_forward_ok, maidag_forward_metoo, maidag_forward_error }; enum maidag_forward_result maidag_forward (mu_message_t msg, struct mu_auth_data *auth, char *fwfile); /* Scripting support */ typedef int (*maidag_script_fun) (mu_message_t msg, struct mu_auth_data *auth, const char *prog); extern mu_script_t script_handler; struct maidag_script { mu_script_t scr; /* Handler script */ const char *pat; /* Script name pattern */ }; maidag_script_fun script_lang_handler (const char *lang); maidag_script_fun script_suffix_handler (const char *name); int script_register (const char *pattern); int script_apply (mu_message_t msg, struct mu_auth_data *auth); /* guile.c */ extern int debug_guile; int scheme_check_msg (mu_message_t msg, struct mu_auth_data *auth, const char *prog); /* python.c */ int python_check_msg (mu_message_t msg, struct mu_auth_data *auth, const char *prog); /* sieve.c */ int sieve_check_msg (mu_message_t msg, struct mu_auth_data *auth, const char *prog);