feat: add desktop LAN access setting
This commit is contained in:
@@ -14,7 +14,7 @@ use std::{
|
||||
path::{Path, PathBuf},
|
||||
};
|
||||
use std::{
|
||||
net::TcpListener,
|
||||
net::{TcpListener, UdpSocket},
|
||||
process::Command,
|
||||
sync::{
|
||||
atomic::{AtomicU32, AtomicU64, Ordering},
|
||||
@@ -1630,13 +1630,14 @@ fn settings_file_path() -> PathBuf {
|
||||
.join("settings.json")
|
||||
}
|
||||
|
||||
fn read_desktop_settings_json() -> Option<serde_json::Value> {
|
||||
fs::read_to_string(settings_file_path())
|
||||
.ok()
|
||||
.and_then(|raw| serde_json::from_str::<serde_json::Value>(&raw).ok())
|
||||
}
|
||||
|
||||
fn read_desktop_local_port_from_disk() -> Option<u16> {
|
||||
let path = settings_file_path();
|
||||
let raw = fs::read_to_string(path).ok();
|
||||
let parsed = raw
|
||||
.as_deref()
|
||||
.and_then(|s| serde_json::from_str::<serde_json::Value>(s).ok());
|
||||
parsed
|
||||
read_desktop_settings_json()
|
||||
.as_ref()
|
||||
.and_then(|v| v.get("desktopLocalPort"))
|
||||
.and_then(|v| v.as_u64())
|
||||
@@ -2548,27 +2549,10 @@ async fn spawn_local_server(app: &tauri::AppHandle) -> Result<String> {
|
||||
}
|
||||
});
|
||||
|
||||
let desktop_settings = read_desktop_settings_json();
|
||||
|
||||
let opencode_binary_from_settings: Option<String> = (|| {
|
||||
let data_dir = env::var("OPENCHAMBER_DATA_DIR")
|
||||
.ok()
|
||||
.and_then(|v| {
|
||||
let t = v.trim().to_string();
|
||||
if t.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(PathBuf::from(t))
|
||||
}
|
||||
})
|
||||
.or_else(|| {
|
||||
resolved_home_dir_path
|
||||
.as_ref()
|
||||
.map(|home| home.join(".config").join("openchamber"))
|
||||
});
|
||||
let data_dir = data_dir?;
|
||||
let settings_path = data_dir.join("settings.json");
|
||||
let raw = fs::read_to_string(&settings_path).ok()?;
|
||||
let json = serde_json::from_str::<serde_json::Value>(&raw).ok()?;
|
||||
let value = json.get("opencodeBinary")?.as_str()?.trim();
|
||||
let value = desktop_settings.as_ref()?.get("opencodeBinary")?.as_str()?.trim();
|
||||
if value.is_empty() {
|
||||
return None;
|
||||
}
|
||||
@@ -2592,6 +2576,13 @@ async fn spawn_local_server(app: &tauri::AppHandle) -> Result<String> {
|
||||
Some(candidate)
|
||||
})();
|
||||
|
||||
let sidecar_bind_host = desktop_settings
|
||||
.as_ref()
|
||||
.and_then(|value| value.get("desktopLanAccessEnabled"))
|
||||
.and_then(|value| value.as_bool())
|
||||
.map(|enabled| if enabled { "0.0.0.0" } else { "127.0.0.1" })
|
||||
.unwrap_or("127.0.0.1");
|
||||
|
||||
let mut push_unique = |value: String| {
|
||||
let trimmed = value.trim();
|
||||
if trimmed.is_empty() {
|
||||
@@ -2668,7 +2659,7 @@ async fn spawn_local_server(app: &tauri::AppHandle) -> Result<String> {
|
||||
.sidecar(SIDECAR_NAME)
|
||||
.map_err(|err| anyhow!("Failed to resolve sidecar '{SIDECAR_NAME}': {err}"))?
|
||||
.args(["--port", &port.to_string()])
|
||||
.env("OPENCHAMBER_HOST", "127.0.0.1")
|
||||
.env("OPENCHAMBER_HOST", sidecar_bind_host)
|
||||
.env("OPENCHAMBER_DIST_DIR", dist_dir.clone())
|
||||
.env("OPENCHAMBER_RUNTIME", "desktop")
|
||||
.env("OPENCHAMBER_DESKTOP_NOTIFY", "true")
|
||||
@@ -3206,9 +3197,7 @@ fn parse_theme_override(theme_mode: Option<&str>, theme_variant: Option<&str>) -
|
||||
}
|
||||
|
||||
fn read_desktop_theme_override() -> Option<tauri::Theme> {
|
||||
let settings = fs::read_to_string(settings_file_path())
|
||||
.ok()
|
||||
.and_then(|raw| serde_json::from_str::<serde_json::Value>(&raw).ok());
|
||||
let settings = read_desktop_settings_json();
|
||||
|
||||
let use_system_theme = settings
|
||||
.as_ref()
|
||||
@@ -3232,6 +3221,22 @@ fn read_desktop_theme_override() -> Option<tauri::Theme> {
|
||||
parse_theme_override(theme_mode, theme_variant)
|
||||
}
|
||||
|
||||
fn detect_desktop_lan_ipv4() -> Option<String> {
|
||||
let socket = UdpSocket::bind("0.0.0.0:0").ok()?;
|
||||
socket.connect("8.8.8.8:80").ok()?;
|
||||
let address = socket.local_addr().ok()?;
|
||||
let ip = address.ip();
|
||||
|
||||
if ip.is_loopback() {
|
||||
return None;
|
||||
}
|
||||
|
||||
match ip {
|
||||
std::net::IpAddr::V4(ipv4) => Some(ipv4.to_string()),
|
||||
std::net::IpAddr::V6(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Apply platform-specific window builder configuration.
|
||||
fn apply_platform_window_config<M: Manager<tauri::Wry>>(
|
||||
builder: WebviewWindowBuilder<'_, tauri::Wry, M>,
|
||||
@@ -3268,6 +3273,11 @@ fn desktop_set_window_theme(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn desktop_get_lan_address() -> Option<String> {
|
||||
detect_desktop_lan_ipv4()
|
||||
}
|
||||
|
||||
fn is_window_state_visible(app: &tauri::AppHandle, state: &DesktopWindowState) -> bool {
|
||||
if state.width == 0 || state.height == 0 {
|
||||
return false;
|
||||
@@ -4019,6 +4029,7 @@ fn main() {
|
||||
desktop_hosts_set,
|
||||
desktop_host_probe,
|
||||
desktop_set_window_theme,
|
||||
desktop_get_lan_address,
|
||||
remote_ssh::desktop_ssh_instances_get,
|
||||
remote_ssh::desktop_ssh_instances_set,
|
||||
remote_ssh::desktop_ssh_import_hosts,
|
||||
|
||||
Reference in New Issue
Block a user