131 Commits

Author SHA1 Message Date
Dave Kempe d2dbfe3b2e Add Windows RDP performance tuning script (contrib) v0.9.0 2026-03-24 20:52:51 +11:00
Dave Kempe 6489bab9a9 CI: ignore RUSTSEC-2026-0074 (libcrux-sha3 via russh, no update available) 2026-03-24 20:49:23 +11:00
Dave Kempe 566336aadb CI: ignore yanked crate warnings in audit (digest 0.11.1 via russh) 2026-03-24 20:38:49 +11:00
Dave Kempe 3bf1762d87 v0.9.0: RDP audio, GFX pipeline, video performance
Audio:
- RDP audio output now works through guacamole. Advertise audio/L16
  and audio/L8 mimetypes in the guacd handshake, and explicitly set
  disable-audio=false. Fixed mimetype mismatch that silently prevented
  guacd from creating audio streams.
- Browser AudioContext auto-resumed on user interaction (click/keydown)
  to comply with autoplay policy.

Video performance:
- Per-entry GFX pipeline toggle (enable_gfx) — enables RemoteFX codec
- Per-entry desktop composition toggle (enable_desktop_composition)
- Per-entry force lossless toggle (force_lossless) — PNG-only mode
- WebSocket proxy buffer increased from 8KB to 64KB
- Video Performance section in address book UI for RDP entries

Documentation:
- RDP Video Performance guide with Windows server tuning (AVC444,
  60fps, GPU encoding) and Linux xrdp setup (Debian 13)
- contrib/setup-xrdp-gfx.sh — automated GFX/H.264 setup for xrdp
- contrib/setup-xrdp-audio.sh — automated PulseAudio module build
2026-03-24 20:25:05 +11:00
Dave Kempe 7acbb302fa v0.8.5: Reports, session history, enriched recordings
Session history:
- New session_history SQLite table tracks all sessions with user,
  entry, folder, hostname, duration, and recording file
- Automatic cleanup via session_history_retention_days config (default 90)
- 8 new unit tests for session history DB functions

Reports page (poweruser+ only):
- Summary cards: total sessions, hours, unique users, active now
- Sortable/filterable session history table with pagination
- Top Connections and Top Users leaderboards
- CSV export for session history with filters

Enriched recordings:
- Recording .meta sidecars now include user, folder, entry name, session type
- Recordings API returns enriched metadata from .meta files
- Recordings page shows User, Entry, Folder columns

Other:
- Reports nav link on all pages, hidden for operator/viewer roles
- Reports documentation in docs/reports.md
- Onboarding wizard for new users (role-scoped, dismissable)
- Settings menu label visibility improvement
- Fixed stale credential variable test (hyphen support)
v0.8.5
2026-03-22 20:36:26 +11:00
Dave Kempe e07af6fdb1 Fix rustls-webpki in fuzz/Cargo.lock (RUSTSEC-2026-0049) v0.8.1 2026-03-22 09:42:15 +11:00
Dave Kempe a729ce0900 v0.8.1: Security fixes, dependency updates, onboarding wizard
Security:
- aws-lc-sys 0.38.0 → 0.39.0 (RUSTSEC-2026-0044, RUSTSEC-2026-0048)
- rustls-webpki 0.103.9 → 0.103.10 (RUSTSEC-2026-0049)
- Fixed fuzz/Cargo.lock with same aws-lc-sys update

Dependencies:
- rusqlite 0.38.0 → 0.39.0 (bundled SQLite 3.51.3)
- russh 0.57.1 → 0.58.0 (21% throughput improvement)
- clap 4.5.60 → 4.6.0
- toml 1.0.4 → 1.0.7
- tracing-subscriber 0.3.22 → 0.3.23
- libc 0.2.182 → 0.2.183

