',
// Mixed content attacks
'Normal text more text',
'[b]Bold text[/b]',
'**Bold

text**'
];
// CSS Injection Test Vectors
const CSS_INJECTION_VECTORS = [
'color: red; background: url(javascript:alert("XSS"))',
'font-family: "Arial"; } body { background: red; .fake {',
'font-size: expression(alert("XSS"))',
'background: url("data:text/html,")',
'color: red; } .injected { background: red',
'@import url("malicious.css")',
'behavior: url("malicious.htc")'
];
// Test Results Interface
interface SecurityTestResult {
input: string;
output: string;
passed: boolean;
vulnerabilities: string[];
testType: string;
}
interface SecurityTestSuite {
xssTests: SecurityTestResult[];
cssInjectionTests: SecurityTestResult[];
validationTests: SecurityTestResult[];
gradientTests: SecurityTestResult[];
summary: {
totalTests: number;
passed: number;
failed: number;
vulnerabilities: string[];
};
}
// Check if output contains dangerous patterns
function detectVulnerabilities(output: string): string[] {
const vulnerabilities: string[] = [];
// Script tags
if (/',
'Very long text '.repeat(200), // Test length limits
'', // Empty text
'Text with\nnewlines\nand\ttabs',
'Special chars: <>&"\'`',
'Unicode: δ½ ε₯½δΈη π π',
'Mixed: Normal **bold** and '
];
for (const testCase of testCases) {
const validation = validateMessageContent(testCase);
const vulnerabilities = detectVulnerabilities(validation.sanitizedContent);
results.push({
input: testCase,
output: validation.sanitizedContent,
passed: validation.isValid && vulnerabilities.length === 0,
vulnerabilities: [...validation.errors, ...vulnerabilities],
testType: 'Validation'
});
}
return results;
}
// Run gradient text security tests
function runGradientTests(): SecurityTestResult[] {
const results: SecurityTestResult[] = [];
const testCases = [
'Normal gradient text',
'',
'Text with "quotes" and \'apostrophes\'',
'Very long gradient text '.repeat(50),
'Special chars: <>&\'"',
''
];
const testColors = ['#FF0000', '#00FF00', '#0000FF'];
for (const testCase of testCases) {
try {
const output = createGradientText(testCase, testColors);
const vulnerabilities = detectVulnerabilities(output);
results.push({
input: testCase,
output,
passed: vulnerabilities.length === 0,
vulnerabilities,
testType: 'Gradient'
});
} catch (error) {
results.push({
input: testCase,
output: `Error: ${error}`,
passed: true,
vulnerabilities: [],
testType: 'Gradient'
});
}
}
return results;
}
// Run complete security test suite
export async function runSecurityTestSuite(): Promise
{
console.log('π Running comprehensive security test suite...');
const xssTests = await runXSSTests();
const cssInjectionTests = await runCSSInjectionTests();
const validationTests = runValidationTests();
const gradientTests = runGradientTests();
const allTests = [...xssTests, ...cssInjectionTests, ...validationTests, ...gradientTests];
const passed = allTests.filter((test) => test.passed).length;
const failed = allTests.length - passed;
// Collect all unique vulnerabilities
const allVulnerabilities = new Set();
allTests.forEach((test) => {
test.vulnerabilities.forEach((vuln) => allVulnerabilities.add(vuln));
});
const results: SecurityTestSuite = {
xssTests,
cssInjectionTests,
validationTests,
gradientTests,
summary: {
totalTests: allTests.length,
passed,
failed,
vulnerabilities: Array.from(allVulnerabilities)
}
};
console.log(`β
Security tests completed:`);
console.log(` Total tests: ${results.summary.totalTests}`);
console.log(` Passed: ${results.summary.passed}`);
console.log(` Failed: ${results.summary.failed}`);
if (results.summary.vulnerabilities.length > 0) {
console.warn(`β οΈ Vulnerabilities detected:`, results.summary.vulnerabilities);
} else {
console.log(`π‘οΈ No vulnerabilities detected!`);
}
return results;
}
// Quick security check function
export async function quickSecurityCheck(input: string): Promise {
try {
const output = await formatText(input, DEFAULT_TEXT_STYLE, true);
const vulnerabilities = detectVulnerabilities(output);
return vulnerabilities.length === 0;
} catch {
// Errors on malicious input are acceptable
return true;
}
}
// Style validation tests
export function testStyleValidation(): boolean {
const testCases = [
// Valid styles
{ fontFamily: 'tahoma', fontSize: 14, color: 'red', bold: true },
{ fontFamily: 'verdana', fontSize: 16, color: 'blue', italic: true },
// Invalid styles (should be sanitized)
{ fontFamily: 'malicious-font', fontSize: 999, color: 'invalid-color' },
{ fontFamily: 'tahoma', fontSize: -10, color: 'red' },
{ fontFamily: 'tahoma', fontSize: 'invalid' as unknown as number, color: 'red' }
];
for (const testCase of testCases) {
try {
const validated = validateTextStyle(testCase as Partial);
// Check that validated style has safe values
if (!validated.fontFamily || validated.fontSize < 8 || validated.fontSize > 72) {
console.error('Style validation failed for:', testCase);
return false;
}
} catch (error) {
console.error('Style validation error:', error);
return false;
}
}
return true;
}
// Export test utilities
export {
XSS_TEST_VECTORS,
CSS_INJECTION_VECTORS,
detectVulnerabilities,
type SecurityTestResult,
type SecurityTestSuite
};