diff --git a/ChangeLog b/ChangeLog index d6588117..bac9312b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -28,6 +28,7 @@ ver. 1.1.1-dev-1 (20??/??/??) - development nightly edition e. g. setting `blocktype="DROP"` via jail for action would now apply for IPv4 and IPv6 chains, to submit different `blocktype` for IPv4 and IPv6 from jail, one can pass them like in this example: `banaction = iptables-ipset[blocktype="...", blocktype?family=inet6="..."]` +* fixes restoring bans with custom failure-id * `jail.conf`: - default banactions need to be specified in `paths-*.conf` (maintainer level) now - since stock fail2ban includes `paths-debian.conf` by default, banactions are `nftables` diff --git a/fail2ban/server/ticket.py b/fail2ban/server/ticket.py index 72573ec4..f25ea509 100644 --- a/fail2ban/server/ticket.py +++ b/fail2ban/server/ticket.py @@ -25,7 +25,7 @@ __copyright__ = "Copyright (c) 2004 Cyril Jaquier" __license__ = "GPL" from ..helpers import getLogger -from .ipdns import IPAddr +from .ipdns import IPAddr, asip from .mytime import MyTime # Gets the instance of the logger. @@ -56,8 +56,11 @@ class Ticket(object): self._data = {'matches': matches or [], 'failures': 0} if data is not None: for k,v in data.items(): - if v is not None: - self._data[k] = v + if v is None: + continue + if k == 'ip': + v = asip(v) + self._data[k] = v if ticket: # ticket available - copy whole information from ticket: self.update(ticket) @@ -95,8 +98,12 @@ class Ticket(object): def getID(self): return self._id - def getIP(self): - return self._data.get('ip', self._id) + def getIP(self) -> IPAddr: + if 'ip' in self._data: + return self._data['ip'] + if isinstance(self._id, IPAddr): + return self._id + raise ValueError("No IP available") def setTime(self, value): self._time = value diff --git a/fail2ban/tests/tickettestcase.py b/fail2ban/tests/tickettestcase.py index c13e9e69..d2b6ef68 100644 --- a/fail2ban/tests/tickettestcase.py +++ b/fail2ban/tests/tickettestcase.py @@ -135,6 +135,15 @@ class TicketTests(unittest.TestCase): self.assertIsInstance(t.getIP(), IPAddr) self.assertEqual(t.getIP(), '192.0.2.1') + # invalid ip type causes an error + with self.assertRaises(TypeError): + Ticket('123-456-789', tm, data={'ip':192021}) + + # no IPAddr causes an error + t = Ticket(('192.0.2.1', '5000'), tm, data={}) + with self.assertRaises(ValueError): + t.getIP() + def testTicketFlags(self): flags = ('restored', 'banned') ticket = Ticket('test', 0)