ssh-picker 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -36,9 +36,26 @@ Dashboard keys:
36
36
 
37
37
  - `Enter` connect to the selected server over SSH
38
38
  - `F` open SFTP file manager
39
+ - `T` test SSH connection without opening a shell
40
+ - `A` add a new server
41
+ - `E` edit the selected server
42
+ - `Delete` or `Backspace` delete the selected server after confirmation
39
43
  - `/` search servers
40
44
  - `Q` or `Esc` quit
41
45
 
46
+ File manager keys:
47
+
48
+ - `Tab` switch local/remote pane
49
+ - `Enter` open selected folder
50
+ - `Backspace` or `Left` go to parent folder
51
+ - `/` search files in the active pane
52
+ - `U` upload selected local file/folder
53
+ - `D` download selected remote file/folder
54
+ - `R` refresh both panes
55
+ - `Q` or `Esc` go back or quit when launched with `sshp files`
56
+
57
+ Transfers show a live progress bar for the active file and keep the panes usable for confirming where files are moving.
58
+
42
59
  ## Scriptable commands
43
60
 
44
61
  ```bash
@@ -49,6 +66,8 @@ sshp upload <server> <local> <remote>
49
66
  sshp download <server> <remote> <local>
50
67
  sshp export backup.sshp
51
68
  sshp import backup.sshp
69
+ sshp import-ssh-config [file]
70
+ sshp import-termius hosts.csv
52
71
  sshp config set dataDir <path>
53
72
  ```
54
73
 
@@ -57,7 +76,13 @@ sshp config set dataDir <path>
57
76
  - The master password is never stored.
58
77
  - Credentials are encrypted with AES-256-GCM.
59
78
  - The vault key is derived with Node's `scrypt` implementation.
60
- - Export files contain the already-encrypted SQLite vault and still require the master password.
79
+ - Export files encrypt the SQLite vault backup and require the master password to import.
80
+ - Server metadata in the local SQLite database is not encrypted; protect access to your data directory.
81
+
82
+ ## Imports
83
+
84
+ - `sshp import-ssh-config` imports hosts from `~/.ssh/config`, including readable `IdentityFile` private keys.
85
+ - `sshp import-termius hosts.csv` imports host rows from a Termius-style CSV. Full Termius encrypted vault export is not publicly documented, so CSV import is the supported path.
61
86
 
62
87
  ## Development
63
88
 
package/dist/cli/index.js CHANGED
@@ -3,8 +3,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { Command } from 'commander';
4
4
  import { render } from 'ink';
5
5
  import { input, password, confirm } from '@inquirer/prompts';
6
- import { existsSync, statSync } from 'node:fs';
7
- import { basename } from 'node:path';
6
+ import { existsSync, readFileSync, statSync } from 'node:fs';
7
+ import { homedir } from 'node:os';
8
+ import { basename, join } from 'node:path';
8
9
  import { resolveDataDir, resolveDbPath, writeBootstrapConfig } from '../config/paths.js';
9
10
  import { toFriendlyMessage } from '../shared/errors.js';
10
11
  const originalEmitWarning = process.emitWarning.bind(process);
@@ -15,7 +16,46 @@ process.emitWarning = ((warning, ...args) => {
15
16
  return;
16
17
  return originalEmitWarning(warning, ...args);
17
18
  });
