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,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hash-chained audit logger with tamper-evident storage
|
|
3
|
+
*
|
|
4
|
+
* Provides cryptographic integrity verification for audit logs.
|
|
5
|
+
* Note: Credential redaction is handled by OpenClaw's built-in redaction.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { computeChainedHash, generateId } from '../utils/hash.js';
|
|
10
|
+
import { expandPath } from '../utils/config.js';
|
|
11
|
+
const GENESIS_HASH = '0000000000000000000000000000000000000000000000000000000000000000';
|
|
12
|
+
const SENSITIVE_KEY_PATTERNS = [
|
|
13
|
+
'key', 'token', 'secret', 'password', 'credential',
|
|
14
|
+
'authorization', 'api_key', 'apikey', 'access_token',
|
|
15
|
+
'refresh_token', 'client_secret',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* Redact sensitive values from a params/result object.
|
|
19
|
+
* Shallow redaction only — replaces top-level keys matching sensitive patterns.
|
|
20
|
+
*/
|
|
21
|
+
export function redactSensitiveParams(obj) {
|
|
22
|
+
const result = {};
|
|
23
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
24
|
+
const lower = key.toLowerCase();
|
|
25
|
+
if (SENSITIVE_KEY_PATTERNS.some(p => lower.includes(p))) {
|
|
26
|
+
result[key] = '[REDACTED]';
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
result[key] = value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
export class AuditLogger {
|
|
35
|
+
logDir;
|
|
36
|
+
currentLogPath;
|
|
37
|
+
walPath;
|
|
38
|
+
enabled;
|
|
39
|
+
walEnabled;
|
|
40
|
+
lastHash = GENESIS_HASH;
|
|
41
|
+
entryCount = 0;
|
|
42
|
+
initialized = false;
|
|
43
|
+
constructor(options) {
|
|
44
|
+
this.logDir = expandPath(options.logDir);
|
|
45
|
+
this.currentLogPath = path.join(this.logDir, 'current.jsonl');
|
|
46
|
+
this.walPath = path.join(this.logDir, 'current.wal');
|
|
47
|
+
this.enabled = options.enabled ?? true;
|
|
48
|
+
this.walEnabled = options.walEnabled ?? true;
|
|
49
|
+
}
|
|
50
|
+
async initialize() {
|
|
51
|
+
if (this.initialized)
|
|
52
|
+
return;
|
|
53
|
+
if (!this.enabled) {
|
|
54
|
+
this.initialized = true;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Ensure directories exist
|
|
58
|
+
const archiveDir = path.join(this.logDir, 'archive');
|
|
59
|
+
const integrityDir = path.join(this.logDir, 'integrity');
|
|
60
|
+
fs.mkdirSync(this.logDir, { recursive: true });
|
|
61
|
+
fs.mkdirSync(archiveDir, { recursive: true });
|
|
62
|
+
fs.mkdirSync(integrityDir, { recursive: true });
|
|
63
|
+
// Recover state from existing log
|
|
64
|
+
await this.recoverState();
|
|
65
|
+
// Recover from WAL if present
|
|
66
|
+
if (this.walEnabled) {
|
|
67
|
+
await this.recoverFromWal();
|
|
68
|
+
}
|
|
69
|
+
this.initialized = true;
|
|
70
|
+
}
|
|
71
|
+
async recoverState() {
|
|
72
|
+
if (!fs.existsSync(this.currentLogPath)) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const content = fs.readFileSync(this.currentLogPath, 'utf-8');
|
|
76
|
+
const lines = content.trim().split('\n').filter(line => line.length > 0);
|
|
77
|
+
if (lines.length === 0) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.entryCount = lines.length;
|
|
81
|
+
// Get the hash of the last entry
|
|
82
|
+
const lastLine = lines[lines.length - 1];
|
|
83
|
+
try {
|
|
84
|
+
const lastEntry = JSON.parse(lastLine);
|
|
85
|
+
this.lastHash = lastEntry.hash;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// If we can't parse the last line, start fresh with integrity warning
|
|
89
|
+
console.error('Warning: Could not parse last audit entry, integrity may be compromised');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async recoverFromWal() {
|
|
93
|
+
if (!fs.existsSync(this.walPath)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const walContent = fs.readFileSync(this.walPath, 'utf-8');
|
|
97
|
+
const lines = walContent.trim().split('\n').filter(line => line.length > 0);
|
|
98
|
+
for (const line of lines) {
|
|
99
|
+
try {
|
|
100
|
+
const entry = JSON.parse(line);
|
|
101
|
+
// Write to main log
|
|
102
|
+
fs.appendFileSync(this.currentLogPath, JSON.stringify(entry) + '\n');
|
|
103
|
+
this.lastHash = entry.hash;
|
|
104
|
+
this.entryCount++;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
console.error('Warning: Could not recover WAL entry');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Clear WAL after recovery
|
|
111
|
+
fs.writeFileSync(this.walPath, '');
|
|
112
|
+
}
|
|
113
|
+
async logToolCall(sessionId, agentId, tool, params) {
|
|
114
|
+
if (!this.enabled)
|
|
115
|
+
return null;
|
|
116
|
+
const toolCall = {
|
|
117
|
+
id: generateId(),
|
|
118
|
+
sessionId,
|
|
119
|
+
agentId,
|
|
120
|
+
tool,
|
|
121
|
+
params: redactSensitiveParams(params),
|
|
122
|
+
timestamp: new Date()
|
|
123
|
+
};
|
|
124
|
+
return this.writeEntry('tool_call', sessionId, agentId, toolCall);
|
|
125
|
+
}
|
|
126
|
+
async logToolResult(sessionId, agentId, toolCallId, result, error) {
|
|
127
|
+
if (!this.enabled)
|
|
128
|
+
return null;
|
|
129
|
+
const redactedResult = (result && typeof result === 'object' && !Array.isArray(result))
|
|
130
|
+
? redactSensitiveParams(result)
|
|
131
|
+
: result;
|
|
132
|
+
const toolResult = {
|
|
133
|
+
id: generateId(),
|
|
134
|
+
toolCallId,
|
|
135
|
+
result: redactedResult,
|
|
136
|
+
error,
|
|
137
|
+
timestamp: new Date()
|
|
138
|
+
};
|
|
139
|
+
return this.writeEntry('tool_result', sessionId, agentId, toolResult);
|
|
140
|
+
}
|
|
141
|
+
async logCredentialAccess(sessionId, agentId, access) {
|
|
142
|
+
if (!this.enabled)
|
|
143
|
+
return null;
|
|
144
|
+
return this.writeEntry('credential_access', sessionId, agentId, access);
|
|
145
|
+
}
|
|
146
|
+
async writeEntry(type, sessionId, agentId, data) {
|
|
147
|
+
if (!this.initialized) {
|
|
148
|
+
await this.initialize();
|
|
149
|
+
}
|
|
150
|
+
const entry = {
|
|
151
|
+
id: generateId(),
|
|
152
|
+
timestamp: new Date(),
|
|
153
|
+
type,
|
|
154
|
+
sessionId,
|
|
155
|
+
agentId,
|
|
156
|
+
data,
|
|
157
|
+
previousHash: this.lastHash,
|
|
158
|
+
hash: '' // Will be computed below
|
|
159
|
+
};
|
|
160
|
+
// Compute hash including previous hash for chain integrity
|
|
161
|
+
const entryData = JSON.stringify({
|
|
162
|
+
...entry,
|
|
163
|
+
hash: undefined
|
|
164
|
+
});
|
|
165
|
+
entry.hash = computeChainedHash(entryData, this.lastHash);
|
|
166
|
+
const line = JSON.stringify(entry) + '\n';
|
|
167
|
+
// Write to WAL first (for crash recovery)
|
|
168
|
+
if (this.walEnabled) {
|
|
169
|
+
fs.appendFileSync(this.walPath, line);
|
|
170
|
+
}
|
|
171
|
+
// Write to main log
|
|
172
|
+
fs.appendFileSync(this.currentLogPath, line);
|
|
173
|
+
// Clear WAL entry after successful write
|
|
174
|
+
if (this.walEnabled) {
|
|
175
|
+
fs.writeFileSync(this.walPath, '');
|
|
176
|
+
}
|
|
177
|
+
this.lastHash = entry.hash;
|
|
178
|
+
this.entryCount++;
|
|
179
|
+
return entry;
|
|
180
|
+
}
|
|
181
|
+
async verifyIntegrity() {
|
|
182
|
+
const errors = [];
|
|
183
|
+
if (!fs.existsSync(this.currentLogPath)) {
|
|
184
|
+
return { valid: true, errors: [] };
|
|
185
|
+
}
|
|
186
|
+
const content = fs.readFileSync(this.currentLogPath, 'utf-8');
|
|
187
|
+
const lines = content.trim().split('\n').filter(line => line.length > 0);
|
|
188
|
+
let previousHash = GENESIS_HASH;
|
|
189
|
+
for (let i = 0; i < lines.length; i++) {
|
|
190
|
+
try {
|
|
191
|
+
const entry = JSON.parse(lines[i]);
|
|
192
|
+
// Verify previous hash reference
|
|
193
|
+
if (entry.previousHash !== previousHash) {
|
|
194
|
+
errors.push(`Entry ${i}: previousHash mismatch (expected ${previousHash}, got ${entry.previousHash})`);
|
|
195
|
+
}
|
|
196
|
+
// Verify entry hash
|
|
197
|
+
const entryData = JSON.stringify({
|
|
198
|
+
...entry,
|
|
199
|
+
hash: undefined
|
|
200
|
+
});
|
|
201
|
+
const expectedHash = computeChainedHash(entryData, entry.previousHash);
|
|
202
|
+
if (entry.hash !== expectedHash) {
|
|
203
|
+
errors.push(`Entry ${i}: hash mismatch (expected ${expectedHash}, got ${entry.hash})`);
|
|
204
|
+
}
|
|
205
|
+
previousHash = entry.hash;
|
|
206
|
+
}
|
|
207
|
+
catch (parseError) {
|
|
208
|
+
errors.push(`Entry ${i}: failed to parse JSON`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
valid: errors.length === 0,
|
|
213
|
+
errors
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
async getEntries(options) {
|
|
217
|
+
if (!fs.existsSync(this.currentLogPath)) {
|
|
218
|
+
return [];
|
|
219
|
+
}
|
|
220
|
+
const content = fs.readFileSync(this.currentLogPath, 'utf-8');
|
|
221
|
+
const lines = content.trim().split('\n').filter(line => line.length > 0);
|
|
222
|
+
let entries = lines.map(line => JSON.parse(line));
|
|
223
|
+
// Apply filters
|
|
224
|
+
if (options?.type) {
|
|
225
|
+
entries = entries.filter(e => e.type === options.type);
|
|
226
|
+
}
|
|
227
|
+
if (options?.sessionId) {
|
|
228
|
+
entries = entries.filter(e => e.sessionId === options.sessionId);
|
|
229
|
+
}
|
|
230
|
+
// Apply pagination
|
|
231
|
+
const offset = options?.offset ?? 0;
|
|
232
|
+
const limit = options?.limit ?? entries.length;
|
|
233
|
+
return entries.slice(offset, offset + limit);
|
|
234
|
+
}
|
|
235
|
+
async tail(count = 10) {
|
|
236
|
+
const entries = await this.getEntries();
|
|
237
|
+
return entries.slice(-count);
|
|
238
|
+
}
|
|
239
|
+
getStats() {
|
|
240
|
+
return {
|
|
241
|
+
entryCount: this.entryCount,
|
|
242
|
+
lastHash: this.lastHash
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
async rotateLog() {
|
|
246
|
+
if (!fs.existsSync(this.currentLogPath)) {
|
|
247
|
+
throw new Error('No log file to rotate');
|
|
248
|
+
}
|
|
249
|
+
const archiveDir = path.join(this.logDir, 'archive');
|
|
250
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
251
|
+
const archivePath = path.join(archiveDir, `audit-${timestamp}.jsonl`);
|
|
252
|
+
fs.renameSync(this.currentLogPath, archivePath);
|
|
253
|
+
// Reset state for new log
|
|
254
|
+
this.lastHash = GENESIS_HASH;
|
|
255
|
+
this.entryCount = 0;
|
|
256
|
+
return archivePath;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
export function createAuditLogger(options) {
|
|
260
|
+
return new AuditLogger(options);
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/core/audit/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KeePassXC credential backend using kdbxweb
|
|
3
|
+
*
|
|
4
|
+
* Stores credentials in a KDBX database file, compatible with KeePassXC,
|
|
5
|
+
* KeePass, and other KDBX-compatible password managers.
|
|
6
|
+
*/
|
|
7
|
+
import type { CredentialStore } from '../store.js';
|
|
8
|
+
export interface KeePassXCStoreOptions {
|
|
9
|
+
dbPath: string;
|
|
10
|
+
password?: string;
|
|
11
|
+
keyFilePath?: string;
|
|
12
|
+
group?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class KeePassXCStore implements CredentialStore {
|
|
15
|
+
private db;
|
|
16
|
+
private kdbxweb;
|
|
17
|
+
private dbPath;
|
|
18
|
+
private password?;
|
|
19
|
+
private keyFilePath?;
|
|
20
|
+
private groupName;
|
|
21
|
+
private watcher?;
|
|
22
|
+
constructor(options: KeePassXCStoreOptions);
|
|
23
|
+
private getKdbxweb;
|
|
24
|
+
private openDb;
|
|
25
|
+
private saveDb;
|
|
26
|
+
private startWatching;
|
|
27
|
+
private findGroup;
|
|
28
|
+
private findOrCreateGroup;
|
|
29
|
+
private getEntryTitle;
|
|
30
|
+
private findEntry;
|
|
31
|
+
get(service: string, key: string): Promise<string | null>;
|
|
32
|
+
set(service: string, key: string, value: string, _metadata?: Record<string, string>): Promise<void>;
|
|
33
|
+
delete(service: string, key: string): Promise<boolean>;
|
|
34
|
+
list(service?: string): Promise<Array<{
|
|
35
|
+
service: string;
|
|
36
|
+
key: string;
|
|
37
|
+
}>>;
|
|
38
|
+
exists(service: string, key: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Close the database and stop watching for changes.
|
|
41
|
+
*/
|
|
42
|
+
close(): void;
|
|
43
|
+
}
|
|
44
|
+
export declare function createKeePassXCStore(options: KeePassXCStoreOptions): KeePassXCStore;
|
|
45
|
+
//# sourceMappingURL=keepassxc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keepassxc.d.ts","sourceRoot":"","sources":["../../../../src/core/credentials/backends/keepassxc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAe;gBAEnB,OAAO,EAAE,qBAAqB;YAa5B,UAAU;YA2CV,MAAM;YA4CN,MAAM;IAWpB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,SAAS;IASX,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAezD,GAAG,CACP,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAqBV,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;IAwBxE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5D;;OAEG;IACH,KAAK,IAAI,IAAI;CAOd;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAEnF"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KeePassXC credential backend using kdbxweb
|
|
3
|
+
*
|
|
4
|
+
* Stores credentials in a KDBX database file, compatible with KeePassXC,
|
|
5
|
+
* KeePass, and other KDBX-compatible password managers.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
export class KeePassXCStore {
|
|
10
|
+
db = null;
|
|
11
|
+
kdbxweb = null;
|
|
12
|
+
dbPath;
|
|
13
|
+
password;
|
|
14
|
+
keyFilePath;
|
|
15
|
+
groupName;
|
|
16
|
+
watcher;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.dbPath = options.dbPath;
|
|
19
|
+
this.password = options.password;
|
|
20
|
+
this.keyFilePath = options.keyFilePath;
|
|
21
|
+
this.groupName = options.group || 'aquaman';
|
|
22
|
+
if (!this.password && !this.keyFilePath) {
|
|
23
|
+
throw new Error('KeePassXC backend requires a master password (AQUAMAN_KEEPASS_PASSWORD) or key file (keepassxcKeyFilePath)');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async getKdbxweb() {
|
|
27
|
+
if (!this.kdbxweb) {
|
|
28
|
+
try {
|
|
29
|
+
const mod = await import('kdbxweb');
|
|
30
|
+
this.kdbxweb = mod.default || mod;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
throw new Error('kdbxweb not available - install with: npm install kdbxweb argon2');
|
|
34
|
+
}
|
|
35
|
+
// Wire up argon2 for KDBX 4 support
|
|
36
|
+
try {
|
|
37
|
+
const argon2Mod = await import('argon2');
|
|
38
|
+
const argon2 = argon2Mod.default || argon2Mod;
|
|
39
|
+
this.kdbxweb.CryptoEngine.setArgon2Impl(async (password, salt, memory, iterations, length, parallelism, type, version) => {
|
|
40
|
+
const result = await argon2.hash(Buffer.from(password), {
|
|
41
|
+
salt: Buffer.from(salt),
|
|
42
|
+
hashLength: length,
|
|
43
|
+
timeCost: iterations,
|
|
44
|
+
memoryCost: memory,
|
|
45
|
+
parallelism,
|
|
46
|
+
type,
|
|
47
|
+
version,
|
|
48
|
+
raw: true
|
|
49
|
+
});
|
|
50
|
+
const buf = result;
|
|
51
|
+
return new Uint8Array(buf).buffer;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// argon2 not available — KDBX 3 files will still work
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return this.kdbxweb;
|
|
59
|
+
}
|
|
60
|
+
async openDb() {
|
|
61
|
+
if (this.db)
|
|
62
|
+
return this.db;
|
|
63
|
+
const kdbxweb = await this.getKdbxweb();
|
|
64
|
+
// Build credentials
|
|
65
|
+
const passwordValue = this.password
|
|
66
|
+
? kdbxweb.ProtectedValue.fromString(this.password)
|
|
67
|
+
: null;
|
|
68
|
+
let keyFileData = null;
|
|
69
|
+
if (this.keyFilePath) {
|
|
70
|
+
const buf = fs.readFileSync(this.keyFilePath);
|
|
71
|
+
keyFileData = new Uint8Array(buf).buffer;
|
|
72
|
+
}
|
|
73
|
+
const credentials = new kdbxweb.Credentials(passwordValue, keyFileData);
|
|
74
|
+
if (!fs.existsSync(this.dbPath)) {
|
|
75
|
+
// Auto-create a new database
|
|
76
|
+
this.db = kdbxweb.Kdbx.create(credentials, 'aquaman');
|
|
77
|
+
// Ensure our group exists in the new db
|
|
78
|
+
this.db.createGroup(this.db.getDefaultGroup(), this.groupName);
|
|
79
|
+
// Use KDBX 3 format for saving (kdbxweb KDBX 4 write bug #49)
|
|
80
|
+
this.db.setVersion(3);
|
|
81
|
+
await this.saveDb();
|
|
82
|
+
this.startWatching();
|
|
83
|
+
return this.db;
|
|
84
|
+
}
|
|
85
|
+
// Open existing database
|
|
86
|
+
const fileBuf = fs.readFileSync(this.dbPath);
|
|
87
|
+
const arrayBuffer = new Uint8Array(fileBuf).buffer;
|
|
88
|
+
try {
|
|
89
|
+
this.db = await kdbxweb.Kdbx.load(arrayBuffer, credentials);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
throw new Error('Failed to open KeePassXC database - wrong password or key file?');
|
|
93
|
+
}
|
|
94
|
+
this.startWatching();
|
|
95
|
+
return this.db;
|
|
96
|
+
}
|
|
97
|
+
async saveDb() {
|
|
98
|
+
if (!this.db)
|
|
99
|
+
return;
|
|
100
|
+
const arrayBuffer = await this.db.save();
|
|
101
|
+
const dir = path.dirname(this.dbPath);
|
|
102
|
+
if (!fs.existsSync(dir)) {
|
|
103
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
104
|
+
}
|
|
105
|
+
fs.writeFileSync(this.dbPath, Buffer.from(arrayBuffer), { mode: 0o600 });
|
|
106
|
+
}
|
|
107
|
+
startWatching() {
|
|
108
|
+
if (this.watcher)
|
|
109
|
+
return;
|
|
110
|
+
try {
|
|
111
|
+
this.watcher = fs.watch(this.dbPath, () => {
|
|
112
|
+
// External modification — invalidate cache so next access reloads
|
|
113
|
+
this.db = null;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Watch not supported on this filesystem — acceptable fallback
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
findGroup(db) {
|
|
121
|
+
const defaultGroup = db.getDefaultGroup();
|
|
122
|
+
for (const g of defaultGroup.allGroups()) {
|
|
123
|
+
if (g.name === this.groupName)
|
|
124
|
+
return g;
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
findOrCreateGroup(db) {
|
|
129
|
+
let group = this.findGroup(db);
|
|
130
|
+
if (!group) {
|
|
131
|
+
group = db.createGroup(db.getDefaultGroup(), this.groupName);
|
|
132
|
+
}
|
|
133
|
+
return group;
|
|
134
|
+
}
|
|
135
|
+
getEntryTitle(service, key) {
|
|
136
|
+
return `${service}/${key}`;
|
|
137
|
+
}
|
|
138
|
+
findEntry(group, service, key) {
|
|
139
|
+
const title = this.getEntryTitle(service, key);
|
|
140
|
+
for (const entry of group.entries) {
|
|
141
|
+
const entryTitle = entry.fields.get('Title');
|
|
142
|
+
if (entryTitle === title)
|
|
143
|
+
return entry;
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
async get(service, key) {
|
|
148
|
+
const db = await this.openDb();
|
|
149
|
+
const group = this.findGroup(db);
|
|
150
|
+
if (!group)
|
|
151
|
+
return null;
|
|
152
|
+
const entry = this.findEntry(group, service, key);
|
|
153
|
+
if (!entry)
|
|
154
|
+
return null;
|
|
155
|
+
const password = entry.fields.get('Password');
|
|
156
|
+
if (!password)
|
|
157
|
+
return null;
|
|
158
|
+
// ProtectedValue has .getText() for plaintext
|
|
159
|
+
return typeof password === 'string' ? password : password.getText();
|
|
160
|
+
}
|
|
161
|
+
async set(service, key, value, _metadata) {
|
|
162
|
+
const kdbxweb = await this.getKdbxweb();
|
|
163
|
+
const db = await this.openDb();
|
|
164
|
+
const group = this.findOrCreateGroup(db);
|
|
165
|
+
let entry = this.findEntry(group, service, key);
|
|
166
|
+
if (!entry) {
|
|
167
|
+
entry = db.createEntry(group);
|
|
168
|
+
entry.fields.set('Title', this.getEntryTitle(service, key));
|
|
169
|
+
entry.fields.set('UserName', `${service}/${key}`);
|
|
170
|
+
}
|
|
171
|
+
entry.fields.set('Password', kdbxweb.ProtectedValue.fromString(value));
|
|
172
|
+
// Use KDBX 3 format for saving (kdbxweb KDBX 4 write bug #49)
|
|
173
|
+
if (typeof db.setVersion === 'function') {
|
|
174
|
+
db.setVersion(3);
|
|
175
|
+
}
|
|
176
|
+
await this.saveDb();
|
|
177
|
+
}
|
|
178
|
+
async delete(service, key) {
|
|
179
|
+
const db = await this.openDb();
|
|
180
|
+
const group = this.findGroup(db);
|
|
181
|
+
if (!group)
|
|
182
|
+
return false;
|
|
183
|
+
const entry = this.findEntry(group, service, key);
|
|
184
|
+
if (!entry)
|
|
185
|
+
return false;
|
|
186
|
+
db.remove(entry);
|
|
187
|
+
await this.saveDb();
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
async list(service) {
|
|
191
|
+
const db = await this.openDb();
|
|
192
|
+
const group = this.findGroup(db);
|
|
193
|
+
if (!group)
|
|
194
|
+
return [];
|
|
195
|
+
const results = [];
|
|
196
|
+
for (const entry of group.entries) {
|
|
197
|
+
const title = entry.fields.get('Title');
|
|
198
|
+
if (typeof title !== 'string')
|
|
199
|
+
continue;
|
|
200
|
+
const slashIdx = title.indexOf('/');
|
|
201
|
+
if (slashIdx === -1)
|
|
202
|
+
continue;
|
|
203
|
+
const svc = title.substring(0, slashIdx);
|
|
204
|
+
const k = title.substring(slashIdx + 1);
|
|
205
|
+
if (!service || svc === service) {
|
|
206
|
+
results.push({ service: svc, key: k });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return results;
|
|
210
|
+
}
|
|
211
|
+
async exists(service, key) {
|
|
212
|
+
const value = await this.get(service, key);
|
|
213
|
+
return value !== null;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Close the database and stop watching for changes.
|
|
217
|
+
*/
|
|
218
|
+
close() {
|
|
219
|
+
if (this.watcher) {
|
|
220
|
+
this.watcher.close();
|
|
221
|
+
this.watcher = undefined;
|
|
222
|
+
}
|
|
223
|
+
this.db = null;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
export function createKeePassXCStore(options) {
|
|
227
|
+
return new KeePassXCStore(options);
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=keepassxc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keepassxc.js","sourceRoot":"","sources":["../../../../src/core/credentials/backends/keepassxc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 1Password credential backend using the `op` CLI
|
|
3
|
+
* Requires: 1Password CLI installed and signed in
|
|
4
|
+
*/
|
|
5
|
+
import type { CredentialStore } from '../store.js';
|
|
6
|
+
export interface OnePasswordStoreOptions {
|
|
7
|
+
vault?: string;
|
|
8
|
+
account?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class OnePasswordStore implements CredentialStore {
|
|
11
|
+
private vault;
|
|
12
|
+
private account?;
|
|
13
|
+
private opPath;
|
|
14
|
+
constructor(options?: OnePasswordStoreOptions);
|
|
15
|
+
private validateOpCli;
|
|
16
|
+
private runOp;
|
|
17
|
+
private getItemName;
|
|
18
|
+
private parseItemName;
|
|
19
|
+
private ensureVaultExists;
|
|
20
|
+
get(service: string, key: string): Promise<string | null>;
|
|
21
|
+
set(service: string, key: string, value: string, metadata?: Record<string, string>): Promise<void>;
|
|
22
|
+
delete(service: string, key: string): Promise<boolean>;
|
|
23
|
+
list(service?: string): Promise<Array<{
|
|
24
|
+
service: string;
|
|
25
|
+
key: string;
|
|
26
|
+
}>>;
|
|
27
|
+
exists(service: string, key: string): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Get the vault name being used
|
|
30
|
+
*/
|
|
31
|
+
getVault(): string;
|
|
32
|
+
/**
|
|
33
|
+
* Check if 1Password CLI is available and signed in
|
|
34
|
+
*/
|
|
35
|
+
static isAvailable(): boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare function createOnePasswordStore(options?: OnePasswordStoreOptions): OnePasswordStore;
|
|
38
|
+
//# sourceMappingURL=onepassword.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onepassword.d.ts","sourceRoot":"","sources":["../../../../src/core/credentials/backends/onepassword.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,qBAAa,gBAAiB,YAAW,eAAe;IACtD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,OAAO,CAAC,EAAE,uBAAuB;IAM7C,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,KAAK;IAyBb,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,iBAAiB;IAcnB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsBzD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAsClG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBtD,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAiCxE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5D;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,OAAO;CAa9B;AAED,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,gBAAgB,CAE1F"}
|