Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion desktop/src-tauri/src/commands/media_download.rs
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ async fn fetch_blob_bytes_with_cap(
state: &State<'_, AppState>,
cap: u64,
) -> Result<Vec<u8>, String> {
// Fetch bytes via the no-redirect media client (goes through WARP tunnel).
// Fetch bytes via the no-redirect media client (goes through the VPN tunnel).
// A no-redirect client keeps the minted media auth token from being
// forwarded across origins by a relay-issued 3xx (redirect-hop SSRF); a
// 3xx is returned verbatim and rejected by the `is_success` check below.
Expand Down
2 changes: 1 addition & 1 deletion desktop/src-tauri/src/commands/reconnect_hook_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ pub struct ReconnectHookConfig {
pub ready_probe: Vec<String>,
/// RAW SUBSTRING matched in the probe's stdout to consider the transport
/// ready — NOT a parsed field. Pick a token unlikely to collide with other
/// substrings in the probe output (e.g. `warp-cli -j status` JSON, where
/// substrings in the probe output (e.g. a VPN CLI's JSON status output, where
/// "Connected" can collide with "Connecting"/"Disconnected").
pub ready_match: String,
/// Per-process wall-clock cap (ms) for each step and the readiness probe
Expand Down
6 changes: 3 additions & 3 deletions desktop/src-tauri/src/commands/relay_reconnect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
//! builds), this command runs an ordered sequence of subprocess steps followed by
//! a readiness poll before the frontend fires the relay WebSocket reconnect.
//!
//! OSS builds (env var unset) get a pure no-op — zero WARP knowledge compiled in.
//! OSS builds (env var unset) get a pure no-op — zero VPN-specific knowledge compiled in.

// Single source of truth for the config schema, shared with build.rs via
// `include!`. See reconnect_hook_config.rs for why this is shared, not a module.
Expand Down Expand Up @@ -43,14 +43,14 @@ pub async fn relay_reconnect_hook() -> Result<(), String> {
/// Run a fixed-argv command (`argv[0]` + `argv[1..]`) with a wall-clock cap.
///
/// `std::process::Command::output()` blocks until the child exits — a wedged
/// `warp-cli` (the exact degraded-transport case this hook targets) would hang
/// VPN CLI (the exact degraded-transport case this hook targets) would hang
/// forever, pinning the blocking-pool thread and leaving the frontend `invoke`
/// unresolved. So we spawn, poll `try_wait()` every 500ms, and kill+reap on the
/// deadline. Modeled on `media_transcode.rs` `run_ffmpeg_with_timeout`.
///
/// stdout/stderr are piped and read only after the child exits. The pipe-buffer
/// deadlock noted there (a child blocking on write() when the ~64 KiB OS pipe
/// fills) does not apply: `warp-cli` emits a few lines, far below the buffer.
/// fills) does not apply: these CLIs emit a few lines, far below the buffer.
fn run_with_timeout(
argv: &[String],
timeout: std::time::Duration,
Expand Down
2 changes: 1 addition & 1 deletion desktop/src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ pub fn run() {
}

// Start the localhost media streaming proxy. Uses the shared HTTP
// client so WARP tunnelling applies. The port is stored in AppState
// client so VPN tunnelling applies. The port is stored in AppState
// and exposed to the frontend via the `get_media_proxy_port` command.
let proxy_client = state.http_client.clone();
let proxy_handle = app_handle.clone();
Expand Down
6 changes: 3 additions & 3 deletions desktop/src-tauri/src/media_proxy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,11 +150,11 @@ pub async fn spawn_media_proxy(http_client: reqwest::Client, app_handle: tauri::
port
}

/// Proxy media requests through the Rust backend so they traverse the WARP tunnel.
/// Proxy media requests through the Rust backend so they traverse the VPN tunnel.
///
/// WKWebView's networking stack bypasses WARP, causing 403s from Cloudflare Access.
/// WKWebView's networking stack bypasses the VPN tunnel, causing 403s from Cloudflare Access.
/// This handler routes `buzz-media://localhost/{path}` through reqwest, which
/// runs in the Tauri process and goes through WARP.
/// runs in the Tauri process and goes through the VPN.
pub async fn handle_buzz_media(
app: &tauri::AppHandle,
request: &http::Request<Vec<u8>>,
Expand Down
2 changes: 1 addition & 1 deletion desktop/src/features/messages/ui/MessageReactions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ function isSameBadgeBurstRect(
* Render a reaction's emoji: a custom (image) emoji when `emojiUrl` is set,
* otherwise the unicode/text glyph. `className` sizes the image to match the
* surrounding text. The relay URL is rewritten through the localhost media
* proxy (like every other relay-hosted <img>) — WKWebView bypasses WARP, so a
* proxy (like every other relay-hosted <img>) — WKWebView bypasses the VPN tunnel, so a
* direct relay URL gets a Cloudflare Access 403 and renders as a broken image.
*/
function EmojiGlyph({
Expand Down
2 changes: 1 addition & 1 deletion desktop/src/features/profile/lib/selfProfileStorage.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* Cached self-profile store for relay-unreachable scenarios.
*
* When the relay is unreachable (e.g. WARP VPN needs reauth), the app cannot
* When the relay is unreachable (e.g. corporate VPN needs reauth), the app cannot
* fetch the user's kind-0 profile. This module persists the last successfully
* fetched profile — including a base64 avatar snapshot — so the UI can render
* the user's identity even when offline.
Expand Down
2 changes: 1 addition & 1 deletion desktop/src/features/user-status/ui/StatusEmoji.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { rewriteRelayUrl } from "@/shared/lib/mediaUrl";
* Every place that shows a status emoji renders this, so the shortcode→image
* resolution can't drift across the (five) display sites — the same reason the
* picker is unified. The relay URL is rewritten through the localhost media
* proxy, matching reactions' `EmojiGlyph` (WKWebView bypasses WARP, so a direct
* proxy, matching reactions' `EmojiGlyph` (WKWebView bypasses the VPN tunnel, so a direct
* relay URL 403s and renders broken).
*/
type StatusEmojiProps = {
Expand Down
2 changes: 1 addition & 1 deletion desktop/src/shared/api/relayClientShared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import type { RelayEvent } from "@/shared/api/types";
* - `connected` — socket open and AUTH'd.
* - `reconnecting` — socket dropped, waiting for the backoff timer.
* - `stalled` — socket is *open* per the WS layer but no inbound frames
* for a long time (half-open / Warp split-brain). We
* for a long time (half-open socket / VPN split-brain). We
* surface this so the UI can warn even though tungstenite
* hasn't reported anything wrong yet.
* - `disconnected` — final/terminal disconnect (auth rejected, community
Expand Down
2 changes: 1 addition & 1 deletion desktop/src/shared/api/relayStallWatchdog.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ test("does not send probes while watching for stalls", async () => {
await sleep(45);
wd.stop();
// The passive watchdog has no send callback by construction. This test is a
// regression guard for the WARP bug: liveness checks must not write to a
// regression guard for the half-open-socket bug: liveness checks must not write to a
// socket already suspected of being half-open.
assert.equal(typeof wd.recordInbound, "function");
});
Expand Down
2 changes: 1 addition & 1 deletion desktop/src/shared/api/tauriMedia.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export async function pickAndUploadImage(): Promise<BlobDescriptor | null> {
}

/**
* Fetch relay media bytes over IPC (Rust reqwest, WARP-tunneled).
* Fetch relay media bytes over IPC (Rust reqwest, VPN-tunneled).
*
* Used by the composer image editor: wrapping the bytes in a same-origin
* `blob:` URL gives the canvas pixel access without CORS, so the media
Expand Down
4 changes: 2 additions & 2 deletions desktop/src/shared/lib/mediaUrl.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/**
* Rewrite relay media URLs to use the localhost streaming proxy.
*
* WKWebView's networking stack bypasses WARP, so direct <img src> requests
* WKWebView's networking stack bypasses the VPN tunnel, so direct <img src> requests
* to the relay get 403'd by Cloudflare Access. The localhost proxy routes
* fetches through the Rust backend (via reqwest), which goes through WARP.
* fetches through the Rust backend (via reqwest), which goes through the VPN.
*
* For video, the proxy streams via axum — no buffering the entire file.
* Images and other media also benefit from this path.
Expand Down
4 changes: 2 additions & 2 deletions desktop/src/shared/lib/relayError.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* The Rust backend (`desktop/src-tauri/src/relay.rs`) prefixes every
* "relay unreachable" error message with this literal string so that the
* frontend can distinguish a transient connectivity failure (e.g. WARP VPN
* frontend can distinguish a transient connectivity failure (e.g. corporate VPN
* needs reauth, Cloudflare Access 403) from an application-level error.
*
* Contract: the Rust layer MUST emit errors starting with exactly this prefix
Expand All @@ -18,7 +18,7 @@ export const RELAY_UNREACHABLE_MESSAGE =

/**
* Returns true when `error` carries the stable Rust-layer prefix indicating
* the relay is unreachable (network failure, WARP VPN reauth needed, etc.).
* the relay is unreachable (network failure, VPN reauth needed, etc.).
*
* Accepts both `Error` instances and raw strings so callers can pass whatever
* the Tauri IPC or WebSocket layer hands them without pre-normalizing.
Expand Down
2 changes: 1 addition & 1 deletion desktop/tests/e2e/custom-emoji.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ test("native emoji-only messages leave space below the author metadata", async (
//
// The bug (shipped in the custom-emoji launch, PR #816): the reaction renderer
// put the relay emoji URL straight into <img src> without going through
// rewriteRelayUrl(). WKWebView bypasses WARP, so the direct relay URL gets a
// rewriteRelayUrl(). WKWebView bypasses the VPN tunnel, so the direct relay URL gets a
// Cloudflare Access 403 and shows a broken image — even though the same emoji
// rendered fine inline in chat (that path rewrites). The chat path was covered
// by the tests above; the reaction path was not, which is why it slipped.
Expand Down
2 changes: 1 addition & 1 deletion docs/admin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ content retains attachment disposition. Successful reads produce a structured
trace containing feedback ID, community ID, and attachment hash, but no feedback
body or attachment URL.

The human trust boundary remains the private admin ingress. WARP/source-IP
The human trust boundary remains the private admin ingress. VPN/source-IP
admission is not per-operator identity. Anyone admitted to the dashboard can
read attachments for feedback records they can access. Per-person attribution
or revocation requires authenticated operator identity at ingress/application
Expand Down
Loading