19
+ const cyan = '\u001B[36m';
20
+ const green = '\u001B[32m';
21
+ const dim = '\u001B[2m';
22
+ const reset = '\u001B[0m';
23
+ function clearTerminal() {
24
+ if (!process.stdout.isTTY)
25
+ return;
26
+ process.stdout.write('\u001B[2J\u001B[3J\u001B[H');
27
+ }
28
+ function terminalLine(char = '-') {
29
+ return char.repeat(Math.min(process.stdout.columns || 80, 90));
30
+ }
31
+ function renderPromptHeader(title, subtitle) {
32
+ if (!process.stdout.isTTY)
33
+ return;
34
+ clearTerminal();
35
+ console.log(`${cyan}SSHP${reset} ${dim}Portable SSH and SFTP vault${reset}`);
36
+ console.log(terminalLine());
37
+ console.log(`${green}${title}${reset}`);
38
+ console.log(`${dim}${subtitle}${reset}`);
39
+ console.log();
40
+ }
41
+ function renderSshHandoff(server) {
42
+ clearTerminal();
43
+ if (!process.stdout.isTTY)
44
+ return;
45
+ console.log(`${cyan}SSHP SSH${reset} ${dim}${server.name}${reset}`);
46
+ console.log(terminalLine());
47
+ console.log(`${dim}Connected terminal is now fully controlled by ${server.username}@${server.host}:${server.port}.${reset}`);
48
+ console.log(`${dim}Type exit or press Ctrl+D in the remote shell to close the session.${reset}`);
49
+ console.log();
50
+ }
18
51
  async function askMasterPassword(message = 'Master password') {
52
+ const lower = message.toLowerCase();
53
+ const subtitle = lower.includes('backup')
54
+ ? 'Decrypt an encrypted SSHP backup before restoring it.'
55
+ : lower.includes('create') || lower.includes('confirm')
56
+ ? 'Create a master key for this local encrypted vault.'
57
+ : 'Unlock your saved SSH credentials for this session.';
58
+ renderPromptHeader(message, subtitle);
19
59
  return password({ message, mask: '*' });
20
60
  }
