36 Commits

Author SHA1 Message Date
Dave Kempe 994f138685 packaging: build guacenc and ship it in every package
guacenc, from guacamole-server, converts .guac recordings to video and is
what MP4 downloads (#241) run. Stop passing --disable-guacenc in
build-deb.sh, the release workflow, install.sh, the Dockerfile and
dev.sh, and ship /opt/rustguac/bin/guacenc in the .deb (debian/rules),
the Docker runtime image and the release tarball (install-release.sh
installs it when present). It needs only the ffmpeg libraries guacd is
already built and shipped with, so no new dependencies.

configure leaves guacenc out quietly when an ffmpeg library is missing,
like the protocols, so check-guacd-plugins.sh now also fails the build
when guacenc was not built.
2026-10-18 13:23:14 +11:00
Dave Kempe 68bce184df packaging: build SPICE into the .deb, and fail any build missing a protocol
The release workflow built guacd for the .deb without --with-spice and
without libspice-client-glib-2.0-dev, so every .deb from v1.9.0 to
v1.11.0 lacked SPICE and Proxmox consoles failed with "Support for
protocol spice is not installed". Docker and install.sh were fine.

guacd's configure leaves out a protocol whose library is missing even
when asked for it, which is why nothing failed. scripts/check-guacd-plugins.sh
now fails the build unless rdp, ssh, vnc and spice were all built; it
runs after make install in release.yml, build-deb.sh, install.sh and the
Dockerfile.

Also:
- --disable-kubernetes, not --without-kubernetes, which configure ignored,
  so every build shipped an unused Kubernetes plugin
- the Dockerfile's trailing || true covered the whole guacd build, so a
  failed compile still produced an image; it now covers only the
  optional FreeRDP plugin copy it was meant for
2026-10-18 07:51:28 +11:00
Dave Kempe 220f78674c deps: sha2 0.11.1, toml 1.1.8, serde_json 1.0.154, tokio-util 0.7.20; ci: setup-node v7
Dependabot #287-#291, taken together.
2026-10-17 15:13:33 +11:00
Jad Seifeddine c934065a84 tests: Playwright end-to-end harness, with a 1710px layout spec
A browser test harness under tests/e2e: serve.mjs serves the real static
tree over HTTP and lib/api.mjs answers /api/* from a small fixture address
book, recording every request the page makes, so the shipped pages run
against data the test controls without Vault, guacd or a session. CI gains
an e2e job that installs Chromium and runs the suite.

The first spec pins #252: at 1710px the connections, recordings and reports
tables fit inside the viewport and nothing scrolls sideways.

(cherry picked from commit 4ae28efec0)
2026-10-13 08:55:19 +11:00
Dave Kempe a43b81f9d4 ci: run the plain-node client tests
tests/*.mjs pin browser-client behaviour (hardware H.264 fallback,
monitor pointer, coalesced drags, and now the #251 framebuffer fit) but
nothing ran them. The check job installs Debian's nodejs (20.x on
trixie) and runs each; they need no browser and no npm packages.
2026-10-12 19:31:23 +11:00
Dave Kempe 83a91109d9 ci: run the test suite
CI ran fmt, clippy, build and audit but never `cargo test`, so none of the
310 tests had ever run on a pull request. That included the regression
tests written specifically to guard past incidents: the recording rotation
that deleted in-progress files, and the credential-variable folder scan
that hid subfolder-granted entries from operators. Both could have been
reintroduced without CI noticing.

Runs the debug profile rather than --release on purpose. debug_assertions
and integer overflow checks are compiled in there and switched off in a
release build, and the wire-protocol parser is where an overflow would
otherwise pass silently.

Noted by @joshsol1 on #230.
2026-09-30 09:31:03 +10:00
Dave Kempe a360ee1fdb deps: bump futures-util, russh, uuid, bollard, rusqlite, base64, rcgen
Routine dependabot patch bumps (closes the open PRs on push), plus the
docker/login-action CI action 4.5.2 -> 4.6.0.
2026-08-28 15:24:48 +10:00
dependabot[bot] 51fc1e1577 ci: bump docker/login-action from 4 to 4.5.2 (#191)
Bumps [docker/login-action](https://github.com/docker/login-action) from 4 to 4.5.2.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v4...v4.5.2)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.5.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-10 20:42:12 +10:00
Dave Kempe 39075d8fa3 build(guacd): uplift pinned guacd 1.6.0-218 -> 1.6.0-302 (main 6719b20d)
- Bump pin 2980cf0 -> 6719b20d in Dockerfile, install.sh, release.yml,
  docs/installation.md. -Werror verified clean on the new base (the
  GUACAMOLE-2221 pin reason no longer applies).
- Drop patch 006 (terminal OSC-consume): upstreamed as GUACAMOLE-2213
  (guac_terminal_unknown_osc).
- Rebase patch 004 (H.264 display worker) onto the refactored libguac
  display internals: the queued-H.264-frame free moved into the deferred
  guac_display_free_removed_layers path.
- Patches 001/002/003/005/007 unchanged (apply clean on new base).

Local build green under -Werror (guacd + rdp/ssh/vnc). H.264 passthrough
still needs runtime verification on an xrdp+x264 target.
2026-07-23 09:38:56 +10:00
Dave Kempe b52fd1df82 ci: bump actions/checkout v6->v7, actions/cache v5->v6 2026-07-20 11:06:34 +10:00
Dave Kempe 9dbdc17843 Security hardening + test harness expansion
Security audit (v1.6.1 cycle) findings:

- Shadow tokens: each use now writes a shadow_used entry to
  token_audit_log with the connecting IP. Prior behaviour audited
  only the mint, so a leaked token could be replayed within its
  10-minute TTL with no observable record.

- OIDC groups claim: bound per-name length to 256 bytes (UTF-8
  boundary preserved) and array size to 64. A misconfigured or
  compromised IdP could previously bloat the seen_groups table
  unbounded.

- .cargo/audit.toml formalises the rsa (RUSTSEC-2023-0071) and
  rustls-pemfile (RUSTSEC-2025-0134) advisory ignores with
  rationale, replacing the inline --ignore flag in CI. New
  advisories on those crates will still surface.

Small defence-in-depth: WebSocket Origin/Host compare is now
case-insensitive (DNS is canonical) — previously exact-match.

Test harness grows from 150 to 215 tests:

- Pure-function regression coverage: OIDC groups cap, shadow-token
  validation matrix (owner/shadow/invalid/expired/IDOR), Vault
  path traversal, VDI username sanitization, recording-name
  hardening, JPEG magic bytes, Guacamole protocol parser
  adversarial cases (overflow length, UTF-8 split, malformed
  frames, buffer cap, streaming boundaries), Origin/Host matcher.

- Async + in-memory state: SessionManager test helper bypassing
  disk/browser, owner/shadow validation end-to-end, mint prunes
  expired, shadow is session-scoped (IDOR guard), disconnect_viewer
  saturating decrement, seen_groups DB bounds, rate-limit layer
  burst -> 429 (proves tower_governor is actually applied).

Behaviour-preserving refactors to support testing:
check_share_token_match (from validate_share_token),
is_jpeg_magic (from thumbnail PUT), origin_host_matches (from
ws_handler CSWSH check).
2026-04-19 14:46:07 +10:00
Dave Kempe c21131b1e1 release: split Docker build to native runners + refresh locks
Docker pipeline
- Multi-arch build on ubuntu-latest with QEMU was the long pole of
  the release pipeline (arm64 took 30–60 min vs ~5 min for the
  native-arm .deb job). Split into three jobs:
  - build-docker-amd64 on ubuntu-latest
  - build-docker-arm64 on ubuntu-24.04-arm (same native runner the
    arm64 .deb build uses)
  - build-docker-manifest combines them with
    `docker buildx imagetools create` into the consumer-facing
    `sol1/rustguac:VER` and `:latest` multi-arch manifest lists.
- Consumer-facing tags are unchanged — `docker pull
  sol1/rustguac:latest` still auto-picks the right arch. The per-arch
  intermediate tags (`:VER-amd64`, `:VER-arm64`) appear as byproducts
  on Docker Hub but aren't required.
- The release job now depends on build-docker-manifest instead of
  the removed build-docker.

Dependency refresh (closes 5 low-severity Dependabot alerts)
- `cargo update` at root and in fuzz/:
  - rustls-webpki: fuzz/ was 0.103.x < 0.103.12 → now 0.103.12
    (main lock was already there from v1.5.5)
  - rand 0.9.x: < 0.9.3 → 0.9.4 (GHSA-cq8v-f236-94qc: unsound with
    a custom logger inside rand::rng())
  - rand 0.10.0 → 0.10.1 (same GHSA)
- We don't hook loggers into rand so the unsoundness never triggered
  in practice, but getting to clean alerts is worth a lockfile bump.
2026-04-18 22:21:47 +10:00
dependabot[bot] 5143df15f4 ci: bump softprops/action-gh-release from 2 to 3 (#104)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-18 21:55:05 +10:00
Dave Kempe faf941eb06 Pin guacamole-server to known-good commit 2980cf0
Upstream GUACAMOLE-2221 introduced -Werror=maybe-uninitialized failure.
Pin all build paths (CI, Dockerfile, install.sh) to last known-good commit.
Update guacd version deliberately, not on every upstream push.
2026-04-01 10:33:48 +11:00
Dave Kempe 63909484c0 Remove RPM build from release pipeline (FreeRDP 3 only) 2026-03-28 22:44:45 +11:00
Dave Kempe 07ebb33702 v0.9.1: Onboarding wizard, security updates, packaging fix
- Onboarding wizard for new users (was missing from v0.8.1-v0.9.0)
- Settings menu label visibility improvement
- EnvironmentFile=-/opt/rustguac/env in systemd service
- russh 0.57→0.58.1 (drops vulnerable libcrux-sha3)
- aws-lc-sys 0.38→0.39 (RUSTSEC-2026-0044, 0048)
- rustls-webpki 0.103.9→0.103.10 (RUSTSEC-2026-0049)
- Removed RUSTSEC-2026-0074 ignore (no longer needed)
2026-03-27 10:32:47 +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 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
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
dependabot[bot] 1f1032242d ci: bump docker/login-action from 3 to 4
Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/login-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 09:21:16 +00:00
dependabot[bot] b21ddabf8a ci: bump docker/build-push-action from 6 to 7
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6...v7)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-06 09:21:08 +00:00
dependabot[bot] 20b8d3fc4a ci: bump docker/setup-qemu-action from 3 to 4
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3 to 4.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-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 09:21:05 +00:00
Dave Kempe ea72c52a31 v0.5.0: Theme system, ARM64 builds, Docker fixes, dependency updates
Theme system:
- 6 built-in presets (dark, light, high-contrast, terminal, nord, corporate)
- Admin configures preset + per-color overrides in [theme] config section
- Client-side theme switching via localStorage (flash-free)
- All static pages updated with 28 CSS custom properties

Proxy telemetry:
- Track which side terminated connection (guacd/browser/cancelled)
- Timing-based log levels (guacd close <5s = warning)
- Clamp session dimensions to safe ranges (width 640-8192, height 480-8192, DPI 16-384)

Docker fixes (#37):
- Fix port mismatch: Dockerfile now uses 8089 consistently
- Auto-generate admin API key on first run
- Add API key setup docs and recordings volume to compose example

ARM64 support:
- Multi-platform Docker builds (linux/amd64 + linux/arm64)
- Native ARM64 .deb and tarball builds via ubuntu-24.04-arm runner

Dependency updates:
- rustls 0.23.37, chrono 0.4.44, clap 4.5.60, toml 1.0.3
- futures-util 0.3.32, uuid 1.21.0, pulldown-cmark 0.13.1
- actions/upload-artifact v7, actions/download-artifact v8

Also: FreeRDP 3.x NULL deref patch (003), .gitignore for .playwright-mcp/

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 15:05:41 +11:00
Dave Kempe 32c60469e4 Merge pull request #5 from sol1/dependabot/github_actions/actions/checkout-6
ci: bump actions/checkout from 4 to 6
2026-02-07 11:25:24 +11:00
Dave Kempe bf49438ae7 Merge pull request #6 from sol1/dependabot/github_actions/actions/upload-artifact-6
ci: bump actions/upload-artifact from 4 to 6
2026-02-07 11:25:12 +11:00
Dave Kempe 577a28dbcb Merge pull request #7 from sol1/dependabot/github_actions/actions/download-artifact-7
ci: bump actions/download-artifact from 4 to 7
2026-02-07 11:25:00 +11:00
dependabot[bot] 1569fe234e ci: bump actions/checkout from 4 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-07 00:13:39 +00:00
dependabot[bot] 868c5ef2c9 ci: bump actions/upload-artifact from 4 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-07 00:13:38 +00:00
dependabot[bot] c40fca09a7 ci: bump actions/cache from 4 to 5
Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-07 00:13:37 +00:00
dependabot[bot] 468bb8d342 ci: bump actions/download-artifact from 4 to 7
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v7)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-07 00:13:36 +00:00
Dave Kempe 05f39d3d1f Patch dependency vulnerabilities, update Rust to 1.93
- bytes 1.11.0 -> 1.11.1 (integer overflow fix)
- time 0.3.41 -> 0.3.47 (stack exhaustion DoS fix)
- Ignore RUSTSEC-2023-0071 (rsa timing attack, no fix available)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 10:08:08 +11:00
Dave Kempe fead6bbd9b Add supply chain security: Dependabot, cargo audit in CI
- Enable Dependabot for weekly Cargo and GitHub Actions updates
- Add cargo audit step to CI pipeline
- Patch bytes 1.11.0 -> 1.11.1 (integer overflow fix)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 10:03:18 +11:00
Dave Kempe 67101e27ce Initial public release
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 14:38:53 +11:00