fix another bug in _check:cookies (#2160)

regression introduced in ed317bfc

Added a couple of tests to hopefully catch such bugs
before they land in a release.
This commit is contained in:
Mike Fährmann
2022-02-16 22:58:57 +01:00
parent c8414c9d95
commit f5b2b9333f
2 changed files with 91 additions and 5 deletions

View File

@@ -371,20 +371,25 @@ class Extractor():
for cookie in self._cookiejar: for cookie in self._cookiejar:
if cookie.name in names and ( if cookie.name in names and (
not domain or cookie.domain == domain): not domain or cookie.domain == domain):
if cookie.expires: if cookie.expires:
diff = int(cookie.expires - now) diff = int(cookie.expires - now)
if diff <= 0: if diff <= 0:
self.log.warning( self.log.warning(
"Cookie '%s' has expired", cookie.name) "Cookie '%s' has expired", cookie.name)
continue
elif diff <= 86400: elif diff <= 86400:
hours = diff // 3600 hours = diff // 3600
self.log.warning( self.log.warning(
"Cookie '%s' will expire in less than %s hour%s", "Cookie '%s' will expire in less than %s hour%s",
cookie.name, hours + 1, "s" if hours else "") cookie.name, hours + 1, "s" if hours else "")
else: continue
names.discard(cookie.name)
if not names: names.discard(cookie.name)
return True if not names:
return True
return False return False
def _prepare_ddosguard_cookies(self): def _prepare_ddosguard_cookies(self):

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright 2017-2020 Mike Fährmann # Copyright 2017-2022 Mike Fährmann
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as # it under the terms of the GNU General Public License version 2 as
@@ -12,6 +12,7 @@ import sys
import unittest import unittest
from unittest import mock from unittest import mock
import time
import logging import logging
import tempfile import tempfile
from os.path import join from os.path import join
@@ -118,6 +119,86 @@ class TestCookieLogin(unittest.TestCase):
mock_login.assert_not_called() mock_login.assert_not_called()
class TestCookieUtils(unittest.TestCase):
def test_check_cookies(self):
extr = extractor.find("test:")
self.assertFalse(extr._cookiejar, "empty")
self.assertFalse(extr.cookiedomain, "empty")
# always returns False when checking for empty cookie list
self.assertFalse(extr._check_cookies(()))
self.assertFalse(extr._check_cookies(("a",)))
self.assertFalse(extr._check_cookies(("a", "b")))
self.assertFalse(extr._check_cookies(("a", "b", "c")))
extr._cookiejar.set("a", "1")
self.assertTrue(extr._check_cookies(("a",)))
self.assertFalse(extr._check_cookies(("a", "b")))
self.assertFalse(extr._check_cookies(("a", "b", "c")))
extr._cookiejar.set("b", "2")
self.assertTrue(extr._check_cookies(("a",)))
self.assertTrue(extr._check_cookies(("a", "b")))
self.assertFalse(extr._check_cookies(("a", "b", "c")))
def test_check_cookies_domain(self):
extr = extractor.find("test:")
self.assertFalse(extr._cookiejar, "empty")
extr.cookiedomain = ".example.org"
self.assertFalse(extr._check_cookies(("a",)))
self.assertFalse(extr._check_cookies(("a", "b")))
extr._cookiejar.set("a", "1")
self.assertFalse(extr._check_cookies(("a",)))
extr._cookiejar.set("a", "1", domain=extr.cookiedomain)
self.assertTrue(extr._check_cookies(("a",)))
extr._cookiejar.set("a", "1", domain="www" + extr.cookiedomain)
self.assertEqual(len(extr._cookiejar), 3)
self.assertTrue(extr._check_cookies(("a",)))
extr._cookiejar.set("b", "2", domain=extr.cookiedomain)
extr._cookiejar.set("c", "3", domain=extr.cookiedomain)
self.assertTrue(extr._check_cookies(("a", "b", "c")))
def test_check_cookies_expires(self):
extr = extractor.find("test:")
self.assertFalse(extr._cookiejar, "empty")
self.assertFalse(extr.cookiedomain, "empty")
now = int(time.time())
log = logging.getLogger("test")
extr._cookiejar.set("a", "1", expires=now-100)
with mock.patch.object(log, "warning") as mw:
self.assertFalse(extr._check_cookies(("a",)))
self.assertEqual(mw.call_count, 1)
self.assertEqual(mw.call_args[0], ("Cookie '%s' has expired", "a"))
extr._cookiejar.set("a", "1", expires=now+100)
with mock.patch.object(log, "warning") as mw:
self.assertFalse(extr._check_cookies(("a",)))
self.assertEqual(mw.call_count, 1)
self.assertEqual(mw.call_args[0], (
"Cookie '%s' will expire in less than %s hour%s", "a", 1, ""))
extr._cookiejar.set("a", "1", expires=now+100+7200)
with mock.patch.object(log, "warning") as mw:
self.assertFalse(extr._check_cookies(("a",)))
self.assertEqual(mw.call_count, 1)
self.assertEqual(mw.call_args[0], (
"Cookie '%s' will expire in less than %s hour%s", "a", 3, "s"))
extr._cookiejar.set("a", "1", expires=now+100+24*3600)
with mock.patch.object(log, "warning") as mw:
self.assertTrue(extr._check_cookies(("a",)))
self.assertEqual(mw.call_count, 0)
def _get_extractor(category): def _get_extractor(category):
for extr in extractor.extractors(): for extr in extractor.extractors():
if extr.category == category and hasattr(extr, "_login_impl"): if extr.category == category and hasattr(extr, "_login_impl"):