a94b51d407
Apple's Safari web browser binary cookies format (de)serializer written in Python. Our modifications to the original sources include the fix for "the year 2038 problem" on 32-bit systems, Netscape traditional `cookies.txt' file format support, and use of Pydantic V1 which does not pull in Rust unlike V2 which the project needlessly assumes by default.
50 lines
1.9 KiB
Python
50 lines
1.9 KiB
Python
--- src/binarycookies/__main__.py.orig 2025-04-08 19:50:17 UTC
|
|
+++ src/binarycookies/__main__.py
|
|
@@ -5,6 +5,8 @@ from sys import stdout
|
|
from typing import Type
|
|
|
|
import typer
|
|
+# https://github.com/Textualize/rich/issues/271
|
|
+println = print
|
|
from rich import print
|
|
|
|
from binarycookies import load
|
|
@@ -20,6 +22,7 @@ class DateTimeEncoder(json.JSONEncoder):
|
|
class OutputType(str, Enum):
|
|
json = "json"
|
|
ascii = "ascii"
|
|
+ netscape = "netscape"
|
|
|
|
|
|
def cli(file_path: str, output: str = "json"):
|
|
@@ -27,7 +30,7 @@ def cli(file_path: str, output: str = "json"):
|
|
with open(file_path, "rb") as f:
|
|
cookies = load(f)
|
|
if output == OutputType.json:
|
|
- json.dump([cookie.model_dump() for cookie in cookies], indent=2, cls=DateTimeEncoder, fp=stdout)
|
|
+ json.dump([cookie.dict() for cookie in cookies], indent=2, cls=DateTimeEncoder, fp=stdout)
|
|
elif output == OutputType.ascii:
|
|
for cookie in cookies:
|
|
print(f"Name: {cookie.name}")
|
|
@@ -38,6 +41,20 @@ def cli(file_path: str, output: str = "json"):
|
|
print(f"Expires: {cookie.expiry_datetime.isoformat()}")
|
|
print(f"Flag: {cookie.flag.value}")
|
|
print("-" * 40)
|
|
+ elif output == OutputType.netscape:
|
|
+ # http://www.cookiecentral.com/faq/#3.5
|
|
+ println("# Netscape HTTP Cookie File")
|
|
+ for cookie in cookies:
|
|
+ println("%(domain)s\t%(flag)s\t%(path)s\t%(secure)s\t%(expiry)d\t%(name)s\t%(value)s" % dict(
|
|
+ domain = cookie.url,
|
|
+ flag = str(cookie.url.startswith('.')).upper(),
|
|
+ path = cookie.path,
|
|
+ secure = str('Secure' in cookie.flag.value).upper(),
|
|
+ expiry = cookie.expiry_datetime.timestamp(),
|
|
+ name = cookie.name,
|
|
+ value = cookie.value))
|
|
+ else:
|
|
+ print(f"Unsupported output format, can only do {', '.join('[green]%s[/green]' % ot.name for ot in OutputType)}.")
|
|
|
|
|
|
def main():
|