diff options
Diffstat (limited to 'gallery_dl/cookies.py')
| -rw-r--r-- | gallery_dl/cookies.py | 49 |
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") |
