406 #include <sys/stat.h>
552 static ARGV *psc_acl;
553 static int psc_blist_action;
556 static void psc_endpt_lookup_done(
int,
VSTREAM *,
562 static void psc_dump(
char *unused_service,
char **unused_argv)
579 static void psc_drain(
char *unused_service,
char **unused_argv)
603 if (psc_cache_map != 0
608 for (count = 0; ; count++) {
623 static void psc_service(
VSTREAM *smtp_client_stream,
624 char *unused_service,
634 msg_fatal(
"all network protocols are disabled (%s = %s)",
654 static void psc_endpt_lookup_done(
int endpt_status,
661 const char *myname =
"psc_endpt_lookup_done";
663 const char *stamp_str;
669 if (endpt_status < 0) {
671 "421 4.3.2 No system resources\r\n",
672 sizeof(
"421 4.3.2 No system resources\r\n") - 1);
677 msg_info(
"%s: sq=%d cq=%d connect from [%s]:%s",
679 smtp_client_addr->
buf, smtp_client_port->
buf);
681 msg_info(
"CONNECT from [%s]:%s to [%s]:%s",
682 smtp_client_addr->
buf, smtp_client_port->
buf,
683 smtp_server_addr->
buf, smtp_server_port->
buf);
690 smtp_client_port->
buf,
691 smtp_server_addr->
buf,
692 smtp_server_port->
buf);
699 msg_info(
"NOQUEUE: reject: CONNECT from [%s]:%s: too many connections",
702 "421 4.7.0 Error: too many connections\r\n");
711 msg_info(
"NOQUEUE: reject: CONNECT from [%s]:%s: all server ports busy",
714 "421 4.3.2 All server ports are busy\r\n");
730 switch (psc_blist_action) {
733 "521 5.3.2 Service currently unavailable\r\n");
737 "550 5.3.2 Service currently unavailable\r\n");
748 msg_panic(
"%s: unknown blacklist action value %d",
749 myname, psc_blist_action);
777 && psc_cache_map != 0
779 saved_flags = state->
flags;
781 state->
flags |= saved_flags;
783 msg_info(
"%s: cached + recent flags: %s",
791 saved_flags = state->
flags;
793 state->
flags |= saved_flags;
795 msg_info(
"%s: new + recent flags: %s",
798 saved_flags = state->
flags;
800 state->
flags |= saved_flags;
802 msg_info(
"%s: new + recent flags: %s",
822 msg_info(
"reject: connect from [%s]:%s: all screening ports busy",
825 "421 4.3.2 All screening ports are busy\r\n");
843 static int psc_cache_validator(
const char *client_addr,
844 const char *stamp_str,
845 void *unused_context)
865 static void pre_jail_init(
char *unused_name,
char **unused_argv)
909 #define PSC_DICT_OPEN_FLAGS (DICT_FLAG_DUP_REPLACE | DICT_FLAG_SYNC_UPDATE | \
931 static void pre_accept(
char *unused_name,
char **unused_argv)
933 static time_t last_event_time;
934 time_t new_event_time;
942 if (new_event_time >= last_event_time + 1
944 msg_info(
"table %s has changed - finishing in the background", name);
947 last_event_time = new_event_time;
953 static void post_jail_init(
char *unused_name,
char **unused_argv)
#define DEF_SMTPD_ENFORCE_TLS
PSC_CLIENT_INFO * client_info
#define DEF_PSC_DNSBL_REPLY
char * var_psc_forbid_cmds
#define DEF_PSC_UPROXY_TMOUT
#define RESTORE_SAVED_EUGID()
#define CA_MAIL_SERVER_WATCHDOG(v)
#define DEF_PSC_GREET_WAIT
#define MATCH_FLAG_RETURN
#define PSC_ACL_ACT_WHITELIST
#define VAR_PSC_NSMTP_ACTION
#define CA_MAIL_SERVER_BOOL_TABLE(v)
#define addr_match_list_match(l, a)
#define CA_MAIL_SERVER_RAW_TABLE(v)
char * mystrdup(const char *str)
char * var_smtpd_exp_filter
#define DEF_PSC_DNSBL_TMOUT
#define VAR_SMTPD_CMD_FILTER
#define VAR_PSC_BARLF_ACTION
bool var_psc_disable_vrfy
#define VAR_PSC_DNSBL_SITES
#define PSC_STATE_MASK_ANY_FAIL
#define PSC_FAIL_SESSION_STATE(state, bits)
#define VAR_SMTPD_FORBID_CMDS
#define VAR_PSC_DISABLE_VRFY
NORETURN msg_panic(const char *fmt,...)
char * var_smtpd_ehlo_dis_maps
#define CA_MAIL_SERVER_STR_TABLE(v)
#define DEF_PSC_NSMTP_ENABLE
#define DEF_PSC_PIPEL_ACTION
#define inet_proto_info()
char * data_redirect_map(VSTRING *result, const char *map)
#define DEF_PSC_CMD_COUNT
#define VAR_PSC_POST_QLIMIT
#define psc_acl_pre_jail_init
STRING_LIST * psc_forbid_cmds
#define DEF_PSC_PREGR_BANNER
char * var_psc_uproxy_proto
#define SAVE_AND_SET_EUGID(uid, gid)
#define DEF_SMTPD_REJ_FOOTER
#define VAR_SMTPD_CCONN_LIMIT
#define CA_MAIL_SERVER_SLOW_EXIT(v)
#define CA_MAIL_SERVER_EXIT(v)
#define DEF_PSC_BARLF_TTL
#define PSC_DICT_OPEN_FLAGS
#define DEF_SMTPD_USE_TLS
#define DEF_SMTPD_TLS_LEVEL
DICT * dict_open(const char *, int, int)
#define DEF_PSC_PREGR_ACTION
char * var_psc_rej_footer
const char * mail_conf_lookup(const char *name)
int psc_check_queue_length
#define PSC_UNFAIL_SESSION_STATE(state, bits)
#define CA_DICT_CACHE_CTL_INTERVAL(v)
#define VAR_PSC_BLIST_ACTION
int var_psc_dnsbl_max_ttl
#define DEF_PSC_EXP_FILTER
#define VAR_DNSBLOG_SERVICE
char * var_psc_pregr_banner
#define DEF_PSC_CACHE_RET
#define DEF_SMTPD_EHLO_DIS_MAPS
char * var_smtpd_ehlo_dis_words
#define DEF_PSC_PREGR_TTL
#define VAR_SMTPD_SERVICE
#define DEF_DISABLE_VRFY_CMD
bool var_psc_pipel_enable
#define DEF_PSC_TLS_LEVEL
#define DEF_SMTPD_SERVICE
#define PSC_STATE_FLAG_WLIST_FAIL
#define DEF_PSC_DNSBL_WTHRESH
int var_psc_dnsbl_wthresh
#define DEF_PSC_BARLF_ACTION
#define DEF_PSC_PIPEL_TTL
void psc_smtpd_init(void)
#define string_list_init(o, f, p)
#define DEF_HELO_REQUIRED
#define VAR_PSC_ENFORCE_TLS
char * var_tlsproxy_service
HTABLE * htable_create(ssize_t size)
#define CA_DICT_CACHE_CTL_FLAGS(v)
void psc_early_tests(PSC_STATE *)
int event_server_drain(void)
#define DEF_PSC_ENFORCE_TLS
#define VAR_PSC_BARLF_ENABLE
#define CA_MAIL_SERVER_POST_INIT(v)
void psc_smtpd_pre_jail_init(void)
const char * psc_cache_lookup(DICT_CACHE *, const char *)
#define CA_MAIL_SERVER_INT_TABLE(v)
char * var_psc_pregr_action
#define PSC_NAME_ACT_CONT
#define PSC_NAME_ACT_IGNORE
char buf[MAI_HOSTADDR_STRSIZE]
#define VAR_PSC_DNSBL_REPLY
bool var_psc_barlf_enable
void psc_early_init(void)
#define VAR_PSC_DNSBL_WTHRESH
#define VAR_SMTPD_REJ_FOOTER
char * var_psc_ehlo_dis_maps
#define VAR_PSC_DNSBL_MIN_TTL
#define PSC_STATE_MASK_ANY_TODO
#define DICT_CACHE_FLAG_VERBOSE
#define DEF_PSC_PRE_QLIMIT
#define DEF_SMTPD_EHLO_DIS_WORDS
#define PSC_CLIENT_ADDR_PORT(state)
#define DEF_PSC_BLIST_ACTION
#define PSC_STATE_FLAG_BLIST_FAIL
char * var_dnsblog_service
#define VAR_SMTPD_USE_TLS
#define DEF_DNSBLOG_SERVICE
PSC_STATE * psc_new_session_state(VSTREAM *, const char *, const char *, const char *, const char *)
#define PSC_STATE_MASK_SMTPD_TODO
#define VAR_PSC_EHLO_DIS_WORDS
const char * dict_changed_name(void)
#define PSC_ENFORCE_SESSION_STATE(state, reply)
void psc_conclude(PSC_STATE *)
char * var_psc_dnsbl_sites
bool var_psc_nsmtp_enable
#define DEF_SMTPD_FORBID_CMDS
#define VAR_PSC_DNSBL_ACTION
#define VAR_PSC_CMD_COUNT
int psc_stress_cmd_time_limit
#define VAR_PSC_PREGR_BANNER
#define VAR_SMTPD_EHLO_DIS_MAPS
#define VAR_PSC_CMD_FILTER
#define VAR_SMTPD_EHLO_DIS_WORDS
#define VAR_PSC_PIPEL_ACTION
void msg_warn(const char *fmt,...)
char * var_psc_ehlo_dis_words
#define DEF_PSC_BARLF_ENABLE
VSTRING * vstring_alloc(ssize_t len)
#define CA_DICT_CACHE_CTL_END
#define NAME_CODE_FLAG_NONE
#define CA_DICT_CACHE_CTL_VALIDATOR(v)
#define VAR_PSC_PREGR_TTL
#define VAR_PSC_FORBID_CMDS
#define CA_MAIL_SERVER_NBOOL_TABLE(v)
void psc_new_tests(PSC_STATE *)
void psc_todo_tests(PSC_STATE *, time_t)
#define VAR_PSC_DNSBL_THRESH
#define MAIL_VERSION_STAMP_ALLOCATE
NORETURN event_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
#define DEF_PSC_DNSBL_MAX_TTL
#define VAR_INET_PROTOCOLS
char * var_smtpd_tls_level
#define DEF_PSC_NSMTP_TTL
void dict_cache_close(DICT_CACHE *cp)
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
#define DEF_SMTPD_CCONN_LIMIT
int psc_stress_greet_wait
#define DEF_PSC_CACHE_MAP
#define VAR_PSC_REJ_FOOTER
#define CA_DICT_CACHE_CTL_CONTEXT(v)
#define CA_MAIL_SERVER_TIME_TABLE(v)
void event_server_disconnect(VSTREAM *stream)
int psc_normal_greet_wait
#define DEF_TLSPROXY_SERVICE
#define PSC_DROP_SESSION_STATE(state, reply)
#define PSC_STATE_FLAG_NOFORWARD
#define VAR_PSC_NSMTP_ENABLE
#define DICT_FLAG_DUP_WARN
int name_code(const NAME_CODE *table, int flags, const char *name)
#define DEF_PSC_DISABLE_VRFY
#define VAR_PSC_PIPEL_TTL
NORETURN msg_fatal(const char *fmt,...)
int var_psc_post_queue_limit
#define VAR_PSC_UPROXY_PROTO
#define VAR_TLSPROXY_SERVICE
char * var_psc_barlf_action
bool var_smtpd_enforce_tls
#define VAR_PSC_HELO_REQUIRED
#define VAR_PSC_NSMTP_TTL
char * var_smtpd_rej_footer
#define CA_MAIL_SERVER_NINT_TABLE(v)
char * var_smtpd_cmd_filter
void psc_smtpd_tests(PSC_STATE *)
#define DEF_PSC_DNSBL_MIN_TTL
#define VAR_PSC_TLS_LEVEL
#define VAR_PSC_DNSBL_TMOUT
#define VAR_PSC_CACHE_SCAN
int var_smtpd_cconn_limit
#define DEF_PSC_EHLO_DIS_WORDS
#define VAR_SMTPD_EXP_FILTER
#define DEF_PSC_NSMTP_ACTION
#define DEF_PSC_DNSBL_SITES
#define DEF_PSC_PIPEL_ENABLE
#define VAR_SMTPD_TLS_LEVEL
#define DEF_PSC_POST_QLIMIT
int psc_hiwat_check_queue_length
#define PSC_STATE_MASK_EARLY_TODO
#define VAR_HELO_REQUIRED
#define VAR_PSC_PRE_QLIMIT
#define DEF_SMTPD_CMD_FILTER
void psc_endpt_lookup(VSTREAM *, PSC_ENDPT_LOOKUP_FN)
#define VAR_PSC_PREGR_ACTION
int non_blocking(int, int)
#define DICT_CACHE_FLAG_STATISTICS
#define DEF_PSC_CMD_FILTER
#define VAR_DISABLE_VRFY_CMD
#define VAR_PSC_UPROXY_TMOUT
VSTRING * vstring_free(VSTRING *vp)
#define DEF_PSC_CCONN_LIMIT
#define VAR_PSC_BARLF_TTL
#define VAR_PSC_EHLO_DIS_MAPS
char * var_psc_blist_action
char * var_smtpd_forbid_cmds
DICT_CACHE * psc_cache_map
#define CA_MAIL_SERVER_SOLITARY
char * var_psc_exp_filter
#define vstream_fileno(vp)
bool var_psc_helo_required
#define psc_acl_eval(s, a, p)
#define PSC_STATE_MASK_ANY_TODO_FAIL
#define PSC_NAME_ACT_ENFORCE
char * var_inet_protocols
int var_psc_pre_queue_limit
#define VAR_PSC_CCONN_LIMIT
#define VAR_PSC_CACHE_RET
int get_mail_conf_time(const char *, const char *, int, int)
#define addr_match_list_init(o, f, p)
#define VAR_PSC_CACHE_MAP
DICT_CACHE * dict_cache_open(const char *dbname, int open_flags, int dict_flags)
bool var_disable_vrfy_cmd
char * var_psc_nsmtp_action
HTABLE * psc_client_concurrency
char buf[MAI_SERVPORT_STRSIZE]
char * var_psc_cmd_filter
#define VAR_PSC_GREET_WAIT
void psc_dnsbl_init(void)
#define CA_MAIL_SERVER_PRE_ACCEPT(v)
#define VAR_PSC_PIPEL_ENABLE
#define VAR_PSC_EXP_FILTER
#define DEF_SMTPD_EXP_FILTER
int psc_lowat_check_queue_length
int main(int argc, char **argv)
int psc_normal_cmd_time_limit
int psc_post_queue_length
void mail_conf_update(const char *key, const char *value)
#define VAR_SMTPD_ENFORCE_TLS
#define DEF_PSC_DNSBL_THRESH
#define DEF_PSC_UPROXY_PROTO
#define DEF_PSC_EHLO_DIS_MAPS
char * var_psc_pipel_action
#define DEF_PSC_HELO_REQUIRED
#define DEF_PSC_CACHE_SCAN
#define DEF_PSC_REJ_FOOTER
char * var_psc_dnsbl_action
#define PSC_NAME_ACT_DROP
const char * psc_print_state_flags(int, const char *)
char * var_psc_dnsbl_reply
#define DEF_PSC_DNSBL_ACTION
#define MAIL_CLASS_PRIVATE
MAIL_VERSION_STAMP_DECLARE
#define VAR_PSC_DNSBL_MAX_TTL
#define PSC_ACL_ACT_BLACKLIST
int var_psc_dnsbl_min_ttl
const char * mail_conf_eval_once(const char *string)
#define CA_MAIL_SERVER_PRE_INIT(v)
void psc_parse_tests(PSC_STATE *, const char *, time_t)
char * psc_smtpd_service_name
void msg_info(const char *fmt,...)
void dict_cache_control(DICT_CACHE *cp,...)
#define DEF_PSC_FORBID_CMDS