Features:
- Onboarding wizard for new users (role-scoped, dismissable)
- Settings menu label (was just a cog icon)
- Clipboard diagnostic logging in WebSocket proxy
2026-03-21 16:58:10 +11:00
Dave Kempe edacc94c5a Fix security audit: update aws-lc-sys, rustls-webpki
- aws-lc-sys 0.38.0 → 0.39.0 (fixes RUSTSEC-2026-0044, RUSTSEC-2026-0048)
- rustls-webpki 0.103.9 → 0.103.10 (fixes RUSTSEC-2026-0049)
- aws-lc-rs 1.16.1 → 1.16.2
2026-03-21 15:34:38 +11:00
Dave Kempe f8cc1d0e96 Merge pull request #77 from sol1/dependabot/cargo/rusqlite-0.39.0
deps: bump rusqlite from 0.38.0 to 0.39.0
2026-03-21 15:30:47 +11:00
Dave Kempe 90794facdb Merge pull request #68 from sol1/dependabot/cargo/clap-4.6.0
deps: bump clap from 4.5.60 to 4.6.0
2026-03-21 14:51:34 +11:00
Dave Kempe fb21e8c9de Merge pull request #74 from sol1/dependabot/cargo/russh-0.58.0
deps: bump russh from 0.57.1 to 0.58.0
2026-03-21 14:51:32 +11:00
Dave Kempe e54c59d7bb Merge pull request #70 from sol1/dependabot/cargo/libc-0.2.183
Patch bump, CI passes.
2026-03-21 14:25:10 +11:00
Dave Kempe d1ac77caca Merge pull request #75 from sol1/dependabot/cargo/tracing-subscriber-0.3.23
Patch bump, CI passes.
2026-03-21 14:25:07 +11:00
Dave Kempe 44d3d7a0e9 Merge pull request #76 from sol1/dependabot/cargo/toml-1.0.7spec-1.1.0
Patch bump, CI passes.
2026-03-21 14:25:05 +11:00
Dave Kempe 74f67d0ed9 Add scale testing harness and results
Bench suite: k6 load tests, Python Guacamole protocol client,
Vault population scripts, server metrics collector, xrdp target setup.

