[common] add 'subdomains' argument to 'cookies_check()' (#7188)

This commit is contained in:
Mike Fährmann
2025-03-18 14:59:41 +01:00
parent d746e025a0
commit 567f5d0bc6
2 changed files with 61 additions and 26 deletions

View File

@@ -539,7 +539,7 @@ class Extractor():
for name, value in cookiedict.items():
set_cookie(name, value, domain=domain)
def cookies_check(self, cookies_names, domain=None):
def cookies_check(self, cookies_names, domain=None, subdomains=False):
"""Check if all 'cookies_names' are in the session's cookiejar"""
if not self.cookies:
return False
@@ -550,26 +550,31 @@ class Extractor():
now = time.time()
for cookie in self.cookies:
if cookie.name in names and (
not domain or cookie.domain == domain):
if cookie.name not in names:
continue
if cookie.expires:
diff = int(cookie.expires - now)
if not domain or cookie.domain == domain:
pass
elif not subdomains or not cookie.domain.endswith(domain):
continue
if diff <= 0:
self.log.warning(
"Cookie '%s' has expired", cookie.name)
continue
if cookie.expires:
diff = int(cookie.expires - now)
elif diff <= 86400:
hours = diff // 3600
self.log.warning(
"Cookie '%s' will expire in less than %s hour%s",
cookie.name, hours + 1, "s" if hours else "")
if diff <= 0:
self.log.warning(
"Cookie '%s' has expired", cookie.name)
continue
names.discard(cookie.name)
if not names:
return True
elif diff <= 86400:
hours = diff // 3600
self.log.warning(
"Cookie '%s' will expire in less than %s hour%s",
cookie.name, hours + 1, "s" if hours else "")
names.discard(cookie.name)
if not names:
return True
return False
def _extract_jsonld(self, page):

View File

@@ -153,19 +153,49 @@ class TestCookieUtils(unittest.TestCase):
self.assertFalse(extr.cookies_check(("a",)))
self.assertFalse(extr.cookies_check(("a", "b")))
extr.cookies.set("a", "1")
self.assertFalse(extr.cookies_check(("a",)))
extr.cookies.set("nd_a", "1")
self.assertFalse(extr.cookies_check(("nd_a",)))
extr.cookies.set("a", "1", domain=extr.cookies_domain)
self.assertTrue(extr.cookies_check(("a",)))
extr.cookies.set("cd_a", "1", domain=extr.cookies_domain)
self.assertTrue(extr.cookies_check(("cd_a",)))
extr.cookies.set("a", "1", domain="www" + extr.cookies_domain)
extr.cookies.set("wd_a", "1", domain="www" + extr.cookies_domain)
self.assertFalse(extr.cookies_check(("wd_a",)))
self.assertEqual(len(extr.cookies), 3)
self.assertTrue(extr.cookies_check(("a",)))
extr.cookies.set("b", "2", domain=extr.cookies_domain)
extr.cookies.set("c", "3", domain=extr.cookies_domain)
self.assertTrue(extr.cookies_check(("a", "b", "c")))
extr.cookies.set("cd_b", "2", domain=extr.cookies_domain)
extr.cookies.set("cd_c", "3", domain=extr.cookies_domain)
self.assertFalse(extr.cookies_check(("nd_a", "cd_b", "cd_c")))
self.assertTrue(extr.cookies_check(("cd_a", "cd_b", "cd_c")))
self.assertFalse(extr.cookies_check(("wd_a", "cd_b", "cd_c")))
self.assertEqual(len(extr.cookies), 5)
def test_check_cookies_domain_sub(self):
extr = _get_extractor("test")
self.assertFalse(extr.cookies, "empty")
extr.cookies_domain = ".example.org"
self.assertFalse(extr.cookies_check(("a",), subdomains=True))
self.assertFalse(extr.cookies_check(("a", "b"), subdomains=True))
extr.cookies.set("nd_a", "1")
self.assertFalse(extr.cookies_check(("nd_a",), subdomains=True))
extr.cookies.set("cd_a", "1", domain=extr.cookies_domain)
self.assertTrue(extr.cookies_check(("cd_a",), subdomains=True))
extr.cookies.set("wd_a", "1", domain="www" + extr.cookies_domain)
self.assertTrue(extr.cookies_check(("wd_a",), subdomains=True))
extr.cookies.set("cd_b", "2", domain=extr.cookies_domain)
extr.cookies.set("cd_c", "3", domain=extr.cookies_domain)
self.assertEqual(len(extr.cookies), 5)
self.assertFalse(extr.cookies_check(
("nd_a", "cd_b", "cd_c"), subdomains=True))
self.assertTrue(extr.cookies_check(
("cd_a", "cd_b", "cd_c"), subdomains=True))
self.assertTrue(extr.cookies_check(
("wd_a", "cd_b", "cd_c"), subdomains=True))
def test_check_cookies_expires(self):
extr = _get_extractor("test")