From cb280b817f89386546c58109f2138fea6e0cfc08 Mon Sep 17 00:00:00 2001 From: sebres Date: Fri, 13 May 2016 22:16:35 +0200 Subject: [PATCH 1/2] csocket multi-set fix: prevent to convert `list`, `dict`, `set` during transfer (send), this offers a sending of 'multi-set' arrays (missed by cherry-picking from multi-set branch) --- fail2ban/client/csocket.py | 4 +++- fail2ban/server/server.py | 4 ++++ fail2ban/server/transmitter.py | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fail2ban/client/csocket.py b/fail2ban/client/csocket.py index 2e22e5ee..45d58cc6 100644 --- a/fail2ban/client/csocket.py +++ b/fail2ban/client/csocket.py @@ -44,7 +44,9 @@ class CSocket: def send(self, msg): # Convert every list member to string - obj = dumps([str(m) for m in msg], HIGHEST_PROTOCOL) + obj = dumps(map( + lambda m: str(m) if not isinstance(m, (list, dict, set)) else m, msg), + HIGHEST_PROTOCOL) self.__csock.send(obj + CSPROTO.END) return self.receive(self.__csock) diff --git a/fail2ban/server/server.py b/fail2ban/server/server.py index 7f75c347..def796a5 100644 --- a/fail2ban/server/server.py +++ b/fail2ban/server/server.py @@ -266,8 +266,10 @@ class Server: flt = self.__jails[name].filter if multiple: for value in value: + logSys.debug(" failregex: %r", value) flt.addFailRegex(value) else: + logSys.debug(" failregex: %r", value) flt.addFailRegex(value) def delFailRegex(self, name, index): @@ -280,8 +282,10 @@ class Server: flt = self.__jails[name].filter if multiple: for value in value: + logSys.debug(" ignoreregex: %r", value) flt.addIgnoreRegex(value) else: + logSys.debug(" ignoreregex: %r", value) flt.addIgnoreRegex(value) def delIgnoreRegex(self, name, index): diff --git a/fail2ban/server/transmitter.py b/fail2ban/server/transmitter.py index 29d6d189..af2d1b53 100644 --- a/fail2ban/server/transmitter.py +++ b/fail2ban/server/transmitter.py @@ -52,7 +52,7 @@ class Transmitter: def proceed(self, command): # Deserialize object - logSys.debug("Command: " + repr(command)) + logSys.debug("Command: %r", command) try: ret = self.__commandHandler(command) ack = 0, ret @@ -263,6 +263,7 @@ class Transmitter: action = self.__server.getAction(name, actionname) if multiple: for cmd in command[3]: + logSys.debug(" %r", cmd) actionkey = cmd[0] if callable(getattr(action, actionkey, None)): actionvalue = json.loads(cmd[1]) if len(cmd)>1 else {} From d4201480552da3e69a6586c271f097ea18b98f41 Mon Sep 17 00:00:00 2001 From: sebres Date: Fri, 13 May 2016 22:53:57 +0200 Subject: [PATCH 2/2] database: always explicit convert `ip` to `str`, because may be an IPAddr, that will be unsupported type by bind parameter (as long as we've found any default wrapper handler for sqlite3) --- fail2ban/server/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fail2ban/server/database.py b/fail2ban/server/database.py index 6a3d87c3..a6b3feb1 100644 --- a/fail2ban/server/database.py +++ b/fail2ban/server/database.py @@ -455,7 +455,7 @@ class Fail2BanDb(object): queryArgs.append(MyTime.time() - bantime) if ip is not None: query += " AND ip=?" - queryArgs.append(ip) + queryArgs.append(str(ip)) query += " ORDER BY ip, timeofban desc" return cur.execute(query, queryArgs)