Files
OwnCord/Client/src-tauri/Cargo.toml
T
64d2e1087b chore: merge main into dev to unblock the alpha.4 release PR (#1425)
* ci(deps): bump anthropics/claude-code-action (#1404)

Bumps the actions-dependencies group with 1 update: [anthropics/claude-code-action](https://github.com/anthropics/claude-code-action).


Updates `anthropics/claude-code-action` from 1.0.193 to 1.0.199
- [Release notes](https://github.com/anthropics/claude-code-action/releases)
- [Commits](https://github.com/anthropics/claude-code-action/compare/9d7150bc8a3dae8149739a88019d192b579ad90c...dcb57747bfceeaa1fa72638cae52295d1d853d4a)

---
updated-dependencies:
- dependency-name: anthropics/claude-code-action
  dependency-version: 1.0.199
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): pin rfd to tauri-plugin-dialog's major to unblock the cargo group (#1406)

The cargo-dependencies group PR (#1405) fails Rust Unit Tests on Linux:

    error: failed to run custom build command for `rfd v0.17.2`
    You need to choose at least one backend: `gtk3` or `xdg-portal`
    features for x86_64-linux

rfd is not really ours. It arrives in the tree via tauri-plugin-dialog,
which pins ^0.16; we declare it directly only for the fatal-startup
message box in lib.rs, where the Tauri app never finished building and
the plugin has no AppHandle to run a dialog through.

Cargo unifies features only within a semver-compatible version group, so
while both wanted ^0.16 there was a single rfd in the graph and the
plugin's backend features covered our `default-features = false`
declaration too. Bumping our direct dep to 0.17 forks rfd into two
crates: the plugin keeps 0.16.0 with its features, ours resolves to
0.17.2 with none, and rfd 0.17 added a build.rs assertion that aborts
the Linux build when no backend feature is set. Confirmed in the PR's
lockfile, which carries both 0.16.0 and 0.17.2.

Adding a Linux backend feature would be the wrong fix: it would paper
over the fork and still build rfd twice on every platform for one error
dialog. Our version has to track the plugin's instead, so ignore
semver-minor rfd updates (0.16 -> 0.17 for a 0.x crate) until
tauri-plugin-dialog moves. Patch updates inside 0.16.x still flow.

The remaining five crates in the group are unaffected; `windows` in fact
consolidates 3 versions down to 2.

Cargo.toml is comment-only here - no dependency, feature, or lockfile
change - so the build is untouched.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* chore(deps): bump log (#1407)

Bumps the cargo-dependencies group with 1 update in the /Client/tauri-client/src-tauri directory: [log](https://github.com/rust-lang/log).


Updates `log` from 0.4.33 to 0.4.34
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/log/compare/0.4.33...0.4.34)

---
updated-dependencies:
- dependency-name: log
  dependency-version: 0.4.34
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* ci(deps): bump anthropics/claude-code-action (#1408)

Bumps the actions-dependencies group with 1 update: [anthropics/claude-code-action](https://github.com/anthropics/claude-code-action).


Updates `anthropics/claude-code-action` from 1.0.199 to 1.0.200
- [Release notes](https://github.com/anthropics/claude-code-action/releases)
- [Commits](https://github.com/anthropics/claude-code-action/compare/dcb57747bfceeaa1fa72638cae52295d1d853d4a...24dcd50c0568f0fc9e9211213a4fd2d9eb15c4e0)

---
updated-dependencies:
- dependency-name: anthropics/claude-code-action
  dependency-version: 1.0.200
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(client): strip tags to a fixpoint inside sanitizePassApprox

CodeQL alert 17 (js/incomplete-multi-character-sanitization, high) fires on
the single-pass `input.replace(/<[^>]*>/g, "")`: a lone replace can in
principle splice a fresh `<...>` out of the text either side of what it
removed. echoNormalize already loops sanitizePassApprox to a fixpoint, so
that was absorbed one level up and the output is unchanged -- but the
repetition is now where a reader (and the query) can see it.

sanitizePassApprox is a comparison normalizer, never rendered output: its
only consumer is the `===` echo match in isUnreconciledEcho. Not a
sanitization boundary, so this is a legibility fix, not a security one.

Client suite 5257/5257, tsc, lint, hygiene all green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(client): put the strip-tags replace inside the loop body

The previous form hoisted the `replace` into the `for` header's init
expression, so CodeQL still reported it (alert 18, line 217 col 21) --
js/incomplete-multi-character-sanitization only credits a repeated
replacement when the call sits in the loop *body*, which is also the shape
the rule's own guidance shows.

Same fixpoint, same output; `while (out.includes("<"))` gives the loop a
real condition instead of `for (;;)`.

Client suite 5257/5257, tsc, lint, prettier green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-27 20:12:52 +00:00

135 lines
6.5 KiB
TOML

[package]
name = "owncord-client"
version = "1.2.0-alpha.4"
edition = "2021"
# Effective minimum: tauri 2.11 declares rust-version = "1.77.2", so the crate
# cannot build below it. Declaring it here enables Cargo's MSRV-aware resolver
# warning instead of silently following whatever toolchain is installed.
rust-version = "1.77.2"
description = "OwnCord Desktop Client"
# Crate-level lint policy so hardening ships with every build, not only the CI
# `cargo clippy -- -D warnings` gate (which downstream/local builds don't run).
# Enables the allow-by-default rustc lints governing the Win32 FFI unsafe path.
[lints.rust]
unsafe_op_in_unsafe_fn = "deny"
unused_unsafe = "warn"
[lib]
name = "owncord_client_lib"
crate-type = ["lib", "cdylib", "staticlib"]
[build-dependencies]
tauri-build = { version = "2", features = [] }
[features]
default = []
devtools = ["tauri/devtools"]
[dependencies]
tauri = { version = "2", features = ["tray-icon"] }
tauri-plugin-store = "2"
tauri-plugin-notification = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
# Self-signed server certificates are handled by the Rust TOFU proxies
# (ws_proxy, livekit_proxy, http_proxy), NOT by the plugin's dangerous-settings
# feature — REST traffic is tunneled through http_proxy which pins the cert to
# the trust-on-first-use fingerprint. The plugin therefore does default TLS
# validation (used only for external hosts: image CDNs, OG previews, YouTube).
tauri-plugin-http = { version = "2.5.7", features = ["rustls-tls"] }
tauri-plugin-opener = "2"
tauri-plugin-dialog = "2"
tauri-plugin-fs = "2"
# Minor-pinned per the plugin's own guidance: configure_client hands it a
# preconfigured rustls ClientConfig, and a 2.x minor bump can change the
# plugin's bundled reqwest/rustls and break that seam at runtime.
tauri-plugin-updater = "2.10"
tauri-plugin-process = "2"
url = "2"
tokio-tungstenite = { version = "0.30.0", features = ["rustls-tls-webpki-roots"] }
futures-util = "0.3.32"
tokio = { version = "1", features = ["sync", "net", "io-util", "rt", "macros"] }
tokio-rustls = { version = "0.26", default-features = false }
rustls = { version = "0.23", default-features = false, features = ["ring", "std"] }
# Mozilla root bundle for the updater's HostScopedVerifier: non-pinned hosts
# (the GitHub installer download) get web-PKI validation. Already in the
# dependency tree via tokio-tungstenite's rustls-tls-webpki-roots feature.
webpki-roots = "1"
ring = "0.17"
log = "0.4"
# Writes Rust logs to a rotating file under the OS app-log dir (alongside the
# TS client-logs) so a shipped user can retrieve them — a release build detaches
# the console, so stdout/stderr logging is otherwise unreachable.
tauri-plugin-log = "2"
# The backend features are NOT optional extras — keyring 3.x declares no
# `default` feature at all, and every platform arm in its lib.rs falls back to
# `pub use mock as default` when its backend feature is off. A bare
# `keyring = "3"` therefore compiles the in-memory mock store on Windows, macOS
# AND Linux: `set_password` succeeds into a per-Entry cell that is dropped when
# the Entry goes out of scope, and the next `Entry::new(..).get_password()`
# returns NoEntry. Nothing ever reaches Credential Manager / Keychain /
# Secret Service. Removing any of these silently reverts a platform to that
# store — `secret_store::tests::compiled_keyring_backend_is_persistent` fails
# the build if that happens.
# windows-native -> Windows Credential Manager (DPAPI-backed)
# apple-native -> macOS Keychain
# sync-secret-service -> Secret Service (GNOME Keyring / KWallet) over libdbus.
# Chosen over async-secret-service because our Tauri
# commands are blocking `fn`s on Tauri's worker pool;
# the async backend would need a nested runtime.
# Build-time system dep: libdbus-1-dev.
# crypto-rust -> pure-Rust session crypto for the Secret Service
# transport (avoids linking OpenSSL for it).
keyring = { version = "3", default-features = false, features = [
"windows-native",
"apple-native",
"sync-secret-service",
"crypto-rust",
] }
# Scrubs the plaintext secret copies that the DPAPI fallback has to materialize
# as `Vec<u8>` for the Win32 call.
zeroize = "1"
# Encodes the DPAPI ciphertext for the JSON fallback store. Already in the tree
# via the tauri/rustls stack, so this costs no extra build.
base64 = "0.22"
# Native message box for the fatal-startup path in lib.rs, where the Tauri app
# never built and tauri-plugin-dialog has no AppHandle to run through. Already
# in the tree via that same plugin, so this costs no extra build -- but only
# while the versions match: the plugin pins ^0.16, and Cargo unifies features
# only within a semver-compatible group. Moving this to 0.17 forks rfd into two
# crates, and the copy without the plugin's backend features fails rfd 0.17's
# build.rs on Linux. Pinned to the plugin in .github/dependabot.yml; bump both
# together or neither.
rfd = { version = "0.16", default-features = false }
# Desktop-only plugins (no mobile bundle target). single-instance carries the
# "deep-link" feature so an owncord:// link fired at a running app is forwarded
# to it instead of spawning a duplicate window.
[target.'cfg(any(target_os = "macos", windows, target_os = "linux"))'.dependencies]
tauri-plugin-single-instance = { version = "2", features = ["deep-link"] }
tauri-plugin-window-state = "2"
tauri-plugin-autostart = "2"
tauri-plugin-deep-link = "2"
[target.'cfg(windows)'.dependencies]
windows = { version = "0.58", features = ["Win32_UI_Input_KeyboardAndMouse"] }
# DPAPI (CryptProtectData/CryptUnprotectData) for the last-resort credential
# fallback in secret_store. Version tracks keyring's own windows-sys dep so the
# two share one build of the crate.
windows-sys = { version = "0.60", features = [
"Win32_Foundation",
"Win32_Security_Cryptography",
] }
[target.'cfg(target_os = "linux")'.dependencies]
device_query = "2"
# Direct access to the WebKitGTK webview for voice/video support. WebKitGTK
# denies getUserMedia/enumerateDevices permission requests by default (wry
# installs no handler on Linux, unlike its macOS backend which auto-grants),
# and ships with media-stream/WebRTC settings off — so microphones and cameras
# are invisible to the webview without this hook. Version-pinned to match
# wry's own `=2.0.2` pin so both link the same crate build; v2_38 gates the
# enable-webrtc setting.
webkit2gtk = { version = "=2.0.2", features = ["v2_38"] }