Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mikf
GitHub Repository: mikf/gallery-dl
Path: blob/master/test/test_cookies.py
5457 views
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
4
# Copyright 2017-2025 Mike Fährmann
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License version 2 as
8
# published by the Free Software Foundation.
9
10
import os
11
import sys
12
import unittest
13
from unittest import mock
14
15
import time
16
import logging
17
import datetime
18
import tempfile
19
from os.path import join
20
21
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
22
from gallery_dl import config, extractor # noqa E402
23
24
25
class TestCookiejar(unittest.TestCase):
26
27
@classmethod
28
def setUpClass(cls):
29
cls.path = tempfile.TemporaryDirectory()
30
31
cls.cookiefile = join(cls.path.name, "cookies.txt")
32
with open(cls.cookiefile, "w") as fp:
33
fp.write("""# HTTP Cookie File
34
.example.org\tTRUE\t/\tFALSE\t253402210800\tNAME\tVALUE
35
""")
36
37
cls.invalid_cookiefile = join(cls.path.name, "invalid.txt")
38
with open(cls.invalid_cookiefile, "w") as fp:
39
fp.write("""# asd
40
.example.org\tTRUE/FALSE\t253402210800\tNAME\tVALUE
41
""")
42
43
@classmethod
44
def tearDownClass(cls):
45
cls.path.cleanup()
46
config.clear()
47
48
def test_cookiefile(self):
49
config.set((), "cookies", self.cookiefile)
50
cookies = _get_extractor("test").cookies
51
self.assertEqual(len(cookies), 1)
52
53
cookie = next(iter(cookies))
54
self.assertEqual(cookie.domain, ".example.org")
55
self.assertEqual(cookie.path , "/")
56
self.assertEqual(cookie.name , "NAME")
57
self.assertEqual(cookie.value , "VALUE")
58
59
def test_invalid_cookiefile(self):
60
self._test_warning(self.invalid_cookiefile, ValueError)
61
62
def test_invalid_filename(self):
63
self._test_warning(join(self.path.name, "nothing"), FileNotFoundError)
64
65
def _test_warning(self, filename, exc):
66
config.set((), "cookies", filename)
67
log = logging.getLogger("generic")
68
69
with mock.patch.object(log, "warning") as mock_warning:
70
cookies = _get_extractor("test").cookies
71
72
self.assertEqual(len(cookies), 0)
73
self.assertEqual(mock_warning.call_count, 1)
74
self.assertIsInstance(mock_warning.call_args[0][-1], exc)
75
76
77
class TestCookiedict(unittest.TestCase):
78
79
def setUp(self):
80
self.cdict = {"NAME1": "VALUE1", "NAME2": "VALUE2"}
81
config.set((), "cookies", self.cdict)
82
83
def tearDown(self):
84
config.clear()
85
86
def test_dict(self):
87
cookies = _get_extractor("test").cookies
88
89
self.assertEqual(len(cookies), len(self.cdict))
90
self.assertEqual(sorted(cookies.keys()), sorted(self.cdict.keys()))
91
self.assertEqual(sorted(cookies.values()), sorted(self.cdict.values()))
92
93
def test_domain(self):
94
for category in ["exhentai", "nijie", "horne"]:
95
extr = _get_extractor(category)
96
cookies = extr.cookies
97
for key in self.cdict:
98
self.assertTrue(key in cookies)
99
for c in cookies:
100
self.assertEqual(c.domain, extr.cookies_domain)
101
102
103
class TestCookieLogin(unittest.TestCase):
104
105
def tearDown(self):
106
config.clear()
107
108
def test_cookie_login(self):
109
extr_cookies = {
110
"exhentai" : ("ipb_member_id", "ipb_pass_hash"),
111
"nijie" : ("nijie_tok",),
112
"horne" : ("horne_tok",),
113
}
114
for category, cookienames in extr_cookies.items():
115
cookies = {name: "value" for name in cookienames}
116
config.set((), "cookies", cookies)
117
extr = _get_extractor(category)
118
with mock.patch.object(extr, "_login_impl") as mock_login:
119
extr.login()
120
mock_login.assert_not_called()
121
122
123
class TestCookieUtils(unittest.TestCase):
124
125
def test_check_cookies(self):
126
extr = _get_extractor("test")
127
self.assertFalse(extr.cookies, "empty")
128
self.assertFalse(extr.cookies_domain, "empty")
129
130
# always returns False when checking for empty cookie list
131
self.assertFalse(extr.cookies_check(()))
132
133
self.assertFalse(extr.cookies_check(("a",)))
134
self.assertFalse(extr.cookies_check(("a", "b")))
135
self.assertFalse(extr.cookies_check(("a", "b", "c")))
136
137
extr.cookies.set("a", "1")
138
self.assertTrue(extr.cookies_check(("a",)))
139
self.assertFalse(extr.cookies_check(("a", "b")))
140
self.assertFalse(extr.cookies_check(("a", "b", "c")))
141
142
extr.cookies.set("b", "2")
143
self.assertTrue(extr.cookies_check(("a",)))
144
self.assertTrue(extr.cookies_check(("a", "b")))
145
self.assertFalse(extr.cookies_check(("a", "b", "c")))
146
147
def test_check_cookies_domain(self):
148
extr = _get_extractor("test")
149
self.assertFalse(extr.cookies, "empty")
150
extr.cookies_domain = ".example.org"
151
152
self.assertFalse(extr.cookies_check(("a",)))
153
self.assertFalse(extr.cookies_check(("a", "b")))
154
155
extr.cookies.set("nd_a", "1")
156
self.assertFalse(extr.cookies_check(("nd_a",)))
157
158
extr.cookies.set("cd_a", "1", domain=extr.cookies_domain)
159
self.assertTrue(extr.cookies_check(("cd_a",)))
160
161
extr.cookies.set("wd_a", "1", domain=f"www{extr.cookies_domain}")
162
self.assertFalse(extr.cookies_check(("wd_a",)))
163
self.assertEqual(len(extr.cookies), 3)
164
165
extr.cookies.set("cd_b", "2", domain=extr.cookies_domain)
166
extr.cookies.set("cd_c", "3", domain=extr.cookies_domain)
167
self.assertFalse(extr.cookies_check(("nd_a", "cd_b", "cd_c")))
168
self.assertTrue(extr.cookies_check(("cd_a", "cd_b", "cd_c")))
169
self.assertFalse(extr.cookies_check(("wd_a", "cd_b", "cd_c")))
170
self.assertEqual(len(extr.cookies), 5)
171
172
def test_check_cookies_domain_sub(self):
173
extr = _get_extractor("test")
174
self.assertFalse(extr.cookies, "empty")
175
extr.cookies_domain = ".example.org"
176
177
self.assertFalse(extr.cookies_check(("a",), subdomains=True))
178
self.assertFalse(extr.cookies_check(("a", "b"), subdomains=True))
179
180
extr.cookies.set("nd_a", "1")
181
self.assertFalse(extr.cookies_check(("nd_a",), subdomains=True))
182
183
extr.cookies.set("cd_a", "1", domain=extr.cookies_domain)
184
self.assertTrue(extr.cookies_check(("cd_a",), subdomains=True))
185
186
extr.cookies.set("wd_a", "1", domain=f"www{extr.cookies_domain}")
187
self.assertTrue(extr.cookies_check(("wd_a",), subdomains=True))
188
189
extr.cookies.set("cd_b", "2", domain=extr.cookies_domain)
190
extr.cookies.set("cd_c", "3", domain=extr.cookies_domain)
191
self.assertEqual(len(extr.cookies), 5)
192
self.assertFalse(extr.cookies_check(
193
("nd_a", "cd_b", "cd_c"), subdomains=True))
194
self.assertTrue(extr.cookies_check(
195
("cd_a", "cd_b", "cd_c"), subdomains=True))
196
self.assertTrue(extr.cookies_check(
197
("wd_a", "cd_b", "cd_c"), subdomains=True))
198
199
def test_check_cookies_expires(self):
200
extr = _get_extractor("test")
201
self.assertFalse(extr.cookies, "empty")
202
self.assertFalse(extr.cookies_domain, "empty")
203
204
now = int(time.time())
205
log = logging.getLogger("generic")
206
207
extr.cookies.set("a", "1", expires=now-100, domain=".example.org")
208
with mock.patch.object(log, "warning") as mw:
209
self.assertFalse(extr.cookies_check(("a",)))
210
self.assertEqual(mw.call_count, 1)
211
self.assertEqual(mw.call_args[0], (
212
"cookies: %s/%s expired at %s", "example.org", "a",
213
datetime.datetime.fromtimestamp(now-100)))
214
215
extr.cookies.set("a", "1", expires=now+100, domain=".example.org")
216
with mock.patch.object(log, "warning") as mw:
217
self.assertTrue(extr.cookies_check(("a",)))
218
self.assertEqual(mw.call_count, 1)
219
self.assertEqual(mw.call_args[0], (
220
"cookies: %s/%s will expire in less than %s hour%s",
221
"example.org", "a", 1, ""))
222
223
extr.cookies.set("a", "1", expires=now+100+7200, domain=".example.org")
224
with mock.patch.object(log, "warning") as mw:
225
self.assertTrue(extr.cookies_check(("a",)))
226
self.assertEqual(mw.call_count, 1)
227
self.assertEqual(mw.call_args[0], (
228
"cookies: %s/%s will expire in less than %s hour%s",
229
"example.org", "a", 3, "s"))
230
231
extr.cookies.set(
232
"a", "1", expires=now+100+24*3600, domain=".example.org")
233
with mock.patch.object(log, "warning") as mw:
234
self.assertTrue(extr.cookies_check(("a",)))
235
self.assertEqual(mw.call_count, 0)
236
237
238
def _get_extractor(category):
239
extr = extractor.find(URLS[category])
240
extr.initialize()
241
return extr
242
243
244
URLS = {
245
"exhentai" : "https://exhentai.org/g/1200119/d55c44d3d0/",
246
"nijie" : "https://nijie.info/view.php?id=1",
247
"horne" : "https://horne.red/view.php?id=1",
248
"test" : "generic:https://example.org/",
249
}
250
251
252
if __name__ == "__main__":
253
unittest.main()
254
255