framework-mcp
Version:
Dual-architecture server (MCP + HTTP API) for determining vendor tool capability roles against CIS Controls Framework. Supports Microsoft Copilot custom connectors and DigitalOcean App Services deployment.
176 lines (145 loc) ⢠6.05 kB
JavaScript
/**
* Comprehensive Validation Script for CIS Safeguards Migration
* This script will be used to validate data integrity during and after migration
*/
const fs = require('fs');
class SafeguardsValidator {
constructor() {
this.expectedCount = 153;
this.expectedControls = 18;
this.requiredFields = [
'id', 'title', 'description', 'implementationGroup',
'assetType', 'securityFunction', 'governanceElements',
'coreRequirements', 'subTaxonomicalElements',
'implementationSuggestions', 'relatedSafeguards', 'keywords'
];
}
validateFile(filePath) {
console.log(`š Validating: ${filePath}\n`);
if (!fs.existsSync(filePath)) {
console.log('ā File not found');
return false;
}
const content = fs.readFileSync(filePath, 'utf8');
return this.validateContent(content);
}
validateContent(content) {
const results = {
countTest: false,
duplicateTest: false,
formatTest: false,
syntaxTest: false,
fieldsTest: false,
controlsTest: false
};
try {
// Extract safeguards data
let safeguardsData;
if (content.includes('this.safeguards = ')) {
// SafeguardManager format
const match = content.match(/this\.safeguards = ({[\s\S]*});/);
safeguardsData = match ? match[1] : null;
} else {
// Raw CIS_SAFEGUARDS format
const match = content.match(/= ({[\s\S]*});/);
safeguardsData = match ? match[1] : null;
}
if (!safeguardsData) {
console.log('ā Could not extract safeguards data');
return false;
}
// Parse the data
const safeguards = eval(`(${safeguardsData})`);
const safeguardIds = Object.keys(safeguards);
// Test 1: Count validation
console.log('š Count Validation:');
console.log(` Expected: ${this.expectedCount}`);
console.log(` Found: ${safeguardIds.length}`);
results.countTest = safeguardIds.length === this.expectedCount;
console.log(` Result: ${results.countTest ? 'ā
' : 'ā'}\n`);
// Test 2: Duplicate check
console.log('š Duplicate Check:');
const duplicates = safeguardIds.filter((id, index) => safeguardIds.indexOf(id) !== index);
results.duplicateTest = duplicates.length === 0;
console.log(` Duplicates found: ${duplicates.length}`);
console.log(` Result: ${results.duplicateTest ? 'ā
' : 'ā'}\n`);
// Test 3: ID format validation
console.log('š Format Validation:');
const invalidFormats = safeguardIds.filter(id => !/^\d+\.\d+$/.test(id));
results.formatTest = invalidFormats.length === 0;
console.log(` Invalid formats: ${invalidFormats.length}`);
console.log(` Result: ${results.formatTest ? 'ā
' : 'ā'}\n`);
// Test 4: Syntax validation (already done by eval above)
console.log('āļø Syntax Validation:');
results.syntaxTest = true; // If we got here, syntax is valid
console.log(` Result: ā
\n`);
// Test 5: Required fields validation
console.log('š Fields Validation:');
let fieldsValid = true;
const sampleSafeguard = safeguards[safeguardIds[0]];
const missingFields = this.requiredFields.filter(field => !(field in sampleSafeguard));
if (missingFields.length > 0) {
console.log(` Missing fields in sample: ${missingFields.join(', ')}`);
fieldsValid = false;
}
// Check a few random safeguards for field completeness
const testSafeguards = [safeguardIds[0], safeguardIds[Math.floor(safeguardIds.length / 2)], safeguardIds[safeguardIds.length - 1]];
for (const id of testSafeguards) {
const missing = this.requiredFields.filter(field => !(field in safeguards[id]));
if (missing.length > 0) {
console.log(` Missing fields in ${id}: ${missing.join(', ')}`);
fieldsValid = false;
}
}
results.fieldsTest = fieldsValid;
console.log(` Result: ${fieldsValid ? 'ā
' : 'ā'}\n`);
// Test 6: Control coverage
console.log('šÆ Control Coverage:');
const controlCounts = {};
safeguardIds.forEach(id => {
const control = parseInt(id.split('.')[0]);
controlCounts[control] = (controlCounts[control] || 0) + 1;
});
let allControlsPresent = true;
for (let i = 1; i <= this.expectedControls; i++) {
const count = controlCounts[i] || 0;
if (count === 0) {
console.log(` ā Control ${i}: Missing`);
allControlsPresent = false;
} else {
console.log(` ā
Control ${i}: ${count} safeguards`);
}
}
results.controlsTest = allControlsPresent;
console.log(` Result: ${allControlsPresent ? 'ā
' : 'ā'}\n`);
} catch (error) {
console.log('ā Validation error:', error.message);
return false;
}
// Overall result
const allTestsPassed = Object.values(results).every(test => test);
console.log('šÆ Overall Validation Result:');
console.log(` Status: ${allTestsPassed ? 'ā
PASSED' : 'ā FAILED'}`);
console.log(` Details:`, results);
return allTestsPassed;
}
}
// Main execution
if (require.main === module) {
const validator = new SafeguardsValidator();
console.log('š CIS Safeguards Comprehensive Validation\n');
console.log('=' .repeat(50) + '\n');
// Test the formatted data ready for integration
const testFile = '/tmp/formatted_safeguards_ready.ts';
const isValid = validator.validateFile(testFile);
console.log('\n' + '='.repeat(50));
console.log(`Final Result: ${isValid ? 'ā
READY FOR INTEGRATION' : 'ā NOT READY'}`);
if (!isValid) {
console.log('\nā Issues found - please fix before proceeding with integration');
process.exit(1);
} else {
console.log('\nš All validations passed - data is ready for SafeguardManager integration!');
}
}
module.exports = SafeguardsValidator;