@fentz26/envcp 1.1.0 → 1.2.0-exp.1
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 +59 -422
- package/VERSION +1 -0
- package/dist/adapters/base.d.ts +13 -0
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +153 -9
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +7 -4
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +9 -6
- package/dist/adapters/openai.js.map +1 -1
- package/dist/adapters/rest.d.ts +2 -0
- package/dist/adapters/rest.d.ts.map +1 -1
- package/dist/adapters/rest.js +72 -4
- package/dist/adapters/rest.js.map +1 -1
- package/dist/cli/index.js +519 -103
- package/dist/cli/index.js.map +1 -1
- package/dist/config/config-guard.d.ts.map +1 -1
- package/dist/config/config-guard.js +3 -2
- package/dist/config/config-guard.js.map +1 -1
- package/dist/config/config-hmac.d.ts +5 -0
- package/dist/config/config-hmac.d.ts.map +1 -0
- package/dist/config/config-hmac.js +29 -0
- package/dist/config/config-hmac.js.map +1 -0
- package/dist/config/manager.d.ts +14 -0
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +72 -13
- package/dist/config/manager.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/server/unified.d.ts +4 -1
- package/dist/server/unified.d.ts.map +1 -1
- package/dist/server/unified.js +102 -33
- package/dist/server/unified.js.map +1 -1
- package/dist/service/config.d.ts +21 -0
- package/dist/service/config.d.ts.map +1 -0
- package/dist/service/config.js +94 -0
- package/dist/service/config.js.map +1 -0
- package/dist/service/generators.d.ts +14 -0
- package/dist/service/generators.d.ts.map +1 -0
- package/dist/service/generators.js +92 -0
- package/dist/service/generators.js.map +1 -0
- package/dist/service/index.d.ts +23 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +215 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/platform.d.ts +5 -0
- package/dist/service/platform.d.ts.map +1 -0
- package/dist/service/platform.js +25 -0
- package/dist/service/platform.js.map +1 -0
- package/dist/storage/index.d.ts +39 -10
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +318 -31
- package/dist/storage/index.js.map +1 -1
- package/dist/types.d.ts +545 -14
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +74 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/crypto.d.ts +9 -0
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +88 -19
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/hsm.d.ts +82 -0
- package/dist/utils/hsm.d.ts.map +1 -0
- package/dist/utils/hsm.js +344 -0
- package/dist/utils/hsm.js.map +1 -0
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +14 -4
- package/dist/utils/http.js.map +1 -1
- package/dist/utils/keychain.d.ts.map +1 -1
- package/dist/utils/keychain.js +0 -8
- package/dist/utils/keychain.js.map +1 -1
- package/dist/utils/lock.d.ts +1 -1
- package/dist/utils/lock.d.ts.map +1 -1
- package/dist/utils/lock.js +4 -2
- package/dist/utils/lock.js.map +1 -1
- package/dist/utils/lockout.d.ts +56 -0
- package/dist/utils/lockout.d.ts.map +1 -0
- package/dist/utils/lockout.js +209 -0
- package/dist/utils/lockout.js.map +1 -0
- package/dist/utils/prompt.d.ts +13 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +124 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/secure-memory.d.ts +20 -0
- package/dist/utils/secure-memory.d.ts.map +1 -0
- package/dist/utils/secure-memory.js +122 -0
- package/dist/utils/secure-memory.js.map +1 -0
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +14 -4
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/update-checker.d.ts +1 -1
- package/dist/utils/update-checker.d.ts.map +1 -1
- package/dist/utils/update-checker.js +7 -5
- package/dist/utils/update-checker.js.map +1 -1
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/package.json +18 -9
- package/scripts/sync-version.js +88 -0
- package/scripts/install.sh +0 -54
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { ensureDir } from './fs.js';
|
|
4
|
+
const DEFAULT_DATA = { attempts: 0, lockout_count: 0, permanent_lockout_count: 0, locked_until: null, permanent_locked: false };
|
|
5
|
+
export class LockoutManager {
|
|
6
|
+
lockoutPath;
|
|
7
|
+
notificationCallback;
|
|
8
|
+
notificationSource = 'unknown';
|
|
9
|
+
notificationIp;
|
|
10
|
+
notificationUserAgent;
|
|
11
|
+
constructor(lockoutPath, notificationCallback) {
|
|
12
|
+
this.lockoutPath = lockoutPath;
|
|
13
|
+
this.notificationCallback = notificationCallback;
|
|
14
|
+
}
|
|
15
|
+
setNotificationSource(source, ip, userAgent) {
|
|
16
|
+
this.notificationSource = source;
|
|
17
|
+
this.notificationIp = ip;
|
|
18
|
+
this.notificationUserAgent = userAgent;
|
|
19
|
+
}
|
|
20
|
+
sendNotification(type, data, remainingSeconds, attempts) {
|
|
21
|
+
if (!this.notificationCallback)
|
|
22
|
+
return;
|
|
23
|
+
try {
|
|
24
|
+
this.notificationCallback({
|
|
25
|
+
type,
|
|
26
|
+
timestamp: new Date().toISOString(),
|
|
27
|
+
attempts: attempts ?? data.attempts,
|
|
28
|
+
lockout_count: data.lockout_count,
|
|
29
|
+
permanent_lockout_count: data.permanent_lockout_count,
|
|
30
|
+
remaining_seconds: remainingSeconds,
|
|
31
|
+
source: this.notificationSource,
|
|
32
|
+
ip: this.notificationIp,
|
|
33
|
+
user_agent: this.notificationUserAgent
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Silently ignore notification errors
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async read() {
|
|
41
|
+
try {
|
|
42
|
+
const raw = await fs.readFile(this.lockoutPath, 'utf8');
|
|
43
|
+
return { ...DEFAULT_DATA, ...JSON.parse(raw) };
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return { ...DEFAULT_DATA };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async write(data) {
|
|
50
|
+
await ensureDir(path.dirname(this.lockoutPath));
|
|
51
|
+
await fs.writeFile(this.lockoutPath, JSON.stringify(data), { encoding: 'utf8', mode: 0o600 });
|
|
52
|
+
}
|
|
53
|
+
/** Check current lockout status without modifying state. */
|
|
54
|
+
async check() {
|
|
55
|
+
const data = await this.read();
|
|
56
|
+
// Check permanent lockout first
|
|
57
|
+
if (data.permanent_locked) {
|
|
58
|
+
return {
|
|
59
|
+
locked: true,
|
|
60
|
+
permanent_locked: true,
|
|
61
|
+
remaining_seconds: 0,
|
|
62
|
+
attempts: data.attempts,
|
|
63
|
+
lockout_count: data.lockout_count,
|
|
64
|
+
permanent_lockout_count: data.permanent_lockout_count
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (data.locked_until) {
|
|
68
|
+
const remaining = Math.ceil((new Date(data.locked_until).getTime() - Date.now()) / 1000);
|
|
69
|
+
if (remaining > 0) {
|
|
70
|
+
return {
|
|
71
|
+
locked: true,
|
|
72
|
+
permanent_locked: false,
|
|
73
|
+
remaining_seconds: remaining,
|
|
74
|
+
attempts: data.attempts,
|
|
75
|
+
lockout_count: data.lockout_count,
|
|
76
|
+
permanent_lockout_count: data.permanent_lockout_count
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// Lockout expired — clear it but preserve lockout_count for exponential backoff
|
|
80
|
+
await this.write({ ...data, locked_until: null, attempts: 0 });
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
locked: false,
|
|
84
|
+
permanent_locked: false,
|
|
85
|
+
remaining_seconds: 0,
|
|
86
|
+
attempts: data.attempts,
|
|
87
|
+
lockout_count: data.lockout_count,
|
|
88
|
+
permanent_lockout_count: data.permanent_lockout_count
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Record a failed attempt with progressive delays and permanent lockout support.
|
|
93
|
+
* @param threshold - Number of attempts before lockout
|
|
94
|
+
* @param baseSeconds - Base lockout duration in seconds
|
|
95
|
+
* @param progressiveDelay - Whether to apply progressive delays before lockout
|
|
96
|
+
* @param maxDelay - Maximum progressive delay in seconds (0 to disable)
|
|
97
|
+
* @param permanentThreshold - Permanent lockout threshold (0 to disable)
|
|
98
|
+
*/
|
|
99
|
+
async recordFailure(threshold = 5, baseSeconds = 60, progressiveDelay = false, maxDelay = 0, permanentThreshold = 0) {
|
|
100
|
+
const data = await this.read();
|
|
101
|
+
// Check for permanent lockout first
|
|
102
|
+
if (data.permanent_locked) {
|
|
103
|
+
return {
|
|
104
|
+
locked: true,
|
|
105
|
+
permanent_locked: true,
|
|
106
|
+
remaining_seconds: 0,
|
|
107
|
+
attempts: data.attempts,
|
|
108
|
+
lockout_count: data.lockout_count,
|
|
109
|
+
permanent_lockout_count: data.permanent_lockout_count
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const attempts = data.attempts + 1;
|
|
113
|
+
let delaySeconds = undefined;
|
|
114
|
+
// Apply progressive delay if enabled and not at threshold yet
|
|
115
|
+
if (progressiveDelay && attempts < threshold && maxDelay > 0) {
|
|
116
|
+
// Calculate progressive delay: 2^(attempts-1) seconds, capped at maxDelay
|
|
117
|
+
delaySeconds = Math.min(Math.pow(2, attempts - 1), maxDelay);
|
|
118
|
+
}
|
|
119
|
+
// Check for permanent lockout threshold
|
|
120
|
+
if (permanentThreshold > 0 && data.permanent_lockout_count >= permanentThreshold) {
|
|
121
|
+
await this.write({
|
|
122
|
+
...data,
|
|
123
|
+
attempts: 0,
|
|
124
|
+
permanent_locked: true,
|
|
125
|
+
locked_until: null
|
|
126
|
+
});
|
|
127
|
+
this.sendNotification('permanent_lockout', data, undefined, attempts);
|
|
128
|
+
return {
|
|
129
|
+
locked: true,
|
|
130
|
+
permanent_locked: true,
|
|
131
|
+
remaining_seconds: 0,
|
|
132
|
+
attempts: 0,
|
|
133
|
+
lockout_count: data.lockout_count,
|
|
134
|
+
permanent_lockout_count: data.permanent_lockout_count
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if (attempts >= threshold) {
|
|
138
|
+
const cooldown = baseSeconds * Math.pow(2, data.lockout_count);
|
|
139
|
+
const locked_until = new Date(Date.now() + cooldown * 1000).toISOString();
|
|
140
|
+
const newPermanentCount = data.permanent_lockout_count + 1;
|
|
141
|
+
await this.write({
|
|
142
|
+
attempts: 0,
|
|
143
|
+
lockout_count: data.lockout_count + 1,
|
|
144
|
+
permanent_lockout_count: newPermanentCount,
|
|
145
|
+
locked_until,
|
|
146
|
+
permanent_locked: false
|
|
147
|
+
});
|
|
148
|
+
this.sendNotification('lockout_triggered', data, cooldown, attempts);
|
|
149
|
+
return {
|
|
150
|
+
locked: true,
|
|
151
|
+
permanent_locked: false,
|
|
152
|
+
remaining_seconds: cooldown,
|
|
153
|
+
attempts: 0,
|
|
154
|
+
lockout_count: data.lockout_count + 1,
|
|
155
|
+
permanent_lockout_count: newPermanentCount
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
await this.write({ ...data, attempts });
|
|
159
|
+
// Send auth failure notification
|
|
160
|
+
this.sendNotification('auth_failure', data, undefined, attempts);
|
|
161
|
+
const result = {
|
|
162
|
+
locked: false,
|
|
163
|
+
permanent_locked: false,
|
|
164
|
+
remaining_seconds: 0,
|
|
165
|
+
attempts,
|
|
166
|
+
lockout_count: data.lockout_count,
|
|
167
|
+
permanent_lockout_count: data.permanent_lockout_count
|
|
168
|
+
};
|
|
169
|
+
if (delaySeconds !== undefined) {
|
|
170
|
+
result.delay_seconds = delaySeconds;
|
|
171
|
+
}
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
/** Reset all lockout state after a successful unlock. */
|
|
175
|
+
async reset() {
|
|
176
|
+
try {
|
|
177
|
+
await fs.unlink(this.lockoutPath);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
if (err.code !== 'ENOENT')
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** Clear permanent lockout (requires recovery key or admin action). */
|
|
185
|
+
async clearPermanentLockout() {
|
|
186
|
+
const data = await this.read();
|
|
187
|
+
if (data.permanent_locked) {
|
|
188
|
+
await this.write({
|
|
189
|
+
...data,
|
|
190
|
+
permanent_locked: false,
|
|
191
|
+
attempts: 0,
|
|
192
|
+
locked_until: null,
|
|
193
|
+
// Keep lockout_count for exponential backoff memory
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/** Get detailed lockout statistics. */
|
|
198
|
+
async getStats() {
|
|
199
|
+
const data = await this.read();
|
|
200
|
+
return {
|
|
201
|
+
attempts: data.attempts,
|
|
202
|
+
lockout_count: data.lockout_count,
|
|
203
|
+
permanent_lockout_count: data.permanent_lockout_count,
|
|
204
|
+
permanent_locked: data.permanent_locked,
|
|
205
|
+
locked_until: data.locked_until
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=lockout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockout.js","sourceRoot":"","sources":["../../src/utils/lockout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Prompt for masked input (passwords). Characters echo as '*'. */
|
|
2
|
+
export declare function promptPassword(message: string): Promise<string>;
|
|
3
|
+
/** Prompt for plain text input. */
|
|
4
|
+
export declare function promptInput(message: string): Promise<string>;
|
|
5
|
+
/** Prompt for y/n confirmation. Returns true for 'y'/'yes', false otherwise. */
|
|
6
|
+
export declare function promptConfirm(message: string, defaultValue?: boolean): Promise<boolean>;
|
|
7
|
+
export interface ListChoice {
|
|
8
|
+
name: string;
|
|
9
|
+
value: string;
|
|
10
|
+
}
|
|
11
|
+
/** Prompt to select from a list of choices (numbered menu). */
|
|
12
|
+
export declare function promptList(message: string, choices: ListChoice[], defaultValue?: string): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAGA,mEAAmE;AACnE,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgErE;AAED,mCAAmC;AACnC,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAelE;AAED,gFAAgF;AAChF,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAK3F;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,+DAA+D;AAC/D,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B/G"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/* istanbul ignore file - tested via integration tests in __tests__/utils/prompt.test.ts */
|
|
2
|
+
import * as readline from 'readline';
|
|
3
|
+
/** Prompt for masked input (passwords). Characters echo as '*'. */
|
|
4
|
+
export async function promptPassword(message) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: false });
|
|
7
|
+
rl.on('close', () => {
|
|
8
|
+
if (!resolved) {
|
|
9
|
+
reject(new Error('EOF: stdin closed without input'));
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
process.stdout.write(`${message} `);
|
|
13
|
+
// Switch stdin to raw mode for character-by-character reading
|
|
14
|
+
const input = process.stdin;
|
|
15
|
+
let value = '';
|
|
16
|
+
let resolved = false;
|
|
17
|
+
const onData = (char) => {
|
|
18
|
+
for (const ch of char.toString()) {
|
|
19
|
+
if (ch === '\n' || ch === '\r' || ch === '\u0004') {
|
|
20
|
+
// Enter or Ctrl-D
|
|
21
|
+
process.stdout.write('\n');
|
|
22
|
+
cleanup();
|
|
23
|
+
resolved = true;
|
|
24
|
+
resolve(value);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
else if (ch === '\u0003') {
|
|
28
|
+
// Ctrl-C
|
|
29
|
+
process.stdout.write('\n');
|
|
30
|
+
cleanup();
|
|
31
|
+
process.exit(1);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
else if (ch === '\u007f' || ch === '\b') {
|
|
35
|
+
// Backspace
|
|
36
|
+
if (value.length > 0) {
|
|
37
|
+
value = value.slice(0, -1);
|
|
38
|
+
process.stdout.write('\b \b');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (ch >= ' ') {
|
|
42
|
+
// Printable character
|
|
43
|
+
value += ch;
|
|
44
|
+
process.stdout.write('*');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const cleanup = () => {
|
|
49
|
+
if (typeof input.setRawMode === 'function') {
|
|
50
|
+
input.setRawMode(false);
|
|
51
|
+
}
|
|
52
|
+
input.removeListener('data', onData);
|
|
53
|
+
rl.close();
|
|
54
|
+
};
|
|
55
|
+
if (typeof input.setRawMode === 'function') {
|
|
56
|
+
input.setRawMode(true);
|
|
57
|
+
input.resume();
|
|
58
|
+
input.on('data', onData);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Non-TTY fallback (piped input, CI) — read a full line without masking
|
|
62
|
+
rl.once('line', (line) => {
|
|
63
|
+
resolved = true;
|
|
64
|
+
rl.close();
|
|
65
|
+
resolve(line);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/** Prompt for plain text input. */
|
|
71
|
+
export async function promptInput(message) {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
74
|
+
let answered = false;
|
|
75
|
+
rl.question(`${message} `, (answer) => {
|
|
76
|
+
answered = true;
|
|
77
|
+
rl.close();
|
|
78
|
+
resolve(answer);
|
|
79
|
+
});
|
|
80
|
+
rl.on('close', () => {
|
|
81
|
+
if (!answered) {
|
|
82
|
+
reject(new Error('EOF: stdin closed without input'));
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Prompt for y/n confirmation. Returns true for 'y'/'yes', false otherwise. */
|
|
88
|
+
export async function promptConfirm(message, defaultValue = false) {
|
|
89
|
+
const hint = defaultValue ? '[Y/n]' : '[y/N]';
|
|
90
|
+
const answer = await promptInput(`${message} ${hint}`);
|
|
91
|
+
if (answer.trim() === '')
|
|
92
|
+
return defaultValue;
|
|
93
|
+
return /^y(es)?$/i.test(answer.trim());
|
|
94
|
+
}
|
|
95
|
+
/** Prompt to select from a list of choices (numbered menu). */
|
|
96
|
+
export async function promptList(message, choices, defaultValue) {
|
|
97
|
+
if (choices.length === 0) {
|
|
98
|
+
throw new Error('No choices provided');
|
|
99
|
+
}
|
|
100
|
+
process.stdout.write(`${message}\n`);
|
|
101
|
+
choices.forEach((c, i) => {
|
|
102
|
+
const isDefault = c.value === defaultValue;
|
|
103
|
+
process.stdout.write(` ${i + 1}) ${c.name}${isDefault ? ' (default)' : ''}\n`);
|
|
104
|
+
});
|
|
105
|
+
const defaultIndex = choices.findIndex(c => c.value === defaultValue);
|
|
106
|
+
const hint = defaultIndex >= 0 ? ` [${defaultIndex + 1}]` : '';
|
|
107
|
+
while (true) {
|
|
108
|
+
const answer = await promptInput(`Enter choice${hint}:`);
|
|
109
|
+
// Handle EOF (empty responses when stdin is exhausted)
|
|
110
|
+
if (answer === '' && defaultIndex < 0 && !process.stdin.isTTY) {
|
|
111
|
+
// No default and no input - could indicate EOF; avoid infinite loop
|
|
112
|
+
throw new Error('No selection made and no default available');
|
|
113
|
+
}
|
|
114
|
+
if (answer.trim() === '' && defaultIndex >= 0) {
|
|
115
|
+
return choices[defaultIndex].value;
|
|
116
|
+
}
|
|
117
|
+
const num = parseInt(answer.trim(), 10);
|
|
118
|
+
if (num >= 1 && num <= choices.length) {
|
|
119
|
+
return choices[num - 1].value;
|
|
120
|
+
}
|
|
121
|
+
process.stdout.write(` Please enter a number between 1 and ${choices.length}\n`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type SecureBuffer = Buffer & {
|
|
2
|
+
_secure?: boolean;
|
|
3
|
+
};
|
|
4
|
+
export declare function secureAlloc(size: number): SecureBuffer;
|
|
5
|
+
export declare function secureFree(buf: Buffer): void;
|
|
6
|
+
export declare function secureZero(buf: Buffer): void;
|
|
7
|
+
export declare function lockMemory(buf: Buffer): boolean;
|
|
8
|
+
export declare function unlockMemory(buf: Buffer): void;
|
|
9
|
+
export declare function passwordToBuffer(password: string): SecureBuffer;
|
|
10
|
+
export declare function bufferToString(buf: Buffer): string;
|
|
11
|
+
export declare function secureCompare(a: Buffer, b: Buffer): boolean;
|
|
12
|
+
export declare function zeroObjectValues(obj: Record<string, unknown>, keys: string[]): void;
|
|
13
|
+
export declare function zeroEnv(env: Record<string, string | undefined>, keys: string[]): void;
|
|
14
|
+
export declare function isDebuggerAttached(): boolean;
|
|
15
|
+
export declare function preventCoreDumps(): boolean;
|
|
16
|
+
export declare function initMemoryProtection(): {
|
|
17
|
+
coreDumpsDisabled: boolean;
|
|
18
|
+
debuggerDetected: boolean;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=secure-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-memory.d.ts","sourceRoot":"","sources":["../../src/utils/secure-memory.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAOtD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG5C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAO5C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ/C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG9C;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAK/D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAS3D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAMnF;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAIrF;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAU5C;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAa1C;AAID,wBAAgB,oBAAoB,IAAI;IAAE,iBAAiB,EAAE,OAAO,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,CAQhG"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import * as sodium from 'sodium-native';
|
|
2
|
+
import * as nodeCrypto from 'crypto';
|
|
3
|
+
import * as childProcess from 'child_process';
|
|
4
|
+
const HAS_SODIUM = typeof sodium.sodium_malloc === 'function';
|
|
5
|
+
export function secureAlloc(size) {
|
|
6
|
+
if (HAS_SODIUM) {
|
|
7
|
+
return sodium.sodium_malloc(size);
|
|
8
|
+
}
|
|
9
|
+
const buf = Buffer.alloc(size);
|
|
10
|
+
buf._secure = false;
|
|
11
|
+
return buf;
|
|
12
|
+
}
|
|
13
|
+
export function secureFree(buf) {
|
|
14
|
+
if (!buf || buf.length === 0)
|
|
15
|
+
return;
|
|
16
|
+
secureZero(buf);
|
|
17
|
+
}
|
|
18
|
+
export function secureZero(buf) {
|
|
19
|
+
if (!buf || buf.length === 0)
|
|
20
|
+
return;
|
|
21
|
+
if (HAS_SODIUM) {
|
|
22
|
+
sodium.sodium_memzero(buf);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
buf.fill(0);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function lockMemory(buf) {
|
|
29
|
+
if (!HAS_SODIUM)
|
|
30
|
+
return false;
|
|
31
|
+
try {
|
|
32
|
+
sodium.sodium_mlock(buf);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function unlockMemory(buf) {
|
|
40
|
+
if (!HAS_SODIUM)
|
|
41
|
+
return;
|
|
42
|
+
try {
|
|
43
|
+
sodium.sodium_munlock(buf);
|
|
44
|
+
}
|
|
45
|
+
catch { /* ignore */ }
|
|
46
|
+
}
|
|
47
|
+
export function passwordToBuffer(password) {
|
|
48
|
+
const len = Buffer.byteLength(password, 'utf8');
|
|
49
|
+
const buf = secureAlloc(len);
|
|
50
|
+
buf.write(password, 'utf8');
|
|
51
|
+
return buf;
|
|
52
|
+
}
|
|
53
|
+
export function bufferToString(buf) {
|
|
54
|
+
return buf.toString('utf8');
|
|
55
|
+
}
|
|
56
|
+
export function secureCompare(a, b) {
|
|
57
|
+
if (a.length !== b.length)
|
|
58
|
+
return false;
|
|
59
|
+
try {
|
|
60
|
+
return nodeCrypto.timingSafeEqual(a, b);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
let result = 0;
|
|
64
|
+
for (let i = 0; i < a.length; i++)
|
|
65
|
+
result |= a[i] ^ b[i];
|
|
66
|
+
return result === 0;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function zeroObjectValues(obj, keys) {
|
|
70
|
+
for (const key of keys) {
|
|
71
|
+
const val = obj[key];
|
|
72
|
+
if (Buffer.isBuffer(val))
|
|
73
|
+
secureZero(val);
|
|
74
|
+
obj[key] = undefined;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function zeroEnv(env, keys) {
|
|
78
|
+
for (const key of keys) {
|
|
79
|
+
delete env[key];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function isDebuggerAttached() {
|
|
83
|
+
if (process.platform !== 'linux')
|
|
84
|
+
return false;
|
|
85
|
+
try {
|
|
86
|
+
const fs = require('fs');
|
|
87
|
+
const status = fs.readFileSync('/proc/self/status', 'utf8');
|
|
88
|
+
const match = status.match(/TracerPid:\s*(\d+)/);
|
|
89
|
+
return match != null && match[1] !== '0';
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export function preventCoreDumps() {
|
|
96
|
+
if (process.platform !== 'linux' && process.platform !== 'darwin')
|
|
97
|
+
return false;
|
|
98
|
+
try {
|
|
99
|
+
childProcess.execSync(`prlimit --core=0 --pid=${process.pid}`, { stdio: 'ignore' });
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
try {
|
|
104
|
+
childProcess.execSync('ulimit -c 0', { stdio: 'ignore' });
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
let memoryProtectionInitialized = false;
|
|
113
|
+
export function initMemoryProtection() {
|
|
114
|
+
const result = { coreDumpsDisabled: false, debuggerDetected: false };
|
|
115
|
+
if (memoryProtectionInitialized)
|
|
116
|
+
return result;
|
|
117
|
+
memoryProtectionInitialized = true;
|
|
118
|
+
result.debuggerDetected = isDebuggerAttached();
|
|
119
|
+
result.coreDumpsDisabled = preventCoreDumps();
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=secure-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-memory.js","sourceRoot":"","sources":["../../src/utils/secure-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AAGrD,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;gBAElB,WAAW,EAAE,MAAM,EAAE,cAAc,GAAE,MAAW,EAAE,aAAa,GAAE,MAAU;IAMjF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AAGrD,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;gBAElB,WAAW,EAAE,MAAM,EAAE,cAAc,GAAE,MAAW,EAAE,aAAa,GAAE,MAAU;IAMjF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B1C,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA0ChD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ3B,MAAM,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAmCjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,UAAU,IAAI,OAAO,GAAG,IAAI;IAI5B,gBAAgB,IAAI,MAAM;CAQ3B"}
|
package/dist/utils/session.js
CHANGED
|
@@ -34,9 +34,14 @@ export class SessionManager {
|
|
|
34
34
|
session: this.session,
|
|
35
35
|
});
|
|
36
36
|
const encrypted = await encrypt(sessionData, password);
|
|
37
|
-
await nodefs.writeFile(this.sessionPath, '', { encoding: 'utf8', mode: 0o600, flag: 'a' });
|
|
38
37
|
await withLock(this.sessionPath, async () => {
|
|
39
|
-
await nodefs.
|
|
38
|
+
const wh = await nodefs.open(this.sessionPath, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_TRUNC | fs.constants.O_NOFOLLOW, 0o600);
|
|
39
|
+
try {
|
|
40
|
+
await wh.writeFile(encrypted, 'utf8');
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
await wh.close();
|
|
44
|
+
}
|
|
40
45
|
});
|
|
41
46
|
return this.session;
|
|
42
47
|
}
|
|
@@ -105,9 +110,14 @@ export class SessionManager {
|
|
|
105
110
|
session: this.session,
|
|
106
111
|
});
|
|
107
112
|
const encrypted = await encrypt(sessionData, this.password);
|
|
108
|
-
await nodefs.writeFile(this.sessionPath, '', { encoding: 'utf8', mode: 0o600, flag: 'a' });
|
|
109
113
|
await withLock(this.sessionPath, async () => {
|
|
110
|
-
await nodefs.
|
|
114
|
+
const wh = await nodefs.open(this.sessionPath, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_TRUNC | fs.constants.O_NOFOLLOW, 0o600);
|
|
115
|
+
try {
|
|
116
|
+
await wh.writeFile(encrypted, 'utf8');
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
await wh.close();
|
|
120
|
+
}
|
|
111
121
|
});
|
|
112
122
|
return this.session;
|
|
113
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ export interface ReleaseInfo {
|
|
|
29
29
|
}
|
|
30
30
|
export declare function getCurrentVersion(): string;
|
|
31
31
|
export declare function compareVersions(a: string, b: string): number;
|
|
32
|
-
export declare function parseRelease(data:
|
|
32
|
+
export declare function parseRelease(data: unknown): ReleaseInfo;
|
|
33
33
|
export declare function extractAdvisory(body: string, url: string): {
|
|
34
34
|
id: string;
|
|
35
35
|
summary: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/utils/update-checker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/utils/update-checker.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAW1C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,CAOvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAgBrI;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAUvE;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CASvE;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,CAkC/D;AAED,wBAAsB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAuDrH;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAyB7D;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1F"}
|