[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(): for name, value in cookiedict.items():
set_cookie(name, value, domain=domain) 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""" """Check if all 'cookies_names' are in the session's cookiejar"""
if not self.cookies: if not self.cookies:
return False return False
@@ -550,26 +550,31 @@ class Extractor():
now = time.time() now = time.time()
for cookie in self.cookies: for cookie in self.cookies:
if cookie.name in names and ( if cookie.name not in names:
not domain or cookie.domain == domain): continue
if cookie.expires: if not domain or cookie.domain == domain:
diff = int(cookie.expires - now) pass
elif not subdomains or not cookie.domain.endswith(domain):
continue
if diff <= 0: if cookie.expires:
self.log.warning( diff = int(cookie.expires - now)
"Cookie '%s' has expired", cookie.name)
continue
elif diff <= 86400: if diff <= 0:
hours = diff // 3600 self.log.warning(
self.log.warning( "Cookie '%s' has expired", cookie.name)
"Cookie '%s' will expire in less than %s hour%s", continue
cookie.name, hours + 1, "s" if hours else "")
names.discard(cookie.name) elif diff <= 86400:
if not names: hours = diff // 3600
return True 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 return False
def _extract_jsonld(self, page): 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",)))
self.assertFalse(extr.cookies_check(("a", "b"))) self.assertFalse(extr.cookies_check(("a", "b")))
extr.cookies.set("a", "1") extr.cookies.set("nd_a", "1")
self.assertFalse(extr.cookies_check(("a",))) self.assertFalse(extr.cookies_check(("nd_a",)))
extr.cookies.set("a", "1", domain=extr.cookies_domain) extr.cookies.set("cd_a", "1", domain=extr.cookies_domain)
self.assertTrue(extr.cookies_check(("a",))) 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.assertEqual(len(extr.cookies), 3)
self.assertTrue(extr.cookies_check(("a",)))
extr.cookies.set("b", "2", domain=extr.cookies_domain) extr.cookies.set("cd_b", "2", domain=extr.cookies_domain)
extr.cookies.set("c", "3", domain=extr.cookies_domain) extr.cookies.set("cd_c", "3", domain=extr.cookies_domain)
self.assertTrue(extr.cookies_check(("a", "b", "c"))) 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): def test_check_cookies_expires(self):
extr = _get_extractor("test") extr = _get_extractor("test")