ze-filter  (ze-filter-0.8.0-develop-180218)
mlfi_data.c
Go to the documentation of this file.
1 
2 /*
3  *
4  * ze-filter - Mail Server Filter for sendmail
5  *
6  * Copyright (c) 2001-2018 - Jose-Marcio Martins da Cruz
7  *
8  * Auteur : Jose Marcio Martins da Cruz
9  * jose.marcio.mc@gmail.org
10  *
11  * Historique :
12  * Creation : janvier 2002
13  *
14  * This program is free software, but with restricted license :
15  *
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20  *
21  * More details about ze-filter license can be found at ze-filter
22  * web site : http://foss.jose-marcio.org
23  */
24 
25 /* ****************************************************************************
26  * *
27  * *
28  ******************************************************************************/
29 static sfsistat
30 mlfi_data(ctx)
31  SMFICTX *ctx;
32 {
33  CTXPRIV_T *priv = MLFIPRIV(ctx);
34  int result = SMFIS_CONTINUE;
35 
36  int ip_class;
37 
38  int rcpt_rate = 0;
39  int nb_rcpt = 0;
40 
41 #if HAVE_XXFI_DATA
43 #endif
44 
45  if (priv == NULL) {
46  ZE_LogMsgWarning(0, "%s priv is NULL ", CONNID_STR(priv->id));
47  result = SMFIS_TEMPFAIL;
48  goto fin;
49  }
50 #if HAVE_XXFI_DATA
52  sm_macro_update(ctx, priv->sm);
53 #endif
54 
55  ip_class = priv->netclass.class;
56 
57  /*
58  ** spool file creation
59  */
60  if (!spool_file_is_open(priv)) {
61  /*
62  * open a file to store this message
63  */
64  if (!spool_file_create(priv)) {
65  ZE_LogMsgWarning(0, "%s can't create spool file ", CONNID_STR(priv->id));
66  result = SMFIS_TEMPFAIL;
67  }
68  }
69 
70  if (result != SMFIS_CONTINUE)
71  goto fin;
72 
73  if (IS_UNKNOWN(ip_class) && (priv->dbrcpt_conn_spamtrap > 0)) {
74  switch (cf_get_int(CF_SPAMTRAP_RESULT)) {
75  case OPT_OK:
76  break;
77  case OPT_TEMPFAIL:
78  priv->rej_spamtrap++;
79  (void) jsmfi_setreply(ctx, "451", "4.3.2", MSG_SHORT_SPAMTRAP);
80  result = SMFIS_TEMPFAIL;
81  break;
82  case OPT_REJECT:
83  priv->rej_spamtrap++;
84  (void) jsmfi_setreply(ctx, "550", "5.7.1", MSG_SHORT_SPAMTRAP);
85  result = SMFIS_REJECT;
86  break;
87  }
88 
90 
91  if (result != SMFIS_CONTINUE)
92  goto fin;
93  }
94 
95  rcpt_rate = smtprate_check(RATE_RCPT, priv->peer_addr, DEFAULT_WINDOW);
96  nb_rcpt = priv->env_nb_rcpt;
97 
98  /*
99  * Check recipient rate
100  */
101  if ((result == SMFIS_CONTINUE) && (cf_get_int(CF_CHECK_RCPT_RATE) == OPT_YES)) {
102  int ip_class = priv->netclass.class;
103  char buf[256];
104  int vmax = 0;
105  bool ok = FALSE;
106 
108 
109  if (check_host_policy("RcptRate", priv->peer_addr, priv->peer_name,
110  priv->netclass.label, buf, sizeof (buf), TRUE))
111  vmax = zeStr2long(buf, NULL, 0);
112 
113  if (vmax > 0 && rcpt_rate > vmax)
114  result = SMFIS_TEMPFAIL;
115 
116  if (result != SMFIS_CONTINUE) {
117  char s[1024];
118 
120  priv->rej_rcpt_rate++;
121 
122  strlcpy(s, MSG_RCPT_RATE, sizeof (s));
123  (void) jsmfi_setreply(ctx, "451", "4.3.2", s);
124 
126 
127  goto fin;
128  }
129  }
130 #if _FFR_MODULES
131  /*
132  ** ze-filter modules
133  **
134  */
135  if (do_module_callback(ctx, 0, &result))
136  goto fin;
137  if (result != SMFIS_CONTINUE)
138  goto fin;
139 #endif /* _FFR_MODULES */
140 
141 fin:
142 
143 #if HAVE_XXFI_DATA
145 #endif
146 
147  return result;
148 }
#define MSG_RCPT_RATE
Definition: ze-reply.h:129
bool spool_file_create(CTXPRIV_T *)
Definition: ze-spool.c:50
void stats_inc(int, long)
Definition: ze-stats.c:401
#define SMFIS_TEMPFAIL
int jsmfi_setreply(SMFICTX *, char *, char *, char *)
Definition: ze-libmilter.c:99
bool check_host_policy(char *prefix, char *addr, char *name, char *class, char *buf, size_t size, bool cdef)
Definition: ze-policy.c:205
#define CF_CHECK_RCPT_RATE
Definition: cfh-defs.h:155
char * peer_addr
bool ok
Definition: ze-connopen.c:59
#define CF_MAX_RCPT_RATE
Definition: cfh-defs.h:156
#define FALSE
Definition: macros.h:160
#define SMFIS_CONTINUE
#define SMFIS_REJECT
#define strlcpy
Definition: zeString.h:32
#define OPT_YES
Definition: ze-cf.h:45
#define OPT_TEMPFAIL
Definition: ze-cf.h:53
int cf_get_int(int id)
Definition: ze-cf.c:803
#define MLFIPRIV(ctx)
#define INIT_CALLBACK(p, which)
Definition: ze-filter.c:125
#define OPT_REJECT
Definition: ze-cf.h:48
#define OPT_OK
Definition: ze-cf.h:47
void sm_macro_update(SMFICTX *, sm_mac_T *)
Definition: ze-smmacros.c:150
CONNID_T id
long zeStr2long(char *s, int *error, long dval)
Definition: zeStrConvert.c:35
#define CALLBACK_DATA
Definition: ze-callback.h:32
#define INIT_CALLBACK_DELAY()
Definition: ze-filter.c:135
#define IS_UNKNOWN(class)
Definition: ze-netclass.h:51
int dbrcpt_conn_spamtrap
#define TRUE
Definition: macros.h:157
#define STAT_MAX_RCPT
Definition: ze-stats.h:43
#define RATE_RCPT
Definition: ze-smtprate.h:52
bool spool_file_is_open(CTXPRIV_T *)
Definition: ze-spool.c:291
char * peer_name
#define ZE_LogMsgWarning(level,...)
Definition: zeSyslog.h:112
int smtprate_check(int, char *, time_t)
Definition: ze-smtprate.c:479
bool do_module_callback(SMFICTX *ctx, int step, int *result)
Definition: ze-mod-tools.c:84
sm_mac_T * sm
#define CONNID_STR(connid)
Definition: ze-filter.h:113
#define CHECK_CALLBACK_DELAY()
Definition: ze-filter.c:146
netclass_T netclass
char label[32]
Definition: ze-netclass.h:72
void log_msg_context(SMFICTX *ctx, char *why)
#define MSG_SHORT_SPAMTRAP
Definition: ze-reply.h:255
#define CF_SPAMTRAP_RESULT
Definition: cfh-defs.h:153
#define DEFAULT_WINDOW
Definition: ze-smtprate.h:72