@lemoncat7/dsh-ssh 0.1.0-alpha.15

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.
Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -0
  3. package/cordis.patch.yml +10 -0
  4. package/lib/api.d.ts +23 -0
  5. package/lib/api.d.ts.map +1 -0
  6. package/lib/api.js +571 -0
  7. package/lib/api.js.map +1 -0
  8. package/lib/client-api.d.ts +174 -0
  9. package/lib/client-api.d.ts.map +1 -0
  10. package/lib/client-api.js +88 -0
  11. package/lib/client-api.js.map +1 -0
  12. package/lib/client.d.ts +4 -0
  13. package/lib/client.d.ts.map +1 -0
  14. package/lib/client.js +8067 -0
  15. package/lib/client.js.map +7 -0
  16. package/lib/config.d.ts +14 -0
  17. package/lib/config.d.ts.map +1 -0
  18. package/lib/config.js +31 -0
  19. package/lib/config.js.map +1 -0
  20. package/lib/connector.d.ts +30 -0
  21. package/lib/connector.d.ts.map +1 -0
  22. package/lib/connector.js +216 -0
  23. package/lib/connector.js.map +1 -0
  24. package/lib/credentials.d.ts +25 -0
  25. package/lib/credentials.d.ts.map +1 -0
  26. package/lib/credentials.js +84 -0
  27. package/lib/credentials.js.map +1 -0
  28. package/lib/directory.d.ts +8 -0
  29. package/lib/directory.d.ts.map +1 -0
  30. package/lib/directory.js +45 -0
  31. package/lib/directory.js.map +1 -0
  32. package/lib/domain.d.ts +121 -0
  33. package/lib/domain.d.ts.map +1 -0
  34. package/lib/domain.js +136 -0
  35. package/lib/domain.js.map +1 -0
  36. package/lib/exec.d.ts +15 -0
  37. package/lib/exec.d.ts.map +1 -0
  38. package/lib/exec.js +82 -0
  39. package/lib/exec.js.map +1 -0
  40. package/lib/forwards.d.ts +26 -0
  41. package/lib/forwards.d.ts.map +1 -0
  42. package/lib/forwards.js +213 -0
  43. package/lib/forwards.js.map +1 -0
  44. package/lib/index.d.ts +9 -0
  45. package/lib/index.d.ts.map +1 -0
  46. package/lib/index.js +53 -0
  47. package/lib/index.js.map +1 -0
  48. package/lib/proxy.d.ts +9 -0
  49. package/lib/proxy.d.ts.map +1 -0
  50. package/lib/proxy.js +116 -0
  51. package/lib/proxy.js.map +1 -0
  52. package/lib/sftp-client.d.ts +12 -0
  53. package/lib/sftp-client.d.ts.map +1 -0
  54. package/lib/sftp-client.js +123 -0
  55. package/lib/sftp-client.js.map +1 -0
  56. package/lib/sftp.d.ts +43 -0
  57. package/lib/sftp.d.ts.map +1 -0
  58. package/lib/sftp.js +251 -0
  59. package/lib/sftp.js.map +1 -0
  60. package/lib/sidebar-anchor.d.ts +8 -0
  61. package/lib/sidebar-anchor.d.ts.map +1 -0
  62. package/lib/sidebar-anchor.js +50 -0
  63. package/lib/sidebar-anchor.js.map +1 -0
  64. package/lib/store.d.ts +20 -0
  65. package/lib/store.d.ts.map +1 -0
  66. package/lib/store.js +154 -0
  67. package/lib/store.js.map +1 -0
  68. package/lib/terminal.d.ts +108 -0
  69. package/lib/terminal.d.ts.map +1 -0
  70. package/lib/terminal.js +384 -0
  71. package/lib/terminal.js.map +1 -0
  72. package/lib/tools.d.ts +7 -0
  73. package/lib/tools.d.ts.map +1 -0
  74. package/lib/tools.js +237 -0
  75. package/lib/tools.js.map +1 -0
  76. package/package.json +107 -0
