feat: add ssh_expose_lan configuration and localization support

This commit is contained in:
t8y2 2026-05-01 15:37:52 +08:00
parent dcbced25c8
commit 6e0fdf1c92
8 changed files with 19 additions and 2 deletions

2
src-tauri/Cargo.lock generated
View File

@ -1400,7 +1400,7 @@ checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
[[package]]
name = "dbx"
version = "0.3.2"
version = "0.3.3"
dependencies = [
"anyhow",
"chrono",

View File

@ -166,6 +166,7 @@ impl AppState {
&config.ssh_key_path,
&config.host,
config.port,
config.ssh_expose_lan,
)
.await?;

View File

@ -160,6 +160,7 @@ impl TunnelManager {
ssh_key_path: &str,
remote_host: &str,
remote_port: u16,
expose_to_lan: bool,
) -> Result<u16, String> {
let local_port = portpicker::pick_unused_port().ok_or("No available port")?;
@ -167,7 +168,8 @@ impl TunnelManager {
connect_and_authenticate(ssh_host, ssh_port, ssh_user, ssh_password, ssh_key_path)
.await?;
let listener = TcpListener::bind(("127.0.0.1", local_port))
let bind_addr = if expose_to_lan { "0.0.0.0" } else { "127.0.0.1" };
let listener = TcpListener::bind((bind_addr, local_port))
.await
.map_err(|e| format!("Failed to bind local port: {e}"))?;

View File

@ -32,6 +32,8 @@ pub struct ConnectionConfig {
#[serde(default)]
pub ssh_key_path: String,
#[serde(default)]
pub ssh_expose_lan: bool,
#[serde(default)]
pub ssl: bool,
#[serde(default)]
pub connection_string: Option<String>,

View File

@ -54,6 +54,7 @@ const defaultForm = (): Omit<ConnectionConfig, "id"> => ({
ssh_user: "",
ssh_password: "",
ssh_key_path: "",
ssh_expose_lan: false,
ssl: false,
connection_string: undefined,
});
@ -155,6 +156,7 @@ watch(() => props.editConfig, (config) => {
ssh_user: config.ssh_user || "",
ssh_password: config.ssh_password || "",
ssh_key_path: config.ssh_key_path || "",
ssh_expose_lan: config.ssh_expose_lan || false,
ssl: config.ssl || false,
connection_string: config.connection_string,
};
@ -514,6 +516,13 @@ watch([() => editingId.value, () => open.value], () => {
<Label class="text-right text-xs">{{ t('connection.sshKeyPath') }}</Label>
<Input v-model="form.ssh_key_path" class="col-span-3" placeholder="~/.ssh/id_rsa" />
</div>
<div class="grid grid-cols-4 items-center gap-4">
<span />
<label class="col-span-3 flex items-center gap-2 cursor-pointer">
<input type="checkbox" v-model="form.ssh_expose_lan" class="mr-0" />
<span class="text-xs text-muted-foreground">{{ t('connection.sshExposeLan') }}</span>
</label>
</div>
</template>
</template>
</div>

View File

@ -58,6 +58,7 @@ export default {
sshPassword: "SSH Password",
sshPasswordPlaceholder: "Leave empty to use key",
sshKeyPath: "Key Path",
sshExposeLan: "Expose tunnel to LAN",
compatible: "Compatible",
mainstream: "Popular",
color: "Color",

View File

@ -60,6 +60,7 @@ export default {
sshPassword: "SSH 密码",
sshPasswordPlaceholder: "留空则使用密钥",
sshKeyPath: "密钥路径",
sshExposeLan: "允许局域网访问隧道",
compatible: "兼容",
mainstream: "主流",
color: "颜色",

View File

@ -19,6 +19,7 @@ export interface ConnectionConfig {
ssh_user?: string;
ssh_password?: string;
ssh_key_path?: string;
ssh_expose_lan?: boolean;
ssl?: boolean;
connection_string?: string;
}