diff --git a/ChangeLog b/ChangeLog index 50ffe209..b8d39b3a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -103,6 +103,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/server/filter.py b/server/filter.py index 754a2a08..90530f92 100644 --- a/server/filter.py +++ b/server/filter.py @@ -290,6 +290,7 @@ class Filter(JailThread): l = line.decode('utf-8') except UnicodeDecodeError: l = line + l = l.rstrip('\r\n') timeMatch = self.dateDetector.matchTime(l) if timeMatch: # Lets split into time part and log part of the line diff --git a/testcases/filtertestcase.py b/testcases/filtertestcase.py index 6cfa53a7..c1e91e74 100644 --- a/testcases/filtertestcase.py +++ b/testcases/filtertestcase.py @@ -580,11 +580,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):