nox-openclaw-hunter 1.0.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/LICENSE +21 -0
- package/README.md +140 -0
- package/bin/nox.js +2 -0
- package/dist/branding.d.ts +39 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +66 -0
- package/dist/branding.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +94 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/export.d.ts +21 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +616 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/index.d.ts +8 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +8 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/isolate.d.ts +30 -0
- package/dist/commands/isolate.d.ts.map +1 -0
- package/dist/commands/isolate.js +547 -0
- package/dist/commands/isolate.js.map +1 -0
- package/dist/commands/purge.d.ts +22 -0
- package/dist/commands/purge.d.ts.map +1 -0
- package/dist/commands/purge.js +295 -0
- package/dist/commands/purge.js.map +1 -0
- package/dist/commands/scan.d.ts +23 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +155 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/detector/app-bundle.d.ts +13 -0
- package/dist/detector/app-bundle.d.ts.map +1 -0
- package/dist/detector/app-bundle.js +27 -0
- package/dist/detector/app-bundle.js.map +1 -0
- package/dist/detector/cli-binary.d.ts +12 -0
- package/dist/detector/cli-binary.d.ts.map +1 -0
- package/dist/detector/cli-binary.js +66 -0
- package/dist/detector/cli-binary.js.map +1 -0
- package/dist/detector/config.d.ts +21 -0
- package/dist/detector/config.d.ts.map +1 -0
- package/dist/detector/config.js +337 -0
- package/dist/detector/config.js.map +1 -0
- package/dist/detector/detection-config.d.ts +24 -0
- package/dist/detector/detection-config.d.ts.map +1 -0
- package/dist/detector/detection-config.js +242 -0
- package/dist/detector/detection-config.js.map +1 -0
- package/dist/detector/docker.d.ts +10 -0
- package/dist/detector/docker.d.ts.map +1 -0
- package/dist/detector/docker.js +94 -0
- package/dist/detector/docker.js.map +1 -0
- package/dist/detector/index.d.ts +50 -0
- package/dist/detector/index.d.ts.map +1 -0
- package/dist/detector/index.js +155 -0
- package/dist/detector/index.js.map +1 -0
- package/dist/detector/network.d.ts +34 -0
- package/dist/detector/network.d.ts.map +1 -0
- package/dist/detector/network.js +205 -0
- package/dist/detector/network.js.map +1 -0
- package/dist/detector/process.d.ts +16 -0
- package/dist/detector/process.d.ts.map +1 -0
- package/dist/detector/process.js +47 -0
- package/dist/detector/process.js.map +1 -0
- package/dist/detector/service.d.ts +17 -0
- package/dist/detector/service.d.ts.map +1 -0
- package/dist/detector/service.js +51 -0
- package/dist/detector/service.js.map +1 -0
- package/dist/enforcer/docker-cleaner.d.ts +30 -0
- package/dist/enforcer/docker-cleaner.d.ts.map +1 -0
- package/dist/enforcer/docker-cleaner.js +163 -0
- package/dist/enforcer/docker-cleaner.js.map +1 -0
- package/dist/enforcer/file-remover.d.ts +34 -0
- package/dist/enforcer/file-remover.d.ts.map +1 -0
- package/dist/enforcer/file-remover.js +137 -0
- package/dist/enforcer/file-remover.js.map +1 -0
- package/dist/enforcer/index.d.ts +33 -0
- package/dist/enforcer/index.d.ts.map +1 -0
- package/dist/enforcer/index.js +142 -0
- package/dist/enforcer/index.js.map +1 -0
- package/dist/enforcer/process-killer.d.ts +18 -0
- package/dist/enforcer/process-killer.d.ts.map +1 -0
- package/dist/enforcer/process-killer.js +80 -0
- package/dist/enforcer/process-killer.js.map +1 -0
- package/dist/enforcer/service-stopper.d.ts +23 -0
- package/dist/enforcer/service-stopper.d.ts.map +1 -0
- package/dist/enforcer/service-stopper.js +95 -0
- package/dist/enforcer/service-stopper.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/isolator/firewall.d.ts +25 -0
- package/dist/isolator/firewall.d.ts.map +1 -0
- package/dist/isolator/firewall.js +114 -0
- package/dist/isolator/firewall.js.map +1 -0
- package/dist/isolator/index.d.ts +63 -0
- package/dist/isolator/index.d.ts.map +1 -0
- package/dist/isolator/index.js +201 -0
- package/dist/isolator/index.js.map +1 -0
- package/dist/isolator/lockdown.d.ts +22 -0
- package/dist/isolator/lockdown.d.ts.map +1 -0
- package/dist/isolator/lockdown.js +401 -0
- package/dist/isolator/lockdown.js.map +1 -0
- package/dist/isolator/quarantine.d.ts +39 -0
- package/dist/isolator/quarantine.d.ts.map +1 -0
- package/dist/isolator/quarantine.js +364 -0
- package/dist/isolator/quarantine.js.map +1 -0
- package/dist/mdm/index.d.ts +93 -0
- package/dist/mdm/index.d.ts.map +1 -0
- package/dist/mdm/index.js +414 -0
- package/dist/mdm/index.js.map +1 -0
- package/dist/mdm/intune.d.ts +69 -0
- package/dist/mdm/intune.d.ts.map +1 -0
- package/dist/mdm/intune.js +409 -0
- package/dist/mdm/intune.js.map +1 -0
- package/dist/mdm/jamf.d.ts +58 -0
- package/dist/mdm/jamf.d.ts.map +1 -0
- package/dist/mdm/jamf.js +441 -0
- package/dist/mdm/jamf.js.map +1 -0
- package/dist/mdm/jumpcloud.d.ts +73 -0
- package/dist/mdm/jumpcloud.d.ts.map +1 -0
- package/dist/mdm/jumpcloud.js +470 -0
- package/dist/mdm/jumpcloud.js.map +1 -0
- package/dist/mdm/templates/detect.ps1.d.ts +30 -0
- package/dist/mdm/templates/detect.ps1.d.ts.map +1 -0
- package/dist/mdm/templates/detect.ps1.js +463 -0
- package/dist/mdm/templates/detect.ps1.js.map +1 -0
- package/dist/mdm/templates/detect.sh.d.ts +30 -0
- package/dist/mdm/templates/detect.sh.d.ts.map +1 -0
- package/dist/mdm/templates/detect.sh.js +474 -0
- package/dist/mdm/templates/detect.sh.js.map +1 -0
- package/dist/mdm/templates/enforce.ps1.d.ts +33 -0
- package/dist/mdm/templates/enforce.ps1.d.ts.map +1 -0
- package/dist/mdm/templates/enforce.ps1.js +681 -0
- package/dist/mdm/templates/enforce.ps1.js.map +1 -0
- package/dist/mdm/templates/enforce.sh.d.ts +33 -0
- package/dist/mdm/templates/enforce.sh.d.ts.map +1 -0
- package/dist/mdm/templates/enforce.sh.js +591 -0
- package/dist/mdm/templates/enforce.sh.js.map +1 -0
- package/dist/platform/darwin.d.ts +6 -0
- package/dist/platform/darwin.d.ts.map +1 -0
- package/dist/platform/darwin.js +192 -0
- package/dist/platform/darwin.js.map +1 -0
- package/dist/platform/index.d.ts +43 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +27 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/linux.d.ts +6 -0
- package/dist/platform/linux.d.ts.map +1 -0
- package/dist/platform/linux.js +134 -0
- package/dist/platform/linux.js.map +1 -0
- package/dist/platform/windows.d.ts +6 -0
- package/dist/platform/windows.d.ts.map +1 -0
- package/dist/platform/windows.js +134 -0
- package/dist/platform/windows.js.map +1 -0
- package/dist/reporter/console.d.ts +27 -0
- package/dist/reporter/console.d.ts.map +1 -0
- package/dist/reporter/console.js +431 -0
- package/dist/reporter/console.js.map +1 -0
- package/dist/reporter/index.d.ts +11 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +13 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/reporter/json.d.ts +61 -0
- package/dist/reporter/json.d.ts.map +1 -0
- package/dist/reporter/json.js +75 -0
- package/dist/reporter/json.js.map +1 -0
- package/dist/reporter/webhook.d.ts +57 -0
- package/dist/reporter/webhook.d.ts.map +1 -0
- package/dist/reporter/webhook.js +230 -0
- package/dist/reporter/webhook.js.map +1 -0
- package/dist/types/config.d.ts +116 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/detection.d.ts +85 -0
- package/dist/types/detection.d.ts.map +1 -0
- package/dist/types/detection.js +5 -0
- package/dist/types/detection.js.map +1 -0
- package/dist/types/enforcement.d.ts +33 -0
- package/dist/types/enforcement.d.ts.map +1 -0
- package/dist/types/enforcement.js +5 -0
- package/dist/types/enforcement.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/isolation.d.ts +55 -0
- package/dist/types/isolation.d.ts.map +1 -0
- package/dist/types/isolation.js +5 -0
- package/dist/types/isolation.js.map +1 -0
- package/dist/utils/exec.d.ts +48 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +103 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/fs.d.ts +34 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +111 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +48 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/intune.md +390 -0
- package/docs/jamf.md +400 -0
- package/docs/jumpcloud.md +510 -0
- package/package.json +65 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quarantine management for OpenClaw artifacts.
|
|
3
|
+
* Moves files to a secure quarantine directory with manifest tracking.
|
|
4
|
+
*/
|
|
5
|
+
import * as os from 'node:os';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import { rename, writeFile, readFile, readdir } from 'node:fs/promises';
|
|
8
|
+
import { pathExists, ensureDir, safeRemove, validatePathWithinBase } from '../utils/fs.js';
|
|
9
|
+
import { logger } from '../utils/logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Generate a unique quarantine ID based on timestamp and username.
|
|
12
|
+
* Format: YYYY-MM-DD_HHMMSS_username
|
|
13
|
+
*/
|
|
14
|
+
function generateQuarantineId() {
|
|
15
|
+
const now = new Date();
|
|
16
|
+
const date = now.toISOString().split('T')[0];
|
|
17
|
+
const time = now.toTimeString().split(' ')[0]?.replace(/:/g, '') ?? '000000';
|
|
18
|
+
const user = os.userInfo().username || 'unknown';
|
|
19
|
+
return `${date}_${time}_${user}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Quarantine all detected OpenClaw artifacts.
|
|
23
|
+
* Moves files to a secure location and creates a manifest for potential restoration.
|
|
24
|
+
*/
|
|
25
|
+
export async function quarantineArtifacts(platform, detection, options = {}) {
|
|
26
|
+
const action = {
|
|
27
|
+
type: 'quarantine',
|
|
28
|
+
target: 'openclaw-artifacts',
|
|
29
|
+
status: 'pending',
|
|
30
|
+
};
|
|
31
|
+
// Check if artifacts are already quarantined
|
|
32
|
+
const existingQuarantines = await listQuarantined(platform);
|
|
33
|
+
if (existingQuarantines.length > 0) {
|
|
34
|
+
const targetPath = detection.stateDir.path || detection.cli.path || detection.app.path;
|
|
35
|
+
for (const manifest of existingQuarantines) {
|
|
36
|
+
for (const artifact of manifest.artifacts) {
|
|
37
|
+
if (artifact.original === targetPath) {
|
|
38
|
+
logger.warn(`Artifact already quarantined: ${targetPath}`);
|
|
39
|
+
logger.warn(` Quarantine ID: ${manifest.id}`);
|
|
40
|
+
logger.warn(` Use 'nox isolate revert --restore-quarantine' to restore first`);
|
|
41
|
+
action.status = 'failed';
|
|
42
|
+
action.error = `Artifact already quarantined (ID: ${manifest.id}). Restore or delete existing quarantine first.`;
|
|
43
|
+
return { action };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const id = generateQuarantineId();
|
|
49
|
+
const basePath = path.join(platform.getQuarantinePath(), id);
|
|
50
|
+
action.quarantinePath = basePath;
|
|
51
|
+
if (options.dryRun) {
|
|
52
|
+
logger.info(`[dry-run] Would quarantine artifacts to ${basePath}`);
|
|
53
|
+
action.status = 'success';
|
|
54
|
+
return { action };
|
|
55
|
+
}
|
|
56
|
+
// Capture detection details at quarantine time
|
|
57
|
+
const detectionDetails = {};
|
|
58
|
+
if (detection.config.details) {
|
|
59
|
+
if (detection.config.details.model) {
|
|
60
|
+
detectionDetails.model = detection.config.details.model;
|
|
61
|
+
}
|
|
62
|
+
if (detection.config.details.apiProvider) {
|
|
63
|
+
detectionDetails.provider = detection.config.details.apiProvider;
|
|
64
|
+
}
|
|
65
|
+
if (detection.config.details.channels) {
|
|
66
|
+
// Convert channels object to array of enabled channel names
|
|
67
|
+
const enabledChannels = [];
|
|
68
|
+
const channels = detection.config.details.channels;
|
|
69
|
+
if (channels.telegram)
|
|
70
|
+
enabledChannels.push('Telegram');
|
|
71
|
+
if (channels.whatsapp)
|
|
72
|
+
enabledChannels.push('WhatsApp');
|
|
73
|
+
if (channels.slack)
|
|
74
|
+
enabledChannels.push('Slack');
|
|
75
|
+
if (channels.discord)
|
|
76
|
+
enabledChannels.push('Discord');
|
|
77
|
+
if (channels.email)
|
|
78
|
+
enabledChannels.push('Email');
|
|
79
|
+
if (channels.sms)
|
|
80
|
+
enabledChannels.push('SMS');
|
|
81
|
+
if (channels.other && channels.other.length > 0) {
|
|
82
|
+
enabledChannels.push(...channels.other);
|
|
83
|
+
}
|
|
84
|
+
if (enabledChannels.length > 0) {
|
|
85
|
+
detectionDetails.channels = enabledChannels;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (detection.config.details.autonomousMode !== undefined) {
|
|
89
|
+
detectionDetails.autonomous = detection.config.details.autonomousMode;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (detection.gateway.found && detection.gateway.port) {
|
|
93
|
+
detectionDetails.gatewayPort = detection.gateway.port;
|
|
94
|
+
}
|
|
95
|
+
if (detection.processes && detection.processes.length > 0) {
|
|
96
|
+
detectionDetails.processCount = detection.processes.length;
|
|
97
|
+
}
|
|
98
|
+
const manifest = {
|
|
99
|
+
id,
|
|
100
|
+
timestamp: new Date().toISOString(),
|
|
101
|
+
hostname: os.hostname(),
|
|
102
|
+
artifacts: [],
|
|
103
|
+
detection: Object.keys(detectionDetails).length > 0 ? detectionDetails : undefined,
|
|
104
|
+
};
|
|
105
|
+
try {
|
|
106
|
+
logger.info(`Creating quarantine directory: ${basePath}`);
|
|
107
|
+
await ensureDir(basePath);
|
|
108
|
+
await ensureDir(path.join(basePath, 'binaries'));
|
|
109
|
+
await ensureDir(path.join(basePath, 'config'));
|
|
110
|
+
await ensureDir(path.join(basePath, 'app'));
|
|
111
|
+
// Quarantine CLI binary
|
|
112
|
+
if (detection.cli.found && detection.cli.path) {
|
|
113
|
+
const artifact = await quarantineFile(detection.cli.path, path.join(basePath, 'binaries', path.basename(detection.cli.path)), 'binary');
|
|
114
|
+
if (artifact) {
|
|
115
|
+
manifest.artifacts.push(artifact);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Quarantine state/config directory
|
|
119
|
+
if (detection.stateDir.found && detection.stateDir.path) {
|
|
120
|
+
const artifact = await quarantineDirectory(detection.stateDir.path, path.join(basePath, 'config'), 'config');
|
|
121
|
+
if (artifact) {
|
|
122
|
+
manifest.artifacts.push(artifact);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Quarantine app bundle (macOS)
|
|
126
|
+
if (detection.app.found && detection.app.path) {
|
|
127
|
+
const artifact = await quarantineDirectory(detection.app.path, path.join(basePath, 'app', path.basename(detection.app.path)), 'app');
|
|
128
|
+
if (artifact) {
|
|
129
|
+
manifest.artifacts.push(artifact);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Write manifest
|
|
133
|
+
const manifestPath = path.join(basePath, 'manifest.json');
|
|
134
|
+
await writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf8');
|
|
135
|
+
logger.success(`Quarantine manifest written to ${manifestPath}`);
|
|
136
|
+
action.status = 'success';
|
|
137
|
+
logger.success(`Quarantined ${manifest.artifacts.length} artifact(s) to ${basePath}`);
|
|
138
|
+
return {
|
|
139
|
+
action,
|
|
140
|
+
result: { id, path: basePath, manifest },
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
action.status = 'failed';
|
|
145
|
+
action.error = err instanceof Error ? err.message : String(err);
|
|
146
|
+
logger.error(`Quarantine failed: ${action.error}`);
|
|
147
|
+
return { action };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Move a single file to quarantine.
|
|
152
|
+
*/
|
|
153
|
+
async function quarantineFile(source, dest, type) {
|
|
154
|
+
if (!(await pathExists(source))) {
|
|
155
|
+
logger.warn(`Source file not found, skipping: ${source}`);
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
logger.info(`Moving ${source} to ${dest}`);
|
|
160
|
+
await rename(source, dest);
|
|
161
|
+
return { type, original: source, quarantined: dest };
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
// If rename fails (cross-device), try copy + delete
|
|
165
|
+
try {
|
|
166
|
+
const { copyFile, rm } = await import('node:fs/promises');
|
|
167
|
+
await copyFile(source, dest);
|
|
168
|
+
await rm(source, { force: true });
|
|
169
|
+
return { type, original: source, quarantined: dest };
|
|
170
|
+
}
|
|
171
|
+
catch (copyErr) {
|
|
172
|
+
logger.error(`Failed to quarantine ${source}: ${copyErr instanceof Error ? copyErr.message : String(copyErr)}`);
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Move a directory to quarantine.
|
|
179
|
+
*/
|
|
180
|
+
async function quarantineDirectory(source, dest, type) {
|
|
181
|
+
if (!(await pathExists(source))) {
|
|
182
|
+
logger.warn(`Source directory not found, skipping: ${source}`);
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
logger.info(`Moving directory ${source} to ${dest}`);
|
|
187
|
+
await rename(source, dest);
|
|
188
|
+
return { type, original: source, quarantined: dest };
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
// If rename fails (cross-device), try recursive copy + delete
|
|
192
|
+
try {
|
|
193
|
+
const { cp, rm } = await import('node:fs/promises');
|
|
194
|
+
await cp(source, dest, { recursive: true });
|
|
195
|
+
await rm(source, { recursive: true, force: true });
|
|
196
|
+
return { type, original: source, quarantined: dest };
|
|
197
|
+
}
|
|
198
|
+
catch (copyErr) {
|
|
199
|
+
logger.error(`Failed to quarantine ${source}: ${copyErr instanceof Error ? copyErr.message : String(copyErr)}`);
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* List all quarantined items.
|
|
206
|
+
*/
|
|
207
|
+
export async function listQuarantined(platform) {
|
|
208
|
+
const basePath = platform.getQuarantinePath();
|
|
209
|
+
const manifests = [];
|
|
210
|
+
if (!(await pathExists(basePath))) {
|
|
211
|
+
return manifests;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
const entries = await readdir(basePath, { withFileTypes: true });
|
|
215
|
+
for (const entry of entries) {
|
|
216
|
+
if (entry.isDirectory()) {
|
|
217
|
+
const manifestPath = path.join(basePath, entry.name, 'manifest.json');
|
|
218
|
+
if (await pathExists(manifestPath)) {
|
|
219
|
+
try {
|
|
220
|
+
const content = await readFile(manifestPath, 'utf8');
|
|
221
|
+
const manifest = JSON.parse(content);
|
|
222
|
+
manifests.push(manifest);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
logger.warn(`Failed to read manifest: ${manifestPath}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
logger.error(`Failed to list quarantined items: ${err instanceof Error ? err.message : String(err)}`);
|
|
233
|
+
}
|
|
234
|
+
// Sort by timestamp descending (newest first)
|
|
235
|
+
return manifests.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Restore quarantined artifacts to their original locations.
|
|
239
|
+
* If the destination already exists, it will be removed first.
|
|
240
|
+
*/
|
|
241
|
+
export async function restoreQuarantined(platform, quarantineId) {
|
|
242
|
+
const basePath = platform.getQuarantinePath();
|
|
243
|
+
// Validate quarantine ID to prevent path traversal
|
|
244
|
+
if (!/^[\w\-_.]+$/.test(quarantineId)) {
|
|
245
|
+
return { success: false, restored: 0, errors: ['Invalid quarantine ID format'] };
|
|
246
|
+
}
|
|
247
|
+
const quarantinePath = path.join(basePath, quarantineId);
|
|
248
|
+
const manifestPath = path.join(quarantinePath, 'manifest.json');
|
|
249
|
+
const errors = [];
|
|
250
|
+
let restored = 0;
|
|
251
|
+
// Validate that quarantine path is within the base quarantine directory
|
|
252
|
+
try {
|
|
253
|
+
await validatePathWithinBase(quarantinePath, basePath);
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
return { success: false, restored: 0, errors: [`Security error: ${err instanceof Error ? err.message : String(err)}`] };
|
|
257
|
+
}
|
|
258
|
+
if (!(await pathExists(manifestPath))) {
|
|
259
|
+
return { success: false, restored: 0, errors: [`Quarantine not found: ${quarantineId}`] };
|
|
260
|
+
}
|
|
261
|
+
try {
|
|
262
|
+
const content = await readFile(manifestPath, 'utf8');
|
|
263
|
+
const manifest = JSON.parse(content);
|
|
264
|
+
for (const artifact of manifest.artifacts) {
|
|
265
|
+
try {
|
|
266
|
+
// Validate that the quarantined path is within the quarantine directory
|
|
267
|
+
await validatePathWithinBase(artifact.quarantined, quarantinePath);
|
|
268
|
+
// Validate that the original path is within allowed system directories
|
|
269
|
+
// (prevent restoring to arbitrary locations like /etc/passwd)
|
|
270
|
+
const originalDir = path.dirname(artifact.original);
|
|
271
|
+
const homeDir = os.homedir();
|
|
272
|
+
const allowedPrefixes = [
|
|
273
|
+
homeDir,
|
|
274
|
+
'/usr/local/bin',
|
|
275
|
+
'/opt/homebrew/bin',
|
|
276
|
+
'/Applications',
|
|
277
|
+
'/Library',
|
|
278
|
+
'/var/lib',
|
|
279
|
+
'/home',
|
|
280
|
+
'/Users',
|
|
281
|
+
'C:\\Program Files',
|
|
282
|
+
'C:\\Users',
|
|
283
|
+
];
|
|
284
|
+
const isAllowed = allowedPrefixes.some(prefix => artifact.original.startsWith(prefix));
|
|
285
|
+
if (!isAllowed) {
|
|
286
|
+
errors.push(`Restore blocked: ${artifact.original} is not in an allowed directory`);
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
if (await pathExists(artifact.quarantined)) {
|
|
290
|
+
// Ensure parent directory exists
|
|
291
|
+
await ensureDir(path.dirname(artifact.original));
|
|
292
|
+
// If destination already exists, remove it first
|
|
293
|
+
// (e.g., the app recreated the config directory while running)
|
|
294
|
+
if (await pathExists(artifact.original)) {
|
|
295
|
+
logger.info(`Removing existing ${artifact.original} before restore`);
|
|
296
|
+
const { rm } = await import('node:fs/promises');
|
|
297
|
+
await rm(artifact.original, { recursive: true, force: true });
|
|
298
|
+
}
|
|
299
|
+
// Try rename first (same filesystem)
|
|
300
|
+
try {
|
|
301
|
+
await rename(artifact.quarantined, artifact.original);
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
// If rename fails (cross-device), try copy + delete
|
|
305
|
+
const { cp, rm } = await import('node:fs/promises');
|
|
306
|
+
await cp(artifact.quarantined, artifact.original, { recursive: true });
|
|
307
|
+
await rm(artifact.quarantined, { recursive: true, force: true });
|
|
308
|
+
}
|
|
309
|
+
logger.success(`Restored ${artifact.original}`);
|
|
310
|
+
restored++;
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
errors.push(`Quarantined file not found: ${artifact.quarantined}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
errors.push(`Failed to restore ${artifact.original}: ${err instanceof Error ? err.message : String(err)}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Remove quarantine directory if all artifacts were restored
|
|
321
|
+
if (restored === manifest.artifacts.length) {
|
|
322
|
+
await safeRemove(quarantinePath);
|
|
323
|
+
logger.success(`Removed quarantine directory: ${quarantinePath}`);
|
|
324
|
+
}
|
|
325
|
+
return { success: errors.length === 0, restored, errors };
|
|
326
|
+
}
|
|
327
|
+
catch (err) {
|
|
328
|
+
return {
|
|
329
|
+
success: false,
|
|
330
|
+
restored,
|
|
331
|
+
errors: [...errors, `Failed to read manifest: ${err instanceof Error ? err.message : String(err)}`],
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Permanently delete quarantined artifacts.
|
|
337
|
+
*/
|
|
338
|
+
export async function deleteQuarantined(platform, quarantineId) {
|
|
339
|
+
const basePath = platform.getQuarantinePath();
|
|
340
|
+
// Validate quarantine ID to prevent path traversal
|
|
341
|
+
if (!/^[\w\-_.]+$/.test(quarantineId)) {
|
|
342
|
+
return { success: false, error: 'Invalid quarantine ID format' };
|
|
343
|
+
}
|
|
344
|
+
const quarantinePath = path.join(basePath, quarantineId);
|
|
345
|
+
// Validate that quarantine path is within the base quarantine directory
|
|
346
|
+
try {
|
|
347
|
+
await validatePathWithinBase(quarantinePath, basePath);
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
return { success: false, error: `Security error: ${err instanceof Error ? err.message : String(err)}` };
|
|
351
|
+
}
|
|
352
|
+
if (!(await pathExists(quarantinePath))) {
|
|
353
|
+
return { success: false, error: `Quarantine not found: ${quarantineId}` };
|
|
354
|
+
}
|
|
355
|
+
const result = await safeRemove(quarantinePath);
|
|
356
|
+
if (result.success) {
|
|
357
|
+
logger.success(`Permanently deleted quarantine: ${quarantineId}`);
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
logger.error(`Failed to delete quarantine: ${result.error}`);
|
|
361
|
+
}
|
|
362
|
+
return result;
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=quarantine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quarantine.js","sourceRoot":"","sources":["../../src/isolator/quarantine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MDM Export Module - Main entry point.
|
|
3
|
+
*
|
|
4
|
+
* Provides unified interface for generating MDM deployment scripts
|
|
5
|
+
* for Jamf Pro, Microsoft Intune, and JumpCloud platforms.
|
|
6
|
+
*
|
|
7
|
+
* @module mdm
|
|
8
|
+
*/
|
|
9
|
+
export * from './jamf.js';
|
|
10
|
+
export * from './intune.js';
|
|
11
|
+
export * from './jumpcloud.js';
|
|
12
|
+
export * from './templates/detect.sh.js';
|
|
13
|
+
export * from './templates/detect.ps1.js';
|
|
14
|
+
export * from './templates/enforce.sh.js';
|
|
15
|
+
export * from './templates/enforce.ps1.js';
|
|
16
|
+
/**
|
|
17
|
+
* Supported MDM platforms.
|
|
18
|
+
*/
|
|
19
|
+
export type MdmPlatform = 'jamf' | 'intune' | 'jumpcloud';
|
|
20
|
+
/**
|
|
21
|
+
* Script generation modes.
|
|
22
|
+
*/
|
|
23
|
+
export type ScriptMode = 'detect' | 'enforce' | 'all';
|
|
24
|
+
/**
|
|
25
|
+
* Unified MDM export options.
|
|
26
|
+
*/
|
|
27
|
+
export interface MdmExportOptions {
|
|
28
|
+
platform: MdmPlatform;
|
|
29
|
+
mode: ScriptMode;
|
|
30
|
+
webhookUrl?: string;
|
|
31
|
+
webhookToken?: string;
|
|
32
|
+
gatewayPort?: number;
|
|
33
|
+
verbose?: boolean;
|
|
34
|
+
quarantine?: boolean;
|
|
35
|
+
outputDir?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generated script file.
|
|
39
|
+
*/
|
|
40
|
+
export interface GeneratedFile {
|
|
41
|
+
filename: string;
|
|
42
|
+
content: string;
|
|
43
|
+
description: string;
|
|
44
|
+
platform: string;
|
|
45
|
+
type: 'script' | 'documentation' | 'extension' | 'config';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* MDM export result.
|
|
49
|
+
*/
|
|
50
|
+
export interface MdmExportResult {
|
|
51
|
+
platform: MdmPlatform;
|
|
52
|
+
displayName: string;
|
|
53
|
+
supportedOS: string[];
|
|
54
|
+
files: GeneratedFile[];
|
|
55
|
+
outputDir?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Platform display names.
|
|
59
|
+
*/
|
|
60
|
+
export declare const PLATFORM_NAMES: Record<MdmPlatform, string>;
|
|
61
|
+
/**
|
|
62
|
+
* Platform supported operating systems.
|
|
63
|
+
*/
|
|
64
|
+
export declare const PLATFORM_OS: Record<MdmPlatform, string[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Validate MDM platform.
|
|
67
|
+
*/
|
|
68
|
+
export declare function isValidPlatform(platform: string): platform is MdmPlatform;
|
|
69
|
+
/**
|
|
70
|
+
* Validate script mode.
|
|
71
|
+
*/
|
|
72
|
+
export declare function isValidMode(mode: string): mode is ScriptMode;
|
|
73
|
+
/**
|
|
74
|
+
* Generate MDM deployment scripts for the specified platform.
|
|
75
|
+
*/
|
|
76
|
+
export declare function generateMdmScripts(options: MdmExportOptions): MdmExportResult;
|
|
77
|
+
/**
|
|
78
|
+
* Write generated files to output directory.
|
|
79
|
+
*/
|
|
80
|
+
export declare function writeMdmFiles(result: MdmExportResult, outputDir: string): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Get supported platforms information.
|
|
83
|
+
*/
|
|
84
|
+
export declare function getSupportedPlatforms(): Array<{
|
|
85
|
+
id: MdmPlatform;
|
|
86
|
+
name: string;
|
|
87
|
+
supportedOS: string[];
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* Generate combined README for all platforms.
|
|
91
|
+
*/
|
|
92
|
+
export declare function generateMasterDocumentation(): string;
|
|
93
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mdm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAO3C;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,eAAe,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAItD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAIrD,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,IAAI,WAAW,CAEzE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,UAAU,CAE5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAgC7E;AAkMD;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC7F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,KAAK,CAAC;IAC7C,EAAE,EAAE,WAAW,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC,CAMD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CA+GpD"}
|