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:
@@ -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):
|
||||||
|
|||||||
@@ -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"):
|
||||||
|
|||||||
Reference in New Issue
Block a user