From 62aa45a01f724a3879a13191e2a97814eb29f79b Mon Sep 17 00:00:00 2001 From: AJ Slater Date: Sun, 18 Oct 2026 19:26:26 -0700 Subject: [PATCH] Adapt to comicbox 5.3.2 comicbox 5.3.2 (pinned in c36f194c9) needs no code changes here, only accurate comments and the user-facing fixes it brings in NEWS: - Renames strip ":" and the other characters Windows and SMB shares can't store. Codex has no filename sanitizing of its own to retire. - MetronOnlineSource now sends mokkari the API token alone when one is set, so a leftover username & password never reaches mokkari, and mokkari 4.10 stops ~/.netrc replacing the Bearer token. Codex still hands comicbox all three fields, so comments that said "mokkari prefers the token" now say comicbox sends only the token. Co-Authored-By: Claude Opus 5.5 --- NEWS.md | 3 +++ codex/models/admin.py | 3 ++- codex/serializers/admin/tagging.py | 2 +- tests/test_credential_validator.py | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/NEWS.md b/NEWS.md index 06a87bbec..e2ee8dc5d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -12,6 +12,9 @@ border-radius: 128px; - Online tagging matches saved for review by 2.5.3 no longer break the review list and scan status with "No module named 'numpy'". They are dropped, so those comics need tagging again. + - Renamed comics no longer contain colons or other characters Windows and + SMB shares can't store. + - A Metron API key is no longer overridden by a `~/.netrc` login. ## v2.5.4 diff --git a/codex/models/admin.py b/codex/models/admin.py index e5c9e1535..34a45312c 100644 --- a/codex/models/admin.py +++ b/codex/models/admin.py @@ -167,7 +167,8 @@ class EffortChoices(TextChoices): # metron_user & metron_password are legacy. Metron authenticates with an # API token now, and the admin UI only accepts one. Existing logins keep # working (metron.cloud and comicbox still accept them) until an API key - # is saved, which clears them. mokkari prefers the token when both exist. + # is saved, which clears them. comicbox sends only the token when both + # exist. metron_key = EncryptedCharField() metron_user = EncryptedCharField() metron_password = EncryptedCharField() diff --git a/codex/serializers/admin/tagging.py b/codex/serializers/admin/tagging.py index 02f0cb61a..2af06f1bd 100644 --- a/codex/serializers/admin/tagging.py +++ b/codex/serializers/admin/tagging.py @@ -193,7 +193,7 @@ def update(self, instance, validated_data): The key is the only Metron credential the UI offers now, so saving one (or clearing it) drops the old login rather than leaving a stale - fallback that mokkari would silently ignore anyway. + fallback that comicbox would never send anyway. """ if "metron_key" in validated_data: validated_data["metron_user"] = "" diff --git a/tests/test_credential_validator.py b/tests/test_credential_validator.py index 4b8aef846..823ec7cae 100644 --- a/tests/test_credential_validator.py +++ b/tests/test_credential_validator.py @@ -113,7 +113,7 @@ def test_metron_legacy_login_still_validates(self) -> None: ) def test_metron_key_wins_over_legacy_login(self) -> None: - """Both stored: the token reaches mokkari, which prefers it.""" + """Both stored: all three reach comicbox, which sends only the token.""" creds = OnlineCredentials( metron_key="token", metron_user="user",