1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 1999, 2001, 2002, 2003, 2004,
2005, 2006, 2007, 2008, 2009 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, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301 USA */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdlib.h>
#include <syslog.h>
#include <string.h>
#include <mailutils/debug.h>
#include <mailutils/nls.h>
#include <mailutils/syslog.h>
#include <mailutils/cfg.h>
#include <mailutils/diag.h>
#include <mailutils/error.h>
int mu_tcp_wrapper_enable = 1;
char *mu_tcp_wrapper_daemon;
#ifdef WITH_LIBWRAP
# include <tcpd.h>
int deny_severity = LOG_INFO;
int allow_severity = LOG_INFO;
int
mu_tcp_wrapper_cb_hosts_allow_syslog (mu_debug_t debug, void *data,
mu_config_value_t *val)
{
if (mu_cfg_assert_value_type (val, MU_CFG_STRING, debug))
return 1;
if (mu_string_to_syslog_priority (val->v.string, &allow_severity))
mu_cfg_format_error (debug, MU_DEBUG_ERROR,
_("unknown syslog priority `%s'"),
val->v.string);
return 0;
}
int
mu_tcp_wrapper_cb_hosts_deny_syslog (mu_debug_t debug, void *data,
mu_config_value_t *val)
{
if (mu_cfg_assert_value_type (val, MU_CFG_STRING, debug))
return 1;
if (mu_string_to_syslog_priority (val->v.string, &deny_severity))
mu_cfg_format_error (debug, MU_DEBUG_ERROR,
_("unknown syslog priority `%s'"),
val->v.string);
return 0;
}
int
mu_tcpwrapper_access (int fd)
{
struct request_info req;
if (!mu_tcp_wrapper_enable)
return 1;
request_init (&req,
RQ_DAEMON,
mu_tcp_wrapper_daemon ?
mu_tcp_wrapper_daemon : mu_program_name,
RQ_FILE, fd, NULL);
fromhost (&req);
return hosts_access (&req);
}
struct mu_cfg_param tcpwrapper_param[] = {
{ "enable", mu_cfg_bool, &mu_tcp_wrapper_enable, 0, NULL,
N_("Enable TCP wrapper access control. Default is \"yes\".") },
{ "daemon", mu_cfg_string, &mu_tcp_wrapper_daemon, 0, NULL,
N_("Set daemon name for TCP wrapper lookups. Default is program name."),
N_("name") },
{ "allow-table", mu_cfg_string, &hosts_allow_table,
0, NULL,
N_("Use file for positive client address access control "
"(default: /etc/hosts.allow)."),
N_("file") },
{ "deny-table", mu_cfg_string, &hosts_deny_table,
0, NULL,
N_("Use file for negative client address access control "
"(default: /etc/hosts.deny)."),
N_("file") },
{ "allow-syslog-priority", mu_cfg_callback, NULL, 0,
mu_tcp_wrapper_cb_hosts_allow_syslog,
N_("Log host allows at this syslog priority."),
N_("level") },
{ "deny-syslog-priority", mu_cfg_callback, NULL, 0,
mu_tcp_wrapper_cb_hosts_deny_syslog,
N_("Log host denies at this syslog priority."),
N_("level") },
{ NULL }
};
void
mu_tcpwrapper_cfg_init ()
{
struct mu_cfg_section *section;
mu_create_canned_section ("tcp-wrappers", §ion);
mu_cfg_section_add_params (section, tcpwrapper_param);
}
#else
void
mu_tcpwrapper_cfg_init ()
{
}
int
mu_tcpwrapper_access (int fd)
{
return 1;
}
#endif
int
mu_tcp_wrapper_prefork (int fd, void *data, struct sockaddr *sa, int salen)
{
if (mu_tcp_wrapper_enable
&& sa->sa_family == AF_INET
&& !mu_tcpwrapper_access (fd))
{
char *p = mu_sockaddr_to_astr (sa, salen);
mu_error (_("access from %s blocked by TCP wrappers"), p);
free (p);
return 1;
}
return 0;
}
|