UNPKG

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
#!/usr/bin/env node /** * 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;