21
61
  async function createVaultFromPrompt(dataDir = resolveDataDir()) {
@@ -31,7 +71,9 @@ async function createVaultFromPrompt(dataDir = resolveDataDir()) {
31
71
  async function unlockFromPrompt() {
32
72
  const masterPassword = await askMasterPassword();
33
73
  const { unlockVault } = await import('../vault/vault.js');
34
- return unlockVault(masterPassword);
74
+ const vault = unlockVault(masterPassword);
75
+ clearTerminal();
76
+ return vault;
35
77
  }
36
78
  async function unlockOrInitializeVault() {
37
79
  const dataDir = resolveDataDir();
@@ -44,13 +86,24 @@ async function unlockOrInitializeVault() {
44
86
  async function runInit() {
45
87
  await createVaultFromPrompt();
46
88
  }
89
+ function validateRequired(value) {
90
+ return value.trim() ? true : 'Required.';
91
+ }
92
+ function validatePort(value) {
93
+ const port = Number(value);
94
+ return Number.isInteger(port) && port > 0 && port <= 65_535 ? true : 'Port must be between 1 and 65535.';
95
+ }
47
96
  async function promptAddServer(vault) {
48
- const name = await input({ message: 'Name' });
49
- const host = await input({ message: 'Host' });
50
- const username = await input({ message: 'Username' });
51
- const portText = await input({ message: 'Port', default: '22' });
52
- const serverPassword = await password({ message: 'SSH password', mask: '*' });
53
- const defaultRemotePath = await input({ message: 'Default remote path', default: '/home/' + username });
97
+ const name = (await input({ message: 'Name', validate: validateRequired })).trim();
98
+ const host = (await input({ message: 'Host', validate: validateRequired })).trim();
99
+ const username = (await input({ message: 'Username', validate: validateRequired })).trim();
100
+ const portText = await input({ message: 'Port', default: '22', validate: validatePort });
101
+ const authText = (await input({ message: 'Auth method', default: 'password', validate: validateAuthType })).trim();
102
+ const authType = normalizeAuthType(authText);
103
+ const serverPassword = authType === 'password' ? await password({ message: 'SSH password', mask: '*', validate: validateRequired }) : '';
104
+ const privateKeyPath = authType === 'private_key' ? await input({ message: 'Private key path', default: '~/.ssh/id_ed25519', validate: validateRequired }) : '';
105
+ const passphrase = authType === 'private_key' ? await password({ message: 'Key passphrase (optional)', mask: '*' }) : '';
106
+ const defaultRemotePath = (await input({ message: 'Default remote path', default: '/home/' + username, validate: validateRequired })).trim();
54
107
  const [{ openMigratedDatabase }, { ServerRepository }, { encryptString }] = await Promise.all([
55
108
  import('../db/connection.js'),
56
109
  import('../db/repositories/serverRepository.js'),
@@ -62,9 +115,11 @@ async function promptAddServer(vault) {
62
115
  name,
63
116
  host,
64
117
  username,
65
- port: Number(portText) || 22,
66
- authType: 'password',
67
- encryptedPassword: encryptString(serverPassword, vault.key),
118
+ port: Number(portText),
119
+ authType,
120
+ encryptedPassword: serverPassword ? encryptString(serverPassword, vault.key) : null,
121
+ encryptedPrivateKey: privateKeyPath ? encryptString(readFileSync(expandUserPath(privateKeyPath), 'utf8'), vault.key) : null,
122
+ encryptedPassphrase: passphrase ? encryptString(passphrase, vault.key) : null,
68
123
  defaultRemotePath
69
124
  });
70
125
  console.log(`Added ${server.name} (${server.username}@${server.host}:${server.port})`);
@@ -74,6 +129,26 @@ async function promptAddServer(vault) {
74
129
  db.close();
75
130
  }
76
131
  }
132
+ function validateAuthType(value) {
133
+ return parseAuthType(value) ? true : 'Use password or private_key.';
134
+ }
135
+ function parseAuthType(value) {
136
+ const normalized = value.trim().toLowerCase().replace(/[- ]/g, '_');
137
+ if (normalized === 'password' || normalized === 'pass')
138
+ return 'password';
139
+ if (normalized === 'key' || normalized === 'private_key')
140
+ return 'private_key';
141
+ return null;
142
+ }
143
+ function normalizeAuthType(value) {
144
+ return parseAuthType(value) ?? 'password';
145
+ }
146
+ function expandUserPath(path) {
147
+ if (path === '~' || path.startsWith('~/')) {
148
+ return join(homedir(), path.slice(2));
149
+ }
150
+ return path;
151
+ }
77
152
  async function runAdd() {
78
153
  const vault = await unlockOrInitializeVault();
79
154
  await promptAddServer(vault);
@@ -136,6 +211,7 @@ async function runConnect(name) {
136
211
  import('../shared/credentials.js')
137
212
  ]);
138
213
  const { vault, server } = await loadServer(name);
214
+ renderSshHandoff(server);
139
215
  await connectSsh({ server, credentials: decryptServerCredentials(server, vault) });
140
216
  await recordServerAction(vault.dbPath, server.id, 'ssh');
141
217
  }
@@ -150,14 +226,38 @@ async function runDashboard() {
150
226
  }
151
227
  await promptAddServer(vault);
152
228
  }
229
+ clearTerminal();
153
230
  const { App } = await import('../tui/App.js');
231
+ // Reset stdin so Ink can take over raw mode after @inquirer/prompts
232
+ if (process.stdin.isTTY) {
233
+ process.stdin.setRawMode(false);
234
+ process.stdin.pause();
235
+ process.stdin.removeAllListeners();
236
+ }
154
237
  const app = render(_jsx(App, { vault: vault }));
155
- await app.waitUntilExit();
238
+ const result = await app.waitUntilExit();
239
+ app.clear();
240
+ if (result?.action === 'connect') {
241
+ const [{ connectSsh }, { decryptServerCredentials }] = await Promise.all([
242
+ import('../ssh/client.js'),
243
+ import('../shared/credentials.js')
244
+ ]);
245
+ renderSshHandoff(result.server);
246
+ await connectSsh({ server: result.server, credentials: decryptServerCredentials(result.server, vault) });
247
+ await recordServerAction(vault.dbPath, result.server.id, 'ssh');
248
+ }
156
249
  }
157
250
  async function runFiles(name) {
158
251
  const { FileManager } = await import('../tui/screens/FileManager.js');
159
252
  const { vault, server } = await loadServer(name);
160
- const app = render(_jsx(FileManager, { server: server, vault: vault, onBack: () => undefined }));
253
+ // Reset stdin so Ink can take over raw mode after @inquirer/prompts
254
+ if (process.stdin.isTTY) {
255
+ process.stdin.setRawMode(false);
256
+ process.stdin.pause();
257
+ process.stdin.removeAllListeners();
258
+ }
259
+ clearTerminal();
260
+ const app = render(_jsx(FileManager, { server: server, vault: vault, onBack: () => undefined, exitOnBack: true }));
161
261
  await app.waitUntilExit();
162
262
  }
163
263
  async function runUpload(name, localPath, remotePath) {
@@ -190,21 +290,36 @@ async function runDownload(name, remotePath, localPath) {
190
290
  }
191
291
  async function runExport(file) {
192
292
  const { exportVault } = await import('../import-export/archive.js');
193
- console.log(`Exported to ${exportVault(file)}`);
293
+ const vault = await unlockFromPrompt();
294
+ console.log(`Exported to ${exportVault(file, vault)}`);
194
295
  }
195
296
  async function runImport(file) {
196
297
  const { importVault } = await import('../import-export/archive.js');
197
298
  const ok = await confirm({ message: 'Import will replace the current vault database. Continue?', default: false });
198
299
  if (!ok)
199
300
  return;
200
- console.log(`Imported to ${importVault(file)}`);
301
+ const masterPassword = await askMasterPassword('Backup master password');
302
+ console.log(`Imported to ${importVault(file, masterPassword)}`);
303
+ }
304
+ async function runImportSshConfig(file) {
305
+ const vault = await unlockFromPrompt();
306
+ const { importOpenSshConfig } = await import('../import-export/hostImport.js');
307
+ const target = file || join(homedir(), '.ssh', 'config');
308
+ const result = importOpenSshConfig(target, vault);
309
+ console.log(`Imported ${result.imported} host(s) from ${target}. Skipped ${result.skipped} duplicate(s).`);
310
+ }
311
+ async function runImportTermius(file) {
312
+ const vault = await unlockFromPrompt();
313
+ const { importTermiusCsv } = await import('../import-export/hostImport.js');
314
+ const result = importTermiusCsv(file, vault);
315
+ console.log(`Imported ${result.imported} host(s) from Termius CSV. Skipped ${result.skipped} duplicate(s).`);
201
316
  }
202
317
  async function main() {
203
318
  const program = new Command();
204
319
  program
205
320
  .name('sshp')
206
321
  .description('Portable encrypted SSH/SFTP picker')
207
- .version('0.1.2')
322
+ .version('0.1.3')
208
323
  .action(runDashboard);
209
324
  program.command('init').description('Create a portable encrypted vault').action(runInit);
210
325
  program.command('add').description('Add a password-based SSH server').action(runAdd);
@@ -215,6 +330,8 @@ async function main() {
215
330
  program.command('download <server> <remote> <local>').description('Download a file over SFTP').action(runDownload);
216
331
  program.command('export <file>').description('Export encrypted vault backup').action(runExport);
217
332
  program.command('import <file>').description('Import encrypted vault backup').action(runImport);
333
+ program.command('import-ssh-config [file]').description('Import hosts from OpenSSH config').action(runImportSshConfig);
334
+ program.command('import-termius <csv>').description('Import hosts from a Termius-style CSV').action(runImportTermius);
218
335
  const config = program.command('config').description('Manage SSHP configuration');
219
336
  config.command('set <key> <value>').description('Set a config value').action((key, value) => {
220
337
  if (key !== 'dataDir')
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.tsx"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
- export declare function exportVault(outFile: string, dataDir?: string): string;
2
- export declare function importVault(inFile: string, dataDir?: string): string;
1
+ import type { VaultContext } from '../shared/types.js';
2
+ export declare function exportVault(outFile: string, vault: VaultContext): string;
3
+ export declare function importVault(inFile: string, masterPassword: string, dataDir?: string): string;
3
4
  export declare function copyVaultDataDir(sourceDbPath: string, dataDir?: string): string;
@@ -1,32 +1,47 @@
1
- import { copyFileSync, existsSync, readFileSync, writeFileSync } from 'node:fs';
1
+ import { copyFileSync, existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
2
2
  import { dirname, resolve } from 'node:path';
3
3
  import { mkdirSync } from 'node:fs';
4
4
  import { resolveDataDir, resolveDbPath } from '../config/paths.js';
5
+ import { openMigratedDatabase } from '../db/connection.js';
6
+ import { SettingsRepository } from '../db/repositories/settingsRepository.js';
5
7
  import { MissingVaultError, SshpError } from '../shared/errors.js';
6
- const MAGIC = 'SSHP_BACKUP_V1';
7
- export function exportVault(outFile, dataDir = resolveDataDir()) {
8
- const dbPath = resolveDbPath(dataDir);
8
+ import { decryptString, deriveKey, encryptString, KDF } from '../vault/crypto.js';
9
+ const MAGIC = 'SSHP_BACKUP_V2';
10
+ export function exportVault(outFile, vault) {
11
+ const dbPath = resolveDbPath(vault.dataDir);
9
12
  if (!existsSync(dbPath))
10
- throw new MissingVaultError(dataDir);
13
+ throw new MissingVaultError(vault.dataDir);
14
+ const kdfSalt = readKdfSalt(dbPath);
15
+ checkpointDatabase(dbPath);
11
16
  const payload = {
12
17
  magic: MAGIC,
13
18
  exportedAt: new Date().toISOString(),
14
- database: readFileSync(dbPath).toString('base64')
19
+ kdf: KDF,
20
+ kdfSalt,
21
+ encryptedDatabase: encryptString(readFileSync(dbPath).toString('base64'), vault.key)
15
22
  };
16
23
  const target = resolve(outFile);
17
24
  mkdirSync(dirname(target), { recursive: true });
18
25
  writeFileSync(target, `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
19
26
  return target;
20
27
  }
21
- export function importVault(inFile, dataDir = resolveDataDir()) {
28
+ export function importVault(inFile, masterPassword, dataDir = resolveDataDir()) {
22
29
  const source = resolve(inFile);
23
30
  const payload = JSON.parse(readFileSync(source, 'utf8'));
24
- if (payload.magic !== MAGIC || !payload.database) {
31
+ if (payload.magic !== MAGIC || payload.kdf !== KDF || !payload.kdfSalt || !payload.encryptedDatabase) {
25
32
  throw new SshpError('Unsupported or corrupt SSHP backup file.', 'INVALID_BACKUP');
26
33
  }
34
+ let database;
35
+ try {
36
+ database = decryptString(payload.encryptedDatabase, deriveKey(masterPassword, payload.kdfSalt));
37
+ }
38
+ catch {
39
+ throw new SshpError('Backup master password is incorrect or the backup is corrupt.', 'INVALID_BACKUP_PASSWORD');
40
+ }
27
41
  mkdirSync(dataDir, { recursive: true });
28
42
  const dbPath = resolveDbPath(dataDir);
29
- writeFileSync(dbPath, Buffer.from(payload.database, 'base64'));
43
+ removeSqliteSidecars(dbPath);
44
+ writeFileSync(dbPath, Buffer.from(database, 'base64'));
30
45
  return dbPath;
31
46
  }
32
47
  export function copyVaultDataDir(sourceDbPath, dataDir = resolveDataDir()) {
@@ -35,4 +50,29 @@ export function copyVaultDataDir(sourceDbPath, dataDir = resolveDataDir()) {
35
50
  copyFileSync(sourceDbPath, dbPath);
36
51
  return dbPath;
37
52
  }
53
+ function readKdfSalt(dbPath) {
54
+ const db = openMigratedDatabase(dbPath);
55
+ try {
56
+ const salt = new SettingsRepository(db).get('vault.kdfSalt');
57
+ if (!salt)
58
+ throw new MissingVaultError(dirname(dbPath));
59
+ return salt;
60
+ }
61
+ finally {
62
+ db.close();
63
+ }
64
+ }
65
+ function checkpointDatabase(dbPath) {
66
+ const db = openMigratedDatabase(dbPath);
67
+ try {
68
+ db.exec('PRAGMA wal_checkpoint(TRUNCATE);');
69
+ }
70
+ finally {
71
+ db.close();
72
+ }
73
+ }
74
+ function removeSqliteSidecars(dbPath) {
75
+ rmSync(`${dbPath}-wal`, { force: true });
76
+ rmSync(`${dbPath}-shm`, { force: true });
77
+ }
38
78
  //# sourceMappingURL=archive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/import-export/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,KAAK,GAAG,gBAAgB,CAAC;AAQ/B,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,OAAO,GAAG,cAAc,EAAE;IACrE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAkB;QAC7B,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;KAClD,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,aAAa,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,OAAO,GAAG,cAAc,EAAE;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAkB,CAAC;IAC1E,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACjD,MAAM,IAAI,SAAS,CAAC,0CAA0C,EAAE,gBAAgB,CAAC,CAAC;IACpF,CAAC;IACD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,YAAoB,EAAE,OAAO,GAAG,cAAc,EAAE;IAC/E,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/import-export/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { VaultContext } from '../shared/types.js';
2
+ export interface ImportResult {
3
+ imported: number;
4
+ skipped: number;
5
+ }
6
+ export declare function importOpenSshConfig(file: string, vault: VaultContext): ImportResult;
7
+ export declare function importTermiusCsv(file: string, vault: VaultContext): ImportResult;
@@ -0,0 +1,176 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
4
+ import { openMigratedDatabase } from '../db/connection.js';
5
+ import { ServerRepository } from '../db/repositories/serverRepository.js';
6
+ import { encryptString } from '../vault/crypto.js';
7
+ export function importOpenSshConfig(file, vault) {
8
+ const path = expandPath(file);
9
+ const drafts = parseOpenSshConfig(readFileSync(path, 'utf8'), dirname(path));
10
+ return importDrafts(drafts, vault);
11
+ }
12
+ export function importTermiusCsv(file, vault) {
13
+ const rows = parseCsv(readFileSync(file, 'utf8'));
14
+ const drafts = rows.flatMap((row) => {
15
+ const get = (names) => names.map((name) => row[normalizeHeader(name)]).find((value) => value?.trim())?.trim();
16
+ const name = get(['label', 'name', 'host label', 'host']);
17
+ const host = get(['address', 'ip address', 'ip', 'hostname', 'host name', 'host']);
18
+ const username = get(['username', 'user', 'login']) || process.env.USERNAME || process.env.USER || 'root';
19
+ if (!name || !host)
20
+ return [];
21
+ const privateKey = get(['private key', 'privatekey', 'key', 'identityfile']);
22
+ const password = get(['password']);
23
+ return [{
24
+ name,
25
+ host,
26
+ username,
27
+ port: Number(get(['port', 'ssh port'])) || 22,
28
+ authType: privateKey ? 'private_key' : 'password',
29
+ password,
30
+ privateKey: privateKey && existsSync(expandPath(privateKey)) ? readFileSync(expandPath(privateKey), 'utf8') : privateKey,
31
+ passphrase: get(['passphrase', 'key passphrase']),
32
+ defaultRemotePath: get(['remote path', 'default remote path']) || `/home/${username}`
33
+ }];
34
+ });
35
+ return importDrafts(drafts, vault);
36
+ }
37
+ function importDrafts(drafts, vault) {
38
+ const db = openMigratedDatabase(vault.dbPath);
39
+ const repo = new ServerRepository(db);
40
+ let imported = 0;
41
+ let skipped = 0;
42
+ try {
43
+ const existing = new Set(repo.list().map((server) => server.name.toLowerCase()));
44
+ for (const draft of drafts) {
45
+ if (existing.has(draft.name.toLowerCase())) {
46
+ skipped++;
47
+ continue;
48
+ }
49
+ repo.create(toCreateInput(draft, vault));
50
+ existing.add(draft.name.toLowerCase());
51
+ imported++;
52
+ }
53
+ }
54
+ finally {
55
+ db.close();
56
+ }
57
+ return { imported, skipped };
58
+ }
59
+ function toCreateInput(draft, vault) {
60
+ return {
61
+ name: draft.name,
62
+ host: draft.host,
63
+ username: draft.username,
64
+ port: draft.port,
65
+ authType: draft.authType,
66
+ encryptedPassword: draft.password ? encryptString(draft.password, vault.key) : null,
67
+ encryptedPrivateKey: draft.privateKey ? encryptString(draft.privateKey, vault.key) : null,
68
+ encryptedPassphrase: draft.passphrase ? encryptString(draft.passphrase, vault.key) : null,
69
+ defaultRemotePath: draft.defaultRemotePath || `/home/${draft.username}`
70
+ };
71
+ }
72
+ function parseOpenSshConfig(contents, baseDir) {
73
+ const drafts = [];
74
+ let aliases = [];
75
+ let options = new Map();
76
+ const flush = () => {
77
+ for (const alias of aliases) {
78
+ if (!alias || alias.includes('*') || alias.includes('?'))
79
+ continue;
80
+ const username = options.get('user') || process.env.USERNAME || process.env.USER || 'root';
81
+ const identityFile = options.get('identityfile');
82
+ const keyPath = identityFile ? expandPath(identityFile, baseDir) : null;
83
+ const privateKey = keyPath && existsSync(keyPath) ? readFileSync(keyPath, 'utf8') : undefined;
84
+ drafts.push({
85
+ name: alias,
86
+ host: options.get('hostname') || alias,
87
+ username,
88
+ port: Number(options.get('port')) || 22,
89
+ authType: privateKey ? 'private_key' : 'password',
90
+ privateKey,
91
+ defaultRemotePath: `/home/${username}`
92
+ });
93
+ }
94
+ };
95
+ for (const rawLine of contents.split(/\r?\n/)) {
96
+ const line = rawLine.replace(/\s+#.*$/, '').trim();
97
+ if (!line || line.startsWith('#'))
98
+ continue;
99
+ const [rawKey, ...rest] = line.split(/\s+/);
100
+ const key = rawKey.toLowerCase();
101
+ const value = rest.join(' ');
102
+ if (key === 'host') {
103
+ flush();
104
+ aliases = value.split(/\s+/);
105
+ options = new Map();
106
+ }
107
+ else if (aliases.length > 0) {
108
+ options.set(key, value);
109
+ }
110
+ }
111
+ flush();
112
+ return drafts;
113
+ }
114
+ function parseCsv(contents) {
115
+ const rows = splitCsvRows(contents).map(parseCsvRow).filter((row) => row.length > 0);
116
+ const headers = rows.shift()?.map(normalizeHeader) ?? [];
117
+ return rows.map((row) => Object.fromEntries(headers.map((header, index) => [header, row[index] ?? ''])));
118
+ }
119
+ function splitCsvRows(contents) {
120
+ const rows = [];
121
+ let current = '';
122
+ let quoted = false;
123
+ for (let index = 0; index < contents.length; index++) {
124
+ const char = contents[index];
125
+ const next = contents[index + 1];
126
+ if (char === '"' && next === '"') {
127
+ current += '""';
128
+ index++;
129
+ }
130
+ else if (char === '"')
131
+ quoted = !quoted;
132
+ else if ((char === '\n' || char === '\r') && !quoted) {
133
+ if (current.trim())
134
+ rows.push(current);
135
+ current = '';
136
+ if (char === '\r' && next === '\n')
137
+ index++;
138
+ }
139
+ else
140
+ current += char;
141
+ }
142
+ if (current.trim())
143
+ rows.push(current);
144
+ return rows;
145
+ }
146
+ function parseCsvRow(row) {
147
+ const values = [];
148
+ let current = '';
149
+ let quoted = false;
150
+ for (let index = 0; index < row.length; index++) {
151
+ const char = row[index];
152
+ const next = row[index + 1];
153
+ if (char === '"' && next === '"') {
154
+ current += '"';
155
+ index++;
156
+ }
157
+ else if (char === '"')
158
+ quoted = !quoted;
159
+ else if (char === ',' && !quoted) {
160
+ values.push(current);
161
+ current = '';
162
+ }
163
+ else
164
+ current += char;
165
+ }
166
+ values.push(current);
167
+ return values;
168
+ }
169
+ function normalizeHeader(value) {
170
+ return value.toLowerCase().replace(/[^a-z0-9]/g, '');
171
+ }
172
+ function expandPath(path, baseDir = process.cwd()) {
173
+ const expanded = path.startsWith('~/') || path === '~' ? join(homedir(), path.slice(2)) : path;
174
+ return isAbsolute(expanded) ? expanded : resolve(baseDir, expanded);
175
+ }
176
+ //# sourceMappingURL=hostImport.js.map