31 #define CHECK_SM_MAC_DEF(value, label, id) \ 34 if (value == NULL) { \ 37 ZE_MessageWarning(10, "%s : %s macro value is NULL" \ 38 " - maybe undefined at MTA configuration", \ 39 STREMPTY(id, "NOID"), \ 53 time_t conn_id = time(NULL);
61 char *mailserver = NULL;
65 char *client_name, *client_addr, *client_ptr, *client_resolve;
71 memset(&
id, 0,
sizeof (
id));
72 memset(ip, 0,
sizeof (ip));
88 "I'm too busy now. Try again later !");
95 if (smfi_setpriv(ctx, priv) != MI_SUCCESS) {
100 "I'm too busy now. Try again later !");
110 "private storage area already allocated for this connection");
120 priv->
t_open = gethrtime();
126 #if _FFR_DELAYED_REJECT 146 client_name = smfi_getsymval(ctx,
"{client_name}");
147 client_addr = smfi_getsymval(ctx,
"{client_addr}");
148 client_ptr = smfi_getsymval(ctx,
"{client_ptr}");
149 client_resolve = smfi_getsymval(ctx,
"{client_resolve}");
150 ident = smfi_getsymval(ctx,
"_");
162 ident =
STREMPTY(ident, client_name);
163 ident =
STREMPTY(ident, client_addr);
164 ident =
STREMPTY(ident, client_ptr);
167 mailserver = smfi_getsymval(ctx,
"j");
178 char *dport, *dname, *daddr;
180 name =
STREMPTY(hostname, client_name);
182 addr =
STREMPTY(client_addr,
"x.x.x.x");
184 if (strlen(ident) == 0 ||
STRCASEEQUAL(ident,
"unknown"))
185 snprintf(buf,
sizeof (buf),
"%s [%s]", name, addr);
187 snprintf(buf,
sizeof (buf),
"%s", ident);
198 snprintf(daemon,
sizeof (daemon),
"%s:%s:%s",
STREMPTY(dname,
"-"),
201 snprintf(daemon,
sizeof (daemon),
"%s:%s",
STREMPTY(dname,
"-"),
204 if ((priv->
daemon = strdup(daemon)) == NULL) {
210 mailserver, daemon, buf);
216 if (client_addr != NULL && client_ptr != NULL) {
217 if (!
STREQUAL(client_addr,
"127.0.0.1")) {
219 STRNCASEEQUAL(client_ptr,
"localhost.", strlen(
"localhost."))) {
229 if ((ident != NULL) && ((priv->
ident = strdup(ident)) == NULL)) {
237 if ((mailserver != NULL) && ((priv->
mailserver = strdup(mailserver)) == NULL)) {
248 if (hostname == NULL || strlen(hostname) == 0) {
253 name =
STRNULL(client_name,
"unknown");
254 addr =
STRNULL(client_addr,
"unknown");
255 ptr =
STRNULL(client_ptr,
"unknown");
258 "Can't get your hostname. Try again later !");
263 "%s %s : hostname parameter NULL : name=%s addr=%s ptr=%s",
269 if (hostaddr == NULL) {
274 name =
STRNULL(client_name,
"unknown");
275 addr =
STRNULL(client_addr,
"unknown");
276 ptr =
STRNULL(client_ptr,
"unknown");
279 "Can't get your IP address. Try again later !");
284 "%s %s : hostname parameter NULL : name=%s addr=%s ptr=%s",
298 if (client_resolve != NULL) {
299 if (strcasecmp(client_resolve,
"OK") == 0)
301 else if (strcasecmp(client_resolve,
"FAIL") == 0)
303 else if (strcasecmp(client_resolve,
"FORGED") == 0)
305 else if (strcasecmp(client_resolve,
"TEMPFAIL") == 0)
307 else if (strcasecmp(client_resolve,
"TEMP") == 0)
323 sa_family_t addr_family = AF_INET;
328 addr_family = hostaddr->sa_family;
330 switch (addr_family) {
333 struct sockaddr_in *sin = (
struct sockaddr_in *) hostaddr;
335 if (!
jinet_ntop(AF_INET, &sin->sin_addr, ip, sizeof (ip))) {
339 "Unknown network error. Try again later !");
349 struct sockaddr_in6 *sin6 = (
struct sockaddr_in6 *) hostaddr;
351 if (!
jinet_ntop(AF_INET6, &sin6->sin6_addr, ip, sizeof (ip))) {
355 "Unknown network error. Try again later !");
372 if ((strlen(ip) > 0) && ((priv->
peer_addr = strdup(ip)) == NULL)) {
385 if (strlen(ip) > 0 && strlen(hostname) > 0)
398 memset(tname, 0,
sizeof (tname));
401 if (name == NULL || strlen(name) == 0) {
402 ZE_MessageInfo(11,
"%-15s Can't get {client_name} macro value for : %-6s",
406 if (name == NULL || strlen(name) == 0) {
407 ZE_MessageInfo(11,
"%-15s Can't get hostname parameter value for : %-6s",
411 if (name == NULL || strlen(name) == 0) {
412 ZE_MessageInfo(11,
"%-15s Can't get {client_ptr} macro value for : %-6s",
417 snprintf(tname,
sizeof (tname),
"[%s]", priv->
peer_addr);
422 if ((priv->
peer_name = strdup(name)) == NULL) {
443 #define HOSTNAME_IPV4 "[[]?[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+[]]?" 444 #define HOSTNAME_IPV6 "[[]?(ipv6:)?[0-9a-z:]+" 447 goto hostname_check_ok;
449 goto hostname_check_ok;
451 goto hostname_check_ok;
454 bool badname =
FALSE;
465 (void)
jsmfi_setreply(ctx,
"421",
"4.5.1",
"Invalid priv->peer_name !");
483 memset(
class, 0,
sizeof (
class));
487 if (strlen(
class) == 0) {
501 "%s RBWL check list=(%s) code=(%s) class=(%s) addr=(%s) name=(%s)",
536 if (p != NULL && strlen(p) > 0)
558 res = check_cpu_load(ctx,
CONNID_STR(priv->
id), ip, ip_class);
561 "I'm too busy. Try again later !");
571 res = check_filter_open_connections(ctx,
CONNID_STR(priv->
id), ip, ip_class);
574 "I'm too busy. Try again later !");
588 if (fd_check_res != 0) {
589 switch (fd_check_res) {
608 "I'm too busy. Try again later !");
#define CF_RESOLVE_CACHE_ENABLE
int smtprate_add_entry(int, char *, char *, int, time_t)
bool resolve_cache_add(char *prefix, char *key, char *value)
void stats_inc(int, long)
int jsmfi_setreply(SMFICTX *, char *, char *, char *)
#define CF_RESOLVE_FAIL_NETCLASS
#define STRNCASEEQUAL(a, b, n)
int GetClientNetClass(char *ip, char *name, netclass_T *class, char *label, size_t sz)
#define ZE_LogMsgError(level,...)
bool zeStrRegex(char *, char *, long *, long *, bool)
#define CF_LOG_LEVEL_ORACLE
sm_mac_T * sm_macro_new()
sfsistat mlfi_connect(SMFICTX *ctx, char *hostname, _SOCK_ADDR *hostaddr)
#define INIT_CALLBACK(p, which)
#define MSG_NO_PEER_HOSTNAME
#define FREE_DELAYED_RESULT(dres)
void sm_macro_update(SMFICTX *, sm_mac_T *)
int count_connections(int)
#define ZE_MessageNotice(level,...)
#define INIT_CALLBACK_DELAY()
#define IS_UNKNOWN(class)
#define ZE_MessageInfo(level,...)
#define ZE_MessageWarning(level,...)
#define ZE_LogSysError(...)
#define ZE_MessageError(level,...)
char * cf_get_str(int id)
sfsistat validate_connection(SMFICTX *)
#define CF_RESOLVE_FORGED_NETCLASS
int connopen_check_host(char *, char *, int)
#define CONNID_STR(connid)
#define CHECK_CALLBACK_DELAY()
#define STRCASEEQUAL(a, b)
void sm_macro_log_all(char *id, sm_mac_T *sm)
uint32_t check_iprbwl_table(char *id, char *ip, char *name, iprbwl_T *rbwl)
char * sm_macro_get_str(sm_mac_T *, char *)
#define NET_CLASS_LABEL(class)
#define CHECK_SM_MAC_DEF(value, label, id)
void log_msg_context(SMFICTX *ctx, char *why)
char * jinet_ntop(int, void *, char *, size_t)