@qodalis/cli-server-node 1.0.0-beta.5 → 1.0.0-beta.7

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 (119) hide show
  1. package/README.md +397 -19
  2. package/dist/package.json +77 -0
  3. package/dist/src/auth/cli-server-auth-gate.d.ts +33 -0
  4. package/dist/src/auth/cli-server-auth-gate.d.ts.map +1 -0
  5. package/dist/src/auth/cli-server-auth-gate.js +121 -0
  6. package/dist/src/auth/cli-server-auth-gate.js.map +1 -0
  7. package/dist/src/auth/cli-server-auth.d.ts +149 -0
  8. package/dist/src/auth/cli-server-auth.d.ts.map +1 -0
  9. package/dist/src/auth/cli-server-auth.js +143 -0
  10. package/dist/src/auth/cli-server-auth.js.map +1 -0
  11. package/dist/src/auth/index.d.ts +4 -0
  12. package/dist/src/auth/index.d.ts.map +1 -0
  13. package/dist/src/auth/index.js +19 -0
  14. package/dist/src/auth/index.js.map +1 -0
  15. package/dist/src/auth/ws-upgrade-auth.d.ts +30 -0
  16. package/dist/src/auth/ws-upgrade-auth.d.ts.map +1 -0
  17. package/dist/src/auth/ws-upgrade-auth.js +49 -0
  18. package/dist/src/auth/ws-upgrade-auth.js.map +1 -0
  19. package/dist/src/controllers/cli-controller.d.ts +2 -1
  20. package/dist/src/controllers/cli-controller.d.ts.map +1 -1
  21. package/dist/src/controllers/cli-controller.js +7 -2
  22. package/dist/src/controllers/cli-controller.js.map +1 -1
  23. package/dist/src/controllers/cli-version-controller.d.ts +12 -1
  24. package/dist/src/controllers/cli-version-controller.d.ts.map +1 -1
  25. package/dist/src/controllers/cli-version-controller.js +7 -2
  26. package/dist/src/controllers/cli-version-controller.js.map +1 -1
  27. package/dist/src/create-cli-server.d.ts +71 -1
  28. package/dist/src/create-cli-server.d.ts.map +1 -1
  29. package/dist/src/create-cli-server.js +146 -10
  30. package/dist/src/create-cli-server.js.map +1 -1
  31. package/dist/src/extensions/cli-builder.d.ts +10 -0
  32. package/dist/src/extensions/cli-builder.d.ts.map +1 -1
  33. package/dist/src/extensions/cli-builder.js +14 -0
  34. package/dist/src/extensions/cli-builder.js.map +1 -1
  35. package/dist/src/index.d.ts +4 -2
  36. package/dist/src/index.d.ts.map +1 -1
  37. package/dist/src/index.js +36 -1
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/mcp/index.d.ts +10 -0
  40. package/dist/src/mcp/index.d.ts.map +1 -0
  41. package/dist/src/mcp/index.js +34 -0
  42. package/dist/src/mcp/index.js.map +1 -0
  43. package/dist/src/mcp/mcp-controller.d.ts +54 -0
  44. package/dist/src/mcp/mcp-controller.d.ts.map +1 -0
  45. package/dist/src/mcp/mcp-controller.js +358 -0
  46. package/dist/src/mcp/mcp-controller.js.map +1 -0
  47. package/dist/src/mcp/mcp-render.d.ts +10 -0
  48. package/dist/src/mcp/mcp-render.d.ts.map +1 -0
  49. package/dist/src/mcp/mcp-render.js +66 -0
  50. package/dist/src/mcp/mcp-render.js.map +1 -0
  51. package/dist/src/mcp/mcp-schema.d.ts +8 -0
  52. package/dist/src/mcp/mcp-schema.d.ts.map +1 -0
  53. package/dist/src/mcp/mcp-schema.js +64 -0
  54. package/dist/src/mcp/mcp-schema.js.map +1 -0
  55. package/dist/src/mcp/mcp-types.d.ts +70 -0
  56. package/dist/src/mcp/mcp-types.d.ts.map +1 -0
  57. package/dist/src/mcp/mcp-types.js +21 -0
  58. package/dist/src/mcp/mcp-types.js.map +1 -0
  59. package/dist/src/mcp/providers/commands-provider.d.ts +26 -0
  60. package/dist/src/mcp/providers/commands-provider.d.ts.map +1 -0
  61. package/dist/src/mcp/providers/commands-provider.js +142 -0
  62. package/dist/src/mcp/providers/commands-provider.js.map +1 -0
  63. package/dist/src/mcp/providers/data-explorer-provider.d.ts +15 -0
  64. package/dist/src/mcp/providers/data-explorer-provider.d.ts.map +1 -0
  65. package/dist/src/mcp/providers/data-explorer-provider.js +83 -0
  66. package/dist/src/mcp/providers/data-explorer-provider.js.map +1 -0
  67. package/dist/src/mcp/providers/filesystem-provider.d.ts +15 -0
  68. package/dist/src/mcp/providers/filesystem-provider.d.ts.map +1 -0
  69. package/dist/src/mcp/providers/filesystem-provider.js +166 -0
  70. package/dist/src/mcp/providers/filesystem-provider.js.map +1 -0
  71. package/dist/src/mcp/providers/jobs-provider.d.ts +23 -0
  72. package/dist/src/mcp/providers/jobs-provider.d.ts.map +1 -0
  73. package/dist/src/mcp/providers/jobs-provider.js +121 -0
  74. package/dist/src/mcp/providers/jobs-provider.js.map +1 -0
  75. package/dist/src/mcp/providers/server-provider.d.ts +19 -0
  76. package/dist/src/mcp/providers/server-provider.d.ts.map +1 -0
  77. package/dist/src/mcp/providers/server-provider.js +73 -0
  78. package/dist/src/mcp/providers/server-provider.js.map +1 -0
  79. package/dist/src/processors/cli-base64-command-processor.d.ts.map +1 -1
  80. package/dist/src/processors/cli-base64-command-processor.js +2 -0
  81. package/dist/src/processors/cli-base64-command-processor.js.map +1 -1
  82. package/dist/src/processors/cli-hash-command-processor.d.ts +1 -0
  83. package/dist/src/processors/cli-hash-command-processor.d.ts.map +1 -1
  84. package/dist/src/processors/cli-hash-command-processor.js +1 -0
  85. package/dist/src/processors/cli-hash-command-processor.js.map +1 -1
  86. package/dist/src/processors/cli-http-command-processor.d.ts.map +1 -1
  87. package/dist/src/processors/cli-http-command-processor.js +2 -0
  88. package/dist/src/processors/cli-http-command-processor.js.map +1 -1
  89. package/dist/src/server.js +12 -0
  90. package/dist/src/server.js.map +1 -1
  91. package/dist/src/services/cli-event-socket-manager.d.ts +37 -1
  92. package/dist/src/services/cli-event-socket-manager.d.ts.map +1 -1
  93. package/dist/src/services/cli-event-socket-manager.js +126 -28
  94. package/dist/src/services/cli-event-socket-manager.js.map +1 -1
  95. package/dist/src/services/cli-log-socket-manager.d.ts +15 -1
  96. package/dist/src/services/cli-log-socket-manager.d.ts.map +1 -1
  97. package/dist/src/services/cli-log-socket-manager.js +53 -13
  98. package/dist/src/services/cli-log-socket-manager.js.map +1 -1
  99. package/dist/src/services/cli-shell-options.d.ts +107 -0
  100. package/dist/src/services/cli-shell-options.d.ts.map +1 -0
  101. package/dist/src/services/cli-shell-options.js +139 -0
  102. package/dist/src/services/cli-shell-options.js.map +1 -0
  103. package/dist/src/services/cli-shell-session-manager.d.ts +83 -10
  104. package/dist/src/services/cli-shell-session-manager.d.ts.map +1 -1
  105. package/dist/src/services/cli-shell-session-manager.js +474 -85
  106. package/dist/src/services/cli-shell-session-manager.js.map +1 -1
  107. package/dist/src/services/index.d.ts +2 -1
  108. package/dist/src/services/index.d.ts.map +1 -1
  109. package/dist/src/services/index.js +5 -1
  110. package/dist/src/services/index.js.map +1 -1
  111. package/dist/src/services/process-tree.d.ts +38 -0
  112. package/dist/src/services/process-tree.d.ts.map +1 -0
  113. package/dist/src/services/process-tree.js +249 -0
  114. package/dist/src/services/process-tree.js.map +1 -0
  115. package/dist/src/services/session-bound-sockets.d.ts +45 -0
  116. package/dist/src/services/session-bound-sockets.d.ts.map +1 -0
  117. package/dist/src/services/session-bound-sockets.js +129 -0
  118. package/dist/src/services/session-bound-sockets.js.map +1 -0
  119. package/package.json +1 -1
