Skip to content

Commit b87f3db

Browse files
chore(release): prep 6.47.0 - a log line is read by someone else
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RbWZLwBVLGM1xUVXa9NeJ1
1 parent d4ba559 commit b87f3db

3 files changed

Lines changed: 28 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,30 @@ the public-API contract.
1212

1313
_Nothing yet._
1414

15+
## [6.47.0] - 2026-08-26
16+
17+
### Fixed
18+
19+
- **Every emitted log line carried its URL's credentials into OSLog and into the host handler.**
20+
The engine logs whole URLs on purpose, since host, path and query are what a playback report is
21+
diagnosed from, but media servers routinely put the access token in that same query (Jellyfin's
22+
`api_key=`). So `[AetherEngine] load url=`, `[NativeAVPlayerHost] load url=` and `asset.url=` held
23+
a live credential, emitted at `.public` privacy, which means a Console.app capture or a
24+
sysdiagnose showed it in clear text and the host handler passed it to whatever in-app log a
25+
consumer built on it. This belongs here rather than in each consumer: the engine composes the
26+
line, it reaches three sinks a consumer does not control, and a host-side scrub only covers the
27+
one sink that host owns. Both `emit` overloads now funnel through one path that strips
28+
`api_key`, `apikey`, `access_token`, `token`, `secret`, `password`, `signature`, `x-emby-token`,
29+
`x-mediabrowser-token` and `connect.sid` values in the query form, both header forms and the
30+
cookie form, replacing each value whole rather than truncating it. Everything else about the URL
31+
survives. Public API is unchanged and the redactor is internal.
32+
33+
Redaction sits at the funnel, never at the call sites, so a URL logged by code added later is
34+
covered without its author knowing the redactor exists. It works on UTF-8 bytes and allocates its
35+
output only when something matches: a first version compared `Character`s and built a lowercased
36+
`String` per position, which cost enough to shift request timing in
37+
`ServedFromMemoryProgressTests`, since `emit` is called from the demuxer and the segment producer.
38+
1539
## [6.46.0] - 2026-08-26
1640

1741
### Fixed

Examples/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Three samples covering different audiences:
1818
```
1919
https://github.com/superuser404notfound/AetherEngine
2020
```
21-
Dependency Rule: Up to Next Major Version, starting from `6.46.0`. Add the `AetherEngine` library product to your app target.
21+
Dependency Rule: Up to Next Major Version, starting from `6.47.0`. Add the `AetherEngine` library product to your app target.
2222

2323
3. **Drop the file in.** Replace the Xcode template's default `App.swift` (or whatever the generated `@main` file is called) with the contents of [`MinimalPlayerApp.swift`](MinimalPlayer/MinimalPlayerApp.swift). The file is self-contained: it defines both the `@main App` struct and the `ContentView`.
2424

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ Subtitle cues land in raw source PTS; render the overlay against `player.sourceT
325325
Install via Swift Package Manager:
326326

327327
```swift
328-
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "6.46.0")
328+
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "6.47.0")
329329
```
330330

331331
Three samples ship in `Examples/`:
@@ -528,10 +528,10 @@ Browse all of this as a searchable site at **[aetherengine.superuser404.de](http
528528
AetherEngine uses [Semantic Versioning](https://semver.org). The public API surface, every `public` declaration in `Sources/AetherEngine/`, is the stability contract. **Major** removes / renames public symbols or breaks adopters; **Minor** adds public API or codec / format support; **Patch** fixes bugs with no public API change. `internal` types are not part of the contract.
529529

530530
```swift
531-
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "6.46.0")
531+
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "6.47.0")
532532
```
533533

534-
Pin to `.upToNextMinor(from: "6.46.0")` for stricter teams that prefer to opt into minor bumps explicitly.
534+
Pin to `.upToNextMinor(from: "6.47.0")` for stricter teams that prefer to opt into minor bumps explicitly.
535535

536536
## Requirements
537537

0 commit comments

Comments
 (0)