@qodalis/cli-server-node 1.0.0-beta.1 → 1.0.0-beta.10
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/LICENSE +1 -1
- package/README.md +348 -74
- package/dist/package.json +77 -0
- package/dist/src/abstractions/cli-command-author.d.ts +2 -0
- package/dist/src/abstractions/cli-command-author.d.ts.map +1 -0
- package/dist/src/abstractions/cli-command-author.js +7 -0
- package/dist/src/abstractions/cli-command-author.js.map +1 -0
- package/dist/src/abstractions/cli-command-parameter-descriptor.d.ts +2 -0
- package/dist/src/abstractions/cli-command-parameter-descriptor.d.ts.map +1 -0
- package/dist/src/abstractions/cli-command-parameter-descriptor.js +6 -0
- package/dist/src/abstractions/cli-command-parameter-descriptor.js.map +1 -0
- package/dist/src/abstractions/cli-command-processor.d.ts +2 -0
- package/dist/src/abstractions/cli-command-processor.d.ts.map +1 -0
- package/dist/src/abstractions/cli-command-processor.js +6 -0
- package/dist/src/abstractions/cli-command-processor.js.map +1 -0
- package/dist/src/abstractions/cli-process-command.d.ts +2 -0
- package/dist/src/abstractions/cli-process-command.d.ts.map +1 -0
- package/dist/src/abstractions/cli-process-command.js.map +1 -0
- package/dist/src/abstractions/index.d.ts +2 -0
- package/dist/src/abstractions/index.d.ts.map +1 -0
- package/dist/src/abstractions/index.js +18 -0
- package/dist/src/abstractions/index.js.map +1 -0
- package/dist/src/auth/cli-server-auth-gate.d.ts +33 -0
- package/dist/src/auth/cli-server-auth-gate.d.ts.map +1 -0
- package/dist/src/auth/cli-server-auth-gate.js +121 -0
- package/dist/src/auth/cli-server-auth-gate.js.map +1 -0
- package/dist/src/auth/cli-server-auth.d.ts +149 -0
- package/dist/src/auth/cli-server-auth.d.ts.map +1 -0
- package/dist/src/auth/cli-server-auth.js +143 -0
- package/dist/src/auth/cli-server-auth.js.map +1 -0
- package/dist/src/auth/index.d.ts +4 -0
- package/dist/src/auth/index.d.ts.map +1 -0
- package/dist/src/auth/index.js +19 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/auth/ws-upgrade-auth.d.ts +30 -0
- package/dist/src/auth/ws-upgrade-auth.d.ts.map +1 -0
- package/dist/src/auth/ws-upgrade-auth.js +49 -0
- package/dist/src/auth/ws-upgrade-auth.js.map +1 -0
- package/dist/src/controllers/cli-controller.d.ts +11 -0
- package/dist/src/controllers/cli-controller.d.ts.map +1 -0
- package/dist/src/controllers/cli-controller.js +169 -0
- package/dist/src/controllers/cli-controller.js.map +1 -0
- package/dist/src/controllers/cli-version-controller.d.ts +18 -0
- package/dist/src/controllers/cli-version-controller.d.ts.map +1 -0
- package/dist/src/controllers/cli-version-controller.js +81 -0
- package/dist/src/controllers/cli-version-controller.js.map +1 -0
- package/dist/src/controllers/filesystem-controller.d.ts +9 -0
- package/dist/src/controllers/filesystem-controller.d.ts.map +1 -0
- package/dist/src/controllers/filesystem-controller.js +243 -0
- package/dist/src/controllers/filesystem-controller.js.map +1 -0
- package/dist/src/create-cli-server.d.ts +123 -0
- package/dist/src/create-cli-server.d.ts.map +1 -0
- package/dist/src/create-cli-server.js +201 -0
- package/dist/src/create-cli-server.js.map +1 -0
- package/dist/src/extensions/cli-builder.d.ts +54 -0
- package/dist/src/extensions/cli-builder.d.ts.map +1 -0
- package/dist/src/extensions/cli-builder.js +97 -0
- package/dist/src/extensions/cli-builder.js.map +1 -0
- package/dist/src/extensions/index.d.ts.map +1 -0
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/filesystem/filesystem-options.d.ts +16 -0
- package/dist/src/filesystem/filesystem-options.d.ts.map +1 -0
- package/dist/src/filesystem/filesystem-options.js +6 -0
- package/dist/src/filesystem/filesystem-options.js.map +1 -0
- package/dist/src/filesystem/filesystem-path-validator.d.ts +15 -0
- package/dist/src/filesystem/filesystem-path-validator.d.ts.map +1 -0
- package/dist/src/filesystem/filesystem-path-validator.js +72 -0
- package/dist/src/filesystem/filesystem-path-validator.js.map +1 -0
- package/dist/src/filesystem/index.d.ts +3 -0
- package/dist/src/filesystem/index.d.ts.map +1 -0
- package/dist/src/filesystem/index.js +8 -0
- package/dist/src/filesystem/index.js.map +1 -0
- package/dist/src/index.d.ts +24 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +121 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/index.d.ts +10 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +34 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/mcp/mcp-controller.d.ts +54 -0
- package/dist/src/mcp/mcp-controller.d.ts.map +1 -0
- package/dist/src/mcp/mcp-controller.js +358 -0
- package/dist/src/mcp/mcp-controller.js.map +1 -0
- package/dist/src/mcp/mcp-render.d.ts +10 -0
- package/dist/src/mcp/mcp-render.d.ts.map +1 -0
- package/dist/src/mcp/mcp-render.js +66 -0
- package/dist/src/mcp/mcp-render.js.map +1 -0
- package/dist/src/mcp/mcp-schema.d.ts +8 -0
- package/dist/src/mcp/mcp-schema.d.ts.map +1 -0
- package/dist/src/mcp/mcp-schema.js +64 -0
- package/dist/src/mcp/mcp-schema.js.map +1 -0
- package/dist/src/mcp/mcp-types.d.ts +70 -0
- package/dist/src/mcp/mcp-types.d.ts.map +1 -0
- package/dist/src/mcp/mcp-types.js +21 -0
- package/dist/src/mcp/mcp-types.js.map +1 -0
- package/dist/src/mcp/providers/commands-provider.d.ts +30 -0
- package/dist/src/mcp/providers/commands-provider.d.ts.map +1 -0
- package/dist/src/mcp/providers/commands-provider.js +145 -0
- package/dist/src/mcp/providers/commands-provider.js.map +1 -0
- package/dist/src/mcp/providers/data-explorer-provider.d.ts +15 -0
- package/dist/src/mcp/providers/data-explorer-provider.d.ts.map +1 -0
- package/dist/src/mcp/providers/data-explorer-provider.js +83 -0
- package/dist/src/mcp/providers/data-explorer-provider.js.map +1 -0
- package/dist/src/mcp/providers/filesystem-provider.d.ts +15 -0
- package/dist/src/mcp/providers/filesystem-provider.d.ts.map +1 -0
- package/dist/src/mcp/providers/filesystem-provider.js +166 -0
- package/dist/src/mcp/providers/filesystem-provider.js.map +1 -0
- package/dist/src/mcp/providers/jobs-provider.d.ts +23 -0
- package/dist/src/mcp/providers/jobs-provider.d.ts.map +1 -0
- package/dist/src/mcp/providers/jobs-provider.js +121 -0
- package/dist/src/mcp/providers/jobs-provider.js.map +1 -0
- package/dist/src/mcp/providers/server-provider.d.ts +19 -0
- package/dist/src/mcp/providers/server-provider.d.ts.map +1 -0
- package/dist/src/mcp/providers/server-provider.js +73 -0
- package/dist/src/mcp/providers/server-provider.js.map +1 -0
- package/dist/{models → src/models}/cli-server-command-descriptor.d.ts +2 -0
- package/dist/src/models/cli-server-command-descriptor.d.ts.map +1 -0
- package/dist/src/models/cli-server-command-descriptor.js.map +1 -0
- package/dist/src/models/cli-server-output.d.ts +2 -0
- package/dist/src/models/cli-server-output.d.ts.map +1 -0
- package/dist/src/models/cli-server-output.js.map +1 -0
- package/dist/src/models/cli-server-response.d.ts +2 -0
- package/dist/src/models/cli-server-response.d.ts.map +1 -0
- package/dist/src/models/cli-server-response.js.map +1 -0
- package/dist/src/models/index.d.ts.map +1 -0
- package/dist/{models → src/models}/index.js.map +1 -1
- package/dist/{processors → src/processors}/cli-base64-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-base64-command-processor.d.ts.map +1 -0
- package/dist/{processors → src/processors}/cli-base64-command-processor.js +8 -2
- package/dist/src/processors/cli-base64-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/cli-echo-command-processor.d.ts +2 -0
- package/dist/src/processors/cli-echo-command-processor.d.ts.map +1 -0
- package/dist/src/processors/cli-echo-command-processor.js +20 -0
- package/dist/src/processors/cli-echo-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/cli-hash-command-processor.d.ts +2 -0
- package/dist/src/processors/cli-hash-command-processor.d.ts.map +1 -0
- package/dist/{processors → src/processors}/cli-hash-command-processor.js +4 -1
- package/dist/src/processors/cli-hash-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/cli-http-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-http-command-processor.d.ts.map +1 -0
- package/dist/src/processors/cli-http-command-processor.js +161 -0
- package/dist/src/processors/cli-http-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/cli-status-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-status-command-processor.d.ts.map +1 -0
- package/dist/{processors → src/processors}/cli-status-command-processor.js +1 -0
- package/dist/src/processors/cli-status-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/cli-system-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-system-command-processor.d.ts.map +1 -0
- package/dist/{processors → src/processors}/cli-system-command-processor.js +1 -0
- package/dist/src/processors/cli-system-command-processor.js.map +1 -0
- package/dist/{processors → src/processors}/index.d.ts +1 -2
- package/dist/src/processors/index.d.ts.map +1 -0
- package/dist/{processors → src/processors}/index.js +2 -3
- package/dist/src/processors/index.js.map +1 -0
- package/dist/{server.d.ts.map → src/server.d.ts.map} +1 -1
- package/dist/{server.js → src/server.js} +22 -7
- package/dist/src/server.js.map +1 -0
- package/dist/src/services/cli-command-executor-service.d.ts +33 -0
- package/dist/src/services/cli-command-executor-service.d.ts.map +1 -0
- package/dist/src/services/cli-command-executor-service.js +77 -0
- package/dist/src/services/cli-command-executor-service.js.map +1 -0
- package/dist/src/services/cli-command-registry.d.ts +25 -0
- package/dist/src/services/cli-command-registry.d.ts.map +1 -0
- package/dist/{services → src/services}/cli-command-registry.js +5 -0
- package/dist/src/services/cli-command-registry.js.map +1 -0
- package/dist/src/services/cli-event-socket-manager.d.ts +77 -0
- package/dist/src/services/cli-event-socket-manager.d.ts.map +1 -0
- package/dist/src/services/cli-event-socket-manager.js +246 -0
- package/dist/src/services/cli-event-socket-manager.js.map +1 -0
- package/dist/src/services/cli-log-socket-manager.d.ts +67 -0
- package/dist/src/services/cli-log-socket-manager.d.ts.map +1 -0
- package/dist/src/services/cli-log-socket-manager.js +225 -0
- package/dist/src/services/cli-log-socket-manager.js.map +1 -0
- package/dist/{services → src/services}/cli-response-builder.d.ts +9 -0
- package/dist/src/services/cli-response-builder.d.ts.map +1 -0
- package/dist/{services → src/services}/cli-response-builder.js +1 -0
- package/dist/src/services/cli-response-builder.js.map +1 -0
- package/dist/src/services/cli-shell-options.d.ts +107 -0
- package/dist/src/services/cli-shell-options.d.ts.map +1 -0
- package/dist/src/services/cli-shell-options.js +139 -0
- package/dist/src/services/cli-shell-options.js.map +1 -0
- package/dist/src/services/cli-shell-session-manager.d.ts +92 -0
- package/dist/src/services/cli-shell-session-manager.d.ts.map +1 -0
- package/dist/src/services/cli-shell-session-manager.js +588 -0
- package/dist/src/services/cli-shell-session-manager.js.map +1 -0
- package/dist/src/services/index.d.ts +8 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/index.js +20 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/services/process-tree.d.ts +38 -0
- package/dist/src/services/process-tree.d.ts.map +1 -0
- package/dist/src/services/process-tree.js +249 -0
- package/dist/src/services/process-tree.js.map +1 -0
- package/dist/src/services/session-bound-sockets.d.ts +45 -0
- package/dist/src/services/session-bound-sockets.d.ts.map +1 -0
- package/dist/src/services/session-bound-sockets.js +129 -0
- package/dist/src/services/session-bound-sockets.js.map +1 -0
- package/dist/src/utils/logger.d.ts +11 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +13 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/package.json +37 -8
- package/dist/abstractions/cli-command-author.d.ts +0 -11
- package/dist/abstractions/cli-command-author.d.ts.map +0 -1
- package/dist/abstractions/cli-command-author.js +0 -14
- package/dist/abstractions/cli-command-author.js.map +0 -1
- package/dist/abstractions/cli-command-parameter-descriptor.d.ts +0 -18
- package/dist/abstractions/cli-command-parameter-descriptor.d.ts.map +0 -1
- package/dist/abstractions/cli-command-parameter-descriptor.js +0 -21
- package/dist/abstractions/cli-command-parameter-descriptor.js.map +0 -1
- package/dist/abstractions/cli-command-processor.d.ts +0 -26
- package/dist/abstractions/cli-command-processor.d.ts.map +0 -1
- package/dist/abstractions/cli-command-processor.js +0 -14
- package/dist/abstractions/cli-command-processor.js.map +0 -1
- package/dist/abstractions/cli-process-command.d.ts +0 -9
- package/dist/abstractions/cli-process-command.d.ts.map +0 -1
- package/dist/abstractions/cli-process-command.js.map +0 -1
- package/dist/abstractions/index.d.ts +0 -5
- package/dist/abstractions/index.d.ts.map +0 -1
- package/dist/abstractions/index.js +0 -11
- package/dist/abstractions/index.js.map +0 -1
- package/dist/controllers/cli-controller.d.ts +0 -4
- package/dist/controllers/cli-controller.d.ts.map +0 -1
- package/dist/controllers/cli-controller.js +0 -42
- package/dist/controllers/cli-controller.js.map +0 -1
- package/dist/create-cli-server.d.ts +0 -25
- package/dist/create-cli-server.d.ts.map +0 -1
- package/dist/create-cli-server.js +0 -35
- package/dist/create-cli-server.js.map +0 -1
- package/dist/extensions/cli-builder.d.ts +0 -9
- package/dist/extensions/cli-builder.d.ts.map +0 -1
- package/dist/extensions/cli-builder.js +0 -18
- package/dist/extensions/cli-builder.js.map +0 -1
- package/dist/extensions/index.d.ts.map +0 -1
- package/dist/extensions/index.js.map +0 -1
- package/dist/index.d.ts +0 -14
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -40
- package/dist/index.js.map +0 -1
- package/dist/models/cli-server-command-descriptor.d.ts.map +0 -1
- package/dist/models/cli-server-command-descriptor.js.map +0 -1
- package/dist/models/cli-server-output.d.ts +0 -23
- package/dist/models/cli-server-output.d.ts.map +0 -1
- package/dist/models/cli-server-output.js.map +0 -1
- package/dist/models/cli-server-response.d.ts +0 -6
- package/dist/models/cli-server-response.d.ts.map +0 -1
- package/dist/models/cli-server-response.js.map +0 -1
- package/dist/models/index.d.ts.map +0 -1
- package/dist/processors/cli-base64-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-base64-command-processor.js.map +0 -1
- package/dist/processors/cli-echo-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-echo-command-processor.js +0 -14
- package/dist/processors/cli-echo-command-processor.js.map +0 -1
- package/dist/processors/cli-hash-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-hash-command-processor.js.map +0 -1
- package/dist/processors/cli-http-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-http-command-processor.js +0 -79
- package/dist/processors/cli-http-command-processor.js.map +0 -1
- package/dist/processors/cli-status-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-status-command-processor.js.map +0 -1
- package/dist/processors/cli-system-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-system-command-processor.js.map +0 -1
- package/dist/processors/cli-uuid-command-processor.d.ts +0 -10
- package/dist/processors/cli-uuid-command-processor.d.ts.map +0 -1
- package/dist/processors/cli-uuid-command-processor.js +0 -27
- package/dist/processors/cli-uuid-command-processor.js.map +0 -1
- package/dist/processors/index.d.ts.map +0 -1
- package/dist/processors/index.js.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/services/cli-command-executor-service.d.ts +0 -12
- package/dist/services/cli-command-executor-service.d.ts.map +0 -1
- package/dist/services/cli-command-executor-service.js +0 -45
- package/dist/services/cli-command-executor-service.js.map +0 -1
- package/dist/services/cli-command-registry.d.ts +0 -14
- package/dist/services/cli-command-registry.d.ts.map +0 -1
- package/dist/services/cli-command-registry.js.map +0 -1
- package/dist/services/cli-event-socket-manager.d.ts +0 -15
- package/dist/services/cli-event-socket-manager.d.ts.map +0 -1
- package/dist/services/cli-event-socket-manager.js +0 -60
- package/dist/services/cli-event-socket-manager.js.map +0 -1
- package/dist/services/cli-response-builder.d.ts.map +0 -1
- package/dist/services/cli-response-builder.js.map +0 -1
- package/dist/services/index.d.ts +0 -5
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -12
- package/dist/services/index.js.map +0 -1
- /package/dist/{abstractions → src/abstractions}/cli-process-command.js +0 -0
- /package/dist/{extensions → src/extensions}/index.d.ts +0 -0
- /package/dist/{extensions → src/extensions}/index.js +0 -0
- /package/dist/{models → src/models}/cli-server-command-descriptor.js +0 -0
- /package/dist/{models → src/models}/cli-server-output.js +0 -0
- /package/dist/{models → src/models}/cli-server-response.js +0 -0
- /package/dist/{models → src/models}/index.d.ts +0 -0
- /package/dist/{models → src/models}/index.js +0 -0
- /package/dist/{server.d.ts → src/server.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-process-command.js","sourceRoot":"","sources":["../../../src/abstractions/cli-process-command.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { ICliCommandAuthor, CliCommandAuthor, DefaultLibraryAuthor, CliProcessCommand, splitShellWords, joinShellWords, getPositionals, getPositionalText, quoteShellWord, ICliCommandParameterDescriptor, CliCommandParameterDescriptor, ICliCommandProcessor, CliCommandProcessor, ICliModule, CliModule, ICliJob, ICliJobExecutionContext, ICliJobLogger, CliJobOptions, JobOverlapPolicy, ICliJobStorageProvider, JobExecution, JobExecutionStatus, JobState, JobStatus, JobLogEntry, JobLogLevel, CliStructuredOutput, CliStructuredResponse, IDataExplorerProvider, DataExplorerProviderOptions, DataExplorerLanguage, DataExplorerOutputFormat, DataExplorerTemplate, DataExplorerParameterDescriptor, DataExplorerExecutionContext, DataExplorerResult, DataExplorerExecuteRequest, DataExplorerSourceInfo, ICliProcessorFilter, ICliStreamCommandProcessor, isStreamCapable, } from '@qodalis/cli-server-abstractions';
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/abstractions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,8BAA8B,EAC9B,6BAA6B,EAC7B,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,SAAS,EACT,OAAO,EACP,uBAAuB,EACvB,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAC3B,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,+BAA+B,EAC/B,4BAA4B,EAC5B,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,GAClB,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isStreamCapable = exports.DataExplorerOutputFormat = exports.DataExplorerLanguage = exports.CliModule = exports.CliCommandProcessor = exports.CliCommandParameterDescriptor = exports.quoteShellWord = exports.getPositionalText = exports.getPositionals = exports.joinShellWords = exports.splitShellWords = exports.DefaultLibraryAuthor = exports.CliCommandAuthor = void 0;
|
|
4
|
+
var cli_server_abstractions_1 = require("@qodalis/cli-server-abstractions");
|
|
5
|
+
Object.defineProperty(exports, "CliCommandAuthor", { enumerable: true, get: function () { return cli_server_abstractions_1.CliCommandAuthor; } });
|
|
6
|
+
Object.defineProperty(exports, "DefaultLibraryAuthor", { enumerable: true, get: function () { return cli_server_abstractions_1.DefaultLibraryAuthor; } });
|
|
7
|
+
Object.defineProperty(exports, "splitShellWords", { enumerable: true, get: function () { return cli_server_abstractions_1.splitShellWords; } });
|
|
8
|
+
Object.defineProperty(exports, "joinShellWords", { enumerable: true, get: function () { return cli_server_abstractions_1.joinShellWords; } });
|
|
9
|
+
Object.defineProperty(exports, "getPositionals", { enumerable: true, get: function () { return cli_server_abstractions_1.getPositionals; } });
|
|
10
|
+
Object.defineProperty(exports, "getPositionalText", { enumerable: true, get: function () { return cli_server_abstractions_1.getPositionalText; } });
|
|
11
|
+
Object.defineProperty(exports, "quoteShellWord", { enumerable: true, get: function () { return cli_server_abstractions_1.quoteShellWord; } });
|
|
12
|
+
Object.defineProperty(exports, "CliCommandParameterDescriptor", { enumerable: true, get: function () { return cli_server_abstractions_1.CliCommandParameterDescriptor; } });
|
|
13
|
+
Object.defineProperty(exports, "CliCommandProcessor", { enumerable: true, get: function () { return cli_server_abstractions_1.CliCommandProcessor; } });
|
|
14
|
+
Object.defineProperty(exports, "CliModule", { enumerable: true, get: function () { return cli_server_abstractions_1.CliModule; } });
|
|
15
|
+
Object.defineProperty(exports, "DataExplorerLanguage", { enumerable: true, get: function () { return cli_server_abstractions_1.DataExplorerLanguage; } });
|
|
16
|
+
Object.defineProperty(exports, "DataExplorerOutputFormat", { enumerable: true, get: function () { return cli_server_abstractions_1.DataExplorerOutputFormat; } });
|
|
17
|
+
Object.defineProperty(exports, "isStreamCapable", { enumerable: true, get: function () { return cli_server_abstractions_1.isStreamCapable; } });
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/abstractions/index.ts"],"names":[],"mappings":";;;AAAA,4EA2C0C;AAzCtC,2HAAA,gBAAgB,OAAA;AAChB,+HAAA,oBAAoB,OAAA;AAEpB,0HAAA,eAAe,OAAA;AACf,yHAAA,cAAc,OAAA;AACd,yHAAA,cAAc,OAAA;AACd,4HAAA,iBAAiB,OAAA;AACjB,yHAAA,cAAc,OAAA;AAEd,wIAAA,6BAA6B,OAAA;AAE7B,8HAAA,mBAAmB,OAAA;AAEnB,oHAAA,SAAS,OAAA;AAiBT,+HAAA,oBAAoB,OAAA;AACpB,mIAAA,wBAAwB,OAAA;AASxB,0HAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RequestHandler } from 'express';
|
|
2
|
+
import { ICliCommandRegistry } from '../services/cli-command-registry';
|
|
3
|
+
import { CliServerAuthContext, ICliServerAuth } from './cli-server-auth';
|
|
4
|
+
declare global {
|
|
5
|
+
namespace Express {
|
|
6
|
+
interface Request {
|
|
7
|
+
/** Set by the server auth gate when the users plugin protects the server. */
|
|
8
|
+
qcliServerAuth?: CliServerAuthContext;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Normalizes a request path for classification: lower-case, single slashes, no trailing slash. */
|
|
13
|
+
export declare function normalizePath(path: string): string;
|
|
14
|
+
export interface ServerAuthGateOptions {
|
|
15
|
+
registry: ICliCommandRegistry;
|
|
16
|
+
/** Prefixes serving the CLI controller (`/api/v1/qcli`, custom basePath). */
|
|
17
|
+
cliPrefixes: string[];
|
|
18
|
+
/** Extra public routes as `"METHOD /path"` (e.g. a plugin's own login). */
|
|
19
|
+
publicRoutes: Set<string>;
|
|
20
|
+
/** MCP endpoint paths (normalized), requiring `commands:execute`. */
|
|
21
|
+
mcpPaths?: string[];
|
|
22
|
+
}
|
|
23
|
+
/** Collects `requiredPermissions` along the resolved processor chain. */
|
|
24
|
+
export declare function processorPermissions(registry: ICliCommandRegistry, command: unknown, chain: unknown): string[];
|
|
25
|
+
/** Permissions required for a (protected) server route. */
|
|
26
|
+
export declare function requiredServerPermissions(method: string, path: string, body: any, options: ServerAuthGateOptions): string[];
|
|
27
|
+
/**
|
|
28
|
+
* Express middleware protecting every `/api/...` route of the CLI server when
|
|
29
|
+
* an auth provider with `protectServer` is installed. Without a provider it is
|
|
30
|
+
* a no-op, so servers without the users plugin behave as before.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createServerAuthGate(getAuth: () => ICliServerAuth | undefined, options: ServerAuthGateOptions): RequestHandler;
|
|
33
|
+
//# sourceMappingURL=cli-server-auth-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-server-auth-gate.d.ts","sourceRoot":"","sources":["../../../src/auth/cli-server-auth-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,cAAc,EAAE,MAAM,SAAS,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAA6B,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKpG,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,OAAO,CAAC;QACd,UAAU,OAAO;YACb,6EAA6E;YAC7E,cAAc,CAAC,EAAE,oBAAoB,CAAC;SACzC;KACJ;CACJ;AAED,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAgBD,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,6EAA6E;IAC7E,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,2EAA2E;IAC3E,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAChC,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,GACf,MAAM,EAAE,CAkBV;AAED,2DAA2D;AAC3D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAoB3H;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAChC,OAAO,EAAE,MAAM,cAAc,GAAG,SAAS,EACzC,OAAO,EAAE,qBAAqB,GAC/B,cAAc,CAkDhB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizePath = normalizePath;
|
|
4
|
+
exports.processorPermissions = processorPermissions;
|
|
5
|
+
exports.requiredServerPermissions = requiredServerPermissions;
|
|
6
|
+
exports.createServerAuthGate = createServerAuthGate;
|
|
7
|
+
const cli_server_auth_1 = require("./cli-server-auth");
|
|
8
|
+
const logger_1 = require("../utils/logger");
|
|
9
|
+
const logger = (0, logger_1.createLogger)('ServerAuth');
|
|
10
|
+
/** Normalizes a request path for classification: lower-case, single slashes, no trailing slash. */
|
|
11
|
+
function normalizePath(path) {
|
|
12
|
+
const p = path.toLowerCase().replace(/\/{2,}/g, '/').replace(/\/+$/, '');
|
|
13
|
+
return p || '/';
|
|
14
|
+
}
|
|
15
|
+
const PUBLIC_GET = new Set([
|
|
16
|
+
'/api/qcli/versions',
|
|
17
|
+
'/api/qcli/version',
|
|
18
|
+
'/api/qcli/capabilities',
|
|
19
|
+
'/api/cli/versions',
|
|
20
|
+
'/api/v1/qcli/version',
|
|
21
|
+
'/api/v1/qcli/capabilities',
|
|
22
|
+
'/health',
|
|
23
|
+
'/healthz',
|
|
24
|
+
'/api/health',
|
|
25
|
+
]);
|
|
26
|
+
const FS_READ = new Set(['ls', 'cat', 'stat', 'download']);
|
|
27
|
+
/** Collects `requiredPermissions` along the resolved processor chain. */
|
|
28
|
+
function processorPermissions(registry, command, chain) {
|
|
29
|
+
if (typeof command !== 'string')
|
|
30
|
+
return [];
|
|
31
|
+
const root = registry.processors.find((p) => p.command.toLowerCase() === command.toLowerCase());
|
|
32
|
+
if (!root)
|
|
33
|
+
return [];
|
|
34
|
+
const out = [...(root.requiredPermissions ?? [])];
|
|
35
|
+
let current = root;
|
|
36
|
+
if (Array.isArray(chain)) {
|
|
37
|
+
for (const sub of chain) {
|
|
38
|
+
if (typeof sub !== 'string')
|
|
39
|
+
break;
|
|
40
|
+
const child = current.processors?.find((p) => p.command.toLowerCase() === sub.toLowerCase());
|
|
41
|
+
if (!child)
|
|
42
|
+
break;
|
|
43
|
+
out.push(...(child.requiredPermissions ?? []));
|
|
44
|
+
current = child;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
/** Permissions required for a (protected) server route. */
|
|
50
|
+
function requiredServerPermissions(method, path, body, options) {
|
|
51
|
+
for (const prefix of options.cliPrefixes) {
|
|
52
|
+
if (path === `${prefix}/execute` || path === `${prefix}/execute/stream`) {
|
|
53
|
+
return [cli_server_auth_1.CliServerPermissions.CommandsExecute, ...processorPermissions(options.registry, body?.command, body?.chainCommands)];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (options.mcpPaths?.includes(path)) {
|
|
57
|
+
return [cli_server_auth_1.CliServerPermissions.CommandsExecute];
|
|
58
|
+
}
|
|
59
|
+
if (path === '/api/qcli/fs' || path.startsWith('/api/qcli/fs/')) {
|
|
60
|
+
const op = path.slice('/api/qcli/fs/'.length);
|
|
61
|
+
return [method === 'GET' && FS_READ.has(op) ? cli_server_auth_1.CliServerPermissions.FilesRead : cli_server_auth_1.CliServerPermissions.FilesWrite];
|
|
62
|
+
}
|
|
63
|
+
if (path === '/api/qcli/data-explorer' || path.startsWith('/api/qcli/data-explorer/')) {
|
|
64
|
+
return [cli_server_auth_1.CliServerPermissions.DataQuery];
|
|
65
|
+
}
|
|
66
|
+
if (path === '/api/v1/qcli/jobs' || path.startsWith('/api/v1/qcli/jobs/')) {
|
|
67
|
+
return [method === 'GET' ? cli_server_auth_1.CliServerPermissions.JobsRead : cli_server_auth_1.CliServerPermissions.JobsManage];
|
|
68
|
+
}
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Express middleware protecting every `/api/...` route of the CLI server when
|
|
73
|
+
* an auth provider with `protectServer` is installed. Without a provider it is
|
|
74
|
+
* a no-op, so servers without the users plugin behave as before.
|
|
75
|
+
*/
|
|
76
|
+
function createServerAuthGate(getAuth, options) {
|
|
77
|
+
return (req, res, next) => {
|
|
78
|
+
const auth = getAuth();
|
|
79
|
+
if (!auth || !auth.protectServer) {
|
|
80
|
+
next();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const method = req.method.toUpperCase();
|
|
84
|
+
if (method === 'OPTIONS') {
|
|
85
|
+
next();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const path = normalizePath(req.path);
|
|
89
|
+
if (!path.startsWith('/api/') && path !== '/api') {
|
|
90
|
+
next();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if ((method === 'GET' || method === 'HEAD') && PUBLIC_GET.has(path)) {
|
|
94
|
+
next();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (options.publicRoutes.has(`${method} ${path}`) || auth.handlesPath(path, method)) {
|
|
98
|
+
next();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
auth.authenticateRequest(req).then((ctx) => {
|
|
102
|
+
const missing = requiredServerPermissions(method, path, req.body, options).filter((p) => !auth.hasPermission(ctx, p));
|
|
103
|
+
if (missing.length > 0) {
|
|
104
|
+
res.status(403).json({ error: `forbidden: missing permission ${missing.join(', ')}` });
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
req.qcliServerAuth = ctx;
|
|
108
|
+
next();
|
|
109
|
+
}, (err) => {
|
|
110
|
+
if (typeof err?.status !== 'number') {
|
|
111
|
+
// not an auth error (e.g. a store failure): never expose its message
|
|
112
|
+
logger.error('authentication failed unexpectedly:', err);
|
|
113
|
+
res.status(500).json({ error: 'internal server error' });
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const status = err.status;
|
|
117
|
+
res.status(status).json({ error: status === 401 ? err.message || 'unauthorized' : err.message || 'forbidden' });
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=cli-server-auth-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-server-auth-gate.js","sourceRoot":"","sources":["../../../src/auth/cli-server-auth-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type { IncomingMessage } from 'http';
|
|
2
|
+
import type { Request } from 'express';
|
|
3
|
+
/** Identity of an authenticated caller (HTTP request or WebSocket). */
|
|
4
|
+
export interface CliServerAuthContext {
|
|
5
|
+
userId: string;
|
|
6
|
+
userName: string;
|
|
7
|
+
/** Absent for host-authenticated (adapter) callers. */
|
|
8
|
+
sessionId?: string;
|
|
9
|
+
/** Set when the caller authenticated with an API token (no session). */
|
|
10
|
+
tokenId?: string;
|
|
11
|
+
/** Effective permissions (`resource:action`, `*` wildcards). */
|
|
12
|
+
permissions: string[];
|
|
13
|
+
}
|
|
14
|
+
/** Error thrown by {@link ICliServerAuth.authenticateRequest}; rendered as `{ error }`. */
|
|
15
|
+
export interface CliServerAuthError extends Error {
|
|
16
|
+
status?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Authentication provider that protects the whole CLI server (routes and
|
|
20
|
+
* sockets). Implemented by the users plugin (`usersPlugin.serverAuth`).
|
|
21
|
+
*/
|
|
22
|
+
export interface ICliServerAuth {
|
|
23
|
+
/** When false the server stays open; sockets only use tickets for optional identity. */
|
|
24
|
+
readonly protectServer: boolean;
|
|
25
|
+
/** True for routes the provider authenticates itself (its own API, its login). */
|
|
26
|
+
handlesPath(path: string, method: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Authenticates an HTTP request. Throws an error with `status`
|
|
29
|
+
* (401 unauthenticated, 403 e.g. password change required / CSRF); any
|
|
30
|
+
* other error is logged and answered with a generic 500.
|
|
31
|
+
*/
|
|
32
|
+
authenticateRequest(req: Request): Promise<CliServerAuthContext>;
|
|
33
|
+
/**
|
|
34
|
+
* Consumes a single-use WebSocket ticket; undefined when invalid/expired/used.
|
|
35
|
+
* May throw an error with `status: 403` when the identity is valid but not
|
|
36
|
+
* allowed yet (e.g. password change required).
|
|
37
|
+
*/
|
|
38
|
+
consumeTicket(ticket: string): Promise<CliServerAuthContext | undefined>;
|
|
39
|
+
hasPermission(ctx: CliServerAuthContext, permission: string): boolean;
|
|
40
|
+
/** Called once when installed into a server. */
|
|
41
|
+
attachToServer?(server: {
|
|
42
|
+
allowedOrigins?: string[];
|
|
43
|
+
broadcast: (message: Record<string, unknown>) => void;
|
|
44
|
+
}): void;
|
|
45
|
+
/**
|
|
46
|
+
* Re-validates a socket identity without sliding the session: the session still
|
|
47
|
+
* exists and is not expired, the user exists and is enabled. Returns the identity
|
|
48
|
+
* with fresh permissions, or undefined when it ended. Used to bind long-lived
|
|
49
|
+
* sockets (the shell) to their session. `request` is the socket's original
|
|
50
|
+
* upgrade request, for identities without a stored session that the provider
|
|
51
|
+
* re-authenticates from the request (e.g. a host auth adapter reading cookies).
|
|
52
|
+
*/
|
|
53
|
+
revalidate?(ctx: CliServerAuthContext, request?: IncomingMessage): Promise<CliServerAuthContext | undefined>;
|
|
54
|
+
/** Records activity on the session behind `ctx` (slides the idle expiry). */
|
|
55
|
+
touch?(ctx: CliServerAuthContext): Promise<void>;
|
|
56
|
+
/** Writes an audit entry (never include secrets, command text or stdin). */
|
|
57
|
+
audit?(entry: CliServerAuditEntry): Promise<void>;
|
|
58
|
+
/** Subscribes to session lifecycle events; returns an unsubscribe function. */
|
|
59
|
+
onSessionEvent?(listener: (event: CliServerSessionEvent) => void): () => void;
|
|
60
|
+
}
|
|
61
|
+
/** Audit entry written by the server through {@link ICliServerAuth.audit}. */
|
|
62
|
+
export interface CliServerAuditEntry {
|
|
63
|
+
event: string;
|
|
64
|
+
userId: string;
|
|
65
|
+
userName: string;
|
|
66
|
+
/** Acting user (defaults to the user). */
|
|
67
|
+
actorId?: string;
|
|
68
|
+
actorName?: string;
|
|
69
|
+
details?: string;
|
|
70
|
+
metadata?: Record<string, unknown>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Session lifecycle events emitted by the auth provider:
|
|
74
|
+
* - `session-ended`: logout, expiry, revoke (kick), user disabled/deleted;
|
|
75
|
+
* `revoked` is true for revocations, which also broadcast `session-kicked`;
|
|
76
|
+
* - `access-changed`: users/groups/permissions changed, or the expired-session
|
|
77
|
+
* sweep ran (re-check open sockets).
|
|
78
|
+
*/
|
|
79
|
+
export type CliServerSessionEvent = {
|
|
80
|
+
type: 'session-ended';
|
|
81
|
+
sessionId: string;
|
|
82
|
+
userId?: string;
|
|
83
|
+
reason?: string;
|
|
84
|
+
revoked?: boolean;
|
|
85
|
+
} | {
|
|
86
|
+
type: 'access-changed';
|
|
87
|
+
userId?: string;
|
|
88
|
+
};
|
|
89
|
+
/** Server permissions enforced when the users plugin protects the server. */
|
|
90
|
+
export declare const CliServerPermissions: {
|
|
91
|
+
readonly CommandsExecute: "commands:execute";
|
|
92
|
+
readonly FilesRead: "files:read";
|
|
93
|
+
readonly FilesWrite: "files:write";
|
|
94
|
+
readonly DataQuery: "data:query";
|
|
95
|
+
readonly JobsRead: "jobs:read";
|
|
96
|
+
readonly JobsManage: "jobs:manage";
|
|
97
|
+
readonly LogsRead: "logs:read";
|
|
98
|
+
readonly ShellExecute: "shell:execute";
|
|
99
|
+
readonly AdminAccess: "admin:access";
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Exact origin match. An entry ending in `:*` matches any port of that
|
|
103
|
+
* scheme+host (e.g. `http://127.0.0.1:*`).
|
|
104
|
+
*/
|
|
105
|
+
export declare function isOriginAllowed(origin: string | undefined, allowed: readonly string[] | undefined): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Number of trusted reverse-proxy hops for a `trustProxy` setting:
|
|
108
|
+
* `false`/`0`/absent → 0 (untrusted), `true` → 1, a number n → n (values
|
|
109
|
+
* below 1 other than 0 count as 1).
|
|
110
|
+
*/
|
|
111
|
+
export declare function trustedProxyHops(trustProxy: boolean | number | undefined): number;
|
|
112
|
+
/**
|
|
113
|
+
* The client address: the socket address, or with `trustProxy` (a hop count,
|
|
114
|
+
* `true` = 1) the `X-Forwarded-For` entry at index `len - hops`.
|
|
115
|
+
*/
|
|
116
|
+
export declare function clientAddress(req: {
|
|
117
|
+
headers: Record<string, string | string[] | undefined>;
|
|
118
|
+
socket?: {
|
|
119
|
+
remoteAddress?: string;
|
|
120
|
+
} | null;
|
|
121
|
+
}, trustProxy: boolean | number | undefined): string;
|
|
122
|
+
/** Minimal request shape for {@link isSameOrigin} (Node `IncomingMessage` or Express `Request`). */
|
|
123
|
+
export interface OriginCheckRequest {
|
|
124
|
+
headers: Record<string, string | string[] | undefined>;
|
|
125
|
+
socket?: {
|
|
126
|
+
encrypted?: boolean;
|
|
127
|
+
remoteAddress?: string;
|
|
128
|
+
} | null;
|
|
129
|
+
/** Express app (when present, its `trust proxy` setting is honoured). */
|
|
130
|
+
app?: {
|
|
131
|
+
get?: (name: string) => unknown;
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The request's own origin (`scheme://host:port`, normalized): the scheme from
|
|
136
|
+
* the socket (TLS or not) and the `Host` header. Behind a trusted proxy
|
|
137
|
+
* (`trustProxy`, or the Express app's `trust proxy` setting when omitted)
|
|
138
|
+
* `X-Forwarded-Proto` / `X-Forwarded-Host` win, read like `X-Forwarded-For`:
|
|
139
|
+
* the entry at index `len - hops` (the rightmost with one hop; the leftmost
|
|
140
|
+
* when the list is shorter; an empty entry is ignored).
|
|
141
|
+
*/
|
|
142
|
+
export declare function requestOrigin(req: OriginCheckRequest, trustProxy?: boolean | number): string | undefined;
|
|
143
|
+
/**
|
|
144
|
+
* True when `origin` is the request's own origin (e.g. the bundled admin
|
|
145
|
+
* dashboard served by this server). Same-origin requests are not cross-site
|
|
146
|
+
* and always pass Origin/CSRF checks. Case-insensitive; default ports normalized.
|
|
147
|
+
*/
|
|
148
|
+
export declare function isSameOrigin(origin: string | undefined, req: OriginCheckRequest, trustProxy?: boolean | number): boolean;
|
|
149
|
+
//# sourceMappingURL=cli-server-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-server-auth.d.ts","sourceRoot":"","sources":["../../../src/auth/cli-server-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CliServerPermissions = void 0;
|
|
4
|
+
exports.isOriginAllowed = isOriginAllowed;
|
|
5
|
+
exports.trustedProxyHops = trustedProxyHops;
|
|
6
|
+
exports.clientAddress = clientAddress;
|
|
7
|
+
exports.requestOrigin = requestOrigin;
|
|
8
|
+
exports.isSameOrigin = isSameOrigin;
|
|
9
|
+
/** Server permissions enforced when the users plugin protects the server. */
|
|
10
|
+
exports.CliServerPermissions = {
|
|
11
|
+
CommandsExecute: 'commands:execute',
|
|
12
|
+
FilesRead: 'files:read',
|
|
13
|
+
FilesWrite: 'files:write',
|
|
14
|
+
DataQuery: 'data:query',
|
|
15
|
+
JobsRead: 'jobs:read',
|
|
16
|
+
JobsManage: 'jobs:manage',
|
|
17
|
+
LogsRead: 'logs:read',
|
|
18
|
+
ShellExecute: 'shell:execute',
|
|
19
|
+
AdminAccess: 'admin:access',
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Exact origin match. An entry ending in `:*` matches any port of that
|
|
23
|
+
* scheme+host (e.g. `http://127.0.0.1:*`).
|
|
24
|
+
*/
|
|
25
|
+
function isOriginAllowed(origin, allowed) {
|
|
26
|
+
if (!origin || !allowed || allowed.length === 0)
|
|
27
|
+
return false;
|
|
28
|
+
const o = origin.toLowerCase().replace(/\/+$/, '');
|
|
29
|
+
return allowed.some((entry) => {
|
|
30
|
+
const e = entry.toLowerCase().replace(/\/+$/, '');
|
|
31
|
+
if (e.endsWith(':*')) {
|
|
32
|
+
const base = e.slice(0, -2);
|
|
33
|
+
return o === base || (o.startsWith(base + ':') && /^\d+$/.test(o.slice(base.length + 1)));
|
|
34
|
+
}
|
|
35
|
+
return o === e;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Number of trusted reverse-proxy hops for a `trustProxy` setting:
|
|
40
|
+
* `false`/`0`/absent → 0 (untrusted), `true` → 1, a number n → n (values
|
|
41
|
+
* below 1 other than 0 count as 1).
|
|
42
|
+
*/
|
|
43
|
+
function trustedProxyHops(trustProxy) {
|
|
44
|
+
if (typeof trustProxy === 'number') {
|
|
45
|
+
if (trustProxy === 0)
|
|
46
|
+
return 0;
|
|
47
|
+
return trustProxy >= 1 ? Math.floor(trustProxy) : 1;
|
|
48
|
+
}
|
|
49
|
+
return trustProxy ? 1 : 0;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The `X-Forwarded-*` entry behind `hops` trusted proxies (for
|
|
53
|
+
* `X-Forwarded-For`: the client): index `len - hops` (with one hop, the
|
|
54
|
+
* rightmost entry, appended by the trusted proxy; leftmost entries are
|
|
55
|
+
* client-controlled). The leftmost entry when the list is shorter than `hops`;
|
|
56
|
+
* undefined when the header is absent or the selected entry is empty.
|
|
57
|
+
*/
|
|
58
|
+
function forwardedEntry(header, hops) {
|
|
59
|
+
if (hops <= 0 || header === undefined)
|
|
60
|
+
return undefined;
|
|
61
|
+
const entries = (Array.isArray(header) ? header.join(',') : header).split(',').map((e) => e.trim());
|
|
62
|
+
return entries[Math.max(0, entries.length - hops)] || undefined;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The client address: the socket address, or with `trustProxy` (a hop count,
|
|
66
|
+
* `true` = 1) the `X-Forwarded-For` entry at index `len - hops`.
|
|
67
|
+
*/
|
|
68
|
+
function clientAddress(req, trustProxy) {
|
|
69
|
+
return forwardedEntry(req.headers['x-forwarded-for'], trustedProxyHops(trustProxy)) ?? req.socket?.remoteAddress ?? 'unknown';
|
|
70
|
+
}
|
|
71
|
+
const DEFAULT_PORTS = { http: '80', https: '443' };
|
|
72
|
+
function firstHeader(value) {
|
|
73
|
+
const raw = Array.isArray(value) ? value[0] : value;
|
|
74
|
+
const first = raw?.split(',')[0]?.trim();
|
|
75
|
+
return first || undefined;
|
|
76
|
+
}
|
|
77
|
+
/** `scheme://host:port`, lower-cased, explicit port (http:80, https:443); `ws`/`wss` map to `http`/`https`. */
|
|
78
|
+
function normalizeOrigin(scheme, hostPort) {
|
|
79
|
+
let s = scheme.toLowerCase().replace(/:$/, '');
|
|
80
|
+
if (s === 'ws')
|
|
81
|
+
s = 'http';
|
|
82
|
+
if (s === 'wss')
|
|
83
|
+
s = 'https';
|
|
84
|
+
if (!DEFAULT_PORTS[s])
|
|
85
|
+
return undefined;
|
|
86
|
+
try {
|
|
87
|
+
const url = new URL(`${s}://${hostPort}`);
|
|
88
|
+
if (url.username || url.password || (url.pathname && url.pathname !== '/') || url.search || url.hash)
|
|
89
|
+
return undefined;
|
|
90
|
+
return `${s}://${url.hostname.toLowerCase()}:${url.port || DEFAULT_PORTS[s]}`;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Trusted proxy hops for the forwarded headers: from `trustProxy`, or — when it
|
|
98
|
+
* is omitted and the Express app's `trust proxy` setting trusts the socket — that
|
|
99
|
+
* setting's hop count (a number), otherwise 1.
|
|
100
|
+
*/
|
|
101
|
+
function proxyHops(req, trustProxy) {
|
|
102
|
+
if (trustProxy !== undefined)
|
|
103
|
+
return trustedProxyHops(trustProxy);
|
|
104
|
+
const fn = req.app?.get?.('trust proxy fn');
|
|
105
|
+
if (typeof fn !== 'function' || !fn(req.socket?.remoteAddress, 0))
|
|
106
|
+
return 0;
|
|
107
|
+
const setting = req.app?.get?.('trust proxy');
|
|
108
|
+
return typeof setting === 'number' ? trustedProxyHops(setting) || 1 : 1;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The request's own origin (`scheme://host:port`, normalized): the scheme from
|
|
112
|
+
* the socket (TLS or not) and the `Host` header. Behind a trusted proxy
|
|
113
|
+
* (`trustProxy`, or the Express app's `trust proxy` setting when omitted)
|
|
114
|
+
* `X-Forwarded-Proto` / `X-Forwarded-Host` win, read like `X-Forwarded-For`:
|
|
115
|
+
* the entry at index `len - hops` (the rightmost with one hop; the leftmost
|
|
116
|
+
* when the list is shorter; an empty entry is ignored).
|
|
117
|
+
*/
|
|
118
|
+
function requestOrigin(req, trustProxy) {
|
|
119
|
+
const hops = proxyHops(req, trustProxy);
|
|
120
|
+
const scheme = forwardedEntry(req.headers['x-forwarded-proto'], hops) || (req.socket?.encrypted ? 'https' : 'http');
|
|
121
|
+
const host = forwardedEntry(req.headers['x-forwarded-host'], hops) || firstHeader(req.headers['host']);
|
|
122
|
+
return host ? normalizeOrigin(scheme, host) : undefined;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* True when `origin` is the request's own origin (e.g. the bundled admin
|
|
126
|
+
* dashboard served by this server). Same-origin requests are not cross-site
|
|
127
|
+
* and always pass Origin/CSRF checks. Case-insensitive; default ports normalized.
|
|
128
|
+
*/
|
|
129
|
+
function isSameOrigin(origin, req, trustProxy) {
|
|
130
|
+
if (!origin || origin === 'null')
|
|
131
|
+
return false;
|
|
132
|
+
let o;
|
|
133
|
+
try {
|
|
134
|
+
const url = new URL(origin);
|
|
135
|
+
o = normalizeOrigin(url.protocol, url.host);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
const own = requestOrigin(req, trustProxy);
|
|
141
|
+
return !!o && !!own && o === own;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=cli-server-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-server-auth.js","sourceRoot":"","sources":["../../../src/auth/cli-server-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { CliServerAuthContext, CliServerAuthError, CliServerAuditEntry, CliServerSessionEvent, ICliServerAuth, CliServerPermissions, isOriginAllowed, isSameOrigin, requestOrigin, clientAddress, trustedProxyHops, } from './cli-server-auth';
|
|
2
|
+
export { createServerAuthGate, ServerAuthGateOptions, requiredServerPermissions, processorPermissions, normalizePath, } from './cli-server-auth-gate';
|
|
3
|
+
export { authorizeWsUpgrade, rejectUpgrade, WsUpgradeAuthOptions, WsUpgradeAuthResult } from './ws-upgrade-auth';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,aAAa,EACb,gBAAgB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACH,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,aAAa,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rejectUpgrade = exports.authorizeWsUpgrade = exports.normalizePath = exports.processorPermissions = exports.requiredServerPermissions = exports.createServerAuthGate = exports.trustedProxyHops = exports.clientAddress = exports.requestOrigin = exports.isSameOrigin = exports.isOriginAllowed = exports.CliServerPermissions = void 0;
|
|
4
|
+
var cli_server_auth_1 = require("./cli-server-auth");
|
|
5
|
+
Object.defineProperty(exports, "CliServerPermissions", { enumerable: true, get: function () { return cli_server_auth_1.CliServerPermissions; } });
|
|
6
|
+
Object.defineProperty(exports, "isOriginAllowed", { enumerable: true, get: function () { return cli_server_auth_1.isOriginAllowed; } });
|
|
7
|
+
Object.defineProperty(exports, "isSameOrigin", { enumerable: true, get: function () { return cli_server_auth_1.isSameOrigin; } });
|
|
8
|
+
Object.defineProperty(exports, "requestOrigin", { enumerable: true, get: function () { return cli_server_auth_1.requestOrigin; } });
|
|
9
|
+
Object.defineProperty(exports, "clientAddress", { enumerable: true, get: function () { return cli_server_auth_1.clientAddress; } });
|
|
10
|
+
Object.defineProperty(exports, "trustedProxyHops", { enumerable: true, get: function () { return cli_server_auth_1.trustedProxyHops; } });
|
|
11
|
+
var cli_server_auth_gate_1 = require("./cli-server-auth-gate");
|
|
12
|
+
Object.defineProperty(exports, "createServerAuthGate", { enumerable: true, get: function () { return cli_server_auth_gate_1.createServerAuthGate; } });
|
|
13
|
+
Object.defineProperty(exports, "requiredServerPermissions", { enumerable: true, get: function () { return cli_server_auth_gate_1.requiredServerPermissions; } });
|
|
14
|
+
Object.defineProperty(exports, "processorPermissions", { enumerable: true, get: function () { return cli_server_auth_gate_1.processorPermissions; } });
|
|
15
|
+
Object.defineProperty(exports, "normalizePath", { enumerable: true, get: function () { return cli_server_auth_gate_1.normalizePath; } });
|
|
16
|
+
var ws_upgrade_auth_1 = require("./ws-upgrade-auth");
|
|
17
|
+
Object.defineProperty(exports, "authorizeWsUpgrade", { enumerable: true, get: function () { return ws_upgrade_auth_1.authorizeWsUpgrade; } });
|
|
18
|
+
Object.defineProperty(exports, "rejectUpgrade", { enumerable: true, get: function () { return ws_upgrade_auth_1.rejectUpgrade; } });
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/index.ts"],"names":[],"mappings":";;;AAAA,qDAY2B;AANvB,uHAAA,oBAAoB,OAAA;AACpB,kHAAA,eAAe,OAAA;AACf,+GAAA,YAAY,OAAA;AACZ,gHAAA,aAAa,OAAA;AACb,gHAAA,aAAa,OAAA;AACb,mHAAA,gBAAgB,OAAA;AAEpB,+DAMgC;AAL5B,4HAAA,oBAAoB,OAAA;AAEpB,iIAAA,yBAAyB,OAAA;AACzB,4HAAA,oBAAoB,OAAA;AACpB,qHAAA,aAAa,OAAA;AAEjB,qDAAiH;AAAxG,qHAAA,kBAAkB,OAAA;AAAE,gHAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { IncomingMessage } from 'http';
|
|
2
|
+
import type { Duplex } from 'stream';
|
|
3
|
+
import { CliServerAuthContext, ICliServerAuth } from './cli-server-auth';
|
|
4
|
+
export interface WsUpgradeAuthOptions {
|
|
5
|
+
auth?: ICliServerAuth;
|
|
6
|
+
allowedOrigins?: string[];
|
|
7
|
+
/** Honour `X-Forwarded-Proto`/`X-Forwarded-Host` when deciding whether the Origin is the server's own. */
|
|
8
|
+
trustProxy?: boolean | number;
|
|
9
|
+
/** Permission required on top of authentication (protected mode only). */
|
|
10
|
+
permission?: string;
|
|
11
|
+
}
|
|
12
|
+
export type WsUpgradeAuthResult = {
|
|
13
|
+
ok: true;
|
|
14
|
+
ctx?: CliServerAuthContext;
|
|
15
|
+
} | {
|
|
16
|
+
ok: false;
|
|
17
|
+
status: 401 | 403;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Authorizes a WebSocket upgrade:
|
|
21
|
+
* - when `allowedOrigins` is set, a present `Origin` header must be allowed or
|
|
22
|
+
* be the server's own origin (same-origin, e.g. the bundled dashboard) (403);
|
|
23
|
+
* - with a protecting auth provider, a valid single-use `?ticket=` is required
|
|
24
|
+
* (401) and the optional permission is checked (403);
|
|
25
|
+
* - otherwise a ticket, when present, only attaches an identity.
|
|
26
|
+
*/
|
|
27
|
+
export declare function authorizeWsUpgrade(request: IncomingMessage, url: URL, options: WsUpgradeAuthOptions): Promise<WsUpgradeAuthResult>;
|
|
28
|
+
/** Rejects an upgrade with a bare HTTP status response. */
|
|
29
|
+
export declare function rejectUpgrade(socket: Duplex, status: number): void;
|
|
30
|
+
//# sourceMappingURL=ws-upgrade-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-upgrade-auth.d.ts","sourceRoot":"","sources":["../../../src/auth/ws-upgrade-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAiC,MAAM,mBAAmB,CAAC;AAExG,MAAM,WAAW,oBAAoB;IACjC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,0GAA0G;IAC1G,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,oBAAoB,CAAA;CAAE,GACxC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAA;CAAE,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACpC,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,oBAAoB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAyB9B;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQlE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.authorizeWsUpgrade = authorizeWsUpgrade;
|
|
4
|
+
exports.rejectUpgrade = rejectUpgrade;
|
|
5
|
+
const cli_server_auth_1 = require("./cli-server-auth");
|
|
6
|
+
/**
|
|
7
|
+
* Authorizes a WebSocket upgrade:
|
|
8
|
+
* - when `allowedOrigins` is set, a present `Origin` header must be allowed or
|
|
9
|
+
* be the server's own origin (same-origin, e.g. the bundled dashboard) (403);
|
|
10
|
+
* - with a protecting auth provider, a valid single-use `?ticket=` is required
|
|
11
|
+
* (401) and the optional permission is checked (403);
|
|
12
|
+
* - otherwise a ticket, when present, only attaches an identity.
|
|
13
|
+
*/
|
|
14
|
+
async function authorizeWsUpgrade(request, url, options) {
|
|
15
|
+
const origin = request.headers.origin;
|
|
16
|
+
if (options.allowedOrigins && options.allowedOrigins.length > 0 && origin !== undefined) {
|
|
17
|
+
if (!(0, cli_server_auth_1.isOriginAllowed)(origin, options.allowedOrigins) && !(0, cli_server_auth_1.isSameOrigin)(origin, request, options.trustProxy ?? false)) {
|
|
18
|
+
return { ok: false, status: 403 };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const auth = options.auth;
|
|
22
|
+
if (!auth) {
|
|
23
|
+
return { ok: true };
|
|
24
|
+
}
|
|
25
|
+
const ticket = url.searchParams.get('ticket');
|
|
26
|
+
const ctx = ticket ? await auth.consumeTicket(ticket).catch(() => undefined) : undefined;
|
|
27
|
+
if (!auth.protectServer) {
|
|
28
|
+
return { ok: true, ctx };
|
|
29
|
+
}
|
|
30
|
+
if (!ctx) {
|
|
31
|
+
return { ok: false, status: 401 };
|
|
32
|
+
}
|
|
33
|
+
if (options.permission && !auth.hasPermission(ctx, options.permission)) {
|
|
34
|
+
return { ok: false, status: 403 };
|
|
35
|
+
}
|
|
36
|
+
return { ok: true, ctx };
|
|
37
|
+
}
|
|
38
|
+
/** Rejects an upgrade with a bare HTTP status response. */
|
|
39
|
+
function rejectUpgrade(socket, status) {
|
|
40
|
+
const text = status === 401 ? 'Unauthorized' : status === 403 ? 'Forbidden' : status === 404 ? 'Not Found' : 'Error';
|
|
41
|
+
try {
|
|
42
|
+
socket.write(`HTTP/1.1 ${status} ${text}\r\nConnection: close\r\nContent-Length: 0\r\n\r\n`);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// ignore
|
|
46
|
+
}
|
|
47
|
+
socket.destroy();
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=ws-upgrade-auth.js.map
|