ssh-picker 0.1.1 → 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 +26 -1
- package/dist/cli/index.js +136 -17
- package/dist/cli/index.js.map +1 -1
- package/dist/import-export/archive.d.ts +3 -2
- package/dist/import-export/archive.js +49 -9
- package/dist/import-export/archive.js.map +1 -1
- package/dist/import-export/hostImport.d.ts +7 -0
- package/dist/import-export/hostImport.js +176 -0
- package/dist/import-export/hostImport.js.map +1 -0
- package/dist/sftp/client.d.ts +12 -4
- package/dist/sftp/client.js +52 -23
- package/dist/sftp/client.js.map +1 -1
- package/dist/ssh/client.d.ts +3 -0
- package/dist/ssh/client.js +68 -15
- package/dist/ssh/client.js.map +1 -1
- package/dist/tui/App.d.ts +5 -1
- package/dist/tui/App.js +102 -14
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/screens/Dashboard.d.ts +18 -1
- package/dist/tui/screens/Dashboard.js +242 -13
- package/dist/tui/screens/Dashboard.js.map +1 -1
- package/dist/tui/screens/FileManager.d.ts +2 -1
- package/dist/tui/screens/FileManager.js +206 -36
- package/dist/tui/screens/FileManager.js.map +1 -1
- package/package.json +1 -1
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
|
|
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 {
|
|
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
|
-
|
|
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
|
|
53
|
-
const
|
|
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)
|
|
66
|
-
authType
|
|
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,13 +226,39 @@ async function runDashboard() {
|
|
|
150
226
|
}
|
|
151
227
|
await promptAddServer(vault);
|
|
152
228
|
}
|
|
229
|
+
clearTerminal();
|
|
153
230
|
const { App } = await import('../tui/App.js');
|
|
154
|
-
|
|
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
|
+
}
|
|
237
|
+
const app = render(_jsx(App, { vault: vault }));
|
|
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
|
+
}
|
|
155
249
|
}
|
|
156
250
|
async function runFiles(name) {
|
|
157
251
|
const { FileManager } = await import('../tui/screens/FileManager.js');
|
|
158
252
|
const { vault, server } = await loadServer(name);
|
|
159
|
-
|
|
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 }));
|
|
261
|
+
await app.waitUntilExit();
|
|
160
262
|
}
|
|
161
263
|
async function runUpload(name, localPath, remotePath) {
|
|
162
264
|
const [{ withSftp }, { decryptServerCredentials }] = await Promise.all([
|
|
@@ -188,21 +290,36 @@ async function runDownload(name, remotePath, localPath) {
|
|
|
188
290
|
}
|
|
189
291
|
async function runExport(file) {
|
|
190
292
|
const { exportVault } = await import('../import-export/archive.js');
|
|
191
|
-
|
|
293
|
+
const vault = await unlockFromPrompt();
|
|
294
|
+
console.log(`Exported to ${exportVault(file, vault)}`);
|
|
192
295
|
}
|
|
193
296
|
async function runImport(file) {
|
|
194
297
|
const { importVault } = await import('../import-export/archive.js');
|
|
195
298
|
const ok = await confirm({ message: 'Import will replace the current vault database. Continue?', default: false });
|
|
196
299
|
if (!ok)
|
|
197
300
|
return;
|
|
198
|
-
|
|
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).`);
|
|
199
316
|
}
|
|
200
317
|
async function main() {
|
|
201
318
|
const program = new Command();
|
|
202
319
|
program
|
|
203
320
|
.name('sshp')
|
|
204
321
|
.description('Portable encrypted SSH/SFTP picker')
|
|
205
|
-
.version('0.1.
|
|
322
|
+
.version('0.1.3')
|
|
206
323
|
.action(runDashboard);
|
|
207
324
|
program.command('init').description('Create a portable encrypted vault').action(runInit);
|
|
208
325
|
program.command('add').description('Add a password-based SSH server').action(runAdd);
|
|
@@ -213,6 +330,8 @@ async function main() {
|
|
|
213
330
|
program.command('download <server> <remote> <local>').description('Download a file over SFTP').action(runDownload);
|
|
214
331
|
program.command('export <file>').description('Export encrypted vault backup').action(runExport);
|
|
215
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);
|
|
216
335
|
const config = program.command('config').description('Manage SSHP configuration');
|
|
217
336
|
config.command('set <key> <value>').description('Set a config value').action((key, value) => {
|
|
218
337
|
if (key !== 'dataDir')
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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
|
-
|
|
2
|
-
export declare function
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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;
|
|
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
|