koneck 2.25.74 → 2.25.75
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/dist/server.d.ts +13 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +62 -4
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/dist/server.d.ts
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
1
|
import type { AgentConfig } from './types.js';
|
|
2
|
-
export
|
|
2
|
+
export interface ServeOptions {
|
|
3
|
+
port?: number;
|
|
4
|
+
/**
|
|
5
|
+
* Which interface to listen on. Loopback unless changed deliberately.
|
|
6
|
+
*
|
|
7
|
+
* Exposing this beyond the machine publishes an endpoint that runs an agent, so it is a decision
|
|
8
|
+
* someone has to make on purpose rather than the default they get by not thinking about it.
|
|
9
|
+
*/
|
|
10
|
+
host?: string;
|
|
11
|
+
/** An origin allowed to call this from a browser. Same-origin only when absent. */
|
|
12
|
+
allowOrigin?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function runServer(config: AgentConfig, portOrOptions?: number | ServeOptions): Promise<void>;
|
|
3
15
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA0J9C,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,WAAW,EACnB,aAAa,GAAE,MAAM,GAAG,YAA2B,GAClD,OAAO,CAAC,IAAI,CAAC,CAyGf"}
|
package/dist/server.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createServer } from 'http';
|
|
2
|
+
import { randomBytes, timingSafeEqual } from 'crypto';
|
|
2
3
|
import { readdir, readFile } from 'fs/promises';
|
|
3
4
|
import { existsSync } from 'fs';
|
|
4
5
|
import path from 'path';
|
|
@@ -6,6 +7,34 @@ import { fileURLToPath } from 'url';
|
|
|
6
7
|
import chalk from 'chalk';
|
|
7
8
|
import { execa } from 'execa';
|
|
8
9
|
const DEFAULT_PORT = 7799;
|
|
10
|
+
/**
|
|
11
|
+
* The loopback interface, and nothing else, unless somebody says otherwise in as many words.
|
|
12
|
+
*
|
|
13
|
+
* `server.listen(port)` with no host binds every interface, so `koneck daemon start` published an
|
|
14
|
+
* unauthenticated endpoint to the whole network — and the endpoint runs an agent, which writes
|
|
15
|
+
* files and executes shell commands. On a machine on a shared LAN that is remote code execution
|
|
16
|
+
* for anyone who can reach the port. The line it printed said "http://localhost:7799", which was
|
|
17
|
+
* true of one route in and quietly wrong about the rest.
|
|
18
|
+
*/
|
|
19
|
+
const LOOPBACK = '127.0.0.1';
|
|
20
|
+
/**
|
|
21
|
+
* A shared secret for anything that acts.
|
|
22
|
+
*
|
|
23
|
+
* Reading a session listing is harmless; starting a run is not, so /run needs the token whatever
|
|
24
|
+
* interface it arrives on. Generated per start and printed once — there is nothing to store, and a
|
|
25
|
+
* daemon restarted is a daemon with a new token.
|
|
26
|
+
*/
|
|
27
|
+
function newToken() {
|
|
28
|
+
return randomBytes(24).toString('base64url');
|
|
29
|
+
}
|
|
30
|
+
/** Constant-time comparison, so a wrong token cannot be found one character at a time. */
|
|
31
|
+
function tokenMatches(expected, given) {
|
|
32
|
+
if (!given)
|
|
33
|
+
return false;
|
|
34
|
+
const a = Buffer.from(expected);
|
|
35
|
+
const b = Buffer.from(given);
|
|
36
|
+
return a.length === b.length && timingSafeEqual(a, b);
|
|
37
|
+
}
|
|
9
38
|
async function readSessions(cwd) {
|
|
10
39
|
const dir = path.join(cwd, '.koneck', 'sessions');
|
|
11
40
|
if (!existsSync(dir))
|
|
@@ -128,7 +157,13 @@ function send(res, status, body, ct = 'text/plain') {
|
|
|
128
157
|
res.writeHead(status, { 'Content-Type': ct });
|
|
129
158
|
res.end(body);
|
|
130
159
|
}
|
|
131
|
-
export async function runServer(config,
|
|
160
|
+
export async function runServer(config, portOrOptions = DEFAULT_PORT) {
|
|
161
|
+
const opts = typeof portOrOptions === 'number'
|
|
162
|
+
? { port: portOrOptions } : portOrOptions;
|
|
163
|
+
const port = opts.port ?? DEFAULT_PORT;
|
|
164
|
+
const host = opts.host ?? LOOPBACK;
|
|
165
|
+
const allowOrigin = opts.allowOrigin;
|
|
166
|
+
const token = newToken();
|
|
132
167
|
const __filename = fileURLToPath(import.meta.url);
|
|
133
168
|
const __dirname = path.dirname(__filename);
|
|
134
169
|
const distIndexPath = path.join(__dirname, 'index.js');
|
|
@@ -143,7 +178,11 @@ export async function runServer(config, port = DEFAULT_PORT) {
|
|
|
143
178
|
const dashboard = buildDashboard(version);
|
|
144
179
|
const server = createServer(async (req, res) => {
|
|
145
180
|
const url = new URL(req.url ?? '/', `http://localhost:${port}`);
|
|
146
|
-
|
|
181
|
+
// No wildcard CORS. With one, any page in the browser could drive an agent on this machine —
|
|
182
|
+
// the token would not help, because the browser would be sending it from the dashboard's own
|
|
183
|
+
// origin. Same-origin only; a separate front end can be told a specific origin instead.
|
|
184
|
+
if (allowOrigin)
|
|
185
|
+
res.setHeader('Access-Control-Allow-Origin', allowOrigin);
|
|
147
186
|
// GET /
|
|
148
187
|
if (req.method === 'GET' && url.pathname === '/') {
|
|
149
188
|
return send(res, 200, dashboard, 'text/html; charset=utf-8');
|
|
@@ -168,6 +207,15 @@ export async function runServer(config, port = DEFAULT_PORT) {
|
|
|
168
207
|
}
|
|
169
208
|
// /run — GET ?task=… (EventSource) or POST { task } (direct API)
|
|
170
209
|
if (url.pathname === '/run' && (req.method === 'GET' || req.method === 'POST')) {
|
|
210
|
+
// This route starts an agent, which reads and writes files and runs shell commands. It is
|
|
211
|
+
// the one route where being wrong about who is calling is unrecoverable.
|
|
212
|
+
const given = url.searchParams.get('token')
|
|
213
|
+
?? (req.headers.authorization ?? '').replace(/^Bearer\s+/i, '')
|
|
214
|
+
?? null;
|
|
215
|
+
if (!tokenMatches(token, given)) {
|
|
216
|
+
return send(res, 401, 'A token is required to start a run. It is printed when the ' +
|
|
217
|
+
'daemon starts: add ?token=… or an Authorization: Bearer header.');
|
|
218
|
+
}
|
|
171
219
|
let task = url.searchParams.get('task') ?? '';
|
|
172
220
|
if (req.method === 'POST') {
|
|
173
221
|
const chunks = [];
|
|
@@ -199,8 +247,18 @@ export async function runServer(config, port = DEFAULT_PORT) {
|
|
|
199
247
|
send(res, 404, 'Not found');
|
|
200
248
|
});
|
|
201
249
|
await new Promise((resolve, reject) => {
|
|
202
|
-
server.listen(port, () => {
|
|
203
|
-
|
|
250
|
+
server.listen(port, host, () => {
|
|
251
|
+
// The address it is actually on, not the one that reads best. It said "localhost" while
|
|
252
|
+
// listening on every interface, which is the sort of message that stops people checking.
|
|
253
|
+
const shown = host === LOOPBACK || host === '::1' ? 'localhost' : host;
|
|
254
|
+
console.log(chalk.cyan(` KONECK dashboard → http://${shown}:${port}`));
|
|
255
|
+
console.log(chalk.dim(` Token for /run → ${token}`));
|
|
256
|
+
if (host !== LOOPBACK && host !== '::1') {
|
|
257
|
+
console.log(chalk.yellow(` ⚠️ Listening on ${host}, so anything that can reach this port can start a run on ` +
|
|
258
|
+
`this machine — runs write files and execute shell commands. The token is the only ` +
|
|
259
|
+
`thing between them and that; treat it as a password and prefer an SSH tunnel.`));
|
|
260
|
+
}
|
|
261
|
+
console.log();
|
|
204
262
|
});
|
|
205
263
|
server.on('error', reject);
|
|
206
264
|
process.on('SIGINT', () => { server.close(); resolve(); process.exit(0); });
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAmC,MAAM,MAAM,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAI9B,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnG,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACtD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,SAAS;oBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAgB,CAAC,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA4BW,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAiEH,CAAC;AACzB,CAAC;AAED,SAAS,IAAI,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE,GAAG,YAAY;IAChF,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|