feat: align save-time redaction with codex v0.3.0 ProjectZomboidRedactor

Bumps the codex constraint from ^0.2.0 to ^0.3.0 to pull the PZ-B42
parser fix and the IP-redaction passes added in the codex v0.3.0
release. Wires codex's ProjectZomboidRedactor into the save-time
Filter chain via a thin ProjectZomboidRedactorFilter wrapper, and
removes the now-redundant IPv4Filter / IPv6Filter chain entries:

- Codex's IPv4 / IPv6 redaction is generic-applicable (not PZ-only)
  and superior to the prior in-tree filters because it consumes the
  port suffix together with the address; previously only the IP was
  scrubbed, leaving e.g. ":27015" visible.
- Codex additionally redacts PZ-specific PII the prior filters never
  touched (Steam IDs, player names, world coordinates).
- The IPv4Filter and IPv6Filter source files are retained on disk
  for easy restore from history if a future paste type proves
  unsuitable for codex-driven IP scrubbing.

UsernameFilter (OS-path username scrubbing — different concern from
PZ player names) and AccessTokenFilter remain untouched.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-06 19:12:50 +00:00
parent 33fcd0d81f
commit 4fced60a83
4 changed files with 51 additions and 7 deletions

View File

@@ -21,7 +21,7 @@
"ext-mongodb": "*", "ext-mongodb": "*",
"ext-uri": "*", "ext-uri": "*",
"ext-zlib": "*", "ext-zlib": "*",
"indifferentketchup/codex": "^0.2.0", "indifferentketchup/codex": "^0.3.0",
"mongodb/mongodb": "2.1.2" "mongodb/mongodb": "2.1.2"
}, },
"autoload": { "autoload": {

8
composer.lock generated
View File

@@ -4,15 +4,15 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "821a03243eb4b751e38ca3f8f063dd3e", "content-hash": "c970170e823f1c31130ee1eec742a090",
"packages": [ "packages": [
{ {
"name": "indifferentketchup/codex", "name": "indifferentketchup/codex",
"version": "v0.2.0", "version": "v0.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://git.indifferentketchup.com/indifferentketchup/ik-codex", "url": "https://git.indifferentketchup.com/indifferentketchup/ik-codex",
"reference": "2bd4fe6189c21be5b1fb03e8ac23b1a3c01d747c" "reference": "656142dbf8979da7d5f06908e5dd53afa1b5e56d"
}, },
"require": { "require": {
"php": ">=8.4" "php": ">=8.4"
@@ -47,7 +47,7 @@
} }
], ],
"description": "Generic PHP log parsing and analysis framework.", "description": "Generic PHP log parsing and analysis framework.",
"time": "2026-05-01T22:08:43+00:00" "time": "2026-05-06T19:04:37+00:00"
}, },
{ {
"name": "mongodb/mongodb", "name": "mongodb/mongodb",

View File

@@ -23,8 +23,7 @@ abstract class Filter implements \JsonSerializable
new TrimFilter(), new TrimFilter(),
new LimitBytesFilter(), new LimitBytesFilter(),
new LimitLinesFilter(), new LimitLinesFilter(),
new IPv4Filter(), new ProjectZomboidRedactorFilter(),
new IPv6Filter(),
new UsernameFilter(), new UsernameFilter(),
new AccessTokenFilter(), new AccessTokenFilter(),
]; ];

View File

@@ -0,0 +1,45 @@
<?php
namespace IndifferentKetchup\Iblogs\Filter;
use IndifferentKetchup\Codex\Util\ProjectZomboid\ProjectZomboidRedactor;
/**
* Save-time wrapper that delegates to codex's ProjectZomboidRedactor.
*
* Codex owns the canonical Project Zomboid PII patterns (Steam IDs, player
* names, world coordinates, plus IPv4 / IPv6 addresses with the v0.3.0
* release). This filter is the single point at which PZ-shaped PII is
* scrubbed on save; it replaces the previous IPv4Filter + IPv6Filter
* stage (whose IP-only matches left port suffixes intact) and adds the
* PZ-specific Steam ID, player-name, and coordinate redaction the generic
* filters never touched.
*
* Codex's IPv4 / IPv6 regexes are generic and apply to non-PZ pastes too;
* the PZ-specific regexes (Steam ID, player name, coords) mostly no-op on
* non-PZ content because they rely on PZ-specific anchors (`76561198`,
* the Steam-ID placeholder, `Combat:` / `Safety:` prefixes, `at` / `[`
* coord wrappers + trailing PvP verbs).
*
* Patterns are encapsulated inside the codex redactor and are not exposed
* to the client-side preview JS (`getData()` returns an empty array).
* Server-side redaction on save is the privacy guarantee; the preview is
* only a UX hint for users about what gets scrubbed.
*/
class ProjectZomboidRedactorFilter extends Filter
{
public function getType(): FilterType
{
return FilterType::REGEX;
}
public function getData(): array
{
return [];
}
public function filter(string $data): string
{
return new ProjectZomboidRedactor()->redact($data);
}
}