aquaman-proxy 0.14.1 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -5
- package/dist/broker-scope.d.ts +89 -0
- package/dist/broker-scope.d.ts.map +1 -0
- package/dist/broker-scope.js +186 -0
- package/dist/broker-scope.js.map +1 -0
- package/dist/cli/index.js +374 -35
- package/dist/cli/index.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/types.d.ts +14 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/utils/config.d.ts +9 -0
- package/dist/core/utils/config.d.ts.map +1 -1
- package/dist/core/utils/config.js +29 -1
- package/dist/core/utils/config.js.map +1 -1
- package/dist/core/utils/index.d.ts +1 -1
- package/dist/core/utils/index.d.ts.map +1 -1
- package/dist/core/utils/index.js +1 -1
- package/dist/core/utils/index.js.map +1 -1
- package/dist/daemon.d.ts +36 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +136 -15
- package/dist/daemon.js.map +1 -1
- package/dist/hermes/config-writer.d.ts +19 -0
- package/dist/hermes/config-writer.d.ts.map +1 -1
- package/dist/hermes/config-writer.js +51 -1
- package/dist/hermes/config-writer.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/migration/openclaw-migrator.d.ts.map +1 -1
- package/dist/migration/openclaw-migrator.js +7 -6
- package/dist/migration/openclaw-migrator.js.map +1 -1
- package/dist/openclaw/channel-routing.d.ts +81 -0
- package/dist/openclaw/channel-routing.d.ts.map +1 -0
- package/dist/openclaw/channel-routing.js +152 -0
- package/dist/openclaw/channel-routing.js.map +1 -0
- package/dist/openclaw/integration.d.ts +18 -0
- package/dist/openclaw/integration.d.ts.map +1 -1
- package/dist/openclaw/integration.js +32 -0
- package/dist/openclaw/integration.js.map +1 -1
- package/dist/openclaw/secretref.d.ts +35 -6
- package/dist/openclaw/secretref.d.ts.map +1 -1
- package/dist/openclaw/secretref.js +73 -8
- package/dist/openclaw/secretref.js.map +1 -1
- package/dist/request-policy.d.ts +7 -0
- package/dist/request-policy.d.ts.map +1 -1
- package/dist/request-policy.js +31 -2
- package/dist/request-policy.js.map +1 -1
- package/dist/service-registry.d.ts +8 -0
- package/dist/service-registry.d.ts.map +1 -1
- package/dist/service-registry.js +11 -4
- package/dist/service-registry.js.map +1 -1
- package/package.json +2 -2
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,aAAa,EACb,KAAK,uBAAuB,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,UAAU,EACV,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,cAAc,EACd,oBAAoB,EACpB,KAAK,wBAAwB,EAC7B,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,KAAK,kBAAkB,EACvB,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,KAAK,aAAa,EAClB,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,IAAI,EACJ,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,EAChB,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,aAAa,EACb,KAAK,uBAAuB,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,UAAU,EACV,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,cAAc,EACd,oBAAoB,EACpB,KAAK,wBAAwB,EAC7B,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,KAAK,kBAAkB,EACvB,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,KAAK,aAAa,EAClB,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,IAAI,EACJ,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,EAChB,MAAM,kBAAkB,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -16,5 +16,5 @@ export { AuditLogger, createAuditLogger, redactSensitiveParams } from './audit/i
|
|
|
16
16
|
// Secret-pattern redactor (v0.12.0+)
|
|
17
17
|
export { BUILTIN_PATTERNS, redact, redactDeep, containsSecret, buildValuePatterns } from './redactor/index.js';
|
|
18
18
|
// Utils
|
|
19
|
-
export { computeHash, computeChainedHash, generateId, generateNonce, generateSigningKeyPair, sign, verify, encryptWithPassword, decryptWithPassword, generateSelfSignedCert, getConfigDir, getConfigPath, expandPath, getDefaultConfig, loadConfig, ensureConfigDir, saveConfig, applyEnvOverrides, generateLoopbackToken, DEFAULT_LOOPBACK_PORT, DEFAULT_CACHE_TTL_SECONDS, CACHED_BY_DEFAULT_BACKENDS, resolveCacheTtl } from './utils/index.js';
|
|
19
|
+
export { computeHash, computeChainedHash, generateId, generateNonce, generateSigningKeyPair, sign, verify, encryptWithPassword, decryptWithPassword, generateSelfSignedCert, getConfigDir, getConfigPath, expandPath, getDefaultConfig, loadConfig, ensureConfigDir, saveConfig, applyEnvOverrides, generateLoopbackToken, isAquamanPlaceholder, LOOPBACK_TOKEN_PREFIX, DEFAULT_LOOPBACK_PORT, DEFAULT_CACHE_TTL_SECONDS, CACHED_BY_DEFAULT_BACKENDS, resolveCacheTtl } from './utils/index.js';
|
|
20
20
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,cAAc;AACd,OAAO,EAIL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,aAAa,EAEb,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EAEnB,UAAU,EACV,gBAAgB,EAEhB,cAAc,EACd,oBAAoB,EAEpB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAEhC,QAAQ;AACR,OAAO,EAEL,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,qCAAqC;AACrC,OAAO,EAEL,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,QAAQ;AACR,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,IAAI,EACJ,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EAGtB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,EAChB,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,cAAc;AACd,OAAO,EAIL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,aAAa,EAEb,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EAEnB,UAAU,EACV,gBAAgB,EAEhB,cAAc,EACd,oBAAoB,EAEpB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAEhC,QAAQ;AACR,OAAO,EAEL,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,qCAAqC;AACrC,OAAO,EAEL,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,QAAQ;AACR,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,IAAI,EACJ,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EAGtB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,EAChB,MAAM,kBAAkB,CAAC"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -107,6 +107,19 @@ export interface HermesConfig {
|
|
|
107
107
|
configMethod: 'env' | 'dotenv';
|
|
108
108
|
binaryPath?: string;
|
|
109
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Credential broker (`POST /broker/resolve`), served by `aquaman daemon` only
|
|
112
|
+
* (v0.15.0+). The broker hands credential VALUES to same-user callers, so it
|
|
113
|
+
* serves only refs declared for materialization: the env refs in
|
|
114
|
+
* projects.yaml, plus `allowedRefs` here (e.g. Hermes secret-source bindings).
|
|
115
|
+
* OpenClaw-hosted proxies never serve it.
|
|
116
|
+
*/
|
|
117
|
+
export interface BrokerConfig {
|
|
118
|
+
/** Serve the broker from `aquaman daemon`. Default true. */
|
|
119
|
+
enabled: boolean;
|
|
120
|
+
/** Extra `aquaman://service/key` refs callers may materialize. Manage with `aquaman broker allow|revoke`. */
|
|
121
|
+
allowedRefs?: string[];
|
|
122
|
+
}
|
|
110
123
|
export interface WrapperConfig {
|
|
111
124
|
credentials: CredentialsConfig;
|
|
112
125
|
audit: AuditConfig;
|
|
@@ -114,6 +127,7 @@ export interface WrapperConfig {
|
|
|
114
127
|
openclaw: OpenClawConfig;
|
|
115
128
|
loopback?: LoopbackConfig;
|
|
116
129
|
hermes?: HermesConfig;
|
|
130
|
+
broker?: BrokerConfig;
|
|
117
131
|
policy?: Record<string, {
|
|
118
132
|
defaultAction: 'allow' | 'deny';
|
|
119
133
|
rules: Array<{
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,7 +32,16 @@ export declare function resolveCacheTtl(config: WrapperConfig): number;
|
|
|
32
32
|
* agent host as the provider api_key; the proxy strips it and injects the real
|
|
33
33
|
* credential. Prefixed so it's recognizable in `~/.hermes/.env` and logs.
|
|
34
34
|
*/
|
|
35
|
+
/** Every generated loopback token starts with this, so it is recognizable. */
|
|
36
|
+
export declare const LOOPBACK_TOKEN_PREFIX = "aqm_lb_";
|
|
35
37
|
export declare function generateLoopbackToken(): string;
|
|
38
|
+
/**
|
|
39
|
+
* True for a value aquaman itself wrote into a host's config as a stand-in
|
|
40
|
+
* for a credential: the static placeholder, an `aquaman://` reference, or a
|
|
41
|
+
* loopback token. None of them work against the vendor API, so tools that
|
|
42
|
+
* hunt for plaintext credentials must not report them as findings.
|
|
43
|
+
*/
|
|
44
|
+
export declare function isAquamanPlaceholder(value: unknown): boolean;
|
|
36
45
|
export declare function getConfigDir(): string;
|
|
37
46
|
export declare function getConfigPath(): string;
|
|
38
47
|
export declare function expandPath(p: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/utils/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,gEAAgE;AAChE,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,0EAA0E;AAC1E,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,EAAE,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CACzD,CAAC;AAEtC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAQ7D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ5C;AAED,wBAAgB,gBAAgB,IAAI,aAAa,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/utils/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,gEAAgE;AAChE,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,0EAA0E;AAC1E,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,EAAE,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CACzD,CAAC;AAEtC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAQ7D;AAED;;;;GAIG;AACH,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAE/C,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAO5D;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ5C;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CA+BhD;AAED,wBAAgB,UAAU,IAAI,aAAa,CAmB1C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAgFtE;AA2CD,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAUtD"}
|
|
@@ -46,8 +46,23 @@ export function resolveCacheTtl(config) {
|
|
|
46
46
|
* agent host as the provider api_key; the proxy strips it and injects the real
|
|
47
47
|
* credential. Prefixed so it's recognizable in `~/.hermes/.env` and logs.
|
|
48
48
|
*/
|
|
49
|
+
/** Every generated loopback token starts with this, so it is recognizable. */
|
|
50
|
+
export const LOOPBACK_TOKEN_PREFIX = 'aqm_lb_';
|
|
49
51
|
export function generateLoopbackToken() {
|
|
50
|
-
return
|
|
52
|
+
return LOOPBACK_TOKEN_PREFIX + crypto.randomBytes(24).toString('hex');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* True for a value aquaman itself wrote into a host's config as a stand-in
|
|
56
|
+
* for a credential: the static placeholder, an `aquaman://` reference, or a
|
|
57
|
+
* loopback token. None of them work against the vendor API, so tools that
|
|
58
|
+
* hunt for plaintext credentials must not report them as findings.
|
|
59
|
+
*/
|
|
60
|
+
export function isAquamanPlaceholder(value) {
|
|
61
|
+
if (typeof value !== 'string')
|
|
62
|
+
return false;
|
|
63
|
+
return (value === 'aquaman-proxy-managed' ||
|
|
64
|
+
value.startsWith('aquaman://') ||
|
|
65
|
+
value.startsWith(LOOPBACK_TOKEN_PREFIX));
|
|
51
66
|
}
|
|
52
67
|
export function getConfigDir() {
|
|
53
68
|
return process.env['AQUAMAN_CONFIG_DIR'] || DEFAULT_CONFIG_DIR;
|
|
@@ -89,6 +104,10 @@ export function getDefaultConfig() {
|
|
|
89
104
|
},
|
|
90
105
|
hermes: {
|
|
91
106
|
configMethod: 'dotenv'
|
|
107
|
+
},
|
|
108
|
+
broker: {
|
|
109
|
+
enabled: true,
|
|
110
|
+
allowedRefs: []
|
|
92
111
|
}
|
|
93
112
|
};
|
|
94
113
|
}
|
|
@@ -171,6 +190,12 @@ export function applyEnvOverrides(config) {
|
|
|
171
190
|
config.loopback = config.loopback ?? { enabled: false, port: DEFAULT_LOOPBACK_PORT, host: '127.0.0.1' };
|
|
172
191
|
config.loopback.token = env['AQUAMAN_LOOPBACK_TOKEN'];
|
|
173
192
|
}
|
|
193
|
+
// Credential broker switch (v0.15.0+). Only 'false' disables; the broker is
|
|
194
|
+
// still limited to declared refs when on.
|
|
195
|
+
if (env['AQUAMAN_BROKER_ENABLED']) {
|
|
196
|
+
config.broker = config.broker ?? { enabled: true, allowedRefs: [] };
|
|
197
|
+
config.broker.enabled = env['AQUAMAN_BROKER_ENABLED'] !== 'false';
|
|
198
|
+
}
|
|
174
199
|
return config;
|
|
175
200
|
}
|
|
176
201
|
function mergeConfig(base, override) {
|
|
@@ -203,6 +228,9 @@ function mergeConfig(base, override) {
|
|
|
203
228
|
hermes: override.hermes !== undefined
|
|
204
229
|
? { ...base.hermes, ...override.hermes }
|
|
205
230
|
: base.hermes,
|
|
231
|
+
broker: override.broker !== undefined
|
|
232
|
+
? { ...base.broker, ...override.broker }
|
|
233
|
+
: base.broker,
|
|
206
234
|
policy: override.policy !== undefined ? { ...base.policy, ...override.policy } : base.policy
|
|
207
235
|
};
|
|
208
236
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/utils/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAGtE,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC/D,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,gEAAgE;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,0BAA0B,GACrC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AAEtC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QACpE,CAAC,CAAC,yBAAyB;QAC3B,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Utility functions for aquaman
|
|
3
3
|
*/
|
|
4
4
|
export { computeHash, computeChainedHash, generateId, generateNonce, generateSigningKeyPair, sign, verify, encryptWithPassword, decryptWithPassword, generateSelfSignedCert, type SigningKeyPair, type SelfSignedCert } from './hash.js';
|
|
5
|
-
export { getConfigDir, getConfigPath, expandPath, getDefaultConfig, loadConfig, ensureConfigDir, saveConfig, applyEnvOverrides, generateLoopbackToken, DEFAULT_LOOPBACK_PORT, DEFAULT_CACHE_TTL_SECONDS, CACHED_BY_DEFAULT_BACKENDS, resolveCacheTtl } from './config.js';
|
|
5
|
+
export { getConfigDir, getConfigPath, expandPath, getDefaultConfig, loadConfig, ensureConfigDir, saveConfig, applyEnvOverrides, generateLoopbackToken, isAquamanPlaceholder, LOOPBACK_TOKEN_PREFIX, DEFAULT_LOOPBACK_PORT, DEFAULT_CACHE_TTL_SECONDS, CACHED_BY_DEFAULT_BACKENDS, resolveCacheTtl } from './config.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,IAAI,EACJ,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,EAChB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,IAAI,EACJ,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,EAChB,MAAM,aAAa,CAAC"}
|
package/dist/core/utils/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Utility functions for aquaman
|
|
3
3
|
*/
|
|
4
4
|
export { computeHash, computeChainedHash, generateId, generateNonce, generateSigningKeyPair, sign, verify, encryptWithPassword, decryptWithPassword, generateSelfSignedCert } from './hash.js';
|
|
5
|
-
export { getConfigDir, getConfigPath, expandPath, getDefaultConfig, loadConfig, ensureConfigDir, saveConfig, applyEnvOverrides, generateLoopbackToken, DEFAULT_LOOPBACK_PORT, DEFAULT_CACHE_TTL_SECONDS, CACHED_BY_DEFAULT_BACKENDS, resolveCacheTtl } from './config.js';
|
|
5
|
+
export { getConfigDir, getConfigPath, expandPath, getDefaultConfig, loadConfig, ensureConfigDir, saveConfig, applyEnvOverrides, generateLoopbackToken, isAquamanPlaceholder, LOOPBACK_TOKEN_PREFIX, DEFAULT_LOOPBACK_PORT, DEFAULT_CACHE_TTL_SECONDS, CACHED_BY_DEFAULT_BACKENDS, resolveCacheTtl } from './config.js';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,IAAI,EACJ,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EAGvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,EAChB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,IAAI,EACJ,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EAGvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,EAChB,MAAM,aAAa,CAAC"}
|
package/dist/daemon.d.ts
CHANGED
|
@@ -5,6 +5,28 @@
|
|
|
5
5
|
import { type CredentialStore } from './core/index.js';
|
|
6
6
|
import { ServiceRegistry, type ServiceDefinition } from './service-registry.js';
|
|
7
7
|
import { type PolicyConfig } from './request-policy.js';
|
|
8
|
+
import type { BrokerScope } from './broker-scope.js';
|
|
9
|
+
/**
|
|
10
|
+
* A url-path service carries its credential in a path segment instead of a
|
|
11
|
+
* header (Telegram: `/bot<TOKEN>/sendMessage`). A client pointed at us sends
|
|
12
|
+
* that segment filled with whatever it has — a placeholder, or on the loopback
|
|
13
|
+
* listener the aquaman token, because the segment is the only auth slot the
|
|
14
|
+
* shape has.
|
|
15
|
+
*/
|
|
16
|
+
export interface UrlPathCredentialSlot {
|
|
17
|
+
/** Index of the credential segment within the service-relative path. */
|
|
18
|
+
index: number;
|
|
19
|
+
/** What the client put there. Never forwarded upstream. */
|
|
20
|
+
presented: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Locate the credential segment in a service-relative path.
|
|
24
|
+
*
|
|
25
|
+
* Returns null when the client sent no such segment, which is the shape the
|
|
26
|
+
* plugin's fetch interceptor produces (`/telegram/sendMessage`). Callers then
|
|
27
|
+
* insert the credential at index 0, the pre-v0.15.0 behaviour.
|
|
28
|
+
*/
|
|
29
|
+
export declare function findUrlPathCredentialSlot(segments: string[], authPathTemplate: string): UrlPathCredentialSlot | null;
|
|
8
30
|
export interface CredentialProxyOptions {
|
|
9
31
|
socketPath: string;
|
|
10
32
|
store: CredentialStore;
|
|
@@ -25,6 +47,13 @@ export interface CredentialProxyOptions {
|
|
|
25
47
|
token: string;
|
|
26
48
|
host?: string;
|
|
27
49
|
};
|
|
50
|
+
/**
|
|
51
|
+
* Credential broker (`POST /broker/resolve`) scope. When omitted the broker
|
|
52
|
+
* is OFF: the endpoint refuses every request without touching the vault.
|
|
53
|
+
* Only `aquaman daemon` passes a scope; OpenClaw-hosted proxies never do.
|
|
54
|
+
* See broker-scope.ts for the rules.
|
|
55
|
+
*/
|
|
56
|
+
broker?: BrokerScope;
|
|
28
57
|
}
|
|
29
58
|
export interface RequestInfo {
|
|
30
59
|
id: string;
|
|
@@ -58,6 +87,13 @@ export declare class CredentialProxy {
|
|
|
58
87
|
* explicit `x-aquaman-token`. Comparison is constant-time.
|
|
59
88
|
*/
|
|
60
89
|
private isLoopbackTokenValid;
|
|
90
|
+
/**
|
|
91
|
+
* A url-path service sends no auth header at all, so the loopback token can
|
|
92
|
+
* only arrive in the credential segment. OpenClaw's Telegram channel, for
|
|
93
|
+
* instance, is pointed at us with `channels.telegram.apiRoot` and a
|
|
94
|
+
* placeholder bot token; the placeholder it sends is the loopback token.
|
|
95
|
+
*/
|
|
96
|
+
private urlPathTokenCandidate;
|
|
61
97
|
private handleRequest;
|
|
62
98
|
private proxyRequest;
|
|
63
99
|
private emitRequest;
|
package/dist/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAE,KAAK,eAAe,EAAc,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAyB,KAAK,iBAAiB,EAAiB,MAAM,uBAAuB,CAAC;AAEtH,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAE,KAAK,eAAe,EAAc,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAyB,KAAK,iBAAiB,EAAiB,MAAM,uBAAuB,CAAC;AAEtH,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;CACnB;AASD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAAE,EAClB,gBAAgB,EAAE,MAAM,GACvB,qBAAqB,GAAG,IAAI,CAiB9B;AAuBD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,eAAe,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAkB;gBAExB,OAAO,EAAE,sBAAsB;IAMrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuE5B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IA2B5B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;YAaf,aAAa;YAiMb,YAAY;IAqI1B,OAAO,CAAC,WAAW;IAMnB;;;;;;;;;;;;;;;;;;OAkBG;YACW,mBAAmB;IA4J3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B,SAAS,IAAI,OAAO;IAIpB,aAAa,IAAI,MAAM;IAIvB;;;;OAIG;IACH,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAQnC,kBAAkB,IAAI,eAAe;IAIrC,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;CAGnD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAEtF;AAED,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
|
package/dist/daemon.js
CHANGED
|
@@ -14,6 +14,40 @@ import { createOAuthTokenCache } from './oauth-token-cache.js';
|
|
|
14
14
|
import { matchPolicy } from './request-policy.js';
|
|
15
15
|
// Service name validation: lowercase alphanum, dots, hyphens, underscores
|
|
16
16
|
const SAFE_SERVICE_NAME = /^[a-z0-9][a-z0-9._-]*$/;
|
|
17
|
+
/**
|
|
18
|
+
* Only the first two segments are considered. Telegram builds exactly
|
|
19
|
+
* `/bot<TOKEN>/<method>` and `/file/bot<TOKEN>/<file_path>`, so a deeper scan
|
|
20
|
+
* would only add ways for a method or file name to be mistaken for the slot.
|
|
21
|
+
*/
|
|
22
|
+
const URL_PATH_SLOT_SCAN_DEPTH = 2;
|
|
23
|
+
/**
|
|
24
|
+
* Locate the credential segment in a service-relative path.
|
|
25
|
+
*
|
|
26
|
+
* Returns null when the client sent no such segment, which is the shape the
|
|
27
|
+
* plugin's fetch interceptor produces (`/telegram/sendMessage`). Callers then
|
|
28
|
+
* insert the credential at index 0, the pre-v0.15.0 behaviour.
|
|
29
|
+
*/
|
|
30
|
+
export function findUrlPathCredentialSlot(segments, authPathTemplate) {
|
|
31
|
+
const templateSegments = authPathTemplate.split('/').filter(s => s);
|
|
32
|
+
if (templateSegments.length !== 1)
|
|
33
|
+
return null;
|
|
34
|
+
const [prefix, suffix] = templateSegments[0].split('{token}');
|
|
35
|
+
if (suffix === undefined)
|
|
36
|
+
return null;
|
|
37
|
+
const depth = Math.min(segments.length, URL_PATH_SLOT_SCAN_DEPTH);
|
|
38
|
+
for (let index = 0; index < depth; index++) {
|
|
39
|
+
const segment = segments[index];
|
|
40
|
+
if (segment.length <= prefix.length + suffix.length)
|
|
41
|
+
continue;
|
|
42
|
+
if (!segment.startsWith(prefix) || !segment.endsWith(suffix))
|
|
43
|
+
continue;
|
|
44
|
+
return {
|
|
45
|
+
index,
|
|
46
|
+
presented: segment.slice(prefix.length, segment.length - suffix.length)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
17
51
|
/**
|
|
18
52
|
* Constant-time string comparison that doesn't leak length via an early
|
|
19
53
|
* return. timingSafeEqual requires equal-length buffers, so unequal lengths
|
|
@@ -151,8 +185,30 @@ export class CredentialProxy {
|
|
|
151
185
|
if (authz) {
|
|
152
186
|
candidates.push(authz.replace(/^Bearer\s+/i, ''));
|
|
153
187
|
}
|
|
188
|
+
const pathBorne = this.urlPathTokenCandidate(req.url || '/');
|
|
189
|
+
if (pathBorne)
|
|
190
|
+
candidates.push(pathBorne);
|
|
154
191
|
return candidates.some(c => timingSafeStrEqual(c, expected));
|
|
155
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* A url-path service sends no auth header at all, so the loopback token can
|
|
195
|
+
* only arrive in the credential segment. OpenClaw's Telegram channel, for
|
|
196
|
+
* instance, is pointed at us with `channels.telegram.apiRoot` and a
|
|
197
|
+
* placeholder bot token; the placeholder it sends is the loopback token.
|
|
198
|
+
*/
|
|
199
|
+
urlPathTokenCandidate(url) {
|
|
200
|
+
const segments = url.split('/').filter(p => p);
|
|
201
|
+
const service = segments[0];
|
|
202
|
+
if (!service || !SAFE_SERVICE_NAME.test(service))
|
|
203
|
+
return undefined;
|
|
204
|
+
if (!this.options.allowedServices.includes(service))
|
|
205
|
+
return undefined;
|
|
206
|
+
const serviceDef = this.serviceRegistry.get(service);
|
|
207
|
+
if (!serviceDef || serviceDef.authMode !== 'url-path' || !serviceDef.authPathTemplate) {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
return findUrlPathCredentialSlot(segments.slice(1), serviceDef.authPathTemplate)?.presented;
|
|
211
|
+
}
|
|
156
212
|
async handleRequest(req, res, fromLoopback = false) {
|
|
157
213
|
const requestId = generateId();
|
|
158
214
|
const url = req.url || '/';
|
|
@@ -164,7 +220,7 @@ export class CredentialProxy {
|
|
|
164
220
|
res.statusCode = 401;
|
|
165
221
|
res.end(JSON.stringify({
|
|
166
222
|
error: 'Loopback request rejected: missing or invalid aquaman loopback token',
|
|
167
|
-
fix: '
|
|
223
|
+
fix: 'The host must present the loopback token as its placeholder credential. Hermes: aquaman hermes status. OpenClaw: aquaman openclaw status'
|
|
168
224
|
}));
|
|
169
225
|
return;
|
|
170
226
|
}
|
|
@@ -187,13 +243,14 @@ export class CredentialProxy {
|
|
|
187
243
|
res.end(JSON.stringify(obj));
|
|
188
244
|
return;
|
|
189
245
|
}
|
|
190
|
-
// Broker endpoint
|
|
191
|
-
// with a short-lived expiry hint. Used by aquaman-coder
|
|
192
|
-
//
|
|
246
|
+
// Broker endpoint: resolves a vault-stored credential and returns its
|
|
247
|
+
// VALUE, with a short-lived expiry hint. Used by aquaman-coder (v0.12.0+)
|
|
248
|
+
// and the Hermes secret source (v0.14.0+) to materialize declared refs.
|
|
193
249
|
// The expires_at field is a hint for the consumer, not a server-side
|
|
194
|
-
// expiration
|
|
250
|
+
// expiration. Scoped since v0.15.0: off unless the proxy was built with a
|
|
251
|
+
// BrokerScope, and limited to declared refs when on (broker-scope.ts).
|
|
195
252
|
if ((url === '/broker/resolve' || url === '/broker/resolve/') && req.method === 'POST') {
|
|
196
|
-
await this.handleBrokerResolve(req, res, requestId);
|
|
253
|
+
await this.handleBrokerResolve(req, res, requestId, fromLoopback);
|
|
197
254
|
return;
|
|
198
255
|
}
|
|
199
256
|
// Parse service from path: /anthropic/v1/messages -> anthropic
|
|
@@ -228,12 +285,23 @@ export class CredentialProxy {
|
|
|
228
285
|
authPrefix: serviceDef.authPrefix,
|
|
229
286
|
credentialKey: serviceDef.credentialKey
|
|
230
287
|
};
|
|
231
|
-
|
|
288
|
+
// Split the credential segment out of a url-path request before anything
|
|
289
|
+
// else reads the path, so policy rules match the method (`/sendMessage`,
|
|
290
|
+
// not `/bot<TOKEN>/sendMessage`) and nothing observable records the token
|
|
291
|
+
// the client presented.
|
|
292
|
+
const serviceSegments = pathParts.slice(1);
|
|
293
|
+
const credentialSlot = authMode === 'url-path' && serviceDef.authPathTemplate
|
|
294
|
+
? findUrlPathCredentialSlot(serviceSegments, serviceDef.authPathTemplate)
|
|
295
|
+
: null;
|
|
296
|
+
const canonicalSegments = credentialSlot
|
|
297
|
+
? serviceSegments.filter((_, i) => i !== credentialSlot.index)
|
|
298
|
+
: serviceSegments;
|
|
299
|
+
const remainingPath = '/' + canonicalSegments.join('/');
|
|
232
300
|
const requestInfo = {
|
|
233
301
|
id: requestId,
|
|
234
302
|
service,
|
|
235
303
|
method: req.method || 'GET',
|
|
236
|
-
path: url,
|
|
304
|
+
path: credentialSlot ? `/${service}${remainingPath}` : url,
|
|
237
305
|
timestamp: new Date(),
|
|
238
306
|
authenticated: false
|
|
239
307
|
};
|
|
@@ -247,7 +315,7 @@ export class CredentialProxy {
|
|
|
247
315
|
res.setHeader('Content-Type', 'application/json');
|
|
248
316
|
res.statusCode = 403;
|
|
249
317
|
res.end(JSON.stringify({
|
|
250
|
-
error: `Request denied by policy: ${req.method || 'GET'} ${
|
|
318
|
+
error: `Request denied by policy: ${req.method || 'GET'} ${requestInfo.path}`,
|
|
251
319
|
fix: `Check policy rules for "${service}" in ~/.aquaman/config.yaml`
|
|
252
320
|
}));
|
|
253
321
|
return;
|
|
@@ -272,9 +340,31 @@ export class CredentialProxy {
|
|
|
272
340
|
// Build upstream URL based on auth mode
|
|
273
341
|
let upstreamPath;
|
|
274
342
|
if (authMode === 'url-path' && serviceDef.authPathTemplate) {
|
|
275
|
-
//
|
|
276
|
-
|
|
277
|
-
|
|
343
|
+
// Put the real token back in the position the client used it: index 0
|
|
344
|
+
// for `/bot<TOKEN>/sendMessage`, index 1 for the file-download shape
|
|
345
|
+
// `/file/bot<TOKEN>/<file_path>`. A client that sent no segment at all
|
|
346
|
+
// gets the credential prefixed, as before.
|
|
347
|
+
// A credential that contains a slash would silently become extra path
|
|
348
|
+
// segments and send the request somewhere the service definition never
|
|
349
|
+
// named. No url-path token has one; refuse rather than guess.
|
|
350
|
+
if (credential.includes('/')) {
|
|
351
|
+
requestInfo.error = 'Invalid credential: url-path token contains a slash';
|
|
352
|
+
requestInfo.statusCode = 500;
|
|
353
|
+
this.emitRequest(requestInfo);
|
|
354
|
+
res.setHeader('Content-Type', 'application/json');
|
|
355
|
+
res.statusCode = 500;
|
|
356
|
+
res.end(JSON.stringify({
|
|
357
|
+
error: `Stored credential ${service}/${config.credentialKey} is not a valid ${service} token`,
|
|
358
|
+
fix: `Re-add it: aquaman credentials add ${service} ${config.credentialKey}`
|
|
359
|
+
}));
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const template = serviceDef.authPathTemplate;
|
|
363
|
+
const injected = (template.startsWith('/') ? template.slice(1) : template)
|
|
364
|
+
.replace('{token}', credential);
|
|
365
|
+
const segments = [...canonicalSegments];
|
|
366
|
+
segments.splice(credentialSlot?.index ?? 0, 0, injected);
|
|
367
|
+
upstreamPath = '/' + segments.join('/');
|
|
278
368
|
}
|
|
279
369
|
else {
|
|
280
370
|
upstreamPath = remainingPath;
|
|
@@ -384,8 +474,9 @@ export class CredentialProxy {
|
|
|
384
474
|
}
|
|
385
475
|
resolve();
|
|
386
476
|
});
|
|
387
|
-
// Add timeout to prevent indefinite hangs
|
|
388
|
-
|
|
477
|
+
// Add timeout to prevent indefinite hangs. Long-polling services declare
|
|
478
|
+
// a floor so a shorter global setting can't cut their polls short.
|
|
479
|
+
const timeout = Math.max(this.options.requestTimeout ?? 30000, serviceDef.minRequestTimeout ?? 0);
|
|
389
480
|
proxyReq.setTimeout(timeout, () => {
|
|
390
481
|
proxyReq.destroy();
|
|
391
482
|
requestInfo.error = 'Gateway timeout';
|
|
@@ -425,7 +516,7 @@ export class CredentialProxy {
|
|
|
425
516
|
* v0.12.0+ — used by the aquaman-coder hook adapters to materialize
|
|
426
517
|
* credentials per tool call without writing .env files to disk.
|
|
427
518
|
*/
|
|
428
|
-
async handleBrokerResolve(req, res, requestId) {
|
|
519
|
+
async handleBrokerResolve(req, res, requestId, fromLoopback) {
|
|
429
520
|
res.setHeader('Content-Type', 'application/json');
|
|
430
521
|
// Read request body
|
|
431
522
|
let bodyBuf = '';
|
|
@@ -481,6 +572,34 @@ export class CredentialProxy {
|
|
|
481
572
|
}
|
|
482
573
|
ttlSeconds = Math.floor(ttlInput);
|
|
483
574
|
}
|
|
575
|
+
// Scope check BEFORE the vault lookup: a refusal must not depend on (or
|
|
576
|
+
// reveal) what the vault holds. 404 rather than 403 so that clients which
|
|
577
|
+
// treat 401/403 as "bad token" (the Hermes source aborts all refs on
|
|
578
|
+
// those) handle a refusal per ref, like a missing credential.
|
|
579
|
+
const scope = this.options.broker;
|
|
580
|
+
const decision = scope
|
|
581
|
+
? scope.check(service, key, fromLoopback ? 'loopback' : 'uds')
|
|
582
|
+
: {
|
|
583
|
+
allowed: false,
|
|
584
|
+
code: 'broker_disabled',
|
|
585
|
+
reason: 'The credential broker is disabled on this proxy',
|
|
586
|
+
fix: 'OpenClaw-hosted proxies never hand out credential values. For coding agents or the Hermes secret source, run: aquaman daemon',
|
|
587
|
+
};
|
|
588
|
+
if (!decision.allowed) {
|
|
589
|
+
res.statusCode = 404;
|
|
590
|
+
res.end(JSON.stringify({ error: decision.reason, fix: decision.fix, code: decision.code }));
|
|
591
|
+
this.emitRequest({
|
|
592
|
+
id: requestId,
|
|
593
|
+
service,
|
|
594
|
+
method: 'BROKER',
|
|
595
|
+
path: '/broker/resolve',
|
|
596
|
+
timestamp: new Date(),
|
|
597
|
+
authenticated: false,
|
|
598
|
+
statusCode: 404,
|
|
599
|
+
error: `${decision.code}: ${service}/${key}`,
|
|
600
|
+
});
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
484
603
|
// Fetch from vault
|
|
485
604
|
let value;
|
|
486
605
|
try {
|
|
@@ -519,6 +638,8 @@ export class CredentialProxy {
|
|
|
519
638
|
timestamp: new Date(),
|
|
520
639
|
authenticated: false,
|
|
521
640
|
statusCode: 404,
|
|
641
|
+
// Without an error the audit logger records this as a successful use.
|
|
642
|
+
error: `credential_not_found: ${service}/${key}`,
|
|
522
643
|
});
|
|
523
644
|
return;
|
|
524
645
|
}
|