1df83713dSchristos--- Make.rules.in.orig 2015-05-27 20:25:54.000000000 -0400 2df83713dSchristos+++ Make.rules.in 2016-01-25 21:48:47.000000000 -0500 3df83713dSchristos@@ -110,3 +110,8 @@ 4df83713dSchristos 5df83713dSchristos FTPWHO_OBJS=ftpwho.o scoreboard.o misc.o 6df83713dSchristos BUILD_FTPWHO_OBJS=utils/ftpwho.o utils/scoreboard.o utils/misc.o 7df83713dSchristos+ 8*a51582d4Schristos+CPPFLAGS+=-DHAVE_BLOCKLIST 9df83713dSchristos+LIBS+=-lblocklist 10df83713dSchristos+OBJS+= pfilter.o 11df83713dSchristos+BUILD_OBJS+= src/pfilter.o 12df83713dSchristos--- /dev/null 2016-01-22 17:30:55.000000000 -0500 13df83713dSchristos+++ include/pfilter.h 2016-01-22 16:18:33.000000000 -0500 14df83713dSchristos@@ -0,0 +1,3 @@ 15df83713dSchristos+ 16df83713dSchristos+void pfilter_notify(int); 17df83713dSchristos+void pfilter_init(void); 18df83713dSchristos--- modules/mod_auth.c.orig 2015-05-27 20:25:54.000000000 -0400 19df83713dSchristos+++ modules/mod_auth.c 2016-01-22 16:21:06.000000000 -0500 20df83713dSchristos@@ -30,6 +30,7 @@ 21df83713dSchristos 22df83713dSchristos #include "conf.h" 23df83713dSchristos #include "privs.h" 24df83713dSchristos+#include "pfilter.h" 25df83713dSchristos 26df83713dSchristos extern pid_t mpid; 27df83713dSchristos 28df83713dSchristos@@ -84,6 +85,8 @@ 29df83713dSchristos _("Login timeout (%d %s): closing control connection"), TimeoutLogin, 30df83713dSchristos TimeoutLogin != 1 ? "seconds" : "second"); 31df83713dSchristos 32df83713dSchristos+ pfilter_notify(1); 33df83713dSchristos+ 34df83713dSchristos /* It's possible that any listeners of this event might terminate the 35df83713dSchristos * session process themselves (e.g. mod_ban). So write out that the 36df83713dSchristos * TimeoutLogin has been exceeded to the log here, in addition to the 37df83713dSchristos@@ -913,6 +916,7 @@ 38df83713dSchristos pr_memscrub(pass, strlen(pass)); 39df83713dSchristos } 40df83713dSchristos 41df83713dSchristos+ pfilter_notify(1); 42df83713dSchristos pr_log_auth(PR_LOG_NOTICE, "SECURITY VIOLATION: Root login attempted"); 43df83713dSchristos return 0; 44df83713dSchristos } 45df83713dSchristos@@ -1726,6 +1730,7 @@ 46df83713dSchristos return 1; 47df83713dSchristos 48df83713dSchristos auth_failure: 49df83713dSchristos+ pfilter_notify(1); 50df83713dSchristos if (pass) 51df83713dSchristos pr_memscrub(pass, strlen(pass)); 52df83713dSchristos session.user = session.group = NULL; 53df83713dSchristos--- src/main.c.orig 2016-01-22 17:36:43.000000000 -0500 54df83713dSchristos+++ src/main.c 2016-01-22 17:37:58.000000000 -0500 55df83713dSchristos@@ -49,6 +49,7 @@ 56df83713dSchristos #endif 57df83713dSchristos 58df83713dSchristos #include "privs.h" 59df83713dSchristos+#include "pfilter.h" 60df83713dSchristos 61df83713dSchristos int (*cmd_auth_chk)(cmd_rec *); 62df83713dSchristos void (*cmd_handler)(server_rec *, conn_t *); 63df83713dSchristos@@ -1050,6 +1051,7 @@ 64df83713dSchristos pid_t pid; 65df83713dSchristos sigset_t sig_set; 66df83713dSchristos 67df83713dSchristos+ pfilter_init(); 68df83713dSchristos if (!nofork) { 69df83713dSchristos 70df83713dSchristos /* A race condition exists on heavily loaded servers where the parent 71df83713dSchristos@@ -1169,7 +1171,8 @@ 72df83713dSchristos 73df83713dSchristos /* Reseed pseudo-randoms */ 74df83713dSchristos srand((unsigned int) (time(NULL) * getpid())); 75df83713dSchristos- 76df83713dSchristos+#else 77df83713dSchristos+ pfilter_init(); 78df83713dSchristos #endif /* PR_DEVEL_NO_FORK */ 79df83713dSchristos 80df83713dSchristos /* Child is running here */ 81df83713dSchristos--- /dev/null 2016-01-22 17:30:55.000000000 -0500 82df83713dSchristos+++ src/pfilter.c 2016-01-22 16:37:55.000000000 -0500 83df83713dSchristos@@ -0,0 +1,41 @@ 84df83713dSchristos+#include "pfilter.h" 85df83713dSchristos+#include "conf.h" 86df83713dSchristos+#include "privs.h" 87*a51582d4Schristos+#ifdef HAVE_BLOCKLIST 88df83713dSchristos+#include <blocklist.h> 89df83713dSchristos+#endif 90df83713dSchristos+ 91df83713dSchristos+static struct blocklist *blstate; 92df83713dSchristos+ 93df83713dSchristos+void 94df83713dSchristos+pfilter_init(void) 95df83713dSchristos+{ 96*a51582d4Schristos+#ifdef HAVE_BLOCKLIST 97df83713dSchristos+ if (blstate == NULL) 98df83713dSchristos+ blstate = blocklist_open(); 99df83713dSchristos+#endif 100df83713dSchristos+} 101df83713dSchristos+ 102df83713dSchristos+void 103df83713dSchristos+pfilter_notify(int a) 104df83713dSchristos+{ 105*a51582d4Schristos+#ifdef HAVE_BLOCKLIST 106df83713dSchristos+ conn_t *c = session.c; 107df83713dSchristos+ int fd; 108df83713dSchristos+ 109df83713dSchristos+ if (c == NULL) 110df83713dSchristos+ return; 111df83713dSchristos+ if (c->rfd != -1) 112df83713dSchristos+ fd = c->rfd; 113df83713dSchristos+ else if (c->wfd != -1) 114df83713dSchristos+ fd = c->wfd; 115df83713dSchristos+ else 116df83713dSchristos+ return; 117df83713dSchristos+ 118df83713dSchristos+ if (blstate == NULL) 119df83713dSchristos+ pfilter_init(); 120df83713dSchristos+ if (blstate == NULL) 121df83713dSchristos+ return; 122df83713dSchristos+ (void)blocklist_r(blstate, a, fd, "proftpd"); 123df83713dSchristos+#endif 124df83713dSchristos+} 125