summaryrefslogtreecommitdiffstats
path: root/gallery_dl/cookies.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/cookies.py')
-rw-r--r--gallery_dl/cookies.py49
1 files changed, 34 insertions, 15 deletions
diff --git a/gallery_dl/cookies.py b/gallery_dl/cookies.py
index 5d6c3d7..6c19e23 100644
--- a/gallery_dl/cookies.py
+++ b/gallery_dl/cookies.py
@@ -27,8 +27,11 @@ from . import aes, text, util
SUPPORTED_BROWSERS_CHROMIUM = {
"brave", "chrome", "chromium", "edge", "opera", "thorium", "vivaldi"}
SUPPORTED_BROWSERS_FIREFOX = {"firefox", "librewolf", "zen"}
+SUPPORTED_BROWSERS_WEBKIT = {"safari", "orion"}
SUPPORTED_BROWSERS = \
- SUPPORTED_BROWSERS_CHROMIUM | SUPPORTED_BROWSERS_FIREFOX | {"safari"}
+ SUPPORTED_BROWSERS_CHROMIUM \
+ | SUPPORTED_BROWSERS_FIREFOX \
+ | SUPPORTED_BROWSERS_WEBKIT
logger = logging.getLogger("cookies")
@@ -38,8 +41,8 @@ def load_cookies(browser_specification):
_parse_browser_specification(*browser_specification)
if browser_name in SUPPORTED_BROWSERS_FIREFOX:
return load_cookies_firefox(browser_name, profile, container, domain)
- elif browser_name == "safari":
- return load_cookies_safari(profile, domain)
+ elif browser_name in SUPPORTED_BROWSERS_WEBKIT:
+ return load_cookies_webkit(browser_name, profile, domain)
elif browser_name in SUPPORTED_BROWSERS_CHROMIUM:
return load_cookies_chromium(browser_name, profile, keyring, domain)
else:
@@ -92,7 +95,7 @@ def load_cookies_firefox(browser_name, profile=None,
return cookies
-def load_cookies_safari(profile=None, domain=None):
+def load_cookies_webkit(browser_name, profile=None, domain=None):
"""Ref.: https://github.com/libyal/dtformats/blob
/main/documentation/Safari%20Cookies.asciidoc
- This data appears to be out of date
@@ -100,15 +103,24 @@ def load_cookies_safari(profile=None, domain=None):
- There are a few bytes here and there
which are skipped during parsing
"""
- with _safari_cookies_database() as fp:
- data = fp.read()
- page_sizes, body_start = _safari_parse_cookies_header(data)
+ if browser_name == "safari":
+ with _safari_cookies_database() as fp:
+ data = fp.read()
+ elif browser_name == "orion":
+ with _orion_cookies_database() as fp:
+ data = fp.read()
+ else:
+ raise ValueError(f"unknown webkit browser '{browser_name}'")
+
+ page_sizes, body_start = _webkit_parse_cookies_header(data)
p = DataParser(data[body_start:])
cookies = []
for page_size in page_sizes:
- _safari_parse_cookies_page(p.read_bytes(page_size), cookies)
- _log_info("Extracted %s cookies from Safari", len(cookies))
+ _webkit_parse_cookies_page(p.read_bytes(page_size), cookies)
+ _log_info("Extracted %s cookies from %s",
+ browser_name.capitalize(), len(cookies))
+
return cookies
@@ -278,7 +290,8 @@ def _firefox_browser_directory(browser_name):
# --------------------------------------------------------------------
-# safari
+# safari/orion/webkit
+
def _safari_cookies_database():
try:
@@ -291,7 +304,13 @@ def _safari_cookies_database():
return open(path, "rb")
-def _safari_parse_cookies_header(data):
+def _orion_cookies_database():
+ path = os.path.expanduser(
+ "~/Library/HTTPStorages/com.kagi.kagimacOS.binarycookies")
+ return open(path, "rb")
+
+
+def _webkit_parse_cookies_header(data):
p = DataParser(data)
p.expect_bytes(b"cook", "database signature")
number_of_pages = p.read_uint(big_endian=True)
@@ -300,7 +319,7 @@ def _safari_parse_cookies_header(data):
return page_sizes, p.cursor
-def _safari_parse_cookies_page(data, cookies, domain=None):
+def _webkit_parse_cookies_page(data, cookies, domain=None):
p = DataParser(data)
p.expect_bytes(b"\x00\x00\x01\x00", "page signature")
number_of_cookies = p.read_uint()
@@ -313,13 +332,13 @@ def _safari_parse_cookies_page(data, cookies, domain=None):
for i, record_offset in enumerate(record_offsets):
p.skip_to(record_offset, "space between records")
- record_length = _safari_parse_cookies_record(
+ record_length = _webkit_parse_cookies_record(
data[record_offset:], cookies, domain)
p.read_bytes(record_length)
p.skip_to_end("space in between pages")
-def _safari_parse_cookies_record(data, cookies, host=None):
+def _webkit_parse_cookies_record(data, cookies, host=None):
p = DataParser(data)
record_size = p.read_uint()
p.skip(4, "unknown record field 1")
@@ -355,7 +374,7 @@ def _safari_parse_cookies_record(data, cookies, host=None):
p.skip_to(value_offset)
value = p.read_cstring()
except UnicodeDecodeError:
- _log_warning("Failed to parse Safari cookie")
+ _log_warning("Failed to parse WebKit cookie")
return record_size
p.skip_to(record_size, "space at the end of the record")