From 95c2a2976f6aa157d5b4986b949826378858ca10 Mon Sep 17 00:00:00 2001 From: sebres Date: Fri, 10 Jul 2015 13:56:26 +0200 Subject: [PATCH] unbanip always deletes ip from database (independent of bantime, also if currently not banned or persistent); merged from #716 where it works; closes gh-972, closes gh-768 --- ChangeLog | 2 ++ fail2ban/server/actions.py | 5 +++-- fail2ban/server/database.py | 11 ++++++----- fail2ban/tests/databasetestcase.py | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index a1c39ad8..bc849aaa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -28,6 +28,8 @@ ver. 0.9.3 (2015/XX/XXX) - wanna-be-released locale on systems with customized LC_ALL * performance fix: minimizes connection overhead, close socket only at communication end (gh-1099) + * unbanip always deletes ip from database (independent of bantime, also if + currently not banned or persistent) - New Features: * New filters: diff --git a/fail2ban/server/actions.py b/fail2ban/server/actions.py index 6ba3fc38..b4612f8c 100644 --- a/fail2ban/server/actions.py +++ b/fail2ban/server/actions.py @@ -194,13 +194,14 @@ class Actions(JailThread, Mapping): ValueError If `ip` is not banned """ + # Always delete ip from database (also if currently not banned) + if self._jail.database is not None: + self._jail.database.delBan(self._jail, ip) # Find the ticket with the IP. ticket = self.__banManager.getTicketByIP(ip) if ticket is not None: # Unban the IP. self.__unBan(ticket) - if self._jail.database is not None: - self._jail.database.delBan(self._jail, ticket) else: raise ValueError("IP %s is not banned" % ip) diff --git a/fail2ban/server/database.py b/fail2ban/server/database.py index bf91188a..7de87554 100644 --- a/fail2ban/server/database.py +++ b/fail2ban/server/database.py @@ -418,19 +418,20 @@ class Fail2BanDb(object): "failures": ticket.getAttempt()})) @commitandrollback - def delBan(self, cur, jail, ticket): + def delBan(self, cur, jail, ip): """Delete a ban from the database. Parameters ---------- jail : Jail Jail in which the ban has occurred. - ticket : BanTicket - Ticket of the ban to be removed. + ip : str + IP to be removed. """ + queryArgs = (jail.name, ip); cur.execute( - "DELETE FROM bans WHERE jail = ? AND ip = ? AND timeofban = ?", - (jail.name, ticket.getIP(), int(round(ticket.getTime())))) + "DELETE FROM bans WHERE jail = ? AND ip = ?", + queryArgs); @commitandrollback def _getBans(self, cur, jail=None, bantime=None, ip=None): diff --git a/fail2ban/tests/databasetestcase.py b/fail2ban/tests/databasetestcase.py index cdeba910..dd813ee6 100644 --- a/fail2ban/tests/databasetestcase.py +++ b/fail2ban/tests/databasetestcase.py @@ -212,7 +212,7 @@ class DatabaseTest(LogCaptureTestCase): def testDelBan(self): self.testAddBan() ticket = self.db.getBans(jail=self.jail)[0] - self.db.delBan(self.jail, ticket) + self.db.delBan(self.jail, ticket.getIP()) self.assertEqual(len(self.db.getBans(jail=self.jail)), 0) def testGetBansWithTime(self):