package/lib/api.js ADDED
@@ -0,0 +1,571 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { pipeline } from 'node:stream/promises';
3
+ import { HostKeyRequiredError } from './connector.js';
4
+ import { normalizeCredentialEntryDraft, normalizeForwardDraft, normalizeProfileDraft, normalizeSecrets, } from './domain.js';
5
+ import { setSessionDirectory } from './directory.js';
6
+ import { listSftpDirectory, openSftpFile, readSftpFilePreview, uploadSftpFile } from './sftp.js';
7
+ const MAX_BODY_BYTES = 1_048_576;
8
+ const MAX_SFTP_UPLOAD_BYTES = 512 * 1024 * 1024;
9
+ export function registerSshApi(webServer, prefix, runtime) {
10
+ return webServer.register({
11
+ kind: 'prefix',
12
+ path: prefix,
13
+ handler: async (req, res) => {
14
+ try {
15
+ assertSameOrigin(req);
16
+ await dispatch(req, res, prefix, runtime);
17
+ }
18
+ catch (error) {
19
+ sendError(res, error);
20
+ }
21
+ },
22
+ });
23
+ }
24
+ async function dispatch(req, res, prefix, runtime) {
25
+ const url = new URL(req.url ?? '/', 'http://ssh.local');
26
+ const relative = url.pathname.slice(prefix.length).replace(/^\/+|\/+$/g, '');
27
+ const segments = relative ? relative.split('/').map(decodeURIComponent) : [];
28
+ const method = req.method ?? 'GET';
29
+ if (method === 'GET' && segments[0] === 'health')
30
+ return sendJson(res, 200, { ok: true, service: 'dsh-ssh', schemaVersion: 1 });
31
+ if (segments[0] === 'vault') {
32
+ if (method === 'GET' && segments.length === 1)
33
+ return sendJson(res, 200, await credentialEntryViews(runtime));
34
+ if (method === 'POST' && segments.length === 1) {
35
+ requireMutationHeader(req);
36
+ const body = await readObject(req);
37
+ const draft = normalizeCredentialEntryDraft(body.entry);
38
+ const secrets = normalizeSecrets(body.secrets);
39
+ requireCredentialSecret(draft.authType, secrets);
40
+ const now = Date.now();
41
+ const entry = { ...draft, id: createId('credential'), createdAt: now, updatedAt: now };
42
+ await runtime.credentials.replaceEntry(entry.id, secrets);
43
+ try {
44
+ await runtime.store.update(state => { state.credentialEntries.push(entry); });
45
+ }
46
+ catch (error) {
47
+ await runtime.credentials.deleteEntry(entry.id).catch(() => { });
48
+ throw error;
49
+ }
50
+ return sendJson(res, 201, await credentialEntryView(runtime, entry));
51
+ }
52
+ const id = segments[1];
53
+ if (id !== undefined && method === 'PUT' && segments.length === 2) {
54
+ requireMutationHeader(req);
55
+ const previous = requiredCredentialEntry(runtime.store, id);
56
+ const body = await readObject(req);
57
+ const draft = normalizeCredentialEntryDraft(body.entry);
58
+ const secrets = normalizeSecrets(body.secrets);
59
+ const previousSecrets = await runtime.credentials.readEntry(id);
60
+ requireCredentialSecret(draft.authType, { ...previousSecrets, ...secrets });
61
+ if (Object.keys(secrets).length > 0)
62
+ await runtime.credentials.writeEntry(id, secrets);
63
+ const next = { ...previous, ...draft, id, createdAt: previous.createdAt, updatedAt: Date.now() };
64
+ try {
65
+ await runtime.store.update(state => { state.credentialEntries = state.credentialEntries.map(entry => entry.id === id ? next : entry); });
66
+ }
67
+ catch (error) {
68
+ await runtime.credentials.replaceEntry(id, previousSecrets).catch(() => { });
69
+ throw error;
70
+ }
71
+ return sendJson(res, 200, await credentialEntryView(runtime, next));
72
+ }
73
+ if (id !== undefined && method === 'DELETE' && segments.length === 2) {
74
+ requireMutationHeader(req);
75
+ requiredCredentialEntry(runtime.store, id);
76
+ const references = runtime.store.profiles().filter(profile => profile.credentialId === id);
77
+ if (references.length > 0)
78
+ throw httpError(409, `credential entry is used by ${references.length} SSH profile(s)`);
79
+ await runtime.store.update(state => { state.credentialEntries = state.credentialEntries.filter(entry => entry.id !== id); });
80
+ await runtime.credentials.deleteEntry(id);
81
+ return sendJson(res, 204, undefined);
82
+ }
83
+ }
84
+ if (segments[0] === 'profiles') {
85
+ if (method === 'GET' && segments.length === 1)
86
+ return sendJson(res, 200, await profileViews(runtime));
87
+ if (method === 'POST' && segments[1] === 'test-draft' && segments.length === 2) {
88
+ requireMutationHeader(req);
89
+ const body = await readObject(req);
90
+ const draft = normalizeProfileDraft(body.profile);
91
+ const profileId = body.profileId === undefined ? createId('preview') : requireText(body.profileId, 'profileId', 100);
92
+ const previousSecrets = body.profileId === undefined ? {} : await runtime.credentials.read(requiredProfile(runtime.store, profileId).id);
93
+ const secrets = { ...previousSecrets, ...normalizeSecrets(body.secrets) };
94
+ const now = Date.now();
95
+ const profile = { ...draft, id: profileId, port: draft.port ?? 22, proxy: draft.proxy ?? { type: 'none' }, keepAliveIntervalMs: draft.keepAliveIntervalMs ?? 15_000, connectTimeoutMs: draft.connectTimeoutMs ?? 15_000, terminalType: draft.terminalType ?? 'xterm-256color', tags: draft.tags ?? [], createdAt: now, updatedAt: now };
96
+ try {
97
+ const connection = await runtime.connector.connectDraft(profile, secrets);
98
+ connection.close();
99
+ return sendJson(res, 200, { ok: true });
100
+ }
101
+ catch (error) {
102
+ if (error instanceof HostKeyRequiredError)
103
+ return sendJson(res, 409, { ok: false, code: error.code, fingerprint: error.fingerprint });
104
+ throw error;
105
+ }
106
+ }
107
+ if (method === 'POST' && segments.length === 1) {
108
+ requireMutationHeader(req);
109
+ const body = await readObject(req);
110
+ const draft = normalizeProfileDraft(body.profile);
111
+ const secrets = normalizeSecrets(body.secrets);
112
+ const now = Date.now();
113
+ const profile = { ...draft, id: createId('host'), port: draft.port ?? 22, proxy: draft.proxy ?? { type: 'none' }, keepAliveIntervalMs: draft.keepAliveIntervalMs ?? 15_000, connectTimeoutMs: draft.connectTimeoutMs ?? 15_000, terminalType: draft.terminalType ?? 'xterm-256color', tags: draft.tags ?? [], createdAt: now, updatedAt: now };
114
+ if (profile.credentialId === undefined)
115
+ await runtime.credentials.replace(profile.id, secrets);
116
+ try {
117
+ await runtime.store.update(state => { state.profiles.push(profile); });
118
+ }
119
+ catch (error) {
120
+ if (profile.credentialId === undefined)
121
+ await runtime.credentials.delete(profile.id).catch(() => { });
122
+ throw error;
123
+ }
124
+ return sendJson(res, 201, await profileView(runtime, profile));
125
+ }
126
+ const id = segments[1];
127
+ if (id !== undefined && segments[2] === 'sftp') {
128
+ requiredProfile(runtime.store, id);
129
+ const operation = segments[3];
130
+ if (method === 'GET' && operation === 'directory' && segments.length === 4) {
131
+ return sendJson(res, 200, await listSftpDirectory(runtime.connector, id, url.searchParams.get('path') ?? '~'));
132
+ }
133
+ if (method === 'GET' && operation === 'file' && segments.length === 4) {
134
+ return sendJson(res, 200, await readSftpFilePreview(runtime.connector, id, requireRawText(url.searchParams.get('path'), 'path', 4096)));
135
+ }
136
+ if (method === 'GET' && operation === 'download' && segments.length === 4) {
137
+ return streamSftpFile(res, url, runtime, id, requireRawText(url.searchParams.get('path'), 'path', 4096));
138
+ }
139
+ if (method === 'PUT' && operation === 'upload' && segments.length === 4) {
140
+ requireMutationHeader(req);
141
+ const contentLengthHeader = req.headers['content-length'];
142
+ const contentLength = contentLengthHeader === undefined ? undefined : optionalInteger(Number(contentLengthHeader), 0, Number.MAX_SAFE_INTEGER);
143
+ if (contentLength !== undefined && contentLength > MAX_SFTP_UPLOAD_BYTES)
144
+ throw httpError(413, 'upload exceeds the 512 MB limit');
145
+ const directory = requireRawText(url.searchParams.get('directory'), 'directory', 4096);
146
+ const filename = requireRemoteFilename(url.searchParams.get('name'));
147
+ const result = await uploadSftpFile(runtime.connector, id, directory, filename, req, {
148
+ overwrite: url.searchParams.get('overwrite') === '1',
149
+ maxBytes: MAX_SFTP_UPLOAD_BYTES,
150
+ });
151
+ return sendJson(res, 201, result);
152
+ }
153
+ }
154
+ if (id !== undefined && method === 'PUT' && segments.length === 2) {
155
+ requireMutationHeader(req);
156
+ const previous = requiredProfile(runtime.store, id);
157
+ const body = await readObject(req);
158
+ const draft = normalizeProfileDraft(body.profile);
159
+ const secrets = normalizeSecrets(body.secrets);
160
+ const next = { ...previous, ...draft, port: draft.port ?? 22, proxy: draft.proxy ?? { type: 'none' }, keepAliveIntervalMs: draft.keepAliveIntervalMs ?? 15_000, connectTimeoutMs: draft.connectTimeoutMs ?? 15_000, terminalType: draft.terminalType ?? 'xterm-256color', tags: draft.tags ?? [], id, createdAt: previous.createdAt, updatedAt: Date.now() };
161
+ if (draft.group === undefined)
162
+ delete next.group;
163
+ const previousSecrets = await runtime.credentials.read(id);
164
+ if (Object.keys(secrets).length > 0)
165
+ await runtime.credentials.write(id, secrets);
166
+ try {
167
+ await runtime.store.update(state => { state.profiles = state.profiles.map(profile => profile.id === id ? next : profile); });
168
+ }
169
+ catch (error) {
170
+ await runtime.credentials.replace(id, previousSecrets).catch(() => { });
171
+ throw error;
172
+ }
173
+ return sendJson(res, 200, await profileView(runtime, next));
174
+ }
175
+ if (id !== undefined && method === 'DELETE' && segments.length === 2) {
176
+ requireMutationHeader(req);
177
+ requiredProfile(runtime.store, id);
178
+ const related = runtime.store.forwards().filter(rule => rule.profileId === id);
179
+ await Promise.all(related.map(rule => runtime.forwards.stop(rule.id).catch(() => { })));
180
+ await runtime.store.update(state => {
181
+ state.profiles = state.profiles.filter(profile => profile.id !== id);
182
+ state.forwardRules = state.forwardRules.filter(rule => rule.profileId !== id);
183
+ state.injections = state.injections.map(item => {
184
+ const { [id]: _removed, ...workingDirectories } = item.workingDirectories;
185
+ return { ...item, profileIds: item.profileIds.filter(profileId => profileId !== id), workingDirectories };
186
+ });
187
+ });
188
+ await runtime.credentials.delete(id);
189
+ return sendJson(res, 204, undefined);
190
+ }
191
+ if (id !== undefined && method === 'POST' && segments[2] === 'test' && segments.length === 3) {
192
+ requireMutationHeader(req);
193
+ requiredProfile(runtime.store, id);
194
+ try {
195
+ const connection = await runtime.connector.connect(id);
196
+ connection.close();
197
+ return sendJson(res, 200, { ok: true });
198
+ }
199
+ catch (error) {
200
+ if (error instanceof HostKeyRequiredError)
201
+ return sendJson(res, 409, { ok: false, code: error.code, fingerprint: error.fingerprint });
202
+ throw error;
203
+ }
204
+ }
205
+ if (id !== undefined && method === 'POST' && segments[2] === 'confirm-host' && segments.length === 3) {
206
+ requireMutationHeader(req);
207
+ const body = await readObject(req);
208
+ const fingerprint = requireText(body.fingerprint, 'fingerprint', 256);
209
+ const previous = requiredProfile(runtime.store, id);
210
+ const next = { ...previous, hostFingerprint: fingerprint, updatedAt: Date.now() };
211
+ await runtime.store.update(state => { state.profiles = state.profiles.map(profile => profile.id === id ? next : profile); });
212
+ try {
213
+ const connection = await runtime.connector.connect(id);
214
+ connection.close();
215
+ }
216
+ catch (error) {
217
+ await runtime.store.update(state => { state.profiles = state.profiles.map(profile => profile.id === id ? previous : profile); });
218
+ throw error;
219
+ }
220
+ return sendJson(res, 200, await profileView(runtime, next));
221
+ }
222
+ }
223
+ if (segments[0] === 'forwards') {
224
+ if (method === 'GET' && segments.length === 1)
225
+ return sendJson(res, 200, { rules: runtime.store.forwards(), statuses: runtime.forwards.list() });
226
+ if (method === 'POST' && segments.length === 1) {
227
+ requireMutationHeader(req);
228
+ const draft = normalizeForwardDraft((await readObject(req)).rule);
229
+ requiredProfile(runtime.store, draft.profileId);
230
+ const now = Date.now();
231
+ const rule = { ...draft, id: createId('forward'), bindHost: draft.bindHost ?? '127.0.0.1', autoStart: draft.autoStart ?? false, createdAt: now, updatedAt: now };
232
+ await runtime.store.update(state => { state.forwardRules.push(rule); });
233
+ return sendJson(res, 201, { rule, status: runtime.forwards.status(rule.id) });
234
+ }
235
+ const id = segments[1];
236
+ if (id !== undefined && method === 'PUT' && segments.length === 2) {
237
+ requireMutationHeader(req);
238
+ const previous = requiredForward(runtime.store, id);
239
+ const draft = normalizeForwardDraft((await readObject(req)).rule);
240
+ requiredProfile(runtime.store, draft.profileId);
241
+ await runtime.forwards.stop(id).catch(() => { });
242
+ const next = { ...previous, ...draft, bindHost: draft.bindHost ?? '127.0.0.1', autoStart: draft.autoStart ?? false, id, createdAt: previous.createdAt, updatedAt: Date.now() };
243
+ await runtime.store.update(state => { state.forwardRules = state.forwardRules.map(rule => rule.id === id ? next : rule); });
244
+ if (next.autoStart)
245
+ await runtime.forwards.start(id);
246
+ return sendJson(res, 200, { rule: next, status: runtime.forwards.status(id) });
247
+ }
248
+ if (id !== undefined && method === 'DELETE' && segments.length === 2) {
249
+ requireMutationHeader(req);
250
+ requiredForward(runtime.store, id);
251
+ await runtime.forwards.stop(id).catch(() => { });
252
+ await runtime.store.update(state => { state.forwardRules = state.forwardRules.filter(rule => rule.id !== id); });
253
+ return sendJson(res, 204, undefined);
254
+ }
255
+ if (id !== undefined && method === 'POST' && segments[2] === 'start') {
256
+ requireMutationHeader(req);
257
+ return sendJson(res, 200, await runtime.forwards.start(id));
258
+ }
259
+ if (id !== undefined && method === 'POST' && segments[2] === 'stop') {
260
+ requireMutationHeader(req);
261
+ return sendJson(res, 200, await runtime.forwards.stop(id));
262
+ }
263
+ }
264
+ if (segments[0] === 'injections') {
265
+ if (method === 'GET' && segments.length === 1) {
266
+ const sessionId = url.searchParams.get('sessionId');
267
+ if (!sessionId)
268
+ throw httpError(400, 'sessionId is required');
269
+ return sendJson(res, 200, runtime.store.injection(sessionId) ?? null);
270
+ }
271
+ const sessionId = segments[1];
272
+ if (sessionId !== undefined && method === 'PUT' && segments.length === 2) {
273
+ requireMutationHeader(req);
274
+ const body = await readObject(req);
275
+ const profileIds = parseProfileIds(body.profileIds, runtime.store);
276
+ const permission = body.permission === 'exec' ? 'exec' : body.permission === 'terminal' ? 'terminal' : undefined;
277
+ if (permission === undefined)
278
+ throw httpError(400, 'permission must be exec or terminal');
279
+ const previousDirectories = runtime.store.injection(sessionId)?.workingDirectories ?? {};
280
+ const workingDirectories = Object.fromEntries(Object.entries(previousDirectories).filter(([profileId]) => profileIds.includes(profileId)));
281
+ const injection = { sessionId, profileIds, permission, requireCommandApproval: body.requireCommandApproval !== false, workingDirectories, updatedAt: Date.now() };
282
+ await runtime.store.update(state => { state.injections = [...state.injections.filter(item => item.sessionId !== sessionId), injection]; });
283
+ return sendJson(res, 200, injection);
284
+ }
285
+ if (sessionId !== undefined && method === 'DELETE' && segments.length === 2) {
286
+ requireMutationHeader(req);
287
+ await runtime.store.update(state => { state.injections = state.injections.filter(item => item.sessionId !== sessionId); });
288
+ return sendJson(res, 204, undefined);
289
+ }
290
+ }
291
+ if (segments[0] === 'activity') {
292
+ const sessionId = url.searchParams.get('sessionId');
293
+ if (method === 'GET' && segments.length === 1) {
294
+ if (!sessionId)
295
+ throw httpError(400, 'sessionId is required');
296
+ const injection = runtime.store.injection(sessionId);
297
+ if (injection === undefined || injection.profileIds.length === 0)
298
+ return sendJson(res, 200, { injection: null, profiles: [], terminals: [] });
299
+ const profiles = injection.profileIds.map(profileId => runtime.store.profile(profileId)).filter((profile) => profile !== undefined).map(profile => ({
300
+ id: profile.id,
301
+ name: profile.name,
302
+ host: profile.host,
303
+ port: profile.port,
304
+ username: profile.username,
305
+ cwd: injection.workingDirectories[profile.id] ?? '~',
306
+ }));
307
+ return sendJson(res, 200, {
308
+ injection,
309
+ profiles,
310
+ terminals: injection.permission === 'terminal' ? runtime.aiTerminals.activity(sessionId) : [],
311
+ });
312
+ }
313
+ if (method === 'PUT' && segments[1] === 'directory' && segments.length === 2) {
314
+ requireMutationHeader(req);
315
+ const body = await readObject(req);
316
+ const targetSessionId = requireText(body.sessionId, 'sessionId', 200);
317
+ const profileId = requireText(body.profileId, 'profileId', 100);
318
+ const cwd = requireRawText(body.cwd, 'cwd', 4096);
319
+ return sendJson(res, 200, { cwd: await setSessionDirectory(runtime.store, runtime.connector, targetSessionId, profileId, cwd) });
320
+ }
321
+ if (method === 'GET' && segments[1] === 'files' && segments.length === 2) {
322
+ if (!sessionId)
323
+ throw httpError(400, 'sessionId is required');
324
+ const profileId = requireText(url.searchParams.get('profileId'), 'profileId', 100);
325
+ const injection = requireActivityProfile(runtime.store, sessionId, profileId);
326
+ const requestedPath = url.searchParams.get('path') ?? injection.workingDirectories[profileId] ?? '~';
327
+ return sendJson(res, 200, await listSftpDirectory(runtime.connector, profileId, requestedPath));
328
+ }
329
+ if (method === 'GET' && segments[1] === 'file' && segments.length === 2) {
330
+ if (!sessionId)
331
+ throw httpError(400, 'sessionId is required');
332
+ const profileId = requireText(url.searchParams.get('profileId'), 'profileId', 100);
333
+ requireActivityProfile(runtime.store, sessionId, profileId);
334
+ const requestedPath = requireRawText(url.searchParams.get('path'), 'path', 4096);
335
+ return sendJson(res, 200, await readSftpFilePreview(runtime.connector, profileId, requestedPath));
336
+ }
337
+ if (method === 'GET' && segments[1] === 'download' && segments.length === 2) {
338
+ if (!sessionId)
339
+ throw httpError(400, 'sessionId is required');
340
+ const profileId = requireText(url.searchParams.get('profileId'), 'profileId', 100);
341
+ requireActivityProfile(runtime.store, sessionId, profileId);
342
+ const requestedPath = requireRawText(url.searchParams.get('path'), 'path', 4096);
343
+ return streamSftpFile(res, url, runtime, profileId, requestedPath);
344
+ }
345
+ if (method === 'POST' && segments[1] === 'terminals' && segments[2] !== undefined && segments.length === 4) {
346
+ requireMutationHeader(req);
347
+ const terminalId = segments[2];
348
+ const operation = segments[3];
349
+ const body = await readObject(req);
350
+ const targetSessionId = requireText(body.sessionId, 'sessionId', 200);
351
+ requireActivityTerminal(runtime.store, targetSessionId);
352
+ if (operation === 'input') {
353
+ runtime.aiTerminals.write(targetSessionId, terminalId, requireRawText(body.text, 'text', 100_000));
354
+ return sendJson(res, 204, undefined);
355
+ }
356
+ if (operation === 'resize') {
357
+ runtime.aiTerminals.resize(targetSessionId, terminalId, requireInteger(body.cols, 'cols', 20, 400), requireInteger(body.rows, 'rows', 5, 200));
358
+ return sendJson(res, 204, undefined);
359
+ }
360
+ }
361
+ }
362
+ if (segments[0] === 'settings' && segments.length === 1) {
363
+ if (method === 'GET')
364
+ return sendJson(res, 200, runtime.store.settings());
365
+ if (method === 'PUT') {
366
+ requireMutationHeader(req);
367
+ const body = await readObject(req);
368
+ const settings = {
369
+ allowPublicBind: body.allowPublicBind === true,
370
+ defaultCommandTimeoutMs: requireInteger(body.defaultCommandTimeoutMs, 'defaultCommandTimeoutMs', 1000, 300_000),
371
+ maxOutputChars: requireInteger(body.maxOutputChars, 'maxOutputChars', 1000, 1_000_000),
372
+ };
373
+ await runtime.store.update(state => { state.settings = settings; });
374
+ return sendJson(res, 200, settings);
375
+ }
376
+ }
377
+ if (segments[0] === 'terminals') {
378
+ if (method === 'POST' && segments.length === 1) {
379
+ requireMutationHeader(req);
380
+ const body = await readObject(req);
381
+ const profileId = requireText(body.profileId, 'profileId', 100);
382
+ requiredProfile(runtime.store, profileId);
383
+ return sendJson(res, 201, await runtime.terminals.create(profileId, optionalInteger(body.cols, 20, 400) ?? 120, optionalInteger(body.rows, 5, 200) ?? 32));
384
+ }
385
+ const id = segments[1];
386
+ if (id !== undefined && method === 'GET' && segments[2] === 'output') {
387
+ return sendJson(res, 200, runtime.terminals.get(id).read(optionalInteger(Number(url.searchParams.get('cursor') ?? 0), 0, Number.MAX_SAFE_INTEGER) ?? 0));
388
+ }
389
+ if (id !== undefined && method === 'POST' && segments[2] === 'input') {
390
+ requireMutationHeader(req);
391
+ runtime.terminals.get(id).write(requireRawText((await readObject(req)).text, 'text', 100_000));
392
+ return sendJson(res, 204, undefined);
393
+ }
394
+ if (id !== undefined && method === 'POST' && segments[2] === 'resize') {
395
+ requireMutationHeader(req);
396
+ const body = await readObject(req);
397
+ runtime.terminals.get(id).resize(requireInteger(body.cols, 'cols', 20, 400), requireInteger(body.rows, 'rows', 5, 200));
398
+ return sendJson(res, 204, undefined);
399
+ }
400
+ if (id !== undefined && method === 'DELETE' && segments.length === 2) {
401
+ requireMutationHeader(req);
402
+ await runtime.terminals.get(id).close();
403
+ return sendJson(res, 204, undefined);
404
+ }
405
+ }
406
+ throw httpError(404, 'SSH API route was not found');
407
+ }
408
+ async function profileViews(runtime) {
409
+ return Promise.all(runtime.store.profiles().map(profile => profileView(runtime, profile)));
410
+ }
411
+ async function profileView(runtime, profile) {
412
+ if (profile.credentialId !== undefined) {
413
+ const entry = requiredCredentialEntry(runtime.store, profile.credentialId);
414
+ const credential = await runtime.credentials.describeEntry(entry.id);
415
+ const requiredField = entry.authType === 'password' ? 'password' : 'privateKey';
416
+ return { ...profile, username: entry.username, authType: entry.authType, credential: { ...credential, configured: credential.fields.includes(requiredField), source: 'vault', entryId: entry.id, entryName: entry.name } };
417
+ }
418
+ const credential = await runtime.credentials.describe(profile.id);
419
+ const requiredField = profile.authType === 'password' ? 'password' : profile.authType === 'private-key' ? 'privateKey' : undefined;
420
+ return { ...profile, credential: { ...credential, configured: requiredField === undefined || credential.fields.includes(requiredField), source: 'profile' } };
421
+ }
422
+ async function credentialEntryViews(runtime) {
423
+ return Promise.all(runtime.store.credentialEntries().map(entry => credentialEntryView(runtime, entry)));
424
+ }
425
+ async function credentialEntryView(runtime, entry) {
426
+ const credential = await runtime.credentials.describeEntry(entry.id);
427
+ const requiredField = entry.authType === 'password' ? 'password' : 'privateKey';
428
+ return { ...entry, credential: { ...credential, configured: credential.fields.includes(requiredField) }, references: runtime.store.profiles().filter(profile => profile.credentialId === entry.id).length };
429
+ }
430
+ function requiredProfile(store, id) {
431
+ const profile = store.profile(id);
432
+ if (profile === undefined)
433
+ throw httpError(404, 'SSH profile was not found');
434
+ return profile;
435
+ }
436
+ function requiredForward(store, id) {
437
+ const rule = store.forward(id);
438
+ if (rule === undefined)
439
+ throw httpError(404, 'port-forward rule was not found');
440
+ return rule;
441
+ }
442
+ function requiredCredentialEntry(store, id) {
443
+ const entry = store.credentialEntry(id);
444
+ if (entry === undefined)
445
+ throw httpError(404, 'SSH credential entry was not found');
446
+ return entry;
447
+ }
448
+ function requireCredentialSecret(authType, secrets) {
449
+ if (authType === 'password' && !secrets.password)
450
+ throw httpError(400, 'password is required for this credential entry');
451
+ if (authType === 'private-key' && !secrets.privateKey)
452
+ throw httpError(400, 'private key is required for this credential entry');
453
+ }
454
+ function requireActivityProfile(store, sessionId, profileId) {
455
+ const injection = store.injection(sessionId);
456
+ if (injection === undefined)
457
+ throw httpError(403, 'SSH access is not injected into this DSH session');
458
+ if (!injection.profileIds.includes(profileId))
459
+ throw httpError(403, 'This SSH profile is not injected into the current DSH session');
460
+ return injection;
461
+ }
462
+ function requireActivityTerminal(store, sessionId) {
463
+ const injection = store.injection(sessionId);
464
+ if (injection === undefined || injection.permission !== 'terminal')
465
+ throw httpError(403, 'Terminal control is not granted to this DSH session');
466
+ return injection;
467
+ }
468
+ function parseProfileIds(value, store) {
469
+ if (!Array.isArray(value) || value.length > 100)
470
+ throw httpError(400, 'profileIds must be an array');
471
+ return [...new Set(value.map(item => requireText(item, 'profileId', 100)))].map(id => requiredProfile(store, id).id);
472
+ }
473
+ function createId(prefix) { return `${prefix}-${randomBytes(10).toString('hex')}`; }
474
+ function assertSameOrigin(req) {
475
+ const origin = req.headers.origin;
476
+ const host = req.headers.host;
477
+ if (origin !== undefined && host !== undefined && new URL(origin).host !== host)
478
+ throw httpError(403, 'cross-origin SSH API access is forbidden');
479
+ const site = req.headers['sec-fetch-site'];
480
+ if (site !== undefined && site !== 'same-origin' && site !== 'same-site' && site !== 'none')
481
+ throw httpError(403, 'cross-site SSH API access is forbidden');
482
+ }
483
+ function requireMutationHeader(req) {
484
+ if (req.headers['x-dsh-ssh-request'] !== '1')
485
+ throw httpError(403, 'missing SSH mutation request header');
486
+ }
487
+ async function readObject(req) {
488
+ let total = 0;
489
+ const chunks = [];
490
+ for await (const chunk of req) {
491
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
492
+ total += buffer.length;
493
+ if (total > MAX_BODY_BYTES)
494
+ throw httpError(413, 'request body is too large');
495
+ chunks.push(buffer);
496
+ }
497
+ let parsed;
498
+ try {
499
+ parsed = JSON.parse(Buffer.concat(chunks).toString('utf8') || '{}');
500
+ }
501
+ catch {
502
+ throw httpError(400, 'request body must be valid JSON');
503
+ }
504
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
505
+ throw httpError(400, 'request body must be an object');
506
+ return parsed;
507
+ }
508
+ function requireText(value, label, max) {
509
+ if (typeof value !== 'string' || value.trim().length === 0 || value.length > max)
510
+ throw httpError(400, `${label} is invalid`);
511
+ return value.trim();
512
+ }
513
+ function requireRawText(value, label, max) {
514
+ if (typeof value !== 'string' || value.length > max)
515
+ throw httpError(400, `${label} is invalid`);
516
+ return value;
517
+ }
518
+ function requireRemoteFilename(value) {
519
+ const filename = requireText(value, 'name', 255);
520
+ if (filename === '.' || filename === '..' || filename.includes('/') || filename.includes('\\'))
521
+ throw httpError(400, 'name must be a single remote filename');
522
+ return filename;
523
+ }
524
+ function requireInteger(value, label, min, max) {
525
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < min || value > max)
526
+ throw httpError(400, `${label} must be an integer between ${min} and ${max}`);
527
+ return value;
528
+ }
529
+ function optionalInteger(value, min, max) {
530
+ if (value === undefined || value === null || value === '')
531
+ return undefined;
532
+ return requireInteger(value, 'value', min, max);
533
+ }
534
+ function httpError(status, message) { return Object.assign(new Error(message), { status }); }
535
+ async function streamSftpFile(res, url, runtime, profileId, requestedPath) {
536
+ const file = await openSftpFile(runtime.connector, profileId, requestedPath);
537
+ const filename = file.path.replaceAll('\\', '/').split('/').at(-1) || 'download';
538
+ res.statusCode = 200;
539
+ res.setHeader('Cache-Control', 'private, no-store');
540
+ res.setHeader('Content-Type', file.mimeType);
541
+ res.setHeader('Content-Length', String(file.size));
542
+ res.setHeader('Content-Disposition', `${url.searchParams.get('inline') === '1' ? 'inline' : 'attachment'}; filename*=UTF-8''${encodeURIComponent(filename)}`);
543
+ res.setHeader('X-Content-Type-Options', 'nosniff');
544
+ try {
545
+ await pipeline(file.stream, res);
546
+ }
547
+ finally {
548
+ file.close();
549
+ }
550
+ }
551
+ function sendJson(res, status, value) {
552
+ res.statusCode = status;
553
+ res.setHeader('Cache-Control', 'no-store');
554
+ res.setHeader('Content-Type', 'application/json; charset=utf-8');
555
+ res.setHeader('X-Content-Type-Options', 'nosniff');
556
+ res.end(value === undefined ? '' : JSON.stringify(value));
557
+ }
558
+ function sendError(res, error) {
559
+ if (res.headersSent) {
560
+ res.destroy();
561
+ return;
562
+ }
563
+ const value = error;
564
+ const status = Number.isInteger(value.status) ? value.status : value instanceof HostKeyRequiredError ? 409 : 500;
565
+ sendJson(res, status, {
566
+ error: value instanceof Error ? value.message : String(error),
567
+ ...value.code === undefined ? {} : { code: value.code },
568
+ ...value instanceof HostKeyRequiredError ? { fingerprint: value.fingerprint } : {},
569
+ });
570
+ }
571
+ //# sourceMappingURL=api.js.map
package/lib/api.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}