@@ -1,4 +1,7 @@
1
1
  import type { Server } from 'http';
2
+ import { CliShellSessionManager } from './cli-shell-session-manager';
3
+ import { CliShellAuthMode, CliShellOptions } from './cli-shell-options';
4
+ import { ICliServerAuth } from '../auth/cli-server-auth';
2
5
  /** Information about a connected WebSocket event client. */
3
6
  export interface CliWebSocketClientInfo {
4
7
  id: string;
@@ -6,9 +9,28 @@ export interface CliWebSocketClientInfo {
6
9
  remoteAddress: string;
7
10
  type: 'events';
8
11
  }
12
+ export interface CliEventSocketManagerOptions {
13
+ /** Accept interactive shell sessions on `/ws/v1/qcli/shell` (default false). */
14
+ enableShell?: boolean;
15
+ /** Shell security options (access mode, limits, timeouts, environment). */
16
+ shell?: CliShellOptions;
17
+ /**
18
+ * Trusted reverse-proxy hops (`true` = 1, `false`/0 = none) for `X-Forwarded-*`
19
+ * headers (shell per-address limits/logs, same-origin checks).
20
+ */
21
+ trustProxy?: boolean | number;
22
+ /** When set, every upgrade with an `Origin` header must come from one of these. */
23
+ allowedOrigins?: string[];
24
+ }
9
25
  /**
10
26
  * Manages WebSocket connections for server-push events and interactive shell sessions.
11
- * Handles upgrades on `/ws/v1/qcli/events` and `/ws/v1/qcli/shell` paths.
27
+ * Handles upgrades on `/ws/v1/qcli/events` and (when `enableShell` is set)
28
+ * `/ws/v1/qcli/shell`. With an auth provider that protects the server, event
29
+ * upgrades need a single-use `?ticket=`; `session-kicked` is delivered only to
30
+ * the affected user. Sockets authenticated with a stored session are bound to
31
+ * it: once it ends they are closed with 4401 `session ended` (after
32
+ * `session-kicked` for revocations; see {@link SessionBoundSockets}). Shell
33
+ * access (modes, limits, session binding) is decided by {@link CliShellSessionManager}.
12
34
  */
13
35
  export declare class CliEventSocketManager {
14
36
  private _wss;
@@ -16,6 +38,20 @@ export declare class CliEventSocketManager {
16
38
  private readonly _clientMeta;
17
39
  private readonly _shellManager;
18
40
  private _nextClientId;
41
+ private _auth?;
42
+ private _allowedOrigins?;
43
+ private readonly _trustProxy;
44
+ private readonly _sessionBound;
45
+ constructor(options?: CliEventSocketManagerOptions);
46
+ /** Installs the auth provider (users plugin) used to authenticate upgrades with tickets. */
47
+ setAuth(auth: ICliServerAuth | undefined): void;
48
+ setAllowedOrigins(origins: string[] | undefined): void;
49
+ setShellEnabled(enabled: boolean): void;
50
+ get shellEnabled(): boolean;
51
+ /** Shell access mode (`undefined` while the shell is disabled). */
52
+ get shellAuthMode(): CliShellAuthMode | undefined;
53
+ /** The shell session manager (open sessions, limits, binding). */
54
+ get shellManager(): CliShellSessionManager;
19
55
  private static readonly EVENT_PATHS;
20
56
  private static readonly SHELL_PATHS;
21
57
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"cli-event-socket-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cli-event-socket-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,MAAM,CAAC;AAOpD,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,QAAQ,CAAC;CAClB;AAQD;;;GAGG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqC;IACjE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgC;IAC9D,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAGhC;IAEH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAGhC;IAEH;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IA8D5B;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IASxD;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB1C;;OAEG;IACH,UAAU,IAAI,sBAAsB,EAAE;IAkBtC,kEAAkE;IAClE,OAAO,IAAI,IAAI;CAQlB"}
1
+ {"version":3,"file":"cli-event-socket-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cli-event-socket-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,MAAM,CAAC;AAEpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAA8C,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAMrG,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,QAAQ,CAAC;CAClB;AAUD,MAAM,WAAW,4BAA4B;IACzC,gFAAgF;IAChF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAKD;;;;;;;;;GASG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqC;IACjE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IACvD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgD;gBAElE,OAAO,GAAE,4BAAiC;IAUtD,4FAA4F;IAC5F,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI;IAM/C,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAItD,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIvC,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,mEAAmE;IACnE,IAAI,aAAa,IAAI,gBAAgB,GAAG,SAAS,CAEhD;IAED,kEAAkE;IAClE,IAAI,YAAY,IAAI,sBAAsB,CAEzC;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAGhC;IAEH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAGhC;IAEH;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IA+E5B;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAyCxD;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B1C;;OAEG;IACH,UAAU,IAAI,sBAAsB,EAAE;IAkBtC,kEAAkE;IAClE,OAAO,IAAI,IAAI;CAUlB"}
@@ -5,17 +5,64 @@ const ws_1 = require("ws");
5
5
  const url_1 = require("url");
6
6
  const cli_shell_session_manager_1 = require("./cli-shell-session-manager");
7
7
  const logger_1 = require("../utils/logger");
8
+ const cli_server_auth_1 = require("../auth/cli-server-auth");
9
+ const ws_upgrade_auth_1 = require("../auth/ws-upgrade-auth");
10
+ const session_bound_sockets_1 = require("./session-bound-sockets");
8
11
  const logger = (0, logger_1.createLogger)('EventSocket');
12
+ /** Events delivered only to sockets authenticated as the event's user. */
13
+ const USER_SCOPED_EVENTS = new Set(['session-kicked']);
9
14
  /**
10
15
  * Manages WebSocket connections for server-push events and interactive shell sessions.
11
- * Handles upgrades on `/ws/v1/qcli/events` and `/ws/v1/qcli/shell` paths.
16
+ * Handles upgrades on `/ws/v1/qcli/events` and (when `enableShell` is set)
17
+ * `/ws/v1/qcli/shell`. With an auth provider that protects the server, event
18
+ * upgrades need a single-use `?ticket=`; `session-kicked` is delivered only to
19
+ * the affected user. Sockets authenticated with a stored session are bound to
20
+ * it: once it ends they are closed with 4401 `session ended` (after
21
+ * `session-kicked` for revocations; see {@link SessionBoundSockets}). Shell
22
+ * access (modes, limits, session binding) is decided by {@link CliShellSessionManager}.
12
23
  */
13
24
  class CliEventSocketManager {
14
25
  _wss = null;
15
26
  _clients = new Set();
16
27
  _clientMeta = new Map();
17
- _shellManager = new cli_shell_session_manager_1.CliShellSessionManager();
28
+ _shellManager;
18
29
  _nextClientId = 1;
30
+ _auth;
31
+ _allowedOrigins;
32
+ _trustProxy;
33
+ _sessionBound = new session_bound_sockets_1.SessionBoundSockets({ awaitKick: true });
34
+ constructor(options = {}) {
35
+ this._shellManager = new cli_shell_session_manager_1.CliShellSessionManager({
36
+ enabled: options.enableShell ?? false,
37
+ shell: options.shell,
38
+ trustProxy: options.trustProxy,
39
+ });
40
+ this._allowedOrigins = options.allowedOrigins;
41
+ this._trustProxy = options.trustProxy ?? false;
42
+ }
43
+ /** Installs the auth provider (users plugin) used to authenticate upgrades with tickets. */
44
+ setAuth(auth) {
45
+ this._auth = auth;
46
+ this._shellManager.setAuth(auth);
47
+ this._sessionBound.setAuth(auth);
48
+ }
49
+ setAllowedOrigins(origins) {
50
+ this._allowedOrigins = origins;
51
+ }
52
+ setShellEnabled(enabled) {
53
+ this._shellManager.setEnabled(enabled);
54
+ }
55
+ get shellEnabled() {
56
+ return this._shellManager.enabled;
57
+ }
58
+ /** Shell access mode (`undefined` while the shell is disabled). */
59
+ get shellAuthMode() {
60
+ return this._shellManager.authMode;
61
+ }
62
+ /** The shell session manager (open sessions, limits, binding). */
63
+ get shellManager() {
64
+ return this._shellManager;
65
+ }
19
66
  static EVENT_PATHS = new Set([
20
67
  '/ws/v1/qcli/events',
21
68
  '/ws/qcli/events',
@@ -30,56 +77,73 @@ class CliEventSocketManager {
30
77
  */
31
78
  attach(server) {
32
79
  this._wss = new ws_1.WebSocketServer({ noServer: true });
80
+ this._shellManager.logStartupState();
33
81
  server.on('upgrade', (request, socket, head) => {
34
- const parsed = new url_1.URL(request.url ?? '', 'http://localhost');
82
+ let parsed;
83
+ try {
84
+ parsed = new url_1.URL(request.url ?? '', 'http://localhost');
85
+ }
86
+ catch {
87
+ return; // malformed request target: not one of our paths
88
+ }
35
89
  const pathname = parsed.pathname;
36
90
  if (CliEventSocketManager.EVENT_PATHS.has(pathname)) {
37
- this._wss.handleUpgrade(request, socket, head, (ws) => {
38
- this._wss.emit('connection', ws, request);
39
- });
91
+ (0, ws_upgrade_auth_1.authorizeWsUpgrade)(request, parsed, { auth: this._auth, allowedOrigins: this._allowedOrigins, trustProxy: this._trustProxy }).then((result) => {
92
+ if (!result.ok) {
93
+ (0, ws_upgrade_auth_1.rejectUpgrade)(socket, result.status);
94
+ return;
95
+ }
96
+ this._wss.handleUpgrade(request, socket, head, (ws) => {
97
+ this._wss.emit('connection', ws, request, result.ctx);
98
+ });
99
+ }, () => (0, ws_upgrade_auth_1.rejectUpgrade)(socket, 401));
40
100
  return;
41
101
  }
42
102
  if (CliEventSocketManager.SHELL_PATHS.has(pathname)) {
43
- this._wss.handleUpgrade(request, socket, head, (ws) => {
44
- const cols = parseInt(parsed.searchParams.get('cols') ?? '80', 10) || 80;
45
- const rows = parseInt(parsed.searchParams.get('rows') ?? '24', 10) || 24;
46
- const cmd = parsed.searchParams.get('cmd') || undefined;
47
- this._shellManager.handleSession(ws, cols, rows, cmd).catch((err) => {
48
- try {
49
- ws.send(JSON.stringify({ type: 'error', message: err.message }));
50
- ws.close();
51
- }
52
- catch {
53
- // ignore
54
- }
103
+ // Origin rejection stays an HTTP 403; every other refusal is
104
+ // "accept, then close" with a code the browser can read (C5).
105
+ (0, ws_upgrade_auth_1.authorizeWsUpgrade)(request, parsed, { allowedOrigins: this._allowedOrigins, trustProxy: this._trustProxy }).then((result) => {
106
+ if (!result.ok) {
107
+ (0, ws_upgrade_auth_1.rejectUpgrade)(socket, result.status);
108
+ return;
109
+ }
110
+ this._wss.handleUpgrade(request, socket, head, (ws) => {
111
+ this._shellManager.accept(ws, request, parsed).catch((err) => {
112
+ logger.error('Shell session error: %s', err?.message ?? err);
113
+ try {
114
+ ws.close(1011, 'shell error');
115
+ }
116
+ catch {
117
+ // ignore
118
+ }
119
+ });
55
120
  });
56
121
  });
57
122
  return;
58
123
  }
59
124
  // Unrecognized path; leave for other upgrade handlers
60
125
  });
61
- this._wss.on('connection', (ws, request) => {
126
+ this._wss.on('connection', (ws, request, auth) => {
62
127
  this._clients.add(ws);
63
128
  const id = `evt-${this._nextClientId++}`;
64
129
  this._clientMeta.set(ws, {
65
130
  id,
66
131
  connectedAt: new Date(),
67
132
  remoteAddress: request.socket.remoteAddress ?? 'unknown',
133
+ auth,
68
134
  });
135
+ this._sessionBound.bind(ws, auth);
69
136
  logger.info('Client connected (id=%s)', id);
70
137
  ws.send(JSON.stringify({ type: 'connected' }));
71
- ws.on('close', () => {
72
- const meta = this._clientMeta.get(ws);
73
- logger.info('Client disconnected (id=%s)', meta?.id ?? 'unknown');
74
- this._clients.delete(ws);
75
- this._clientMeta.delete(ws);
76
- });
77
- ws.on('error', () => {
138
+ const disconnected = () => {
78
139
  const meta = this._clientMeta.get(ws);
79
140
  logger.info('Client disconnected (id=%s)', meta?.id ?? 'unknown');
141
+ this._sessionBound.unbind(ws);
80
142
  this._clients.delete(ws);
81
143
  this._clientMeta.delete(ws);
82
- });
144
+ };
145
+ ws.on('close', disconnected);
146
+ ws.on('error', disconnected);
83
147
  });
84
148
  }
85
149
  /**
@@ -87,10 +151,40 @@ class CliEventSocketManager {
87
151
  */
88
152
  broadcastMessage(message) {
89
153
  const data = JSON.stringify(message);
154
+ const type = typeof message.type === 'string' ? message.type : '';
155
+ const payload = (message.data ?? {});
156
+ const toClose = [];
90
157
  for (const ws of this._clients) {
91
- if (ws.readyState === ws_1.WebSocket.OPEN) {
158
+ if (ws.readyState !== ws_1.WebSocket.OPEN)
159
+ continue;
160
+ const auth = this._clientMeta.get(ws)?.auth;
161
+ if (USER_SCOPED_EVENTS.has(type)) {
162
+ // Only the affected user's sockets learn about it
163
+ if (!auth || auth.userId !== payload.userId)
164
+ continue;
92
165
  ws.send(data);
166
+ if (type === 'session-kicked' && auth.sessionId && auth.sessionId === payload.sessionId) {
167
+ toClose.push(ws);
168
+ }
169
+ continue;
93
170
  }
171
+ // A socket whose session ended only waits for its session-kicked
172
+ if (this._sessionBound.isEnding(ws))
173
+ continue;
174
+ if (this._auth?.protectServer) {
175
+ // Server-wide events need the matching read permission
176
+ const needed = type === 'log' || type.startsWith('log:')
177
+ ? cli_server_auth_1.CliServerPermissions.LogsRead
178
+ : type.startsWith('job:')
179
+ ? cli_server_auth_1.CliServerPermissions.JobsRead
180
+ : undefined;
181
+ if (needed && (!auth || !this._auth.hasPermission(auth, needed)))
182
+ continue;
183
+ }
184
+ ws.send(data);
185
+ }
186
+ for (const ws of toClose) {
187
+ this._sessionBound.kicked(ws);
94
188
  }
95
189
  }
96
190
  /**
@@ -111,6 +205,8 @@ class CliEventSocketManager {
111
205
  }
112
206
  }
113
207
  await Promise.all(promises);
208
+ this._shellManager.dispose();
209
+ this._sessionBound.dispose();
114
210
  this._clients.clear();
115
211
  this._clientMeta.clear();
116
212
  }
@@ -136,6 +232,8 @@ class CliEventSocketManager {
136
232
  }
137
233
  /** Terminates all connections and closes the WebSocket server. */
138
234
  dispose() {
235
+ this._shellManager.dispose();
236
+ this._sessionBound.dispose();
139
237
  for (const ws of this._clients) {
140
238
  ws.terminate();
141
239
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli-event-socket-manager.js","sourceRoot":"","sources":["../../../src/services/cli-event-socket-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-event-socket-manager.js","sourceRoot":"","sources":["../../../src/services/cli-event-socket-manager.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { Server } from 'http';
2
+ import { ICliServerAuth } from '../auth/cli-server-auth';
2
3
  /** Information about a connected WebSocket log-streaming client. */
3
4
  export interface CliLogWebSocketClientInfo {
4
5
  id: string;
@@ -11,12 +12,25 @@ export interface CliLogWebSocketClientInfo {
11
12
  * Manages WebSocket connections for streaming log messages to clients.
12
13
  *
13
14
  * Parity with CliLogSocketManager in the .NET and Python servers.
14
- * Handles `/ws/v1/qcli/logs` and `/ws/qcli/logs` upgrade paths.
15
+ * Handles `/ws/v1/qcli/logs` and `/ws/qcli/logs` upgrade paths. Sockets
16
+ * authenticated with a stored session are bound to it: once it ends they are
17
+ * closed with 4401 `session ended` (see {@link SessionBoundSockets}).
15
18
  */
16
19
  export declare class CliLogSocketManager {
17
20
  private _wss;
18
21
  private readonly _clients;
19
22
  private _nextClientId;
23
+ private _auth?;
24
+ private _allowedOrigins?;
25
+ private readonly _trustProxy;
26
+ private readonly _sessionBound;
27
+ constructor(options?: {
28
+ allowedOrigins?: string[];
29
+ trustProxy?: boolean | number;
30
+ });
31
+ /** Installs the auth provider; when it protects the server, upgrades need a ticket and `logs:read`. */
32
+ setAuth(auth: ICliServerAuth | undefined): void;
33
+ setAllowedOrigins(origins: string[] | undefined): void;
20
34
  private static readonly LOG_PATHS;
21
35
  /**
22
36
  * Check whether a log at `logLevel` passes the `filterLevel` gate.
@@ -1 +1 @@
1
- {"version":3,"file":"cli-log-socket-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cli-log-socket-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,MAAM,CAAC;AAMpD,oEAAoE;AACpE,MAAM,WAAW,yBAAyB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CAChB;AAsCD;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAG9B;IAEH;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAY3E;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAUzF;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgB5B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAsB5E;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB1C;;OAEG;IACH,UAAU,IAAI,yBAAyB,EAAE;IAgBzC,kEAAkE;IAClE,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,iBAAiB;CAyB5B"}
1
+ {"version":3,"file":"cli-log-socket-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cli-log-socket-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,MAAM,CAAC;AAGpD,OAAO,EAA8C,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAMrG,oEAAoE;AACpE,MAAM,WAAW,yBAAyB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CAChB;AAsCD;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;gBAE/C,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;KAAO;IAKtF,uGAAuG;IACvG,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI;IAK/C,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAItD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAG9B;IAEH;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAY3E;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAUzF;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAmC5B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAsB5E;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB1C;;OAEG;IACH,UAAU,IAAI,yBAAyB,EAAE;IAgBzC,kEAAkE;IAClE,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,iBAAiB;CAwB5B"}
@@ -4,6 +4,9 @@ exports.CliLogSocketManager = void 0;
4
4
  const ws_1 = require("ws");
5
5
  const url_1 = require("url");
6
6
  const logger_1 = require("../utils/logger");
7
+ const cli_server_auth_1 = require("../auth/cli-server-auth");
8
+ const ws_upgrade_auth_1 = require("../auth/ws-upgrade-auth");
9
+ const session_bound_sockets_1 = require("./session-bound-sockets");
7
10
  const logger = (0, logger_1.createLogger)('LogSocket');
8
11
  /**
9
12
  * Level ordering from lowest to highest severity.
@@ -34,12 +37,30 @@ function normalizeLevel(level) {
34
37
  * Manages WebSocket connections for streaming log messages to clients.
35
38
  *
36
39
  * Parity with CliLogSocketManager in the .NET and Python servers.
37
- * Handles `/ws/v1/qcli/logs` and `/ws/qcli/logs` upgrade paths.
40
+ * Handles `/ws/v1/qcli/logs` and `/ws/qcli/logs` upgrade paths. Sockets
41
+ * authenticated with a stored session are bound to it: once it ends they are
42
+ * closed with 4401 `session ended` (see {@link SessionBoundSockets}).
38
43
  */
39
44
  class CliLogSocketManager {
40
45
  _wss = null;
41
46
  _clients = new Map();
42
47
  _nextClientId = 1;
48
+ _auth;
49
+ _allowedOrigins;
50
+ _trustProxy;
51
+ _sessionBound = new session_bound_sockets_1.SessionBoundSockets();
52
+ constructor(options = {}) {
53
+ this._allowedOrigins = options.allowedOrigins;
54
+ this._trustProxy = options.trustProxy ?? false;
55
+ }
56
+ /** Installs the auth provider; when it protects the server, upgrades need a ticket and `logs:read`. */
57
+ setAuth(auth) {
58
+ this._auth = auth;
59
+ this._sessionBound.setAuth(auth);
60
+ }
61
+ setAllowedOrigins(origins) {
62
+ this._allowedOrigins = origins;
63
+ }
43
64
  static LOG_PATHS = new Set([
44
65
  '/ws/v1/qcli/logs',
45
66
  '/ws/qcli/logs',
@@ -79,14 +100,31 @@ class CliLogSocketManager {
79
100
  attach(server) {
80
101
  this._wss = new ws_1.WebSocketServer({ noServer: true });
81
102
  server.on('upgrade', (request, socket, head) => {
82
- const parsed = new url_1.URL(request.url ?? '', 'http://localhost');
103
+ let parsed;
104
+ try {
105
+ parsed = new url_1.URL(request.url ?? '', 'http://localhost');
106
+ }
107
+ catch {
108
+ return; // malformed request target: not one of our paths
109
+ }
83
110
  const pathname = parsed.pathname;
84
111
  if (!CliLogSocketManager.LOG_PATHS.has(pathname))
85
112
  return;
86
- this._wss.handleUpgrade(request, socket, head, (ws) => {
87
- const levelFilter = parsed.searchParams.get('level') || null;
88
- this._handleConnection(ws, request, levelFilter);
89
- });
113
+ (0, ws_upgrade_auth_1.authorizeWsUpgrade)(request, parsed, {
114
+ auth: this._auth,
115
+ allowedOrigins: this._allowedOrigins,
116
+ trustProxy: this._trustProxy,
117
+ permission: cli_server_auth_1.CliServerPermissions.LogsRead,
118
+ }).then((result) => {
119
+ if (!result.ok) {
120
+ (0, ws_upgrade_auth_1.rejectUpgrade)(socket, result.status);
121
+ return;
122
+ }
123
+ this._wss.handleUpgrade(request, socket, head, (ws) => {
124
+ const levelFilter = parsed.searchParams.get('level') || null;
125
+ this._handleConnection(ws, request, levelFilter, result.ctx);
126
+ });
127
+ }, () => (0, ws_upgrade_auth_1.rejectUpgrade)(socket, 401));
90
128
  });
91
129
  }
92
130
  /**
@@ -131,6 +169,7 @@ class CliLogSocketManager {
131
169
  }
132
170
  }
133
171
  await Promise.all(promises);
172
+ this._sessionBound.dispose();
134
173
  this._clients.clear();
135
174
  }
136
175
  /**
@@ -153,13 +192,14 @@ class CliLogSocketManager {
153
192
  }
154
193
  /** Terminates all connections and closes the WebSocket server. */
155
194
  dispose() {
195
+ this._sessionBound.dispose();
156
196
  for (const entry of this._clients.values()) {
157
197
  entry.ws.terminate();
158
198
  }
159
199
  this._clients.clear();
160
200
  this._wss?.close();
161
201
  }
162
- _handleConnection(ws, request, levelFilter) {
202
+ _handleConnection(ws, request, levelFilter, auth) {
163
203
  const id = `log-${this._nextClientId++}`;
164
204
  const entry = {
165
205
  id,
@@ -169,16 +209,16 @@ class CliLogSocketManager {
169
209
  levelFilter,
170
210
  };
171
211
  this._clients.set(id, entry);
212
+ this._sessionBound.bind(ws, auth);
172
213
  ws.send(JSON.stringify({ type: 'connected' }));
173
214
  logger.info('Log client connected (id=%s, level=%s)', id, levelFilter ?? 'all');
174
- ws.on('close', () => {
175
- logger.info('Log client disconnected (id=%s)', id);
176
- this._clients.delete(id);
177
- });
178
- ws.on('error', () => {
215
+ const disconnected = () => {
179
216
  logger.info('Log client disconnected (id=%s)', id);
217
+ this._sessionBound.unbind(ws);
180
218
  this._clients.delete(id);
181
- });
219
+ };
220
+ ws.on('close', disconnected);
221
+ ws.on('error', disconnected);
182
222
  }
183
223
  }
184
224
  exports.CliLogSocketManager = CliLogSocketManager;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-log-socket-manager.js","sourceRoot":"","sources":["../../../src/services/cli-log-socket-manager.ts"],"names":[],"mappings":";;;AAAA,2BAAgD;AAEhD,6BAA0B;AAC1B,4CAA+C;AAE/C,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,WAAW,CAAC,CAAC;AAmBzC;;;GAGG;AACH,MAAM,WAAW,GAA2B;IACxC,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,WAAW,EAAE,CAAC;IACd,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,aAAa,GAA2B;IAC1C,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,OAAO;CACf,CAAC;AAEF,SAAS,cAAc,CAAC,KAAa;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAa,mBAAmB;IACpB,IAAI,GAA2B,IAAI,CAAC;IAC3B,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,aAAa,GAAG,CAAC,CAAC;IAElB,MAAM,CAAU,SAAS,GAAG,IAAI,GAAG,CAAC;QACxC,kBAAkB;QAClB,eAAe;KAClB,CAAC,CAAC;IAEH;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,WAA0B,EAAE,QAAgB;QAC7D,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QAErD,6BAA6B;QAC7B,IAAI,SAAS,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEjE,OAAO,MAAM,IAAI,SAAS,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAa,EAAE,OAAe,EAAE,QAAwB;QAC5E,OAAO,IAAI,CAAC,SAAS,CAAC;YAClB,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC;YAC5B,OAAO;YACP,QAAQ,EAAE,QAAQ,IAAI,IAAI;SAC7B,CAAC,CAAC;IACP,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,MAAc;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,oBAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC3C,MAAM,MAAM,GAAG,IAAI,SAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAEjC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAEzD,IAAI,CAAC,IAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBACnD,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;gBAC7D,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAa,EAAE,OAAe,EAAE,QAAwB;QACjE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAErC,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI;gBAAE,SAAS;YACrD,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;gBAAE,SAAS;YAE3E,uDAAuD;YACvD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,SAAS,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC/E,CAAC;YAED,IAAI,CAAC;gBACD,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACL,4DAA4D;YAChE,CAAC;QACL,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACrB,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7E,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAoB,EAAE,CAAC;QAErC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI,EAAE,CAAC;gBACzC,QAAQ,CAAC,IAAI,CACT,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAC1B,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;wBAC9B,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;wBAC7C,OAAO,EAAE,CAAC;oBACd,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC,CACL,CAAC;YACN,CAAC;QACL,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,UAAU;QACN,MAAM,MAAM,GAAgC,EAAE,CAAC;QAC/C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI,EAAE,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC;oBACR,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE;oBAC5C,aAAa,EAAE,KAAK,CAAC,aAAa;oBAClC,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,IAAI,EAAE,MAAM;iBACf,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,kEAAkE;IAClE,OAAO;QACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;IAEO,iBAAiB,CAAC,EAAa,EAAE,OAAwB,EAAE,WAA0B;QACzF,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACzC,MAAM,KAAK,GAAmB;YAC1B,EAAE;YACF,EAAE;YACF,WAAW,EAAE,IAAI,IAAI,EAAE;YACvB,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS;YACxD,WAAW;SACd,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAE7B,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,EAAE,WAAW,IAAI,KAAK,CAAC,CAAC;QAEhF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAChB,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAChB,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;;AAnKL,kDAoKC"}
1
+ {"version":3,"file":"cli-log-socket-manager.js","sourceRoot":"","sources":["../../../src/services/cli-log-socket-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import type { IncomingMessage } from 'http';
2
+ /** How the remote shell decides who may open a session (`shellAuth` in `/capabilities`). */
3
+ export type CliShellAuthMode = 'users' | 'token' | 'custom' | 'anonymous' | 'locked';
4
+ /** Extra information handed to a custom {@link CliShellOptions.authorize} check. */
5
+ export interface CliShellAuthorizeContext {
6
+ /** Parsed upgrade URL (path + query). */
7
+ url: URL;
8
+ /** Remote address of the socket. */
9
+ remoteAddress: string;
10
+ /** `interactive` shell or one-shot `command` (`?cmd=`). */
11
+ mode: 'interactive' | 'command';
12
+ }
13
+ /** Environment of the shell child process. */
14
+ export interface CliShellEnvOptions {
15
+ /** Extra server environment variable names copied into the shell (e.g. `['NODE_ENV']`). */
16
+ allow?: string[];
17
+ /** Fixed values set in the shell environment (applied last). */
18
+ set?: Record<string, string>;
19
+ }
20
+ /**
21
+ * Remote shell security options (`createCliServer({ enableShell: true, shell: {...} })`).
22
+ *
23
+ * The shell is only reachable when `enableShell` is true; access is then decided by
24
+ * exactly one mode: `users` (users plugin mounted: ticket + `shell:execute`),
25
+ * `token`, `custom` (`authorize`), or `anonymous` (`allowAnonymous`). With none of
26
+ * them the shell is **locked** (every connection closed with 4401).
27
+ */
28
+ export interface CliShellOptions {
29
+ /**
30
+ * Shared secret. Clients send `Authorization: Bearer <token>` (header, or the
31
+ * `_header_Authorization` query parameter used by browser clients). Compared in
32
+ * constant time, never logged. Always required when set (also with the users
33
+ * plugin and together with `authorize`).
34
+ */
35
+ token?: string;
36
+ /**
37
+ * Host-defined check (headers, query, remote address). Thrown errors and
38
+ * rejections deny. Always required when set (also with the users plugin and
39
+ * together with `token`).
40
+ */
41
+ authorize?: (request: IncomingMessage, context: CliShellAuthorizeContext) => boolean | Promise<boolean>;
42
+ /**
43
+ * Open the shell to anyone who can reach the server (logs a startup WARNING).
44
+ * Ignored once `token` or `authorize` is set.
45
+ */
46
+ allowAnonymous?: boolean;
47
+ /** Concurrent shells per user (users mode) or per remote address (other modes). Default 3. */
48
+ maxSessionsPerUser?: number;
49
+ /** Concurrent shells in total. Default 20. */
50
+ maxSessions?: number;
51
+ /** Close a shell after this long without stdin (ms). Default 15 minutes; 0 disables. */
52
+ idleTimeoutMs?: number;
53
+ /** Close a shell after this long regardless of activity (ms). Default: no limit. */
54
+ maxDurationMs?: number;
55
+ /**
56
+ * How often open users-mode shells re-check their session and `shell:execute` (ms).
57
+ * Default 30 000, maximum 60 000. Session/user/group changes trigger an immediate re-check.
58
+ */
59
+ sessionCheckIntervalMs?: number;
60
+ /** Working directory of the shell. Default: the server user's home directory. */
61
+ cwd?: string;
62
+ /** Shell binary. Default: detected (`$SHELL`, bash, sh; powershell on Windows). */
63
+ shell?: string;
64
+ /** Shell environment: a minimal base plus `allow` / `set`. */
65
+ env?: CliShellEnvOptions;
66
+ }
67
+ export declare const SHELL_DEFAULTS: {
68
+ readonly maxSessionsPerUser: 3;
69
+ readonly maxSessions: 20;
70
+ readonly idleTimeoutMs: number;
71
+ readonly sessionCheckIntervalMs: number;
72
+ readonly maxSessionCheckIntervalMs: number;
73
+ /** stdin touches the users session at most this often. */
74
+ readonly touchIntervalMs: number;
75
+ };
76
+ /** WebSocket close codes used by the shell socket (accept, then close). */
77
+ export declare const ShellCloseCodes: {
78
+ readonly LoginRequired: 4401;
79
+ readonly Forbidden: 4403;
80
+ readonly Disabled: 4404;
81
+ readonly TimedOut: 4408;
82
+ readonly TooMany: 4429;
83
+ };
84
+ /**
85
+ * Resolves the access mode (`shellAuth`). Users plugin mounted ⇒ `users`; otherwise
86
+ * `token` before `custom`, then `anonymous`; otherwise `locked`. Every configured
87
+ * check among token/authorize must pass whatever the reported mode.
88
+ */
89
+ export declare function resolveShellAuthMode(options: CliShellOptions | undefined, usersMounted: boolean): CliShellAuthMode;
90
+ /** Constant-time comparison of a presented token with the configured secret. */
91
+ export declare function tokensEqual(presented: string, expected: string): boolean;
92
+ /**
93
+ * Bearer token from the `Authorization` header or, for browser clients that
94
+ * cannot set WebSocket headers, the `_header_Authorization` query parameter.
95
+ */
96
+ export declare function readBearerToken(request: IncomingMessage, url: URL): string | undefined;
97
+ /**
98
+ * Builds the minimal shell environment: `PATH`, `HOME`, `USER`, `LANG`, `TERM`,
99
+ * `COLUMNS`, `LINES`, `SHELL` (plus the Windows essentials on win32), then the
100
+ * `allow`-listed server variables, then the fixed `set` values.
101
+ */
102
+ export declare function buildShellEnv(options: CliShellEnvOptions | undefined, info: {
103
+ shell: string;
104
+ cols: number;
105
+ rows: number;
106
+ }, source?: NodeJS.ProcessEnv): Record<string, string>;
107
+ //# sourceMappingURL=cli-shell-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-shell-options.d.ts","sourceRoot":"","sources":["../../../src/services/cli-shell-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAI5C,4FAA4F;AAC5F,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAErF,oFAAoF;AACpF,MAAM,WAAW,wBAAwB;IACrC,yCAAyC;IACzC,GAAG,EAAE,GAAG,CAAC;IACT,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;CACnC;AAED,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IAC/B,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC5B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,wBAAwB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxG;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8FAA8F;IAC9F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,GAAG,CAAC,EAAE,kBAAkB,CAAC;CAC5B;AAED,eAAO,MAAM,cAAc;;;;;;IAMvB,0DAA0D;;CAEpD,CAAC;AAEX,2EAA2E;AAC3E,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,EAAE,YAAY,EAAE,OAAO,GAAG,gBAAgB,CAMlH;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIxE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,SAAS,CAatF;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CACzB,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACnD,MAAM,GAAE,MAAM,CAAC,UAAwB,GACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA0BxB"}