aquaman-proxy 0.6.0 → 0.7.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 +10 -9
- package/dist/cli/index.js +104 -87
- package/dist/cli/index.js.map +1 -1
- package/dist/core/audit/index.d.ts +5 -0
- package/dist/core/audit/index.d.ts.map +1 -0
- package/dist/core/audit/index.js +5 -0
- package/dist/core/audit/index.js.map +1 -0
- package/dist/core/audit/logger.d.ts +53 -0
- package/dist/core/audit/logger.d.ts.map +1 -0
- package/dist/core/audit/logger.js +262 -0
- package/dist/core/audit/logger.js.map +1 -0
- package/dist/core/credentials/backends/keepassxc.d.ts +45 -0
- package/dist/core/credentials/backends/keepassxc.d.ts.map +1 -0
- package/dist/core/credentials/backends/keepassxc.js +229 -0
- package/dist/core/credentials/backends/keepassxc.js.map +1 -0
- package/dist/core/credentials/backends/onepassword.d.ts +38 -0
- package/dist/core/credentials/backends/onepassword.d.ts.map +1 -0
- package/dist/core/credentials/backends/onepassword.js +218 -0
- package/dist/core/credentials/backends/onepassword.js.map +1 -0
- package/dist/core/credentials/backends/vault.d.ts +56 -0
- package/dist/core/credentials/backends/vault.d.ts.map +1 -0
- package/dist/core/credentials/backends/vault.js +206 -0
- package/dist/core/credentials/backends/vault.js.map +1 -0
- package/dist/core/credentials/index.d.ts +8 -0
- package/dist/core/credentials/index.d.ts.map +1 -0
- package/dist/core/credentials/index.js +8 -0
- package/dist/core/credentials/index.js.map +1 -0
- package/dist/core/credentials/store.d.ts +102 -0
- package/dist/core/credentials/store.d.ts.map +1 -0
- package/dist/core/credentials/store.js +289 -0
- package/dist/core/credentials/store.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +18 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/types.d.ts +81 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +11 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/utils/config.d.ts +19 -0
- package/dist/core/utils/config.d.ts.map +1 -0
- package/dist/core/utils/config.js +136 -0
- package/dist/core/utils/config.js.map +1 -0
- package/dist/core/utils/hash.d.ts +27 -0
- package/dist/core/utils/hash.d.ts.map +1 -0
- package/dist/core/utils/hash.js +348 -0
- package/dist/core/utils/hash.js.map +1 -0
- package/dist/core/utils/index.d.ts +6 -0
- package/dist/core/utils/index.d.ts.map +1 -0
- package/dist/core/utils/index.js +6 -0
- package/dist/core/utils/index.js.map +1 -0
- package/dist/daemon.d.ts +4 -19
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +24 -101
- package/dist/daemon.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/migration/openclaw-migrator.d.ts +1 -1
- package/dist/migration/openclaw-migrator.d.ts.map +1 -1
- package/dist/oauth-token-cache.d.ts +1 -1
- package/dist/oauth-token-cache.d.ts.map +1 -1
- package/dist/openclaw/env-writer.d.ts +7 -7
- package/dist/openclaw/env-writer.d.ts.map +1 -1
- package/dist/openclaw/env-writer.js +8 -13
- package/dist/openclaw/env-writer.js.map +1 -1
- package/dist/openclaw/integration.d.ts +5 -3
- package/dist/openclaw/integration.d.ts.map +1 -1
- package/dist/openclaw/integration.js +7 -14
- package/dist/openclaw/integration.js.map +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 1Password credential backend using the `op` CLI
|
|
3
|
+
* Requires: 1Password CLI installed and signed in
|
|
4
|
+
*/
|
|
5
|
+
import { spawnSync } from 'node:child_process';
|
|
6
|
+
const DEFAULT_VAULT = 'aquaman';
|
|
7
|
+
const ITEM_PREFIX = 'aquaman';
|
|
8
|
+
export class OnePasswordStore {
|
|
9
|
+
vault;
|
|
10
|
+
account;
|
|
11
|
+
opPath = null;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.vault = options?.vault || DEFAULT_VAULT;
|
|
14
|
+
this.account = options?.account;
|
|
15
|
+
this.validateOpCli();
|
|
16
|
+
}
|
|
17
|
+
validateOpCli() {
|
|
18
|
+
// Check if op CLI is installed
|
|
19
|
+
try {
|
|
20
|
+
const result = spawnSync('which', ['op'], { encoding: 'utf-8' });
|
|
21
|
+
if (result.status !== 0) {
|
|
22
|
+
throw new Error('1Password CLI (op) not found. Install from: https://1password.com/downloads/command-line/');
|
|
23
|
+
}
|
|
24
|
+
this.opPath = result.stdout.trim();
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new Error('1Password CLI (op) not found. Install from: https://1password.com/downloads/command-line/');
|
|
28
|
+
}
|
|
29
|
+
// Check if signed in
|
|
30
|
+
try {
|
|
31
|
+
this.runOp(['account', 'get']);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new Error('Not signed in to 1Password. Run: op signin');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
runOp(args, input) {
|
|
38
|
+
const accountArgs = this.account ? ['--account', this.account] : [];
|
|
39
|
+
const fullArgs = [...args, ...accountArgs];
|
|
40
|
+
try {
|
|
41
|
+
const result = spawnSync('op', fullArgs, {
|
|
42
|
+
encoding: 'utf-8',
|
|
43
|
+
input,
|
|
44
|
+
maxBuffer: 10 * 1024 * 1024
|
|
45
|
+
});
|
|
46
|
+
if (result.status !== 0) {
|
|
47
|
+
const error = result.stderr || result.stdout || 'Unknown error';
|
|
48
|
+
throw new Error(`op command failed: ${error}`);
|
|
49
|
+
}
|
|
50
|
+
return result.stdout;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (error instanceof Error && error.message.includes('op command failed')) {
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
throw new Error(`Failed to run op command: ${error}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
getItemName(service, key) {
|
|
60
|
+
return `${ITEM_PREFIX}-${service}-${key}`;
|
|
61
|
+
}
|
|
62
|
+
parseItemName(itemName) {
|
|
63
|
+
if (!itemName.startsWith(`${ITEM_PREFIX}-`)) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const parts = itemName.slice(ITEM_PREFIX.length + 1).split('-');
|
|
67
|
+
if (parts.length < 2) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
// Handle service names with dashes by taking first part as service
|
|
71
|
+
const service = parts[0];
|
|
72
|
+
const key = parts.slice(1).join('-');
|
|
73
|
+
return { service, key };
|
|
74
|
+
}
|
|
75
|
+
ensureVaultExists() {
|
|
76
|
+
try {
|
|
77
|
+
this.runOp(['vault', 'get', this.vault]);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Vault doesn't exist, create it
|
|
81
|
+
try {
|
|
82
|
+
this.runOp(['vault', 'create', this.vault]);
|
|
83
|
+
console.log(`Created 1Password vault: ${this.vault}`);
|
|
84
|
+
}
|
|
85
|
+
catch (createError) {
|
|
86
|
+
throw new Error(`Failed to create vault "${this.vault}": ${createError}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async get(service, key) {
|
|
91
|
+
const itemName = this.getItemName(service, key);
|
|
92
|
+
try {
|
|
93
|
+
const result = this.runOp([
|
|
94
|
+
'item', 'get', itemName,
|
|
95
|
+
'--vault', this.vault,
|
|
96
|
+
'--fields', 'credential',
|
|
97
|
+
'--format', 'json'
|
|
98
|
+
]);
|
|
99
|
+
const parsed = JSON.parse(result);
|
|
100
|
+
return parsed.value || null;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
// Item not found is not an error
|
|
104
|
+
if (error instanceof Error && error.message.includes('not found')) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async set(service, key, value, metadata) {
|
|
111
|
+
this.ensureVaultExists();
|
|
112
|
+
const itemName = this.getItemName(service, key);
|
|
113
|
+
const tags = [ITEM_PREFIX, service];
|
|
114
|
+
// Check if item already exists
|
|
115
|
+
const existing = await this.get(service, key);
|
|
116
|
+
if (existing !== null) {
|
|
117
|
+
// Update existing item — pipe credential via stdin to avoid /proc/cmdline exposure
|
|
118
|
+
this.runOp([
|
|
119
|
+
'item', 'edit', itemName,
|
|
120
|
+
'--vault', this.vault,
|
|
121
|
+
'credential=-'
|
|
122
|
+
], value);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Create new item — pipe credential via stdin to avoid /proc/cmdline exposure
|
|
126
|
+
const createArgs = [
|
|
127
|
+
'item', 'create',
|
|
128
|
+
'--category', 'API Credential',
|
|
129
|
+
'--vault', this.vault,
|
|
130
|
+
'--title', itemName,
|
|
131
|
+
'credential=-',
|
|
132
|
+
'--tags', tags.join(',')
|
|
133
|
+
];
|
|
134
|
+
// Add metadata as fields
|
|
135
|
+
if (metadata) {
|
|
136
|
+
for (const [k, v] of Object.entries(metadata)) {
|
|
137
|
+
createArgs.push(`${k}=${v}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
this.runOp(createArgs, value);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async delete(service, key) {
|
|
144
|
+
const itemName = this.getItemName(service, key);
|
|
145
|
+
try {
|
|
146
|
+
this.runOp([
|
|
147
|
+
'item', 'delete', itemName,
|
|
148
|
+
'--vault', this.vault
|
|
149
|
+
]);
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
if (error instanceof Error && error.message.includes('not found')) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async list(service) {
|
|
160
|
+
try {
|
|
161
|
+
const listArgs = [
|
|
162
|
+
'item', 'list',
|
|
163
|
+
'--vault', this.vault,
|
|
164
|
+
'--tags', service ? `${ITEM_PREFIX},${service}` : ITEM_PREFIX,
|
|
165
|
+
'--format', 'json'
|
|
166
|
+
];
|
|
167
|
+
const result = this.runOp(listArgs);
|
|
168
|
+
const items = JSON.parse(result);
|
|
169
|
+
const credentials = [];
|
|
170
|
+
for (const item of items) {
|
|
171
|
+
const parsed = this.parseItemName(item.title);
|
|
172
|
+
if (parsed) {
|
|
173
|
+
if (!service || parsed.service === service) {
|
|
174
|
+
credentials.push(parsed);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return credentials;
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
// Vault might not exist yet
|
|
182
|
+
if (error instanceof Error && error.message.includes('not found')) {
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async exists(service, key) {
|
|
189
|
+
const value = await this.get(service, key);
|
|
190
|
+
return value !== null;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get the vault name being used
|
|
194
|
+
*/
|
|
195
|
+
getVault() {
|
|
196
|
+
return this.vault;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Check if 1Password CLI is available and signed in
|
|
200
|
+
*/
|
|
201
|
+
static isAvailable() {
|
|
202
|
+
try {
|
|
203
|
+
const whichResult = spawnSync('which', ['op'], { encoding: 'utf-8' });
|
|
204
|
+
if (whichResult.status !== 0) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
const accountResult = spawnSync('op', ['account', 'get'], { encoding: 'utf-8' });
|
|
208
|
+
return accountResult.status === 0;
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
export function createOnePasswordStore(options) {
|
|
216
|
+
return new OnePasswordStore(options);
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=onepassword.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onepassword.js","sourceRoot":"","sources":["../../../../src/core/credentials/backends/onepassword.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HashiCorp Vault credential backend using KV v2 API
|
|
3
|
+
* Requires: Vault server accessible and valid token
|
|
4
|
+
*/
|
|
5
|
+
import type { CredentialStore } from '../store.js';
|
|
6
|
+
export interface VaultStoreOptions {
|
|
7
|
+
address: string;
|
|
8
|
+
token?: string;
|
|
9
|
+
namespace?: string;
|
|
10
|
+
mountPath?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class VaultStore implements CredentialStore {
|
|
13
|
+
private address;
|
|
14
|
+
private token;
|
|
15
|
+
private namespace?;
|
|
16
|
+
private mountPath;
|
|
17
|
+
constructor(options: VaultStoreOptions);
|
|
18
|
+
private getPath;
|
|
19
|
+
private getHeaders;
|
|
20
|
+
private request;
|
|
21
|
+
/**
|
|
22
|
+
* KV v2 uses data/ prefix for read/write and metadata/ prefix for metadata
|
|
23
|
+
*/
|
|
24
|
+
private getDataPath;
|
|
25
|
+
private getMetadataPath;
|
|
26
|
+
private getListPath;
|
|
27
|
+
get(service: string, key: string): Promise<string | null>;
|
|
28
|
+
set(service: string, key: string, value: string, metadata?: Record<string, string>): Promise<void>;
|
|
29
|
+
delete(service: string, key: string): Promise<boolean>;
|
|
30
|
+
list(service?: string): Promise<Array<{
|
|
31
|
+
service: string;
|
|
32
|
+
key: string;
|
|
33
|
+
}>>;
|
|
34
|
+
exists(service: string, key: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Get the Vault address being used
|
|
37
|
+
*/
|
|
38
|
+
getAddress(): string;
|
|
39
|
+
/**
|
|
40
|
+
* Get the mount path being used
|
|
41
|
+
*/
|
|
42
|
+
getMountPath(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Check if Vault is reachable and token is valid
|
|
45
|
+
*/
|
|
46
|
+
healthCheck(): Promise<{
|
|
47
|
+
healthy: boolean;
|
|
48
|
+
error?: string;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Check if Vault is available with given options
|
|
52
|
+
*/
|
|
53
|
+
static isAvailable(options: VaultStoreOptions): Promise<boolean>;
|
|
54
|
+
}
|
|
55
|
+
export declare function createVaultStore(options: VaultStoreOptions): VaultStore;
|
|
56
|
+
//# sourceMappingURL=vault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../../../src/core/credentials/backends/vault.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,qBAAa,UAAW,YAAW,eAAe;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,iBAAiB;IAetC,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,UAAU;YAaJ,OAAO;IA+BrB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,WAAW;IAOb,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBzD,GAAG,CACP,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IAiBV,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAatD,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IA0CxE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5D;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiBlE;;OAEG;WACU,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CASvE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAEvE"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HashiCorp Vault credential backend using KV v2 API
|
|
3
|
+
* Requires: Vault server accessible and valid token
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_MOUNT_PATH = 'secret';
|
|
6
|
+
const AQUAMAN_PATH_PREFIX = 'aquaman';
|
|
7
|
+
export class VaultStore {
|
|
8
|
+
address;
|
|
9
|
+
token;
|
|
10
|
+
namespace;
|
|
11
|
+
mountPath;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.address = options.address.replace(/\/$/, ''); // Remove trailing slash
|
|
14
|
+
this.token = options.token || process.env['VAULT_TOKEN'] || '';
|
|
15
|
+
this.namespace = options.namespace || process.env['VAULT_NAMESPACE'];
|
|
16
|
+
this.mountPath = options.mountPath || DEFAULT_MOUNT_PATH;
|
|
17
|
+
if (!this.token) {
|
|
18
|
+
throw new Error('Vault token required. Provide via options.token or VAULT_TOKEN env var.');
|
|
19
|
+
}
|
|
20
|
+
if (!this.address) {
|
|
21
|
+
throw new Error('Vault address required. Provide via options.address or VAULT_ADDR env var.');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
getPath(service, key) {
|
|
25
|
+
return `${AQUAMAN_PATH_PREFIX}/${service}/${key}`;
|
|
26
|
+
}
|
|
27
|
+
getHeaders() {
|
|
28
|
+
const headers = {
|
|
29
|
+
'X-Vault-Token': this.token,
|
|
30
|
+
'Content-Type': 'application/json'
|
|
31
|
+
};
|
|
32
|
+
if (this.namespace) {
|
|
33
|
+
headers['X-Vault-Namespace'] = this.namespace;
|
|
34
|
+
}
|
|
35
|
+
return headers;
|
|
36
|
+
}
|
|
37
|
+
async request(method, path, body) {
|
|
38
|
+
const url = `${this.address}/v1/${path}`;
|
|
39
|
+
const headers = this.getHeaders();
|
|
40
|
+
const response = await fetch(url, {
|
|
41
|
+
method,
|
|
42
|
+
headers,
|
|
43
|
+
body: body ? JSON.stringify(body) : undefined
|
|
44
|
+
});
|
|
45
|
+
if (response.status === 404) {
|
|
46
|
+
return { status: 404 };
|
|
47
|
+
}
|
|
48
|
+
if (!response.ok && response.status !== 204) {
|
|
49
|
+
const errorText = await response.text();
|
|
50
|
+
throw new Error(`Vault API error (${response.status}): ${errorText}`);
|
|
51
|
+
}
|
|
52
|
+
if (response.status === 204) {
|
|
53
|
+
return { status: 204 };
|
|
54
|
+
}
|
|
55
|
+
const data = await response.json();
|
|
56
|
+
return { data: data.data, status: response.status };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* KV v2 uses data/ prefix for read/write and metadata/ prefix for metadata
|
|
60
|
+
*/
|
|
61
|
+
getDataPath(service, key) {
|
|
62
|
+
return `${this.mountPath}/data/${this.getPath(service, key)}`;
|
|
63
|
+
}
|
|
64
|
+
getMetadataPath(service, key) {
|
|
65
|
+
return `${this.mountPath}/metadata/${this.getPath(service, key)}`;
|
|
66
|
+
}
|
|
67
|
+
getListPath(service) {
|
|
68
|
+
if (service) {
|
|
69
|
+
return `${this.mountPath}/metadata/${AQUAMAN_PATH_PREFIX}/${service}`;
|
|
70
|
+
}
|
|
71
|
+
return `${this.mountPath}/metadata/${AQUAMAN_PATH_PREFIX}`;
|
|
72
|
+
}
|
|
73
|
+
async get(service, key) {
|
|
74
|
+
try {
|
|
75
|
+
const result = await this.request('GET', this.getDataPath(service, key));
|
|
76
|
+
if (result.status === 404) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
// KV v2 wraps data in another data object
|
|
80
|
+
const kvData = result.data;
|
|
81
|
+
return kvData?.data?.credential || null;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (error instanceof Error && error.message.includes('404')) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async set(service, key, value, metadata) {
|
|
91
|
+
const data = {
|
|
92
|
+
credential: value
|
|
93
|
+
};
|
|
94
|
+
// Add metadata to the secret data (Vault stores metadata separately but we can include it in data too)
|
|
95
|
+
if (metadata) {
|
|
96
|
+
for (const [k, v] of Object.entries(metadata)) {
|
|
97
|
+
data[`meta_${k}`] = v;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
await this.request('POST', this.getDataPath(service, key), {
|
|
101
|
+
data
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async delete(service, key) {
|
|
105
|
+
try {
|
|
106
|
+
// For KV v2, we need to delete the metadata to fully remove the secret
|
|
107
|
+
const result = await this.request('DELETE', this.getMetadataPath(service, key));
|
|
108
|
+
return result.status === 204 || result.status === 200;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error instanceof Error && error.message.includes('404')) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async list(service) {
|
|
118
|
+
const credentials = [];
|
|
119
|
+
try {
|
|
120
|
+
if (service) {
|
|
121
|
+
// List keys for a specific service
|
|
122
|
+
const result = await this.request('LIST', this.getListPath(service));
|
|
123
|
+
if (result.status === 404) {
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
const keys = result.data?.keys || [];
|
|
127
|
+
for (const key of keys) {
|
|
128
|
+
// Remove trailing slash if present (indicates directory)
|
|
129
|
+
const cleanKey = key.replace(/\/$/, '');
|
|
130
|
+
credentials.push({ service, key: cleanKey });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// List all services first, then keys for each
|
|
135
|
+
const servicesResult = await this.request('LIST', this.getListPath());
|
|
136
|
+
if (servicesResult.status === 404) {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
const services = servicesResult.data?.keys || [];
|
|
140
|
+
for (const svc of services) {
|
|
141
|
+
const cleanService = svc.replace(/\/$/, '');
|
|
142
|
+
const serviceCredentials = await this.list(cleanService);
|
|
143
|
+
credentials.push(...serviceCredentials);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return credentials;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
if (error instanceof Error && error.message.includes('404')) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async exists(service, key) {
|
|
156
|
+
const value = await this.get(service, key);
|
|
157
|
+
return value !== null;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get the Vault address being used
|
|
161
|
+
*/
|
|
162
|
+
getAddress() {
|
|
163
|
+
return this.address;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get the mount path being used
|
|
167
|
+
*/
|
|
168
|
+
getMountPath() {
|
|
169
|
+
return this.mountPath;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Check if Vault is reachable and token is valid
|
|
173
|
+
*/
|
|
174
|
+
async healthCheck() {
|
|
175
|
+
try {
|
|
176
|
+
// Check token validity by looking up self
|
|
177
|
+
const response = await fetch(`${this.address}/v1/auth/token/lookup-self`, {
|
|
178
|
+
headers: this.getHeaders()
|
|
179
|
+
});
|
|
180
|
+
if (response.ok) {
|
|
181
|
+
return { healthy: true };
|
|
182
|
+
}
|
|
183
|
+
return { healthy: false, error: `Token lookup failed: ${response.status}` };
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
return { healthy: false, error: `Connection failed: ${error}` };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check if Vault is available with given options
|
|
191
|
+
*/
|
|
192
|
+
static async isAvailable(options) {
|
|
193
|
+
try {
|
|
194
|
+
const store = new VaultStore(options);
|
|
195
|
+
const health = await store.healthCheck();
|
|
196
|
+
return health.healthy;
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export function createVaultStore(options) {
|
|
204
|
+
return new VaultStore(options);
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../../src/core/credentials/backends/vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential storage module
|
|
3
|
+
*/
|
|
4
|
+
export { type Credential, type CredentialStore, type CredentialStoreOptions, KeychainStore, EncryptedFileStore, MemoryStore, createCredentialStore, validatePasswordStrength } from './store.js';
|
|
5
|
+
export { type OnePasswordStoreOptions, OnePasswordStore, createOnePasswordStore } from './backends/onepassword.js';
|
|
6
|
+
export { type VaultStoreOptions, VaultStore, createVaultStore } from './backends/vault.js';
|
|
7
|
+
export { type KeePassXCStoreOptions, KeePassXCStore, createKeePassXCStore } from './backends/keepassxc.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/credentials/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,uBAAuB,EAC5B,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,KAAK,iBAAiB,EACtB,UAAU,EACV,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,KAAK,qBAAqB,EAC1B,cAAc,EACd,oBAAoB,EACrB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential storage module
|
|
3
|
+
*/
|
|
4
|
+
export { KeychainStore, EncryptedFileStore, MemoryStore, createCredentialStore, validatePasswordStrength } from './store.js';
|
|
5
|
+
export { OnePasswordStore, createOnePasswordStore } from './backends/onepassword.js';
|
|
6
|
+
export { VaultStore, createVaultStore } from './backends/vault.js';
|
|
7
|
+
export { KeePassXCStore, createKeePassXCStore } from './backends/keepassxc.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/credentials/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAIL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAEL,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAEL,UAAU,EACV,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,cAAc,EACd,oBAAoB,EACrB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential storage interface with multiple backend support
|
|
3
|
+
* Supports: macOS Keychain, 1Password, HashiCorp Vault, encrypted file
|
|
4
|
+
*/
|
|
5
|
+
import type { CredentialBackend } from '../types.js';
|
|
6
|
+
export interface Credential {
|
|
7
|
+
service: string;
|
|
8
|
+
key: string;
|
|
9
|
+
value: string;
|
|
10
|
+
metadata?: Record<string, string>;
|
|
11
|
+
createdAt: Date;
|
|
12
|
+
lastUsed?: Date;
|
|
13
|
+
rotateAfter?: Date;
|
|
14
|
+
}
|
|
15
|
+
export interface CredentialStore {
|
|
16
|
+
get(service: string, key: string): Promise<string | null>;
|
|
17
|
+
set(service: string, key: string, value: string, metadata?: Record<string, string>): Promise<void>;
|
|
18
|
+
delete(service: string, key: string): Promise<boolean>;
|
|
19
|
+
list(service?: string): Promise<Array<{
|
|
20
|
+
service: string;
|
|
21
|
+
key: string;
|
|
22
|
+
}>>;
|
|
23
|
+
exists(service: string, key: string): Promise<boolean>;
|
|
24
|
+
}
|
|
25
|
+
export interface CredentialStoreOptions {
|
|
26
|
+
backend: CredentialBackend;
|
|
27
|
+
encryptionPassword?: string;
|
|
28
|
+
vaultAddress?: string;
|
|
29
|
+
vaultToken?: string;
|
|
30
|
+
vaultNamespace?: string;
|
|
31
|
+
vaultMountPath?: string;
|
|
32
|
+
onePasswordVault?: string;
|
|
33
|
+
onePasswordAccount?: string;
|
|
34
|
+
keepassxcDatabasePath?: string;
|
|
35
|
+
keepassxcKeyFilePath?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* macOS Keychain backend using the keytar library
|
|
39
|
+
*/
|
|
40
|
+
export declare class KeychainStore implements CredentialStore {
|
|
41
|
+
private keytar;
|
|
42
|
+
private servicePrefix;
|
|
43
|
+
private indexService;
|
|
44
|
+
private indexAccount;
|
|
45
|
+
private getKeytar;
|
|
46
|
+
private getServiceName;
|
|
47
|
+
private getIndex;
|
|
48
|
+
private updateIndex;
|
|
49
|
+
get(service: string, key: string): Promise<string | null>;
|
|
50
|
+
set(service: string, key: string, value: string): Promise<void>;
|
|
51
|
+
delete(service: string, key: string): Promise<boolean>;
|
|
52
|
+
list(): Promise<Array<{
|
|
53
|
+
service: string;
|
|
54
|
+
key: string;
|
|
55
|
+
}>>;
|
|
56
|
+
exists(service: string, key: string): Promise<boolean>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Encrypted file backend - fallback option
|
|
60
|
+
*/
|
|
61
|
+
export declare class EncryptedFileStore implements CredentialStore {
|
|
62
|
+
private filePath;
|
|
63
|
+
private password;
|
|
64
|
+
private cache;
|
|
65
|
+
constructor(password: string, filePath?: string);
|
|
66
|
+
private getKey;
|
|
67
|
+
private load;
|
|
68
|
+
private save;
|
|
69
|
+
get(service: string, key: string): Promise<string | null>;
|
|
70
|
+
set(service: string, key: string, value: string, metadata?: Record<string, string>): Promise<void>;
|
|
71
|
+
delete(service: string, key: string): Promise<boolean>;
|
|
72
|
+
list(service?: string): Promise<Array<{
|
|
73
|
+
service: string;
|
|
74
|
+
key: string;
|
|
75
|
+
}>>;
|
|
76
|
+
exists(service: string, key: string): Promise<boolean>;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* In-memory store for testing
|
|
80
|
+
*/
|
|
81
|
+
export declare class MemoryStore implements CredentialStore {
|
|
82
|
+
private store;
|
|
83
|
+
private getKey;
|
|
84
|
+
get(service: string, key: string): Promise<string | null>;
|
|
85
|
+
set(service: string, key: string, value: string, metadata?: Record<string, string>): Promise<void>;
|
|
86
|
+
delete(service: string, key: string): Promise<boolean>;
|
|
87
|
+
list(service?: string): Promise<Array<{
|
|
88
|
+
service: string;
|
|
89
|
+
key: string;
|
|
90
|
+
}>>;
|
|
91
|
+
exists(service: string, key: string): Promise<boolean>;
|
|
92
|
+
clear(): void;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Validate encryption password strength for encrypted-file backend.
|
|
96
|
+
*/
|
|
97
|
+
export declare function validatePasswordStrength(password: string): {
|
|
98
|
+
valid: boolean;
|
|
99
|
+
errors: string[];
|
|
100
|
+
};
|
|
101
|
+
export declare function createCredentialStore(options: CredentialStoreOptions): CredentialStore;
|
|
102
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/core/credentials/store.ts"],"names":[],"mappings":"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"}
|