diff --git a/ChangeLog b/ChangeLog index cdbc7038..6cb5aad5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -46,7 +46,7 @@ ver. 0.8.9 (2013/05/XX) - wanna-be-stable Originally targeted as a bugfix release, it incorporated many new enhancements, few new features, and more importantly -- quite extended -tests battery with current 94% coverage. +tests battery with current 94% coverage (from 56% of 0.8.8). This release introduces over 200 of non-merge commits from 16 contributors (sorted by number of commits): Yaroslav Halchenko, Daniel @@ -137,6 +137,7 @@ fail2ban-users mailing list and IRC. * [40c5a2d] adding more of diagnostic messages into -client while starting the daemon. * [8e63d4c] Compare against None with 'is' instead of '=='. + * [6fef85f] Strip CR and LF while analyzing the log line Daniel Black * [3aeb1a9] Add jail.conf manual page. Closes gh-143. * [MANY] man page edits. diff --git a/fail2ban/server/filter.py b/fail2ban/server/filter.py index 1e71c55f..838fd890 100644 --- a/fail2ban/server/filter.py +++ b/fail2ban/server/filter.py @@ -310,6 +310,7 @@ class Filter(JailThread): def processLine(self, line): """Split the time portion from log msg and return findFailures on them """ + line = line.rstrip('\r\n') timeMatch = self.dateDetector.matchTime(line) if timeMatch: # Lets split into time part and log part of the line diff --git a/fail2ban/tests/filtertestcase.py b/fail2ban/tests/filtertestcase.py index d59ed86d..70e386d6 100644 --- a/fail2ban/tests/filtertestcase.py +++ b/fail2ban/tests/filtertestcase.py @@ -603,11 +603,29 @@ class GetFailures(unittest.TestCase): - def testGetFailures01(self): - self.filter.addLogPath(GetFailures.FILENAME_01) - self.filter.addFailRegex("(?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user|ROOT LOGIN REFUSED) .*(?: from|FROM) ") - self.filter.getFailures(GetFailures.FILENAME_01) - _assert_correct_last_attempt(self, self.filter, GetFailures.FAILURES_01) + def testGetFailures01(self, filename=None, failures=None): + filename = filename or GetFailures.FILENAME_01 + failures = failures or GetFailures.FAILURES_01 + + self.filter.addLogPath(filename) + self.filter.addFailRegex("(?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user|ROOT LOGIN REFUSED) .*(?: from|FROM) $") + self.filter.getFailures(filename) + _assert_correct_last_attempt(self, self.filter, failures) + + def testCRLFFailures01(self): + # We first adjust logfile/failures to end with CR+LF + fname = tempfile.mktemp(prefix='tmp_fail2ban', suffix='crlf') + f = open(fname, 'w') + for l in open(GetFailures.FILENAME_01).readlines(): + f.write('%s\r\n' % l.rstrip('\n')) + f.close() + + # now see if we should be getting the "same" failures + self.testGetFailures01(filename=fname, + failures=GetFailures.FAILURES_01[:3] + + ([x.rstrip('\n') + '\r\n' for x in + GetFailures.FAILURES_01[-1]],)) + _killfile(f, fname) def testGetFailures02(self):