Add Android app: phone UI for hosts, SSH terminal with extra key row, keys, snippets, LAN sync and app lock (password + fingerprint), reusing the desktop Node modules via capacitor-nodejs; APKs per ABI in releases for Obtainium

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-25 23:56:39 +02:00
co-authored by Claude Opus 5.5
parent 430c18b84e
commit 4542aff75f
70 changed files with 4766 additions and 7 deletions
+1 -1
View File
@@ -35,7 +35,7 @@ class SshManager {
const cfg = {
host: host.address,
port: Number(host.port) || 22,
username: host.username || os.userInfo().username,
username: host.username || (() => { try { return os.userInfo().username; } catch { return 'root'; } })(),
readyTimeout: 20000,
keepaliveInterval: (this.store.get().settings.keepAlive || 0) * 1000,
tryKeyboard: true,
+4 -2
View File
@@ -193,7 +193,7 @@ class SyncService {
d.sync ||= { enabled: false, peers: [], share: { keys: [], hosts: [], vpns: [] } };
const s = d.sync;
if (!s.deviceId) s.deviceId = crypto.randomUUID();
if (!s.deviceName) s.deviceName = os.hostname();
if (!s.deviceName) s.deviceName = process.env.MRTERM_DEVICE || os.hostname();
s.peers ||= []; s.share ||= { keys: [], hosts: [], vpns: [] };
return s;
}
@@ -241,7 +241,9 @@ class SyncService {
// ------------------------------------------------ Finden
broadcastAddrs() {
const out = new Set(['255.255.255.255']);
for (const list of Object.values(os.networkInterfaces())) {
let ifaces = {};
try { ifaces = os.networkInterfaces(); } catch {} // Android: je nach Version eingeschränkt
for (const list of Object.values(ifaces)) {
for (const a of list || []) {
if (a.family !== 'IPv4' || a.internal) continue;
const ip = a.address.split('.').map(Number), mask = a.netmask.split('.').map(Number);