From nobody Wed Jun 25 16:25:37 2025 X-Original-To: dev-commits-ports-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bS6cd5TZMz60DxW; Wed, 25 Jun 2025 16:25:37 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bS6cd3x99z4Kqr; Wed, 25 Jun 2025 16:25:37 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1750868737; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=SQScbG4kBSzN5XKGMffDrKId2VuEm00RMecvFVOoea4=; b=cfGmt+oCYB6uDxIUcY7RgY6qoBE+egozo590ElFQNccg8JU8WqIB/KlH0z1WCY9twLO3bW QxWzw+yIZ0Evlp+VfESFhEMzKgrGY6NW2AKjf8ky16izG1PQNocSjXxZ+kDikTwcKiKw1b RBXdHhJCNZVlbgimNd1vvMrO3fEdl0Va5EC57tjt0o6bUz0tkuvOwqkWaJBhfQf9sTFskc YVEoK0wVz5jaqVwpxeku5XLJyl3AvzYSrCFzED3VJgb0daS0diinr695vc3z1nvqGPf9n0 VRvNbIv0CV2av5nFMOYJ3EYbOfOrAJLxRR2hbA6aswzuTQCemyoRBglhhje3ww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1750868737; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=SQScbG4kBSzN5XKGMffDrKId2VuEm00RMecvFVOoea4=; b=tscYRHd5Y6EDfJ72fmT3ZHbMHmi+vb47yzc5nRWsvq4zRreUKEIuzmtG3sFbNd1e5A5RW9 xY4b4xI3OFPG8vB9eoddKLyexVEQWB2BoRjqNk6Zyr642WUV+zRN9wZNBY7mVB4/FGSxwk 7phGhtsn8JL9pqygL12rhlZ6L1gdheY7lu2Bz0ZjGVDzAjI15QVLM4wSZ/R2Cvt1HjKu8h I1U02t0B88iaXRZqZ3oQGwsMVo+guI1viAfvpmbAfe8U3lEbwMqF9pNhNUKzUl/aLUsu9+ ZteWJRp8ycodi/w7dHT1uFPeoDVyZTrrRrt8Wwo3C5PVevHLwU9OBrZcRJT6lA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1750868737; a=rsa-sha256; cv=none; b=VE/Z9XfBgLubjMaO5B/k2IOnHbL1V0pjOn9ZlYHLSuXmVdDf7KoQbuuMbrt7NqNRmkrDRV ASe1XI4iys+feuiL6fqGokRf819q4G5A21ygujZun0/ToTVxP9ftPmFUISTVTrTyfE6e/e ejBqUrFqaJZWx11q2Glm+hQGsXP6+rSAPIuthQiU5iISb9PY+hmFzyHYjJnPujeXke61Hb kQeext5ubEjUx6m5LsiwfFFxgAtla+r2B5OVImP7tMvIIzpBKiWh3t+z0jCDlKWUDxsqx2 4+cAjRbwp+Hy1Q50RkLokkMXCzMfNkCCpRZ3KlW9I9uYpVAhfh24Ez5JNJKgvw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4bS6cd3PkRz8RN; Wed, 25 Jun 2025 16:25:37 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 55PGPbMD065400; Wed, 25 Jun 2025 16:25:37 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 55PGPbJQ065397; Wed, 25 Jun 2025 16:25:37 GMT (envelope-from git) Date: Wed, 25 Jun 2025 16:25:37 GMT Message-Id: <202506251625.55PGPbJQ065397@gitrepo.freebsd.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org From: Alexey Dokuchaev Subject: git: a94b51d40765 - main - www/py-binarycookies: new port had been added (+) List-Id: Commit messages for all branches of the ports repository List-Archive: https://lists.freebsd.org/archives/dev-commits-ports-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-ports-all@freebsd.org Sender: owner-dev-commits-ports-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: danfe X-Git-Repository: ports X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: a94b51d40765f0aedfca0069940d14db5068640e Auto-Submitted: auto-generated The branch main has been updated by danfe: URL: https://cgit.FreeBSD.org/ports/commit/?id=a94b51d40765f0aedfca0069940d14db5068640e commit a94b51d40765f0aedfca0069940d14db5068640e Author: Alexey Dokuchaev AuthorDate: 2025-06-25 16:22:30 +0000 Commit: Alexey Dokuchaev CommitDate: 2025-06-25 16:22:30 +0000 www/py-binarycookies: new port had been added (+) 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. --- www/Makefile | 1 + www/py-binarycookies/Makefile | 26 ++++++++++++ www/py-binarycookies/distinfo | 3 ++ .../files/patch-src_binarycookies_____main____.py | 49 ++++++++++++++++++++++ .../files/patch-src_binarycookies___deserialize.py | 21 ++++++++++ www/py-binarycookies/pkg-descr | 6 +++ 6 files changed, 106 insertions(+) diff --git a/www/Makefile b/www/Makefile index 320f82474594..e72084fbdc21 100644 --- a/www/Makefile +++ b/www/Makefile @@ -1487,6 +1487,7 @@ SUBDIR += py-beaker SUBDIR += py-beautifulsoup SUBDIR += py-betamax + SUBDIR += py-binarycookies SUBDIR += py-biscuits SUBDIR += py-bjoern SUBDIR += py-bleach diff --git a/www/py-binarycookies/Makefile b/www/py-binarycookies/Makefile new file mode 100644 index 000000000000..4a76b5bfd247 --- /dev/null +++ b/www/py-binarycookies/Makefile @@ -0,0 +1,26 @@ +PORTNAME= binarycookies +PORTVERSION= 2.1.5 +CATEGORIES= www python +MASTER_SITES= PYPI +PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} + +MAINTAINER= danfe@FreeBSD.org +COMMENT= Binary cookies (de)serializer written in Python +WWW= https://pypi.org/project/binarycookies/ + +LICENSE= MIT + +RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}pydantic>=0:devel/py-pydantic@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}typer>=0.12.3:devel/py-typer@${PY_FLAVOR} + +USES= python +USE_PYTHON= autoplist distutils + +NO_ARCH= yes + +post-patch: +# Do not pick up leftovers (*.orig files etc.) when making the package + @${REINPLACE_CMD} -e '/^package_data =/,+1s,\*,&.py,' \ + ${WRKSRC}/${PYSETUP} + +.include diff --git a/www/py-binarycookies/distinfo b/www/py-binarycookies/distinfo new file mode 100644 index 000000000000..90ad5f5508ac --- /dev/null +++ b/www/py-binarycookies/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1744141848 +SHA256 (binarycookies-2.1.5.tar.gz) = ff28a8e90e6ba02bc82fb2ff0d1d9a4a3be1ee9289a58f74a653d264928a31f3 +SIZE (binarycookies-2.1.5.tar.gz) = 8448 diff --git a/www/py-binarycookies/files/patch-src_binarycookies_____main____.py b/www/py-binarycookies/files/patch-src_binarycookies_____main____.py new file mode 100644 index 000000000000..da43dac8dabd --- /dev/null +++ b/www/py-binarycookies/files/patch-src_binarycookies_____main____.py @@ -0,0 +1,49 @@ +--- 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(): diff --git a/www/py-binarycookies/files/patch-src_binarycookies___deserialize.py b/www/py-binarycookies/files/patch-src_binarycookies___deserialize.py new file mode 100644 index 000000000000..3aec2539907c --- /dev/null +++ b/www/py-binarycookies/files/patch-src_binarycookies___deserialize.py @@ -0,0 +1,21 @@ +--- src/binarycookies/_deserialize.py.orig 2025-04-08 19:50:17 UTC ++++ src/binarycookies/_deserialize.py +@@ -1,6 +1,7 @@ + from datetime import datetime, timezone + from io import BytesIO + from struct import unpack ++from sys import maxsize + from typing import BinaryIO, List, Union + + from binarycookies.models import ( +@@ -28,7 +29,9 @@ def interpret_flag(flags: int) -> Flag: + + def mac_epoch_to_date(epoch: int) -> datetime: + """Converts a mac epoch time to a datetime object.""" +- return datetime.fromtimestamp(epoch + 978307200, tz=timezone.utc) ++ unix_epoch = epoch + 978307200 ++ if unix_epoch > maxsize: unix_epoch = maxsize ++ return datetime.fromtimestamp(unix_epoch, tz=timezone.utc) + + + def read_string(data: BytesIO, size: int) -> str: diff --git a/www/py-binarycookies/pkg-descr b/www/py-binarycookies/pkg-descr new file mode 100644 index 000000000000..e53f18a363c9 --- /dev/null +++ b/www/py-binarycookies/pkg-descr @@ -0,0 +1,6 @@ +Python library and command-line tool for reading and writing binary +cookies files used by Apple's Safari web browser on macOS and iOS. + +The `bcparser' program supports three output types: JSON (default), +ASCII (line-by-line text format), and Netscape legacy `cookies.txt' +format used by popular tools such as curl, wget, yt-dlp, and others.