2026-03-15 19:44:02 +01:00
|
|
|
[package]
|
|
|
|
|
name = "owncord-client"
|
2026-08-28 06:54:32 +02:00
|
|
|
version = "1.2.0-alpha.4"
|
2026-03-15 19:44:02 +01:00
|
|
|
edition = "2021"
|
2026-07-29 13:12:32 +02:00
|
|
|
# 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"
|
2026-03-15 19:44:02 +01:00
|
|
|
description = "OwnCord Desktop Client"
|
|
|
|
|
|
2026-07-29 13:12:32 +02:00
|
|
|
# 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"
|
|
|
|
|
|
2026-03-15 19:44:02 +01:00
|
|
|
[lib]
|
|
|
|
|
name = "owncord_client_lib"
|
|
|
|
|
crate-type = ["lib", "cdylib", "staticlib"]
|
|
|
|
|
|
|
|
|
|
[build-dependencies]
|
|
|
|
|
tauri-build = { version = "2", features = [] }
|
|
|
|
|
|
2026-03-20 12:30:12 +01:00
|
|
|
[features]
|
2026-04-04 09:07:53 +02:00
|
|
|
default = []
|
2026-03-20 12:30:12 +01:00
|
|
|
devtools = ["tauri/devtools"]
|
|
|
|
|
|
2026-03-15 19:44:02 +01:00
|
|
|
[dependencies]
|
2026-03-20 12:30:12 +01:00
|
|
|
tauri = { version = "2", features = ["tray-icon"] }
|
2026-03-15 19:44:02 +01:00
|
|
|
tauri-plugin-store = "2"
|
|
|
|
|
tauri-plugin-notification = "2"
|
|
|
|
|
serde = { version = "1", features = ["derive"] }
|
|
|
|
|
serde_json = "1"
|
2026-07-19 14:26:25 +00:00
|
|
|
# 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"] }
|
2026-03-18 14:13:52 +01:00
|
|
|
tauri-plugin-opener = "2"
|
2026-03-18 17:10:16 +01:00
|
|
|
tauri-plugin-dialog = "2"
|
|
|
|
|
tauri-plugin-fs = "2"
|
2026-07-23 18:38:22 +02:00
|
|
|
# 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"
|
2026-03-18 17:47:59 +01:00
|
|
|
tauri-plugin-process = "2"
|
|
|
|
|
url = "2"
|
2026-08-22 06:48:58 +02:00
|
|
|
tokio-tungstenite = { version = "0.30.0", features = ["rustls-tls-webpki-roots"] }
|
2026-03-15 19:44:02 +01:00
|
|
|
futures-util = "0.3.32"
|
2026-03-28 10:39:23 +01:00
|
|
|
tokio = { version = "1", features = ["sync", "net", "io-util", "rt", "macros"] }
|
|
|
|
|
tokio-rustls = { version = "0.26", default-features = false }
|
2026-03-15 19:44:02 +01:00
|
|
|
rustls = { version = "0.23", default-features = false, features = ["ring", "std"] }
|
2026-07-23 18:38:22 +02:00
|
|
|
# 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"
|
2026-03-17 11:05:52 +01:00
|
|
|
ring = "0.17"
|
2026-03-28 20:42:37 +01:00
|
|
|
log = "0.4"
|
2026-07-24 11:07:00 +02:00
|
|
|
# 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"
|
2026-07-31 15:41:57 +02:00
|
|
|
# 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"
|
2026-08-25 19:49:37 +02:00
|
|
|
# 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.
|
2026-04-03 23:18:06 +02:00
|
|
|
rfd = { version = "0.16", default-features = false }
|
2026-03-16 16:43:46 +01:00
|
|
|
|
2026-07-24 10:44:06 +02:00
|
|
|
# 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"
|
|
|
|
|
|
2026-03-16 16:43:46 +01:00
|
|
|
[target.'cfg(windows)'.dependencies]
|
2026-04-03 14:26:26 +02:00
|
|
|
windows = { version = "0.58", features = ["Win32_UI_Input_KeyboardAndMouse"] }
|
2026-07-31 15:41:57 +02:00
|
|
|
# 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",
|
|
|
|
|
] }
|
2026-04-03 14:26:26 +02:00
|
|
|
|
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
|
|
|
device_query = "2"
|
2026-08-01 22:06:14 +02:00
|
|
|
# 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"] }
|