Results from 100 concurrent RDP session test on 16 GB server:
- rustguac: 45 MB RSS, 9 threads — not the bottleneck
- guacd/FreeRDP: 15.8 GB RSS (~158 MB/session) — primary bottleneck
- Zero errors, p95 session create 98ms, p95 WS connect 63ms
- Address book: 982 entries loads in 2.4s (sequential Vault reads)
2026-03-21 12:38:03 +11:00
Dave Kempe 35f7dd519c Fix Docker config copy command in docs (#73)
Add --entrypoint cat to override the container's default entrypoint
which starts guacd/rustguac instead of running the cat command.
2026-03-21 07:52:57 +11:00
dependabot[bot] 7185c31d80 deps: bump rusqlite from 0.38.0 to 0.39.0
Bumps [rusqlite](https://github.com/rusqlite/rusqlite) from 0.38.0 to 0.39.0.
- [Release notes](https://github.com/rusqlite/rusqlite/releases)
- [Changelog](https://github.com/rusqlite/rusqlite/blob/master/Changelog.md)
- [Commits](https://github.com/rusqlite/rusqlite/compare/v0.38.0...v0.39.0)

---
updated-dependencies:
- dependency-name: rusqlite
  dependency-version: 0.39.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 09:17:18 +00:00
dependabot[bot] bc220b935d deps: bump toml from 1.0.4+spec-1.1.0 to 1.0.7+spec-1.1.0
Bumps [toml](https://github.com/toml-rs/toml) from 1.0.4+spec-1.1.0 to 1.0.7+spec-1.1.0.
- [Commits](https://github.com/toml-rs/toml/compare/toml-v1.0.4...toml-v1.0.7)

---
updated-dependencies:
- dependency-name: toml
  dependency-version: 1.0.7+spec-1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 09:17:06 +00:00
dependabot[bot] 1d57611151 deps: bump tracing-subscriber from 0.3.22 to 0.3.23
Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.3.22 to 0.3.23.
- [Release notes](https://github.com/tokio-rs/tracing/releases)
- [Commits](https://github.com/tokio-rs/tracing/compare/tracing-subscriber-0.3.22...tracing-subscriber-0.3.23)

---
updated-dependencies:
- dependency-name: tracing-subscriber
  dependency-version: 0.3.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 09:16:57 +00:00
dependabot[bot] 954bf745a5 deps: bump russh from 0.57.1 to 0.58.0
Bumps [russh](https://github.com/warp-tech/russh) from 0.57.1 to 0.58.0.
- [Release notes](https://github.com/warp-tech/russh/releases)
- [Commits](https://github.com/warp-tech/russh/compare/v0.57.1...v0.58.0)

---
updated-dependencies:
- dependency-name: russh
  dependency-version: 0.58.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 09:16:46 +00:00
dependabot[bot] 49649179db deps: bump libc from 0.2.182 to 0.2.183
Bumps [libc](https://github.com/rust-lang/libc) from 0.2.182 to 0.2.183.
- [Release notes](https://github.com/rust-lang/libc/releases)
- [Changelog](https://github.com/rust-lang/libc/blob/0.2.183/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/libc/compare/0.2.182...0.2.183)

---
updated-dependencies:
- dependency-name: libc
  dependency-version: 0.2.183
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-13 09:20:23 +00:00
dependabot[bot] e6d3879869 deps: bump clap from 4.5.60 to 4.6.0
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.60 to 4.6.0.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.60...clap_complete-v4.6.0)

---
updated-dependencies:
- dependency-name: clap
  dependency-version: 4.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-13 09:19:55 +00:00
Dave Kempe 6bafc79d60 v0.8.0: Credential variables, bug fixes
Credential variables — address book entries reference $domain_username /
$domain_password instead of storing static credentials. Users fill in their
own values via My Credentials (gear menu), stored per-user in Vault KV.
All variables set → silent launch; missing → prompted. Hyphens allowed in
variable names. Docs section added.

Bug fixes:
- Rate limiting disabled by default; opt-in via rate_limit = true (#62)
- Docker: copy FreeRDP guac-common-svc plugins to runtime image (#64)
- Docker/install: add chromium-sandbox package for non-root web sessions (#61)
- Logo: skip redundant JS src= when server-side branding already set (#65)
- Sessions page: hide Open/Share buttons for non-active sessions (#63)
- Drive: expose drive_configured in /api/auth/status, warn in UI when
  [drive] not configured
- install.sh: verify FreeRDP plugin installation

UI polish:
- Nav bar: border separator + spacing between header and nav on all pages
- Address book: password show/hide toggle on all password fields
- Drive diagnostic logging (session.rs, websocket.rs, client.html)

Closes #61, #62, #63, #64, #65
v0.8.0
2026-03-13 13:47:11 +11:00
Dave Kempe 6b1ad57fdc v0.7.2: Fix theme branding flash, Docker writable paths
- Server-side HTML branding: site_title, h1, logo_url baked in at
  startup so first paint shows configured branding (#59)
- Docker: pre-create certs/, drives/, scripts/ dirs and chown for
  non-root user so startup loaders can write config/certs (#57)
v0.7.2
2026-03-12 21:13:25 +11:00
Dave Kempe 991a8cf9e6 Fix Docker writable paths for non-root user (#57)
Pre-create certs/, drives/, scripts/ dirs and chown them to the
rustguac user. Also chown the top-level /opt/rustguac dir (non-recursive)
so startup loaders can write config.toml and cert material without
needing root.
2026-03-12 21:12:18 +11:00
Dave Kempe d559da5775 Fix theme flash: server-side branding in HTML (#59)
Replace default "rustguac" site title, h1 headings, and logo URL in
HTML at startup so the first paint already shows configured branding.
2026-03-12 21:10:30 +11:00
Dave Kempe 364b6772e4 v0.7.1: Guacamole import CLI, migration docs
- Wire up import-guacamole CLI subcommand (--file, --folder, --scope, --dry-run)
- Fix non-UTF-8 SQL dumps crashing import (use lossy UTF-8 decoding)
- Add migration.md to embedded docs
v0.7.1
2026-03-12 21:03:02 +11:00
Dave Kempe 62c92aa260 Update screenshots: web automation UI, clone button, sanitised entries
- web_connection.png: Full web entry editor showing Banner, Automation
  section (username, password, login script dropdown, autofill), Allowed
  Domains, Recording Settings, clipboard controls, SSH tunnels
- address_book.png: Updated to show clone button column, sanitised
  hostnames and folder names
- screenshots.md: Updated web session editor description
2026-03-12 08:09:31 +11:00
Dave Kempe 7bf797c9e8 Merge pull request #53 from sol1/dependabot/cargo/fuzz/quinn-proto-0.11.14
Bump quinn-proto from 0.11.13 to 0.11.14 in /fuzz
2026-03-12 07:35:52 +11:00
Dave Kempe 0c98aba190 v0.7.0: Banner field, automation UI, fix CDP policy, login script filtering
- Add optional `banner` field to address book entries (shown before session
  starts, user must click Continue). No longer auto-populates from display_name.
- Restructure web entry form: username, password, login script, and autofill
  collapsed under a collapsible "Automation" section.
- Filter login scripts dropdown to .js/.sh/.py files only (skip package.json etc.)
- Fix CDP/login scripts: change DeveloperToolsAvailability policy from 2 (disabled)
  to 0. DevTools UI remains blocked by chrome://* URLBlocklist. Fixes login script
  automation that was silently broken by the v0.6.0 security hardening.
- Update Dockerfile, debian/postinst, install.sh with corrected policy.
- Update docs/security.md and docs/web-sessions.md.
v0.7.0
2026-03-11 23:01:22 +11:00
Dave Kempe d63cc4a62c Fix login script fetch: use apiHeaders() not authHeaders()
The loadLoginScripts() function called the non-existent authHeaders(),
causing a JS error that silently prevented web entry edit/clone modals
from opening.
2026-03-11 22:01:34 +11:00
Dave Kempe d07b8ae225 v0.7.0: Login script dropdown, batch address book, Docker non-root
New features:
- Login script selector: dropdown populated from server scripts dir (#52)
- Batch address book endpoint eliminates N+1 API calls (#56)
- Clone button for address book entries (#56)
- Increased API rate limits (#56)

Fixes:
- Docker container runs as non-root user (#50)
- Conditional --no-sandbox when running as root (#50)
- Post-spawn Chromium liveness check with stderr capture (#50)

Docs:
- Theme/branding configuration guide (#55)
- Vault metadata policy for deletes (#54)
- TLS config clarification (no boolean toggle)
2026-03-11 21:54:38 +11:00
Dave Kempe a57af11413 Run Docker container as non-root user (#50)
Create a dedicated rustguac user instead of running as root. This
fixes the Chromium sandbox issue (SUID helper works as non-root)
and is better security practice for containers.

Chromium crashpad needs a real home directory, so the user gets
/home/rustguac. Data/recording dirs are chowned at build time.
2026-03-11 21:20:20 +11:00
Dave Kempe 5a44d02509 Add --no-sandbox for root/Docker, post-spawn Chromium liveness check (#50)
Chromium refuses to start as root without --no-sandbox, causing a
silent black screen in Docker. Now detected via euid check — bare
metal installs with the SUID sandbox helper are unaffected.

Also adds a 500ms post-spawn liveness check: if Chromium exits
immediately (sandbox failure, missing libs, etc), stderr is captured
and logged, and the session fails with a clear error instead of
leaving Xvnc running with a black screen.
2026-03-11 21:11:01 +11:00
Dave Kempe 4f66ea35fd Add clone button for address book entries (#56)
Clone opens the entry form in create mode pre-populated with the
source entry's settings and a "-copy" name suffix. Credentials are
not copied (security by design) — user re-enters or uses prompt.

Useful for duplicating similar entries (e.g. same config, different
host) and as a workaround for rename (clone + delete original).
2026-03-11 20:58:54 +11:00
Dave Kempe 3c3217197b Batch address book endpoint, increase rate limits (#56)
Add GET /api/addressbook that returns all visible folders with entries
in a single response. Eliminates N+1 fetch pattern (list folders, then
entries per folder) that triggered 429 rate limiting on page load.

Address book UI now uses batch endpoint for initial load, falls back to
per-folder fetch after mutations (create/edit/delete).

Rate limits increased: API 20/s burst 100 (was 5/s burst 30), session
create 2/s burst 10 (was 1/s burst 5), WebSocket 5/s burst 50 (was
1/s burst 20).
2026-03-11 20:55:56 +11:00
Dave Kempe a28816eca6 Document [theme] section: presets, logo_url, colour overrides, branding example (#55) 2026-03-11 20:31:17 +11:00
Dave Kempe 5a5bd8ff75 Document Vault KV v2 metadata policy requirement for deletes (#54)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:05:35 +11:00
dependabot[bot] 99b482a994 Bump quinn-proto from 0.11.13 to 0.11.14 in /fuzz
Bumps [quinn-proto](https://github.com/quinn-rs/quinn) from 0.11.13 to 0.11.14.
- [Release notes](https://github.com/quinn-rs/quinn/releases)
- [Commits](https://github.com/quinn-rs/quinn/compare/quinn-proto-0.11.13...quinn-proto-0.11.14)

---
updated-dependencies:
- dependency-name: quinn-proto
  dependency-version: 0.11.14
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-11 00:18:47 +00:00
Dave Kempe 04111ab177 Clarify TLS config docs: no boolean toggle, presence of fields controls behaviour
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 07:43:19 +11:00
Dave Kempe df402944f3 v0.6.2: Fix mTLS identity parsing (#51), decouple server/guacd TLS (#49)
- Rewrite Vault mTLS client to build rustls ClientConfig directly,
  bypassing reqwest::Identity::from_pem() which fails with rustls
  backend for PKCS#8 keys from OpenBao/Vault PKI
- Make cert_path/key_path optional in [tls] — guacd TLS now works
  independently of server HTTPS (for reverse proxy setups)
- Add webpki-roots direct dependency for custom TLS config
- Add mTLS tests: PKCS#8 key, fullchain cert, tls_skip_verify
- Update docs: configuration.md, security.md

Closes #51, closes #49

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.6.2
2026-03-11 07:37:45 +11:00
Dave Kempe f40fe6f37e Update quinn-proto 0.11.13 → 0.11.14 (RUSTSEC-2026-0037)
Fix high-severity DoS vulnerability in quinn-proto (transitive dep).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.6.1
2026-03-10 11:56:39 +11:00
Dave Kempe da5e1907fa Fix clippy warnings in import.rs for CI
- Allow dead_code on module (used via CLI subcommand, not direct calls)
- Simplify bool toggle: in_quote = !in_quote
- Use iterator instead of index loop in deduplicate_names

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 11:49:33 +11:00
Dave Kempe ac77bfab98 v0.6.1: Vault mTLS support, comprehensive test suite (87 tests)
Vault/OpenBao mTLS:
- Add ca_cert, client_cert, client_key fields to [vault] config
- Supports custom CA certificates and mutual TLS authentication
- Clear error messages for missing files, invalid PEM, missing key
- Fixes #48 (OpenBao requiring client certificates)

Test suite (8 → 87 tests):
- vault: 13 tests (TLS client builder, config deserialization, name validation)
- auth: 11 tests (role hierarchy, effective role capping, XFF/trusted proxy, has_role)
- session: 12 tests (CIDR network checks, autofill JSON parsing, placeholder substitution)
- browser: 8 tests (Chromium password encryption, Login Data SQLite, RangeAllocator)
- config: 8 tests (preset resolution, theme overrides, defaults, vault config)
- api: 6 tests (HTML escaping, recording name path traversal protection)
- db: 7 tests (SHA-256 hashing, key generation, user groups parsing)
- import: 12 tests (already existed, now wired into module tree)
- protocol: 8 tests (already existed)

Other:
- Wire import.rs into module tree (fixes orphaned tests)
- Document mTLS config in configuration.md and integrations.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 11:44:46 +11:00
Dave Kempe 8945a33208 Merge pull request #42 from sol1/dependabot/github_actions/docker/build-push-action-7
ci: bump docker/build-push-action from 6 to 7
2026-03-07 07:33:39 +11:00
Dave Kempe aea2e5da21 Merge pull request #43 from sol1/dependabot/github_actions/docker/setup-buildx-action-4
ci: bump docker/setup-buildx-action from 3 to 4
2026-03-07 07:33:27 +11:00
Dave Kempe 4e85db3022 Merge pull request #44 from sol1/dependabot/github_actions/docker/login-action-4
ci: bump docker/login-action from 3 to 4
2026-03-07 07:33:14 +11:00
Dave Kempe b5d31b13ce Add dedicated web sessions doc, fix credential docs, global policy warning
- New docs/web-sessions.md: comprehensive guide with autofill, domain
  allowlisting, login scripts (Playwright + shell examples), clipboard
  control, API reference, and troubleshooting
- Fix integrations.md: web sessions DO use credentials (for autofill
  and login scripts)
- Add global Chromium policy warning to security.md and web-sessions.md
- Add web-sessions.md to in-app docs (build.rs)
- Condense overview.md web section to link to new dedicated doc

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.6.0
2026-03-07 07:30:09 +11:00
Dave Kempe a11395df7c Merge pull request #47 from sol1/dependabot/cargo/tokio-1.50.0
deps: bump tokio from 1.49.0 to 1.50.0
2026-03-07 07:20:17 +11:00
dependabot[bot] deb53f16ec ci: bump docker/setup-buildx-action from 3 to 4
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3 to 4.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-06 20:20:14 +00:00