feat: add security configuration module
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
import { getSecurityConfig, validateSecurityConfig } from './config';
|
||||
|
||||
describe('Security Config', () => {
|
||||
test('should return default security configuration', () => {
|
||||
const config = getSecurityConfig();
|
||||
expect(config).toBeDefined();
|
||||
expect(config.rateLimit.ip.maxRequests).toBe(10);
|
||||
expect(config.rateLimit.ip.windowMinutes).toBe(60);
|
||||
expect(config.captcha.complexity).toBe('medium');
|
||||
});
|
||||
|
||||
test('should validate security config structure', () => {
|
||||
const config = getSecurityConfig();
|
||||
const isValid = validateSecurityConfig(config);
|
||||
expect(isValid).toBe(true);
|
||||
});
|
||||
|
||||
test('should reject invalid config', () => {
|
||||
const invalidConfig = { rateLimit: { ip: { maxRequests: -1 } } };
|
||||
const isValid = validateSecurityConfig(invalidConfig);
|
||||
expect(isValid).toBe(false);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,77 @@
|
||||
export interface SecurityConfig {
|
||||
captcha: {
|
||||
complexity: 'simple' | 'medium' | 'complex';
|
||||
expiryMinutes: number;
|
||||
maxAttempts: number;
|
||||
};
|
||||
rateLimit: {
|
||||
ip: {
|
||||
maxRequests: number;
|
||||
windowMinutes: number;
|
||||
};
|
||||
email: {
|
||||
maxRequests: number;
|
||||
windowHours: number;
|
||||
};
|
||||
global: {
|
||||
maxRequests: number;
|
||||
windowMinutes: number;
|
||||
};
|
||||
};
|
||||
protection: {
|
||||
enableCSRF: boolean;
|
||||
enableInputSanitization: boolean;
|
||||
enableBehaviorDetection: boolean;
|
||||
blockSuspiciousIPs: boolean;
|
||||
};
|
||||
logging: {
|
||||
enableSecurityLogs: boolean;
|
||||
logRetentionDays: number;
|
||||
alertThreshold: number;
|
||||
};
|
||||
}
|
||||
|
||||
const defaultConfig: SecurityConfig = {
|
||||
captcha: {
|
||||
complexity: 'medium',
|
||||
expiryMinutes: 5,
|
||||
maxAttempts: 3,
|
||||
},
|
||||
rateLimit: {
|
||||
ip: {
|
||||
maxRequests: 10,
|
||||
windowMinutes: 60,
|
||||
},
|
||||
email: {
|
||||
maxRequests: 3,
|
||||
windowHours: 24,
|
||||
},
|
||||
global: {
|
||||
maxRequests: 50,
|
||||
windowMinutes: 1,
|
||||
},
|
||||
},
|
||||
protection: {
|
||||
enableCSRF: true,
|
||||
enableInputSanitization: true,
|
||||
enableBehaviorDetection: true,
|
||||
blockSuspiciousIPs: true,
|
||||
},
|
||||
logging: {
|
||||
enableSecurityLogs: true,
|
||||
logRetentionDays: 30,
|
||||
alertThreshold: 5,
|
||||
},
|
||||
};
|
||||
|
||||
export function getSecurityConfig(): SecurityConfig {
|
||||
return { ...defaultConfig };
|
||||
}
|
||||
|
||||
export function validateSecurityConfig(config: any): boolean {
|
||||
if (!config || typeof config !== 'object') return false;
|
||||
if (!config.rateLimit || !config.captcha || !config.protection) return false;
|
||||
if (config.rateLimit.ip?.maxRequests < 0) return false;
|
||||
if (config.captcha.expiryMinutes <= 0) return false;
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user