diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index deca0042..39a15908 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,6 +52,12 @@ jobs: - name: Go vulnerability check run: go install golang.org/x/vuln/cmd/govulncheck@v1.1.4 && govulncheck ./... + # Generated sqlc output must never drift from db/queries/. One leg of + # the matrix is enough; make is not guaranteed on the Windows runner. + - name: Verify generated sqlc output (make sqlc-verify) + if: matrix.os == 'ubuntu-latest' + run: make sqlc-install sqlc-verify + - name: Run tests with race detection and coverage run: go test -race -timeout 20m ./... -coverprofile=coverage.out -cover diff --git a/.gitignore b/.gitignore index 0e2d5c6a..4dcdb234 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,9 @@ TODOS.md CLAUDE.md DESIGN.md Client/CLIENT-REVIEW.md + +# Agent tooling state +.serena/ + +# Client env (holds API keys - never commit) +Client/tauri-client/.env diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cc901b9..8dc79a1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,13 @@ tooling (`npm run changelog`) auto-generates entries from commit messages on each release; this file is the curated counterpart that calls out behavioural changes operators must know about. -## Unreleased — Phase B + C +## Unreleased — v1.1.0-alpha series (Phase B + C) + +> **Project reset note:** OwnCord has re-entered alpha. The `v1.0.0` release is +> superseded; versioning continues forward as `v1.1.0-alpha.N` so deployed +> servers and clients keep receiving updates. Releases are published to the +> public [`OwnCord-releases`](https://github.com/J3vb/OwnCord-releases) +> repository, including a full source snapshot with every release. ### Phase B — Acceleration @@ -29,8 +35,8 @@ behavioural changes operators must know about. `VoiceService.JoinChannel`, `InviteService.CreateInvite`, `ModerationService.BanUser`, `BlockService.BlockUser`, `UserService.UpdateProfile`. The real OTel SDK is gated behind - `-tags otel` and is currently a placeholder; wiring the upstream - modules is tracked in `PHASE_BC_LOCAL_TODO.md`. + `-tags otel` and is currently a placeholder; completing it is + deferred until after the beta reset. - **Solid.js proof of concept (Step 6).** Two leaf components migrated (`Badge`, `ChannelListItem`), Vite + JSX configured, store→signal adapter landed. The remaining vanilla components remain in place; @@ -93,16 +99,11 @@ behavioural changes operators must know about. the existing IP restriction.** A previous prerelease shipped with only the IP gate; that has been corrected. -### Known follow-up work (local toolchain required) +### Deferred work -See `PHASE_BC_LOCAL_TODO.md` for the full list. Highlights: - -- Real OpenTelemetry SDK wiring (needs `go get` of the upstream modules) -- Real Wazero runtime construction (needs `go get github.com/tetratelabs/wazero`) -- Postgres backend implementation (needs `make sqlc-generate`) -- Tinygo `.wasm` build of the example hello plugin -- Migration of the remaining vanilla TypeScript components to Solid.js -- Slash-command dispatcher in the WS layer (design TBD) - -These items each need a real developer machine with network access; no -in-sandbox pass can land them. +The project is under a feature freeze until the beta reset completes. +Explicitly deferred (not abandoned unless noted): real OpenTelemetry SDK +wiring, the Postgres backend (scaffolding removed pending real demand), +the slash-command dispatcher (`docs/plans/slash-commands.md`), and the +Solid.js migration (abandoned — the experiment is being removed in favor +of the established vanilla component pattern). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..a7128eda --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,34 @@ +# Security Policy + +## Supported versions + +OwnCord is in alpha. Only the **latest release** receives security fixes. +There are no backports. + +| Version | Supported | +| ------- | --------- | +| Latest release (see [OwnCord-releases](https://github.com/J3vb/OwnCord-releases/releases)) | Yes | +| Anything older | No | + +## Reporting a vulnerability + +**Do not open a public issue for security bugs.** + +Report vulnerabilities privately via GitHub Security Advisories on the +[OwnCord-releases](https://github.com/J3vb/OwnCord-releases/security/advisories/new) +repository ("Report a vulnerability"). This channel works even while the +source repository is private. + +Please include: + +- Affected component (server, desktop client, admin panel, plugin host) +- Reproduction steps or a proof of concept +- The release version (or source snapshot) you tested against + +You will get an initial response within 7 days. Coordinated disclosure is +appreciated; fixes ship in the next release with credit unless you prefer +otherwise. + +## Hardening documentation + +Operator-facing hardening notes live in [docs/security.md](docs/security.md). diff --git a/docs/audit-2026-04-07.md b/docs/audit-2026-04-07.md index 200cec7a..83195976 100644 --- a/docs/audit-2026-04-07.md +++ b/docs/audit-2026-04-07.md @@ -5,6 +5,29 @@ --- +## Finding closure status (maintained; last updated 2026-07-18) + +Every CRITICAL/HIGH below must end with a closing commit link or an explicit +mitigation before the beta gate. Standing rule: any plugin CRITICAL still +OPEN at the beta gate → plugins ship default-disabled (they already default +to `plugins.enabled: false`). + +| # | Sev | Finding | Status | +|---|-----|---------|--------| +| 1 | CRITICAL | Plugin `invokeCommand` has no timeout | IN PROGRESS — CPU budget added on `fix/security-hardening-review`; regression fix (module bricking, W1-1) required before merge | +| 2 | CRITICAL | Plugin storage has no per-plugin key isolation | OPEN — verify/close in P3 | +| 3 | CRITICAL | Plugin per-command ACL missing (auto-registration) | OPEN — verify/close in P3 | +| 4 | CRITICAL | No rate limit on event delivery to plugins | OPEN — verify/close in P3 | +| 5 | CRITICAL | Plugin HTTP capability allows data exfiltration to allowlisted hosts | OPEN — partially mitigated by SSRF hardening + allowlist; document residual risk in P3 | +| 6 | HIGH | `Server/store/` untested | SUPERSEDED — `store/` package is being removed in P4 (single data layer); tests move to in-memory SQLite | +| 7 | HIGH | Client `src/lib`/`src/stores` <10% unit coverage | CLOSED since audit — large vitest suite exists (113 files); suite health tracked in P2 | +| 8 | HIGH | Unpinned critical npm packages | OPEN — review in P2 | +| 9 | MEDIUM | auth_handler bypasses service layer | OPEN — P4 consolidation candidate | +| 10 | MEDIUM | Audit-trail write failures silently ignored | OPEN — cheap fix, fold into P1 | +| 11 | MEDIUM | E2E not in CI / no .nvmrc | IN PROGRESS — nightly non-blocking e2e job planned in P2 | + +--- + ## Table of Contents 1. [Architecture](#1-architecture) 2. [Code Quality](#2-code-quality) diff --git a/docs/plans/slash-commands.md b/docs/plans/slash-commands.md index 003cacaf..0fa564d2 100644 --- a/docs/plans/slash-commands.md +++ b/docs/plans/slash-commands.md @@ -2,7 +2,7 @@ **Status:** design only, not implemented **Owner:** TBD -**Tracks:** PHASE_D_PARITY_TODO.md item #1 +**Tracks:** deferred feature backlog (post-beta; see CHANGELOG "Deferred work") **Estimated effort:** 1–2 weeks of focused work ## Why