Skip to main content
Glama
intune-policy-validator.ts19.8 kB
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js'; interface PolicyValidationResult { isValid: boolean; errors: string[]; warnings: string[]; } // Policy validation rules by platform and type const POLICY_VALIDATION_RULES = { macos: { Configuration: { requiredFields: ['customConfiguration.payloadFileName', 'customConfiguration.payload'], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; if (!settings.customConfiguration) { errors.push('macOS Configuration policies require a customConfiguration object'); } else { if (!settings.customConfiguration.payloadFileName) { errors.push('customConfiguration.payloadFileName is required'); } if (!settings.customConfiguration.payload) { errors.push('customConfiguration.payload is required (base64 encoded .mobileconfig)'); } // Validate payload is base64 if (settings.customConfiguration.payload && !isValidBase64(settings.customConfiguration.payload)) { warnings.push('customConfiguration.payload should be base64 encoded'); } } return { isValid: errors.length === 0, errors, warnings }; } }, Compliance: { requiredFields: [], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; if (!settings.compliance) { warnings.push('macOS Compliance policies should have a compliance object with settings'); } else { // Validate compliance settings if (settings.compliance.passwordMinimumLength && settings.compliance.passwordMinimumLength < 4) { errors.push('passwordMinimumLength must be at least 4'); } if (settings.compliance.passwordRequiredType && !['deviceDefault', 'alphanumeric', 'numeric'].includes(settings.compliance.passwordRequiredType)) { errors.push('passwordRequiredType must be one of: deviceDefault, alphanumeric, numeric'); } if (settings.compliance.gatekeeperAllowedAppSource && !['notConfigured', 'macAppStore', 'macAppStoreAndIdentifiedDevelopers', 'anywhere'].includes( settings.compliance.gatekeeperAllowedAppSource)) { errors.push('gatekeeperAllowedAppSource has invalid value'); } } return { isValid: errors.length === 0, errors, warnings }; } }, Security: { requiredFields: [], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; warnings.push('macOS Security policies are not fully implemented. Consider using Configuration policies with security-focused .mobileconfig'); return { isValid: errors.length === 0, errors, warnings }; } }, Update: { requiredFields: [], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; warnings.push('macOS Update policies are not fully implemented. Consider using Configuration policies with software update .mobileconfig'); return { isValid: errors.length === 0, errors, warnings }; } }, AppProtection: { requiredFields: [], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; warnings.push('macOS AppProtection policies are not fully implemented'); return { isValid: errors.length === 0, errors, warnings }; } } }, windows: { Configuration: { requiredFields: [], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; // Windows Configuration policies use direct settings if (Object.keys(settings).length === 0) { warnings.push('No configuration settings provided. Policy will use defaults.'); } return { isValid: errors.length === 0, errors, warnings }; } }, Compliance: { requiredFields: [], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; // Validate password settings if (settings.passwordMinimumLength && settings.passwordMinimumLength < 0) { errors.push('passwordMinimumLength cannot be negative'); } if (settings.passwordRequiredType && !['deviceDefault', 'alphanumeric', 'numeric'].includes(settings.passwordRequiredType)) { errors.push('passwordRequiredType must be one of: deviceDefault, alphanumeric, numeric'); } return { isValid: errors.length === 0, errors, warnings }; } }, Security: { requiredFields: [], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; if (!settings.templateId) { warnings.push('Security policies typically require a templateId. Using default security baseline template.'); } return { isValid: errors.length === 0, errors, warnings }; } }, Update: { requiredFields: [], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; if (settings.qualityUpdatesDeferralPeriodInDays && (settings.qualityUpdatesDeferralPeriodInDays < 0 || settings.qualityUpdatesDeferralPeriodInDays > 30)) { errors.push('qualityUpdatesDeferralPeriodInDays must be between 0 and 30'); } if (settings.featureUpdatesDeferralPeriodInDays && (settings.featureUpdatesDeferralPeriodInDays < 0 || settings.featureUpdatesDeferralPeriodInDays > 365)) { errors.push('featureUpdatesDeferralPeriodInDays must be between 0 and 365'); } return { isValid: errors.length === 0, errors, warnings }; } }, AppProtection: { requiredFields: [], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; return { isValid: errors.length === 0, errors, warnings }; } }, EndpointSecurity: { requiredFields: [], validate: (settings: any): PolicyValidationResult => { const errors: string[] = []; const warnings: string[] = []; if (!settings.templateId) { warnings.push('EndpointSecurity policies typically require a templateId. Using default endpoint security template.'); } return { isValid: errors.length === 0, errors, warnings }; } } } }; // Default values for policies export const POLICY_DEFAULTS = { macos: { Configuration: { customConfiguration: { payloadFileName: 'configuration.mobileconfig', payload: '' // Should be provided by user } }, Compliance: { compliance: { passwordRequired: false, passwordMinimumLength: 4, passwordMinutesOfInactivityBeforeLock: 15, storageRequireEncryption: true, systemIntegrityProtectionEnabled: true, firewallEnabled: true, gatekeeperAllowedAppSource: 'macAppStoreAndIdentifiedDevelopers' } } }, windows: { Configuration: { // Basic security defaults passwordRequired: true, passwordBlockSimple: true, passwordMinimumLength: 8, defenderMonitorFileActivity: true, defenderScanNetworkFiles: true, defenderEnableScanIncomingMail: true, defenderEnableScanMappedNetworkDrivesDuringFullScan: true }, Compliance: { passwordRequired: true, passwordBlockSimple: true, passwordMinimumLength: 8, passwordMinutesOfInactivityBeforeLock: 15, osMinimumVersion: '10.0.19041', storageRequireEncryption: true, activeFirewallRequired: true, defenderEnabled: true, antivirusRequired: true, antiSpywareRequired: true }, Security: { templateId: 'd1174162-1dd2-4976-affc-6667049ab0ae' // Default security baseline }, Update: { automaticUpdateMode: 'autoInstallAndRebootAtScheduledTime', microsoftUpdateServiceAllowed: true, driversExcluded: false, qualityUpdatesDeferralPeriodInDays: 0, featureUpdatesDeferralPeriodInDays: 0, businessReadyUpdatesOnly: 'all' }, EndpointSecurity: { templateId: 'e044e60e-5901-41ea-92c5-87e8b6edd6bb' // Default endpoint security } } }; // Policy templates for common scenarios export const POLICY_TEMPLATES = { macos: { basicSecurity: { name: 'macOS Basic Security Policy', description: 'Basic security configuration for macOS devices', policyType: 'Compliance', settings: { compliance: { passwordRequired: true, passwordMinimumLength: 8, passwordMinutesOfInactivityBeforeLock: 5, passwordRequiredType: 'alphanumeric', storageRequireEncryption: true, osMinimumVersion: '14.0', systemIntegrityProtectionEnabled: true, firewallEnabled: true, firewallBlockAllIncoming: false, firewallEnableStealthMode: true, gatekeeperAllowedAppSource: 'macAppStoreAndIdentifiedDevelopers' } } }, strictSecurity: { name: 'macOS Strict Security Policy', description: 'Strict security configuration for high-security macOS devices', policyType: 'Compliance', settings: { compliance: { passwordRequired: true, passwordMinimumLength: 12, passwordMinutesOfInactivityBeforeLock: 2, passwordMinutesOfInactivityBeforeScreenTimeout: 2, passwordPreviousPasswordBlockCount: 5, passwordRequiredType: 'alphanumeric', storageRequireEncryption: true, osMinimumVersion: '14.0', systemIntegrityProtectionEnabled: true, firewallEnabled: true, firewallBlockAllIncoming: true, firewallEnableStealthMode: true, gatekeeperAllowedAppSource: 'macAppStore', deviceThreatProtectionEnabled: true, deviceThreatProtectionRequiredSecurityLevel: 'secured' } } } }, windows: { basicSecurity: { name: 'Windows Basic Security Policy', description: 'Basic security configuration for Windows devices', policyType: 'Compliance', settings: { passwordRequired: true, passwordBlockSimple: true, passwordMinimumLength: 8, passwordMinutesOfInactivityBeforeLock: 15, passwordExpirationDays: 90, passwordPreviousPasswordBlockCount: 5, passwordRequiredType: 'alphanumeric', requireHealthyDeviceReport: true, osMinimumVersion: '10.0.19041', bitLockerEnabled: true, secureBootEnabled: true, codeIntegrityEnabled: true, storageRequireEncryption: true, activeFirewallRequired: true, defenderEnabled: true, antivirusRequired: true, antiSpywareRequired: true, rtpEnabled: true } }, strictSecurity: { name: 'Windows Strict Security Policy', description: 'Strict security configuration for high-security Windows devices', policyType: 'Compliance', settings: { passwordRequired: true, passwordBlockSimple: true, passwordMinimumLength: 14, passwordMinutesOfInactivityBeforeLock: 5, passwordExpirationDays: 60, passwordMinimumCharacterSetCount: 3, passwordPreviousPasswordBlockCount: 12, passwordRequiredType: 'alphanumeric', requireHealthyDeviceReport: true, osMinimumVersion: '10.0.22000', // Windows 11 earlyLaunchAntiMalwareDriverEnabled: true, bitLockerEnabled: true, secureBootEnabled: true, codeIntegrityEnabled: true, storageRequireEncryption: true, activeFirewallRequired: true, defenderEnabled: true, antivirusRequired: true, antiSpywareRequired: true, rtpEnabled: true, signatureOutOfDate: false } }, windowsUpdate: { name: 'Windows Update Management Policy', description: 'Standard Windows Update configuration', policyType: 'Update', settings: { automaticUpdateMode: 'autoInstallAndRebootAtScheduledTime', microsoftUpdateServiceAllowed: true, driversExcluded: false, qualityUpdatesDeferralPeriodInDays: 7, featureUpdatesDeferralPeriodInDays: 30, businessReadyUpdatesOnly: 'businessReadyOnly', prereleaseFeatures: 'notAllowed', deliveryOptimizationMode: 'httpWithPeeringNat', installationSchedule: { scheduledInstallDay: 'sunday', scheduledInstallTime: '03:00', activeHoursStart: '08:00', activeHoursEnd: '17:00' } } } } }; // Helper functions function isValidBase64(str: string): boolean { try { return btoa(atob(str)) === str; } catch (err) { return false; } } function checkRequiredFields(obj: any, paths: string[]): string[] { const missing: string[] = []; for (const path of paths) { const parts = path.split('.'); let current = obj; for (let i = 0; i < parts.length; i++) { if (!current || !(parts[i] in current)) { missing.push(path); break; } current = current[parts[i]]; } } return missing; } // Main validation function export function validatePolicySettings( platform: string, policyType: string, settings: any ): PolicyValidationResult { const platformRules = POLICY_VALIDATION_RULES[platform as keyof typeof POLICY_VALIDATION_RULES]; if (!platformRules) { return { isValid: false, errors: [`Unsupported platform: ${platform}`], warnings: [] }; } const typeRules = platformRules[policyType as keyof typeof platformRules]; if (!typeRules) { return { isValid: false, errors: [`Unsupported policy type for ${platform}: ${policyType}`], warnings: [] }; } // Check required fields const missingFields = checkRequiredFields(settings, typeRules.requiredFields); if (missingFields.length > 0) { return { isValid: false, errors: missingFields.map(field => `Required field missing: ${field}`), warnings: [] }; } // Run specific validation return typeRules.validate(settings); } // Apply defaults to settings export function applyPolicyDefaults( platform: string, policyType: string, settings: any ): any { const platformDefaults = POLICY_DEFAULTS[platform as keyof typeof POLICY_DEFAULTS]; if (!platformDefaults) { return settings; } const typeDefaults = platformDefaults[policyType as keyof typeof platformDefaults]; if (!typeDefaults) { return settings; } // Deep merge defaults with provided settings return deepMerge(typeDefaults, settings); } // Deep merge helper function deepMerge(target: any, source: any): any { const output = { ...target }; if (isObject(target) && isObject(source)) { Object.keys(source).forEach(key => { if (isObject(source[key])) { if (!(key in target)) { Object.assign(output, { [key]: source[key] }); } else { output[key] = deepMerge(target[key], source[key]); } } else { Object.assign(output, { [key]: source[key] }); } }); } return output; } function isObject(item: any): boolean { return item && typeof item === 'object' && !Array.isArray(item); } // Generate policy creation example export function generatePolicyExample( platform: string, policyType: string ): string { const examples: any = { macos: { Configuration: { platform: 'macos', policyType: 'Configuration', displayName: 'macOS Configuration Policy', description: 'Custom configuration for macOS devices', settings: { customConfiguration: { payloadFileName: 'custom.mobileconfig', payload: 'BASE64_ENCODED_MOBILECONFIG_CONTENT' } }, assignments: [ { target: { groupId: 'GROUP_ID_HERE' }, intent: 'apply' } ] }, Compliance: { platform: 'macos', policyType: 'Compliance', displayName: 'macOS Compliance Policy', description: 'Compliance requirements for macOS devices', settings: { compliance: { passwordRequired: true, passwordMinimumLength: 8, storageRequireEncryption: true, firewallEnabled: true, osMinimumVersion: '14.0' } } } }, windows: { Configuration: { platform: 'windows', policyType: 'Configuration', displayName: 'Windows Configuration Policy', description: 'Configuration settings for Windows devices', settings: { passwordRequired: true, passwordMinimumLength: 8, defenderEnabled: true, firewallEnabled: true } }, Compliance: { platform: 'windows', policyType: 'Compliance', displayName: 'Windows Compliance Policy', description: 'Compliance requirements for Windows devices', settings: { passwordRequired: true, passwordMinimumLength: 8, bitLockerEnabled: true, storageRequireEncryption: true, osMinimumVersion: '10.0.19041' } }, Update: { platform: 'windows', policyType: 'Update', displayName: 'Windows Update Policy', description: 'Update configuration for Windows devices', settings: { automaticUpdateMode: 'autoInstallAndRebootAtScheduledTime', qualityUpdatesDeferralPeriodInDays: 7, featureUpdatesDeferralPeriodInDays: 30 } } } }; const example = examples[platform]?.[policyType]; if (!example) { return `No example available for ${platform} ${policyType} policy`; } return JSON.stringify(example, null, 2); } // Validate assignments export function validateAssignments(assignments: any[]): PolicyValidationResult { const errors: string[] = []; const warnings: string[] = []; if (!Array.isArray(assignments)) { errors.push('Assignments must be an array'); return { isValid: false, errors, warnings }; } assignments.forEach((assignment, index) => { if (!assignment.target) { errors.push(`Assignment ${index}: missing target`); } else { if (!assignment.target.groupId && !assignment.target.deviceAndAppManagementAssignmentFilterId) { warnings.push(`Assignment ${index}: no groupId or filter specified. Policy may not be assigned.`); } } if (assignment.intent && !['apply', 'remove'].includes(assignment.intent)) { errors.push(`Assignment ${index}: invalid intent '${assignment.intent}'. Must be 'apply' or 'remove'`); } }); return { isValid: errors.length === 0, errors, warnings }; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DynamicEndpoints/m365-core-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server