@fentz26/envcp 1.0.83 → 1.0.91
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 +67 -17
- package/dist/cli/index.js +130 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/config/manager.js +3 -3
- package/dist/config/manager.js.map +1 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +32 -14
- package/dist/storage/index.js.map +1 -1
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -3
- package/dist/types.js.map +1 -1
- package/dist/utils/crypto.d.ts +1 -0
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +28 -4
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/keychain.d.ts +27 -0
- package/dist/utils/keychain.d.ts.map +1 -0
- package/dist/utils/keychain.js +234 -0
- package/dist/utils/keychain.js.map +1 -0
- package/dist/utils/lock.d.ts +10 -0
- package/dist/utils/lock.d.ts.map +1 -0
- package/dist/utils/lock.js +39 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +17 -11
- package/dist/utils/session.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { execFile } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
const SERVICE_NAME = 'envcp';
|
|
6
|
+
const ACCOUNT_NAME = 'master-password';
|
|
7
|
+
// --- macOS Keychain (security CLI) ---
|
|
8
|
+
class MacOSKeychain {
|
|
9
|
+
name = 'macOS Keychain';
|
|
10
|
+
async store(service, account, password) {
|
|
11
|
+
try {
|
|
12
|
+
// Delete existing entry first (ignore errors)
|
|
13
|
+
try {
|
|
14
|
+
await execFileAsync('security', ['delete-generic-password', '-s', service, '-a', account]);
|
|
15
|
+
}
|
|
16
|
+
catch { /* entry may not exist */ }
|
|
17
|
+
await execFileAsync('security', [
|
|
18
|
+
'add-generic-password',
|
|
19
|
+
'-s', service,
|
|
20
|
+
'-a', account,
|
|
21
|
+
'-w', password,
|
|
22
|
+
'-U', // update if exists
|
|
23
|
+
]);
|
|
24
|
+
return { success: true };
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async retrieve(service, account) {
|
|
31
|
+
try {
|
|
32
|
+
const { stdout } = await execFileAsync('security', [
|
|
33
|
+
'find-generic-password',
|
|
34
|
+
'-s', service,
|
|
35
|
+
'-a', account,
|
|
36
|
+
'-w', // output password only
|
|
37
|
+
]);
|
|
38
|
+
return stdout.trim() || null;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async remove(service, account) {
|
|
45
|
+
try {
|
|
46
|
+
await execFileAsync('security', ['delete-generic-password', '-s', service, '-a', account]);
|
|
47
|
+
return { success: true };
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async isAvailable() {
|
|
54
|
+
try {
|
|
55
|
+
await execFileAsync('security', ['help']);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// 'security help' exits with code 1 but still indicates the binary exists
|
|
60
|
+
try {
|
|
61
|
+
await execFileAsync('which', ['security']);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// --- Linux libsecret (secret-tool CLI) ---
|
|
71
|
+
class LinuxKeychain {
|
|
72
|
+
name = 'GNOME Keyring (libsecret)';
|
|
73
|
+
async store(service, account, password) {
|
|
74
|
+
try {
|
|
75
|
+
const proc = execFileAsync('secret-tool', [
|
|
76
|
+
'store',
|
|
77
|
+
'--label', `${service} password`,
|
|
78
|
+
'service', service,
|
|
79
|
+
'account', account,
|
|
80
|
+
]);
|
|
81
|
+
// secret-tool reads the secret from stdin
|
|
82
|
+
proc.child.stdin.write(password);
|
|
83
|
+
proc.child.stdin.end();
|
|
84
|
+
await proc;
|
|
85
|
+
return { success: true };
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async retrieve(service, account) {
|
|
92
|
+
try {
|
|
93
|
+
const { stdout } = await execFileAsync('secret-tool', [
|
|
94
|
+
'lookup',
|
|
95
|
+
'service', service,
|
|
96
|
+
'account', account,
|
|
97
|
+
]);
|
|
98
|
+
return stdout || null;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async remove(service, account) {
|
|
105
|
+
try {
|
|
106
|
+
await execFileAsync('secret-tool', [
|
|
107
|
+
'clear',
|
|
108
|
+
'service', service,
|
|
109
|
+
'account', account,
|
|
110
|
+
]);
|
|
111
|
+
return { success: true };
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async isAvailable() {
|
|
118
|
+
try {
|
|
119
|
+
await execFileAsync('which', ['secret-tool']);
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// --- Windows Credential Manager (PowerShell) ---
|
|
128
|
+
class WindowsKeychain {
|
|
129
|
+
name = 'Windows Credential Manager';
|
|
130
|
+
async store(service, account, password) {
|
|
131
|
+
try {
|
|
132
|
+
// Use cmdkey for simplicity
|
|
133
|
+
const target = `${service}:${account}`;
|
|
134
|
+
await execFileAsync('cmdkey', ['/add:' + target, '/user:' + account, '/pass:' + password]);
|
|
135
|
+
return { success: true };
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async retrieve(service, account) {
|
|
142
|
+
try {
|
|
143
|
+
// cmdkey can't retrieve passwords; use PowerShell CredentialManager
|
|
144
|
+
const target = `${service}:${account}`;
|
|
145
|
+
const script = `
|
|
146
|
+
Add-Type -AssemblyName System.Runtime.InteropServices;
|
|
147
|
+
$cred = [System.Runtime.InteropServices.Marshal];
|
|
148
|
+
$target = '${target.replace(/'/g, "''")}';
|
|
149
|
+
$c = New-Object -TypeName PSCredential -ArgumentList @('x', (ConvertTo-SecureString (cmdkey /list:$target | Out-String) -AsPlainText -Force));
|
|
150
|
+
`;
|
|
151
|
+
// Simpler approach: use Windows CredentialManager module or generic approach
|
|
152
|
+
const { stdout } = await execFileAsync('powershell', [
|
|
153
|
+
'-NoProfile', '-Command',
|
|
154
|
+
`$cred = Get-StoredCredential -Target '${target.replace(/'/g, "''")}'; if ($cred) { $cred.GetNetworkCredential().Password } else { '' }`,
|
|
155
|
+
]);
|
|
156
|
+
return stdout.trim() || null;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Fallback: try with cmdkey-based approach via PowerShell DPAPI
|
|
160
|
+
try {
|
|
161
|
+
const target = `${service}:${account}`;
|
|
162
|
+
const { stdout } = await execFileAsync('powershell', [
|
|
163
|
+
'-NoProfile', '-Command',
|
|
164
|
+
`[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((New-Object Management.Automation.PSCredential('u',(Get-Content '${os.homedir()}/.envcp/.credential' | ConvertTo-SecureString))).Password))`,
|
|
165
|
+
]);
|
|
166
|
+
return stdout.trim() || null;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async remove(service, account) {
|
|
174
|
+
try {
|
|
175
|
+
const target = `${service}:${account}`;
|
|
176
|
+
await execFileAsync('cmdkey', ['/delete:' + target]);
|
|
177
|
+
return { success: true };
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async isAvailable() {
|
|
184
|
+
try {
|
|
185
|
+
await execFileAsync('where', ['cmdkey']);
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// --- Keychain manager ---
|
|
194
|
+
export class KeychainManager {
|
|
195
|
+
backend;
|
|
196
|
+
service;
|
|
197
|
+
constructor(service = SERVICE_NAME) {
|
|
198
|
+
this.service = service;
|
|
199
|
+
const platform = os.platform();
|
|
200
|
+
if (platform === 'darwin') {
|
|
201
|
+
this.backend = new MacOSKeychain();
|
|
202
|
+
}
|
|
203
|
+
else if (platform === 'win32') {
|
|
204
|
+
this.backend = new WindowsKeychain();
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
this.backend = new LinuxKeychain();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
get backendName() {
|
|
211
|
+
return this.backend.name;
|
|
212
|
+
}
|
|
213
|
+
async isAvailable() {
|
|
214
|
+
return this.backend.isAvailable();
|
|
215
|
+
}
|
|
216
|
+
async storePassword(password, projectPath) {
|
|
217
|
+
const account = projectPath ? `${ACCOUNT_NAME}:${projectPath}` : ACCOUNT_NAME;
|
|
218
|
+
return this.backend.store(this.service, account, password);
|
|
219
|
+
}
|
|
220
|
+
async retrievePassword(projectPath) {
|
|
221
|
+
const account = projectPath ? `${ACCOUNT_NAME}:${projectPath}` : ACCOUNT_NAME;
|
|
222
|
+
return this.backend.retrieve(this.service, account);
|
|
223
|
+
}
|
|
224
|
+
async removePassword(projectPath) {
|
|
225
|
+
const account = projectPath ? `${ACCOUNT_NAME}:${projectPath}` : ACCOUNT_NAME;
|
|
226
|
+
return this.backend.remove(this.service, account);
|
|
227
|
+
}
|
|
228
|
+
async getStatus(projectPath) {
|
|
229
|
+
const available = await this.isAvailable();
|
|
230
|
+
const hasPassword = available ? (await this.retrievePassword(projectPath)) !== null : false;
|
|
231
|
+
return { available, backend: this.backend.name, hasPassword };
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/utils/keychain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Acquires an exclusive lock on `filePath` using an atomic `.lock` sentinel file,
|
|
3
|
+
* runs `fn`, then releases the lock. Retries up to MAX_RETRIES times with
|
|
4
|
+
* linear back-off before throwing.
|
|
5
|
+
*
|
|
6
|
+
* Uses O_CREAT|O_EXCL (the `wx` flag) which is atomic on POSIX and NTFS —
|
|
7
|
+
* the same primitive proper-lockfile uses internally.
|
|
8
|
+
*/
|
|
9
|
+
export declare function withLock<T>(filePath: string, fn: () => Promise<T>): Promise<T>;
|
|
10
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/utils/lock.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAsBpF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
const MAX_RETRIES = 5;
|
|
3
|
+
const BASE_DELAY_MS = 50;
|
|
4
|
+
/**
|
|
5
|
+
* Acquires an exclusive lock on `filePath` using an atomic `.lock` sentinel file,
|
|
6
|
+
* runs `fn`, then releases the lock. Retries up to MAX_RETRIES times with
|
|
7
|
+
* linear back-off before throwing.
|
|
8
|
+
*
|
|
9
|
+
* Uses O_CREAT|O_EXCL (the `wx` flag) which is atomic on POSIX and NTFS —
|
|
10
|
+
* the same primitive proper-lockfile uses internally.
|
|
11
|
+
*/
|
|
12
|
+
export async function withLock(filePath, fn) {
|
|
13
|
+
const lockPath = filePath + '.lock';
|
|
14
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
15
|
+
try {
|
|
16
|
+
const handle = await fs.open(lockPath, 'wx');
|
|
17
|
+
await handle.close();
|
|
18
|
+
break; // lock acquired
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
if (err.code !== 'EEXIST')
|
|
22
|
+
throw err;
|
|
23
|
+
if (attempt === MAX_RETRIES) {
|
|
24
|
+
throw new Error(`Could not acquire lock for ${filePath} after ${MAX_RETRIES} retries`);
|
|
25
|
+
}
|
|
26
|
+
await new Promise(resolve => setTimeout(resolve, BASE_DELAY_MS * (attempt + 1)));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
return await fn();
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
try {
|
|
34
|
+
await fs.unlink(lockPath);
|
|
35
|
+
}
|
|
36
|
+
catch { /* ignore: lock file already gone */ }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/utils/lock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,QAAgB,EAAE,EAAoB;IACtE,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IAEpC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,gBAAgB;QACzB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAChE,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,UAAU,WAAW,UAAU,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oCAAoC,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAGA,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":"AAGA,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;IA+B1C,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAqChD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ3B,MAAM,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAoCjC,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
|
@@ -32,9 +32,8 @@ export class SessionManager {
|
|
|
32
32
|
session: this.session,
|
|
33
33
|
});
|
|
34
34
|
const encrypted = await encrypt(sessionData, password);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
35
|
+
// Ensure the file exists for lockfile (append-mode is a no-op if it exists)
|
|
36
|
+
await fs.writeFile(this.sessionPath, '', { encoding: 'utf8', mode: 0o600, flag: 'a' });
|
|
38
37
|
const releaseCreate = await lockfile.lock(this.sessionPath, { retries: { retries: 3, minTimeout: 50 } });
|
|
39
38
|
try {
|
|
40
39
|
await fs.writeFile(this.sessionPath, encrypted, { encoding: 'utf8', mode: 0o600 });
|
|
@@ -45,15 +44,20 @@ export class SessionManager {
|
|
|
45
44
|
return this.session;
|
|
46
45
|
}
|
|
47
46
|
async load(password) {
|
|
48
|
-
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
47
|
+
let encrypted;
|
|
51
48
|
try {
|
|
52
49
|
const stat = await fs.lstat(this.sessionPath);
|
|
53
50
|
if (!stat.isFile()) {
|
|
54
51
|
return null;
|
|
55
52
|
}
|
|
56
|
-
|
|
53
|
+
encrypted = await fs.readFile(this.sessionPath, 'utf8');
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
if (err.code === 'ENOENT')
|
|
57
|
+
return null;
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
57
61
|
const pwd = password || this.password;
|
|
58
62
|
if (!pwd) {
|
|
59
63
|
return null;
|
|
@@ -98,9 +102,7 @@ export class SessionManager {
|
|
|
98
102
|
session: this.session,
|
|
99
103
|
});
|
|
100
104
|
const encrypted = await encrypt(sessionData, this.password);
|
|
101
|
-
|
|
102
|
-
await fs.writeFile(this.sessionPath, '', { encoding: 'utf8', mode: 0o600 });
|
|
103
|
-
}
|
|
105
|
+
await fs.writeFile(this.sessionPath, '', { encoding: 'utf8', mode: 0o600, flag: 'a' });
|
|
104
106
|
const releaseExtend = await lockfile.lock(this.sessionPath, { retries: { retries: 3, minTimeout: 50 } });
|
|
105
107
|
try {
|
|
106
108
|
await fs.writeFile(this.sessionPath, encrypted, { encoding: 'utf8', mode: 0o600 });
|
|
@@ -113,9 +115,13 @@ export class SessionManager {
|
|
|
113
115
|
async destroy() {
|
|
114
116
|
this.session = null;
|
|
115
117
|
this.password = null;
|
|
116
|
-
|
|
118
|
+
try {
|
|
117
119
|
await fs.unlink(this.sessionPath);
|
|
118
120
|
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
if (err.code !== 'ENOENT')
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
119
125
|
}
|
|
120
126
|
getPassword() {
|
|
121
127
|
return this.password;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAW,aAAa,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,OAAO,cAAc;IACjB,WAAW,CAAS;IACpB,OAAO,GAAmB,IAAI,CAAC;IAC/B,QAAQ,GAAkB,IAAI,CAAC;IAC/B,cAAc,CAAS;IACvB,aAAa,CAAS;IAE9B,YAAY,WAAmB,EAAE,iBAAyB,EAAE,EAAE,gBAAwB,CAAC;QACrF,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,GAAG;YACb,EAAE,EAAE,UAAU,EAAE;YAChB,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE;YAC1B,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;YAC9B,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;SAC/B,CAAC;QAEJ,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACvD,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fentz26/envcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.91",
|
|
4
4
|
"mcpName": "dev.fentz.envcp/envcp",
|
|
5
5
|
"description": "MCP server for secure environment variable management - Keep your secrets safe from AI agents",
|
|
6
|
+
"homepage": "https://envcp.fentz.dev",
|
|
6
7
|
"repository": {
|
|
7
8
|
"type": "git",
|
|
8
9
|
"url": "https://github.com/fentz26/EnvCP.git"
|
|
9
10
|
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/fentz26/EnvCP/issues"
|
|
13
|
+
},
|
|
10
14
|
"type": "module",
|
|
11
15
|
"main": "dist/index.js",
|
|
12
16
|
"types": "dist/index.d.ts",
|
|
@@ -29,7 +33,7 @@
|
|
|
29
33
|
"model-context-protocol"
|
|
30
34
|
],
|
|
31
35
|
"author": "fentz26",
|
|
32
|
-
"license": "SEE LICENSE IN LICENSE",
|
|
36
|
+
"license": "SEE LICENSE IN https://github.com/fentz26/EnvCP/blob/main/LICENSE",
|
|
33
37
|
"dependencies": {
|
|
34
38
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
35
39
|
"argon2": "^0.44.0",
|