Wietse Venema wrote in
<[email protected]>:
|Steffen Nurpmeso:
|> It would be great if a hook could be called for such events. Even
|> a simple fork+detach+exec+forget approach would be really great,
|> with an event indicator and an IP address as an argument.
|
|We don't do ad-hoc special-case solutions.
Yes. That is good. But, on the other hand, trying to create
a very generic interface can become an endless undertaking.
First, have you ever seen the patch in question? And you know
that this blocklist exists in NetBSD for >5 years and in FreeBSD
not that much shorter?
Index: dist/src/smtpd/pfilter.c
===================================================================
RCS file: dist/src/smtpd/pfilter.c
diff -N dist/src/smtpd/pfilter.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ dist/src/smtpd/pfilter.c 1 Feb 2018 03:29:09 -0000
@@ -0,0 +1,19 @@
+#include "pfilter.h"
+#include <stdio.h> /* for NULL */
+#include <blocklist.h>
+
+static struct blocklist *blstate;
+
+void
+pfilter_notify(int a, int fd)
+{
+ if (blstate == NULL)
+ blstate = blocklist_open();
+ if (blstate == NULL)
+ return;
+ (void)blocklist_r(blstate, a, fd, "smtpd");
+ if (a == 0) {
+ blocklist_close(blstate);
+ blstate = NULL;
+ }
+}
Index: dist/src/smtpd/pfilter.h
===================================================================
RCS file: dist/src/smtpd/pfilter.h
diff -N dist/src/smtpd/pfilter.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ dist/src/smtpd/pfilter.h 1 Feb 2018 03:29:09 -0000
@@ -0,0 +1,2 @@
+
+void pfilter_notify(int, int);
Index: dist/src/smtpd/smtpd.c
===================================================================
RCS file: /cvsroot/src/external/ibm-public/postfix/dist/src/smtpd/smtpd.c,v
retrieving revision 1.14
diff -u -r1.14 smtpd.c
--- dist/src/smtpd/smtpd.c 14 Feb 2017 01:16:48 -0000 1.14
+++ dist/src/smtpd/smtpd.c 1 Feb 2018 03:29:09 -0000
@@ -1197,6 +1197,8 @@
#include <smtpd_milter.h>
#include <smtpd_expand.h>
+#include "pfilter.h"
+
/*
* Tunable parameters. Make sure that there is some bound on the length of
* an SMTP command, so that the mail system stays in control even when a
@@ -5048,6 +5050,7 @@
if (state->error_count >= var_smtpd_hard_erlim) {
state->reason = REASON_ERROR_LIMIT;
state->error_mask |= MAIL_ERROR_PROTOCOL;
+ pfilter_notify(1, vstream_fileno(state->client));
smtpd_chat_reply(state, "421 4.7.0 %s Error: too many errors",
var_myhostname);
break;
Index: libexec/smtpd/Makefile
That one i skip (basically "+LDADD+=-lblocklist").
It cannot be any less intrusive and cheaper than that.
(This goes via IPC to the blocklistd, which uses getpeername(), as
you can imagine.)
I have read Dukhovni's milter response, and since a milter
invocation (the first i ever see) is only a few lines further to
the top, a different approach would be to create a new milter
event, if that is how things work. I never used a milter ;).
This milter would only act as a notifier, however, which is
possibly different to existing milter use cases? Though
"unknown_event" also exists.
Zoulas has diversified the notifications in the meantime, there is
AUTH_OK (0), AUTH_FAIL (1), as well as ABUSIVE_BEHAVIOR and
BAD_USER. The above could thus surely be improved. Anyhow, i do
not seem to be the one who implements such a thing, i have zero
overview over the codebase and its inter-dependencies. And also
i lag behind a mountain of work. I see that there is
a milter_other_event(). But how does this fit? I remember having
read about milters in FreeBSD /usr/share/?? many years ago. But
seems to be forgotten.
--steffen
|
|Der Kragenbaer, The moon bear,
|der holt sich munter he cheerfully and one by one
|einen nach dem anderen runter wa.ks himself off
|(By Robert Gernhardt)