sanitize and validate name of file s3.
This commit is contained in:
parent
4e0c49fcf0
commit
8314145b44
@ -212,5 +212,15 @@ namespace PoweredSoft.Storage.Azure.Blob
|
|||||||
var container = GetContainer();
|
var container = GetContainer();
|
||||||
return encoding.GetString(await this.GetFileBytesAsync(path));
|
return encoding.GetString(await this.GetFileBytesAsync(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsFileNameAllowed(string fileName)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SanitizeFileName(string key, string replacement)
|
||||||
|
{
|
||||||
|
return key;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,5 +20,8 @@ namespace PoweredSoft.Storage.Core
|
|||||||
Task DeleteFileAsync(string path);
|
Task DeleteFileAsync(string path);
|
||||||
Task DeleteDirectoryAsync(string path, bool force = false);
|
Task DeleteDirectoryAsync(string path, bool force = false);
|
||||||
Task<IDirectoryInfo> CreateDirectoryAsync(string path);
|
Task<IDirectoryInfo> CreateDirectoryAsync(string path);
|
||||||
|
|
||||||
|
bool IsFileNameAllowed(string fileName);
|
||||||
|
string SanitizeFileName(string key, string replacement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -145,5 +145,15 @@ namespace PoweredSoft.Storage.Physical
|
|||||||
if (!Directory.Exists(directoryPath))
|
if (!Directory.Exists(directoryPath))
|
||||||
Directory.CreateDirectory(directoryPath);
|
Directory.CreateDirectory(directoryPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsFileNameAllowed(string fileName)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SanitizeFileName(string key, string replacement)
|
||||||
|
{
|
||||||
|
return key;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ using System.Collections.Generic;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace PoweredSoft.Storage.S3
|
namespace PoweredSoft.Storage.S3
|
||||||
@ -223,5 +224,27 @@ namespace PoweredSoft.Storage.S3
|
|||||||
var ret = new S3FileInfo(s3o);
|
var ret = new S3FileInfo(s3o);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string SanitizeFileName(string key, string replacement)
|
||||||
|
{
|
||||||
|
string pattern = @"[^a-zA-Z0-9.!/-_*'()]";
|
||||||
|
string substitution = replacement;
|
||||||
|
string input = key;
|
||||||
|
RegexOptions options = RegexOptions.Multiline;
|
||||||
|
|
||||||
|
Regex regex = new Regex(pattern, options);
|
||||||
|
|
||||||
|
string result = regex.Replace(input, substitution);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsFileNameAllowed(string fileName)
|
||||||
|
{
|
||||||
|
string pattern = @"[^a-zA-Z0-9.!/-_*'()]";
|
||||||
|
RegexOptions options = RegexOptions.Multiline;
|
||||||
|
Regex regex = new Regex(pattern, options);
|
||||||
|
var hasMatches = regex.IsMatch(fileName);
|
||||||
|
return false == hasMatches;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
20
PoweredSoft.Storage.Test/PoweredSoft.Storage.Test.csproj
Normal file
20
PoweredSoft.Storage.Test/PoweredSoft.Storage.Test.csproj
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
|
||||||
|
<IsPackable>false</IsPackable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
|
||||||
|
<PackageReference Include="MSTest.TestAdapter" Version="2.1.0" />
|
||||||
|
<PackageReference Include="MSTest.TestFramework" Version="2.1.0" />
|
||||||
|
<PackageReference Include="coverlet.collector" Version="1.2.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\PoweredSoft.Storage.S3\PoweredSoft.Storage.S3.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
35
PoweredSoft.Storage.Test/S3Tests.cs
Normal file
35
PoweredSoft.Storage.Test/S3Tests.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
using PoweredSoft.Storage.S3;
|
||||||
|
|
||||||
|
namespace PoweredSoft.Storage.Test
|
||||||
|
{
|
||||||
|
[TestClass]
|
||||||
|
public class S3Tests
|
||||||
|
{
|
||||||
|
[TestMethod]
|
||||||
|
public void NameValidation()
|
||||||
|
{
|
||||||
|
var space = GetMockS3Space();
|
||||||
|
|
||||||
|
Assert.IsFalse(space.IsFileNameAllowed("Operations .pdf"), "Should not be valid");
|
||||||
|
Assert.IsFalse(space.IsFileNameAllowed("Operations$$.pdf"), "Should not be valid");
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void NameSanitation()
|
||||||
|
{
|
||||||
|
var space = GetMockS3Space();
|
||||||
|
|
||||||
|
Assert.AreEqual("Operations_.pdf", space.SanitizeFileName("Operations .pdf", "_"), "does not match sanitation expectations");
|
||||||
|
Assert.AreEqual("Operations__.pdf", space.SanitizeFileName("Operations$$.pdf", "_"), "does not match sanitation expectations");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static S3StorageProvider GetMockS3Space()
|
||||||
|
{
|
||||||
|
var space = new S3StorageProvider("http://localhost:9000", "mybucket", "myminio", "myexample");
|
||||||
|
space.SetForcePathStyle(true);
|
||||||
|
space.SetS3UsEast1RegionalEndpointValue(Amazon.Runtime.S3UsEast1RegionalEndpointValue.Legacy);
|
||||||
|
return space;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 15.0.28307.852
|
VisualStudioVersion = 16.0.30406.217
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PoweredSoft.Storage.Azure", "PoweredSoft.Storage.Azure\PoweredSoft.Storage.Azure.csproj", "{B937F389-07BE-4235-B2A8-7D1229B3D0FC}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PoweredSoft.Storage.Azure", "PoweredSoft.Storage.Azure\PoweredSoft.Storage.Azure.csproj", "{B937F389-07BE-4235-B2A8-7D1229B3D0FC}"
|
||||||
EndProject
|
EndProject
|
||||||
@ -11,6 +11,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PoweredSoft.Storage.Physica
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PoweredSoft.Storage.S3", "PoweredSoft.Storage.S3\PoweredSoft.Storage.S3.csproj", "{457912EA-48E3-4B2E-941F-2116D18C6D88}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PoweredSoft.Storage.S3", "PoweredSoft.Storage.S3\PoweredSoft.Storage.S3.csproj", "{457912EA-48E3-4B2E-941F-2116D18C6D88}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoweredSoft.Storage.Test", "PoweredSoft.Storage.Test\PoweredSoft.Storage.Test.csproj", "{305416EE-51A4-4293-9262-87865D2784F4}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@ -33,6 +35,10 @@ Global
|
|||||||
{457912EA-48E3-4B2E-941F-2116D18C6D88}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{457912EA-48E3-4B2E-941F-2116D18C6D88}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{457912EA-48E3-4B2E-941F-2116D18C6D88}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{457912EA-48E3-4B2E-941F-2116D18C6D88}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{457912EA-48E3-4B2E-941F-2116D18C6D88}.Release|Any CPU.Build.0 = Release|Any CPU
|
{457912EA-48E3-4B2E-941F-2116D18C6D88}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{305416EE-51A4-4293-9262-87865D2784F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{305416EE-51A4-4293-9262-87865D2784F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{305416EE-51A4-4293-9262-87865D2784F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{305416EE-51A4-4293-9262-87865D2784F4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
Loading…
Reference in New Issue
Block a user