119 lines
4.8 KiB
C#
119 lines
4.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Paca.Core.Config;
|
|
using Paca.Core.Detection;
|
|
using Paca.Core.Security;
|
|
using Xunit;
|
|
|
|
namespace Paca.Tests.Detection;
|
|
|
|
public class UrlAndMediaDetectionExtremeRedTests
|
|
{
|
|
[Theory]
|
|
[InlineData(null)]
|
|
[InlineData("")]
|
|
[InlineData(" ")]
|
|
[InlineData("not a url")]
|
|
[InlineData("javascript:alert('pwn')")]
|
|
[InlineData("data:text/html,<script>alert(1)</script>")]
|
|
[InlineData("file:///C:/Windows/System32/calc.exe")]
|
|
[InlineData("blob:https://youtube.com/1234-5678")]
|
|
public void SocialSiteDetector_TryMatchString_InvalidOrDangerousUrls_ReturnsFalse(string? input)
|
|
{
|
|
var result = SocialSiteDetector.TryMatch(input, out var normalized, out var label);
|
|
Assert.False(result);
|
|
Assert.Empty(normalized);
|
|
Assert.Empty(label);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("https://www.youtube.com/watch?v=dQw4w9WgXcQ", "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "YOUTUBE")]
|
|
[InlineData("https://youtu.be/dQw4w9WgXcQ", "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "YOUTUBE")]
|
|
[InlineData("https://www.youtube.com/shorts/dQw4w9WgXcQ", "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "YOUTUBE")]
|
|
[InlineData("https://twitter.com/OpenAI/status/1234567890", "https://x.com/OpenAI/status/1234567890", "X")]
|
|
[InlineData("https://x.com/OpenAI/status/1234567890", "https://x.com/OpenAI/status/1234567890", "X")]
|
|
[InlineData("https://www.instagram.com/reel/C_xyz123/", "https://www.instagram.com/reel/C_xyz123", "INSTAGRAM")]
|
|
[InlineData("https://www.tiktok.com/@user/video/1234567890", "https://www.tiktok.com/@user/video/1234567890", "TIKTOK")]
|
|
public void SocialSiteDetector_TryMatchString_ValidUrls_NormalizesCorrectly(string input, string expectedUrl, string expectedLabel)
|
|
{
|
|
var result = SocialSiteDetector.TryMatch(input, out var normalized, out var label);
|
|
Assert.True(result);
|
|
Assert.Equal(expectedUrl, normalized);
|
|
Assert.Equal(expectedLabel, label);
|
|
}
|
|
|
|
[Fact]
|
|
public void MediaDetector_Classify_NullConfig_ReturnsNullWithoutThrowing()
|
|
{
|
|
var result = MediaDetector.Classify("https://cdn.example.com/video.mp4", "video/mp4", 1024 * 1024, null!);
|
|
Assert.Null(result);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("javascript:alert('xss')")]
|
|
[InlineData("data:video/mp4;base64,AAAA")]
|
|
[InlineData("file:///C:/videos/test.mp4")]
|
|
[InlineData("blob:https://example.com/uuid-1234")]
|
|
public void MediaDetector_Classify_DangerousSchemes_ReturnsNull(string dangerousUri)
|
|
{
|
|
var config = new AppConfig();
|
|
var result = MediaDetector.Classify(dangerousUri, "video/mp4", 1024 * 1024, config);
|
|
Assert.Null(result);
|
|
}
|
|
|
|
[Fact]
|
|
public void MediaDetector_Classify_InvalidNegativeLengthBelowMinusOne_ReturnsNull()
|
|
{
|
|
var config = new AppConfig();
|
|
var result = MediaDetector.Classify("https://cdn.example.com/video.mp4", "video/mp4", -99999L, config);
|
|
Assert.Null(result);
|
|
}
|
|
|
|
[Fact]
|
|
public void MediaDetector_ProbeFormat_BoundaryFtypBox_RecognizesMp4()
|
|
{
|
|
var ftypBytes = new byte[] { 0, 0, 0, 0x18, (byte)'f', (byte)'t', (byte)'y', (byte)'p', (byte)'m', (byte)'p', (byte)'4', (byte)'2' };
|
|
var format = MediaDetector.ProbeFormat(ftypBytes);
|
|
Assert.Equal("mp4", format);
|
|
}
|
|
|
|
[Fact]
|
|
public void CredentialSecurityAuditor_PerformAudit_NullList_ReturnsHealthyZeroReport()
|
|
{
|
|
var report = CredentialSecurityAuditor.PerformAudit(null!);
|
|
Assert.NotNull(report);
|
|
Assert.Equal(100, report.OverallHealthScore);
|
|
Assert.Equal(0, report.TotalAccounts);
|
|
Assert.Empty(report.Issues);
|
|
}
|
|
|
|
[Fact]
|
|
public void CredentialSecurityAuditor_PerformAudit_ListWithNullElements_FiltersNullsWithoutThrowing()
|
|
{
|
|
var credentials = new List<SiteCredentialRecord?>
|
|
{
|
|
new() { Id = "1", Domain = "example.com", Username = "user1", DecryptedPassword = "Password123!" },
|
|
null,
|
|
new() { Id = "2", Domain = "test.com", Username = "user2", DecryptedPassword = "SuperSecurePassword2026!#" }
|
|
};
|
|
|
|
var report = CredentialSecurityAuditor.PerformAudit(credentials!);
|
|
Assert.NotNull(report);
|
|
Assert.Equal(2, report.TotalAccounts);
|
|
}
|
|
|
|
[Fact]
|
|
public void CredentialSecurityAuditor_PerformAudit_DetectsWeakAndReusedPasswords()
|
|
{
|
|
var credentials = new List<SiteCredentialRecord>
|
|
{
|
|
new() { Id = "1", Domain = "site1.com", Username = "user", DecryptedPassword = "123" },
|
|
new() { Id = "2", Domain = "site2.com", Username = "user", DecryptedPassword = "123" }
|
|
};
|
|
|
|
var report = CredentialSecurityAuditor.PerformAudit(credentials);
|
|
Assert.True(report.WeakPasswordCount > 0);
|
|
Assert.True(report.ReusedPasswordCount > 0);
|
|
Assert.True(report.OverallHealthScore < 100);
|
|
}
|
|
}
|