mirror of https://github.com/OpenVidu/openvidu.git
openvidu-dashboard: the writer redacts custom base URLs
parent
17dd82e389
commit
4be6333d02
|
|
@ -0,0 +1,2 @@
|
||||||
|
schema: spec-driven
|
||||||
|
created: 2026-10-27
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
# Design
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
- The codec copies a field of a protocol message only when the allow-list names it, with a rule per field. `redactURL`
|
||||||
|
rewrites a URL to scheme, host and path with the last segment replaced by `***`.
|
||||||
|
- `custom_base_url` has the rule `keep` in `RoomCompositeEgressRequest` and `TemplateSource`. The egress request
|
||||||
|
summary redacts it on its own, so only raw payloads hold the full value.
|
||||||
|
|
||||||
|
## Goals / Non-Goals
|
||||||
|
|
||||||
|
**Goals:**
|
||||||
|
- No stored payload holds the query string, userinfo or last path segment of a custom base URL.
|
||||||
|
|
||||||
|
**Non-Goals:**
|
||||||
|
- Rewriting stored events. The read side of an edition may redact them again.
|
||||||
|
|
||||||
|
## Decisions
|
||||||
|
|
||||||
|
### Same rule as the web URL
|
||||||
|
|
||||||
|
`custom_base_url` gets `redactURL`, the rule of `WebEgressRequest.url` and `WebSource.url`. A layout page under a
|
||||||
|
custom base URL is as likely as a web egress page to take a token in its query string or path.
|
||||||
|
|
||||||
|
Alternative rejected: `stripURLCredentials`, which keeps the path. A token in the last path segment would survive.
|
||||||
|
|
||||||
|
### Data model
|
||||||
|
|
||||||
|
- Collections: `events` (payloads of `EGRESS_*` events). No field, type, index or retention change; no schema-version
|
||||||
|
change.
|
||||||
|
- Migration from legacy events: the legacy migration encodes with the same codec, so migrated payloads are redacted too.
|
||||||
|
- Performance: none.
|
||||||
|
|
||||||
|
## Risks / Trade-offs
|
||||||
|
|
||||||
|
- [The redacted value no longer opens the layout] → The value is shown for reference only; the request summary was
|
||||||
|
already redacted.
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
# Proposal
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
The writer stores the `custom_base_url` of room composite requests and of the template source of unified egress
|
||||||
|
requests unchanged in raw event payloads. A custom base URL can carry a token in its query string, while the request
|
||||||
|
summary of the egress document already stores it redacted.
|
||||||
|
|
||||||
|
## What Changes
|
||||||
|
|
||||||
|
- Raw event payloads store `custom_base_url` redacted like the web URL: no userinfo, query string or fragment, and the
|
||||||
|
last path segment replaced by `***`.
|
||||||
|
|
||||||
|
Scope excludes the following:
|
||||||
|
- Raw events already stored, which keep the value until they expire.
|
||||||
|
- Any other field of the allow-list.
|
||||||
|
|
||||||
|
Edition: CE and PRO (writer). Repositories: openvidu-livekit (`openvidu/analytics/schema/allowlist.go`) and the specs
|
||||||
|
of the dashboard.
|
||||||
|
|
||||||
|
CHANGELOG: none. The analytics data model has not shipped in a release.
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### New Capabilities
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
### Modified Capabilities
|
||||||
|
|
||||||
|
- `server-analytics-writer`: the secrets allow-list redacts custom base URLs.
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- Writer: the allow-list rule of `custom_base_url` in `RoomCompositeEgressRequest` and `TemplateSource`, and the codec
|
||||||
|
tests.
|
||||||
|
- Dashboard: none; the request summary is unchanged.
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
## MODIFIED Requirements
|
||||||
|
|
||||||
|
### Requirement: Secrets allow-list
|
||||||
|
Edition: CE and PRO. Projectors SHALL copy only fields named in an explicit allow-list into any document,
|
||||||
|
including raw payloads; every other field, present or future, SHALL be dropped. Egress stream, web, websocket and
|
||||||
|
custom base URLs SHALL be stored without userinfo, query string and fragment and with their last path segment replaced
|
||||||
|
by `***`; the ingress URL SHALL be stored without userinfo, query string and fragment.
|
||||||
|
|
||||||
|
#### Scenario: Fully populated messages
|
||||||
|
- **GIVEN** an `AnalyticsEvent` of every type with every string field set to a unique sentinel, including `room.turn_password`, egress storage credentials, webhook signing keys, egress tokens, `ingress.stream_key`, `ingress.url`, SIP credentials and `api_call` request bodies
|
||||||
|
- **WHEN** each is projected with `store_metadata` and IP storage enabled
|
||||||
|
- **THEN** the sentinels found in all write models are exactly those of the allow-list paths
|
||||||
|
|
||||||
|
#### Scenario: Stream URL redacted
|
||||||
|
- **GIVEN** an egress with stream URL `rtmps://user:pw@live.example.com/app/live_123?token=abc`
|
||||||
|
- **WHEN** it is projected
|
||||||
|
- **THEN** the stored output URL is `rtmps://live.example.com/app/***`
|
||||||
|
|
||||||
|
#### Scenario: Custom base URL redacted
|
||||||
|
- **GIVEN** a room composite egress, and a unified egress with a template source, both with custom base URL `https://layouts.example.com/app/index.html?token=abc`
|
||||||
|
- **WHEN** their `EGRESS_STARTED` events are stored
|
||||||
|
- **THEN** each raw payload holds `custom_base_url: "https://layouts.example.com/app/***"`
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Tasks
|
||||||
|
|
||||||
|
## 1. Writer (openvidu-livekit)
|
||||||
|
|
||||||
|
- [x] 1.1 Give `custom_base_url` the `redactURL` rule in `RoomCompositeEgressRequest` and `TemplateSource` of
|
||||||
|
`openvidu/analytics/schema/allowlist.go`. Verify with a codec test that encodes both requests with a custom base
|
||||||
|
URL carrying a token, and with the codec suite.
|
||||||
|
- [x] 1.2 Add a custom base URL with a secret to the room composite egress of the writer test builders, so that the
|
||||||
|
integration suite's no-secret check covers it. Verify with the analytics integration tests and the lint of the
|
||||||
|
fork.
|
||||||
|
|
||||||
|
## 2. Docs and CHANGELOG
|
||||||
|
|
||||||
|
- [x] 2.1 No CHANGELOG line: the analytics data model has not shipped. No `AGENTS.md` changes. Verify by reading the
|
||||||
|
change against both files.
|
||||||
|
|
||||||
|
## 3. Integration check
|
||||||
|
|
||||||
|
- [x] 3.1 Run the spec validation and the format check of the dashboard. Verify that they pass.
|
||||||
Loading…
Reference in New Issue