OS independent file paths & Utility.PathCombine added

System.IO.Path.Combine provides cross-platform support for system paths, however rooted paths discarding of earlier segments
Utilities.PathCombine ensures if any parameters start with root chacters does not discard previous Utilities.PathCombine allows appending of "\\" to translate to the correct cross-platform result
This commit is contained in:
Sean Long 2020-04-18 14:57:31 -04:00
parent 194f5674b4
commit f0043f53ee
11 changed files with 37 additions and 18 deletions

View File

@ -44,7 +44,7 @@ namespace Oqtane.Services
{ {
if (!(folderPath.EndsWith(System.IO.Path.DirectorySeparatorChar) || folderPath.EndsWith(System.IO.Path.AltDirectorySeparatorChar))) if (!(folderPath.EndsWith(System.IO.Path.DirectorySeparatorChar) || folderPath.EndsWith(System.IO.Path.AltDirectorySeparatorChar)))
{ {
folderPath = System.IO.Path.Combine(folderPath, " ").TrimEnd(' '); folderPath = Utilities.PathCombine(folderPath,"\\");
} }
var path = WebUtility.UrlEncode(folderPath); var path = WebUtility.UrlEncode(folderPath);

View File

@ -40,7 +40,7 @@ namespace Oqtane.Services
{ {
if (!(folderPath.EndsWith(System.IO.Path.DirectorySeparatorChar) || folderPath.EndsWith(System.IO.Path.AltDirectorySeparatorChar))) if (!(folderPath.EndsWith(System.IO.Path.DirectorySeparatorChar) || folderPath.EndsWith(System.IO.Path.AltDirectorySeparatorChar)))
{ {
folderPath = System.IO.Path.Combine(folderPath, " ").TrimEnd(' '); folderPath = Utilities.PathCombine(folderPath, "\\");
} }
var path = WebUtility.UrlEncode(folderPath); var path = WebUtility.UrlEncode(folderPath);

View File

@ -431,12 +431,12 @@ namespace Oqtane.Controllers
private string GetFolderPath(Folder folder) private string GetFolderPath(Folder folder)
{ {
return Path.Combine(_environment.ContentRootPath, "Content", "Tenants", _tenants.GetTenant().TenantId.ToString(), "Sites", folder.SiteId.ToString(), folder.Path, " ").TrimEnd(' '); return Utilities.PathCombine(_environment.ContentRootPath, "Content", "Tenants", _tenants.GetTenant().TenantId.ToString(), "Sites", folder.SiteId.ToString(), folder.Path);
} }
private string GetFolderPath(string folder) private string GetFolderPath(string folder)
{ {
return Path.Combine(_environment.WebRootPath, folder, " ").TrimEnd(' '); return Utilities.PathCombine(_environment.WebRootPath, folder);
} }
private void CreateDirectory(string folderpath) private void CreateDirectory(string folderpath)
@ -448,7 +448,7 @@ namespace Oqtane.Controllers
string[] folders = folderpath.Split(separators, StringSplitOptions.RemoveEmptyEntries); string[] folders = folderpath.Split(separators, StringSplitOptions.RemoveEmptyEntries);
foreach (string folder in folders) foreach (string folder in folders)
{ {
path = Path.Combine(path, folder); path = Utilities.PathCombine(path, folder,"\\");
if (!Directory.Exists(path)) if (!Directory.Exists(path))
{ {
Directory.CreateDirectory(path); Directory.CreateDirectory(path);

View File

@ -110,7 +110,7 @@ namespace Oqtane.Controllers
if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null) if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null)
{ {
Folder parent = _folders.GetFolder(folder.ParentId.Value); Folder parent = _folders.GetFolder(folder.ParentId.Value);
folder.Path = Path.Combine(parent.Path, folder.Name); folder.Path = Utilities.PathCombine(parent.Path, folder.Name,"\\");
} }
folder = _folders.AddFolder(folder); folder = _folders.AddFolder(folder);
_logger.Log(LogLevel.Information, this, LogFunction.Create, "Folder Added {Folder}", folder); _logger.Log(LogLevel.Information, this, LogFunction.Create, "Folder Added {Folder}", folder);
@ -135,7 +135,7 @@ namespace Oqtane.Controllers
if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null) if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null)
{ {
Folder parent = _folders.GetFolder(folder.ParentId.Value); Folder parent = _folders.GetFolder(folder.ParentId.Value);
folder.Path = Path.Combine(parent.Path, folder.Name); folder.Path = Utilities.PathCombine(parent.Path, folder.Name,"\\");
} }
folder = _folders.UpdateFolder(folder); folder = _folders.UpdateFolder(folder);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "Folder Updated {Folder}", folder); _logger.Log(LogLevel.Information, this, LogFunction.Update, "Folder Updated {Folder}", folder);

View File

@ -189,17 +189,17 @@ namespace Oqtane.Controllers
{ {
string rootPath; string rootPath;
DirectoryInfo rootFolder = Directory.GetParent(_environment.ContentRootPath); DirectoryInfo rootFolder = Directory.GetParent(_environment.ContentRootPath);
string templatePath = Path.Combine(rootFolder.FullName, "Oqtane.Client", "Modules", "Admin", "ModuleCreator", "Templates",moduleDefinition.Template," ").TrimEnd(' '); string templatePath = Utilities.PathCombine(rootFolder.FullName, "Oqtane.Client", "Modules", "Admin", "ModuleCreator", "Templates",moduleDefinition.Template,"\\");
if (moduleDefinition.Template == "internal") if (moduleDefinition.Template == "internal")
{ {
rootPath = rootFolder.FullName; rootPath = Utilities.PathCombine(rootFolder.FullName,"\\");
moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Modules, Oqtane.Client"; moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Modules, Oqtane.Client";
moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Manager." + moduleDefinition.Name + "Manager, Oqtane.Server"; moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Manager." + moduleDefinition.Name + "Manager, Oqtane.Server";
} }
else else
{ {
rootPath = Path.Combine(rootFolder.Parent.FullName , moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Module"); rootPath = Utilities.PathCombine(rootFolder.Parent.FullName , moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Module","\\");
moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Modules, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Module.Client"; moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Modules, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Module.Client";
moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Manager." + moduleDefinition.Name + "Manager, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Module.Server"; moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Manager." + moduleDefinition.Name + "Manager, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Module.Server";
} }
@ -218,7 +218,7 @@ namespace Oqtane.Controllers
private void ProcessTemplatesRecursively(DirectoryInfo current, string rootPath, string rootFolder, string templatePath, ModuleDefinition moduleDefinition) private void ProcessTemplatesRecursively(DirectoryInfo current, string rootPath, string rootFolder, string templatePath, ModuleDefinition moduleDefinition)
{ {
// process folder // process folder
string folderPath = Path.Combine(rootPath, current.FullName.Replace(templatePath, "")); string folderPath = Utilities.PathCombine(rootPath, current.FullName.Replace(templatePath, ""));
folderPath = folderPath.Replace("[Owner]", moduleDefinition.Owner); folderPath = folderPath.Replace("[Owner]", moduleDefinition.Owner);
folderPath = folderPath.Replace("[Module]", moduleDefinition.Name); folderPath = folderPath.Replace("[Module]", moduleDefinition.Name);
if (!Directory.Exists(folderPath)) if (!Directory.Exists(folderPath))

View File

@ -150,7 +150,7 @@ namespace Oqtane.Controllers
} }
// add folder for user // add folder for user
Folder folder = _folders.GetFolder(user.SiteId, "Users"); Folder folder = _folders.GetFolder(user.SiteId, Utilities.PathCombine("Users","\\"));
if (folder != null) if (folder != null)
{ {
_folders.AddFolder(new Folder _folders.AddFolder(new Folder
@ -158,7 +158,7 @@ namespace Oqtane.Controllers
SiteId = folder.SiteId, SiteId = folder.SiteId,
ParentId = folder.FolderId, ParentId = folder.FolderId,
Name = "My Folder", Name = "My Folder",
Path = System.IO.Path.Combine(folder.Path, newUser.UserId.ToString()), Path = Utilities.PathCombine(folder.Path, newUser.UserId.ToString(),"\\"),
Order = 1, Order = 1,
IsSystem = true, IsSystem = true,
Permissions = "[{\"PermissionName\":\"Browse\",\"Permissions\":\"[" + newUser.UserId.ToString() + "]\"},{\"PermissionName\":\"View\",\"Permissions\":\"All Users\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"[" + Permissions = "[{\"PermissionName\":\"Browse\",\"Permissions\":\"[" + newUser.UserId.ToString() + "]\"},{\"PermissionName\":\"View\",\"Permissions\":\"All Users\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"[" +

View File

@ -387,14 +387,14 @@ namespace Oqtane.Infrastructure
} }
// add folder for user // add folder for user
var folder = folderRepository.GetFolder(user.SiteId, "Users"); var folder = folderRepository.GetFolder(user.SiteId, Utilities.PathCombine("Users","\\"));
if (folder != null) if (folder != null)
folderRepository.AddFolder(new Folder folderRepository.AddFolder(new Folder
{ {
SiteId = folder.SiteId, SiteId = folder.SiteId,
ParentId = folder.FolderId, ParentId = folder.FolderId,
Name = "My Folder", Name = "My Folder",
Path = Path.Combine(folder.Path, newUser.UserId.ToString()), Path = Utilities.PathCombine(folder.Path, newUser.UserId.ToString(),"\\"),
Order = 1, Order = 1,
IsSystem = true, IsSystem = true,
Permissions = new List<Permission> Permissions = new List<Permission>

View File

@ -103,7 +103,8 @@ namespace Oqtane.Infrastructure
case ".svg": case ".svg":
case ".js": case ".js":
case ".css": case ".css":
filename = Path.Combine(sourceFolder, entry.FullName.Replace("wwwroot", name)); string entryPath = Utilities.PathCombine(entry.FullName.Replace("wwwroot", name).Split('/'));
filename = Path.Combine(sourceFolder, entryPath);
if (!Directory.Exists(Path.GetDirectoryName(filename))) if (!Directory.Exists(Path.GetDirectoryName(filename)))
{ {
Directory.CreateDirectory(Path.GetDirectoryName(filename)); Directory.CreateDirectory(Path.GetDirectoryName(filename));

View File

@ -134,7 +134,7 @@ namespace Oqtane.SiteTemplates
if (System.IO.File.Exists(Path.Combine(_environment.WebRootPath, "images", "logo.png"))) if (System.IO.File.Exists(Path.Combine(_environment.WebRootPath, "images", "logo.png")))
{ {
string folderpath = Path.Combine(_environment.ContentRootPath, "Content", "Tenants", site.TenantId.ToString(), "Sites", site.SiteId.ToString()); string folderpath = Utilities.PathCombine(_environment.ContentRootPath, "Content", "Tenants", site.TenantId.ToString(), "Sites", site.SiteId.ToString(),"\\");
System.IO.Directory.CreateDirectory(folderpath); System.IO.Directory.CreateDirectory(folderpath);
if (!System.IO.File.Exists(Path.Combine(folderpath, "logo.png"))) if (!System.IO.File.Exists(Path.Combine(folderpath, "logo.png")))
{ {

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -583,7 +584,7 @@ namespace Oqtane.Repository
}); });
_folderRepository.AddFolder(new Folder _folderRepository.AddFolder(new Folder
{ {
SiteId = site.SiteId, ParentId = folder.FolderId, Name = "Users", Path = "Users", Order = 1, IsSystem = true, SiteId = site.SiteId, ParentId = folder.FolderId, Name = "Users", Path = Utilities.PathCombine("Users","\\"), Order = 1, IsSystem = true,
Permissions = "[{\"PermissionName\":\"Browse\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"View\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]" Permissions = "[{\"PermissionName\":\"Browse\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"View\",\"Permissions\":\"Administrators\"},{\"PermissionName\":\"Edit\",\"Permissions\":\"Administrators\"}]"
}); });

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Globalization; using System.Globalization;
using System.IO;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -236,5 +237,21 @@ namespace Oqtane.Shared
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$", @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250)); RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
} }
public static string PathCombine(params string[] segments)
{
var separators = new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar };
for (int i =1;i < segments.Length; i++){
if(Path.IsPathRooted(segments[i])){
segments[i] = segments[i].TrimStart(separators);
if(String.IsNullOrEmpty(segments[i])){
segments[i]=" ";
}
}
}
return Path.Combine(segments).TrimEnd();
}
} }
} }