From 04e22a3c7e29d1d10f221362560bb3e298de49ea Mon Sep 17 00:00:00 2001
From: Viktor Liu <17948409+lixmal@users.noreply.github.com>
Date: Mon, 19 Jan 2026 16:49:08 +0800
Subject: [PATCH] Enable SSH for Windows and Android peers (#532)
* Enable SSH for Windows and Android peers, hide update badge for temporary peers
* Fix RDP to use tcp protocol instead of netbird-ssh
---
src/app/(remote-access)/peer/rdp/page.tsx | 6 +-----
src/modules/peers/PeerVersionCell.tsx | 6 ++++--
src/modules/peers/PeersTable.tsx | 1 +
src/modules/remote-access/ssh/SSHButton.tsx | 4 +---
4 files changed, 7 insertions(+), 10 deletions(-)
diff --git a/src/app/(remote-access)/peer/rdp/page.tsx b/src/app/(remote-access)/peer/rdp/page.tsx
index 35082eb..810ea03 100644
--- a/src/app/(remote-access)/peer/rdp/page.tsx
+++ b/src/app/(remote-access)/peer/rdp/page.tsx
@@ -20,7 +20,6 @@ import {
useNetBirdClient,
} from "@/modules/remote-access/useNetBirdClient";
import { cn } from "@utils/helpers";
-import { isNetbirdSSHProtocolSupported } from "@utils/version";
export default function RDPPage() {
const { peerId } = useRDPQueryParams();
@@ -85,11 +84,8 @@ function RDPSession({ peer }: Props) {
try {
setCredentials(rdpCredentials);
setIsNetBirdConnecting(true);
- const protocol = isNetbirdSSHProtocolSupported(peer.version)
- ? "netbird-ssh"
- : "tcp";
await client.connectTemporary(peer.id, [
- `${protocol}/${rdpCredentials.port}`,
+ `tcp/${rdpCredentials.port}`,
]);
setIsNetBirdConnecting(false);
} catch (error) {
diff --git a/src/modules/peers/PeerVersionCell.tsx b/src/modules/peers/PeerVersionCell.tsx
index 9e105bb..5476eb0 100644
--- a/src/modules/peers/PeerVersionCell.tsx
+++ b/src/modules/peers/PeerVersionCell.tsx
@@ -20,11 +20,13 @@ type Props = {
version: string;
os: string;
serial?: string;
+ ephemeral?: boolean;
};
-export default function PeerVersionCell({ version, os, serial }: Props) {
+export default function PeerVersionCell({ version, os, serial, ephemeral }: Props) {
const { latestVersion, latestUrl } = useApplicationContext();
const updateAvailable = useMemo(() => {
+ if (ephemeral) return false;
const operatingSystem = getOperatingSystem(os);
if (
operatingSystem === OperatingSystem.IOS ||
@@ -33,7 +35,7 @@ export default function PeerVersionCell({ version, os, serial }: Props) {
return false;
if (!latestVersion) return false;
return !compareVersions(version, latestVersion);
- }, [os, version, latestVersion]);
+ }, [os, version, latestVersion, ephemeral]);
const updateIcon = useMemo(() => {
return ;
diff --git a/src/modules/peers/PeersTable.tsx b/src/modules/peers/PeersTable.tsx
index 96ac958..05ae9e4 100644
--- a/src/modules/peers/PeersTable.tsx
+++ b/src/modules/peers/PeersTable.tsx
@@ -170,6 +170,7 @@ const PeersTableColumns: ColumnDef[] = [
version={row.original.version}
os={row.original.os}
serial={row.original.serial_number}
+ ephemeral={row.original.ephemeral}
/>
),
},
diff --git a/src/modules/remote-access/ssh/SSHButton.tsx b/src/modules/remote-access/ssh/SSHButton.tsx
index b419670..3d7fb03 100644
--- a/src/modules/remote-access/ssh/SSHButton.tsx
+++ b/src/modules/remote-access/ssh/SSHButton.tsx
@@ -26,9 +26,7 @@ export const SSHButton = ({ peer, isDropdown = false }: Props) => {
const hasPermission = permission.peers.update;
const os = getOperatingSystem(peer?.os);
- const isWindows = os === OperatingSystem.WINDOWS;
- const isMobile = os === OperatingSystem.ANDROID || os === OperatingSystem.IOS;
- const isSSHSupported = !isWindows && !isMobile;
+ const isSSHSupported = os !== OperatingSystem.IOS;
return (
isSSHSupported && (