diff --git a/gallery_dl/extractor/common.py b/gallery_dl/extractor/common.py index 5a2d3a39..1cf00f14 100644 --- a/gallery_dl/extractor/common.py +++ b/gallery_dl/extractor/common.py @@ -371,20 +371,25 @@ class Extractor(): for cookie in self._cookiejar: if cookie.name in names and ( not domain or cookie.domain == domain): + if cookie.expires: diff = int(cookie.expires - now) + if diff <= 0: self.log.warning( "Cookie '%s' has expired", cookie.name) + continue + 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 "") - else: - names.discard(cookie.name) - if not names: - return True + continue + + names.discard(cookie.name) + if not names: + return True return False def _prepare_ddosguard_cookies(self): diff --git a/test/test_cookies.py b/test/test_cookies.py index d103d021..04a37b9b 100644 --- a/test/test_cookies.py +++ b/test/test_cookies.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- 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 # it under the terms of the GNU General Public License version 2 as @@ -12,6 +12,7 @@ import sys import unittest from unittest import mock +import time import logging import tempfile from os.path import join @@ -118,6 +119,86 @@ class TestCookieLogin(unittest.TestCase): 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): for extr in extractor.extractors(): if extr.category == category and hasattr(extr, "_login_impl"):