diff --git a/FileOrganizer.Tests/MetadataEngineTests.cs b/FileOrganizer.Tests/MetadataEngineTests.cs new file mode 100644 index 0000000..adb043d --- /dev/null +++ b/FileOrganizer.Tests/MetadataEngineTests.cs @@ -0,0 +1,33 @@ +using System; +using System.Reflection; +using FileOrganizer.Engines; +using Xunit; + +namespace FileOrganizer.Tests +{ + public class MetadataEngineTests + { + private readonly MetadataEngine _engine = new MetadataEngine(); + + private string CallSanitizeForPath(string input) + { + var method = typeof(MetadataEngine).GetMethod("SanitizeForPath", BindingFlags.NonPublic | BindingFlags.Instance); + return (string)method.Invoke(_engine, new object[] { input }); + } + + [Theory] + [InlineData("ValidName", "ValidName")] + [InlineData(" TrimmedName ", "TrimmedName")] + [InlineData("Name/With/Slash", "NameWithSlash")] + [InlineData("Name\\With\\Backslash", "NameWithBackslash")] + [InlineData("..", "Unknown")] + [InlineData("../etc/passwd", "etcpasswd")] + [InlineData(".", "Unknown")] + [InlineData("valid.name", "validname")] + public void SanitizeForPath_RemovesInvalidAndPathTraversalChars(string input, string expected) + { + string actual = CallSanitizeForPath(input); + Assert.Equal(expected, actual); + } + } +} diff --git a/FileOrganizer/Engines/MetadataEngine.cs b/FileOrganizer/Engines/MetadataEngine.cs index 33c3697..046ebb8 100644 --- a/FileOrganizer/Engines/MetadataEngine.cs +++ b/FileOrganizer/Engines/MetadataEngine.cs @@ -130,10 +130,14 @@ private string GetImageSubFolder(string filePath) private string SanitizeForPath(string folderName) { folderName = folderName.Trim(); + // Remove invalid characters for a file name foreach (char c in Path.GetInvalidFileNameChars()) { folderName = folderName.Replace(c.ToString(), ""); } + // Remove dots to prevent path traversal (e.g., ".." or ".") + folderName = folderName.Replace(".", ""); + return folderName.Length > 0 ? folderName : "Unknown"; } }