Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 31 additions & 3 deletions Models/SQLFileProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -580,7 +580,11 @@ public FileStreamResult Download(string path, string[] names, params FileManager
if (isFile)
{
string safePath = SanitizeAndValidatePath(Path.GetTempPath() + files[i]);
zipEntry = archive.CreateEntryFromFile(safePath, files[i], CompressionLevel.Fastest);
string sanitizedEntryName = SanitizeZipEntryName(files[i]);
if (!string.IsNullOrEmpty(sanitizedEntryName))
{
zipEntry = archive.CreateEntryFromFile(safePath, sanitizedEntryName, CompressionLevel.Fastest);
}
}
else
{
Expand Down Expand Up @@ -628,7 +632,11 @@ public void DownloadFolder(ZipArchive archive, string subFolderName, SqlConnecti
string parentID = "";
string fileName = "";
bool isFile = false;
zipEntry = archive.CreateEntry(folderName + "/");
string sanitizedFolderName = SanitizeZipEntryName(folderName + "/");
if (!string.IsNullOrEmpty(sanitizedFolderName))
{
zipEntry = archive.CreateEntry(sanitizedFolderName);
}
SqlCommand readCommand = new SqlCommand("SELECT * FROM " + tableName + " WHERE Name = @SubFolderName", sqlConnection);
readCommand.Parameters.AddWithValue("@SubFolderName", subFolderName);
SqlDataReader readCommandReader = readCommand.ExecuteReader();
Expand All @@ -654,7 +662,12 @@ public void DownloadFolder(ZipArchive archive, string subFolderName, SqlConnecti
{
file.Write(fileContent, 0, fileContent.Length);
file.Close();
zipEntry = archive.CreateEntryFromFile(safePath, folderName + "\\" + fileName, CompressionLevel.Fastest);
string entryPath = folderName + "/" + fileName;
string sanitizedEntryName = SanitizeZipEntryName(entryPath);
if (!string.IsNullOrEmpty(sanitizedEntryName))
{
zipEntry = archive.CreateEntryFromFile(safePath, sanitizedEntryName, CompressionLevel.Fastest);
}
}
if (System.IO.File.Exists(safePath))
System.IO.File.Delete(safePath);
Expand Down Expand Up @@ -1987,6 +2000,21 @@ private string SanitizeAndValidatePath(string path)

return fullPath;
}

private string SanitizeZipEntryName(string entryName)
{
if (string.IsNullOrEmpty(entryName))
{
return string.Empty;
}
string sanitized = entryName.Replace('\\', '/');
while (sanitized.Contains("../"))
{
sanitized = sanitized.Replace("../", "");
}
sanitized = sanitized.TrimStart('/');
return sanitized;
}
}
}