From bafe2c666625d1e9e62de0ff210e5ec42ea6056f Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Thu, 14 May 2020 14:22:11 -0400 Subject: [PATCH 1/9] fix module creator templates --- .../Templates/External/Server/Manager/[Module]Manager.cs | 4 ++-- .../Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/Manager/[Module]Manager.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/Manager/[Module]Manager.cs index 0b987600..1fc55b78 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/Manager/[Module]Manager.cs +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Server/Manager/[Module]Manager.cs @@ -23,12 +23,12 @@ namespace [Owner].[Module]s.Manager public bool Install(Tenant tenant, string version) { - return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]." + version + ".sql"); + return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]s." + version + ".sql"); } public bool Uninstall(Tenant tenant) { - return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module].Uninstall.sql"); + return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]s.Uninstall.sql"); } public string ExportModule(Module module) diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs index 0b987600..1fc55b78 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Server/Modules/[Module]/Manager/[Module]Manager.cs @@ -23,12 +23,12 @@ namespace [Owner].[Module]s.Manager public bool Install(Tenant tenant, string version) { - return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]." + version + ".sql"); + return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]s." + version + ".sql"); } public bool Uninstall(Tenant tenant) { - return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module].Uninstall.sql"); + return _sql.ExecuteScript(tenant, GetType().Assembly, "[Owner].[Module]s.Uninstall.sql"); } public string ExportModule(Module module) From 6e28fa47a2ce371c33306c84a8f48b935a85eb2d Mon Sep 17 00:00:00 2001 From: Cody Date: Thu, 14 May 2020 14:03:09 -0700 Subject: [PATCH 2/9] container class added to pane resolves issue with title border DIV not utilizing 100% pane size --- Oqtane.Client/UI/Pane.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Client/UI/Pane.razor b/Oqtane.Client/UI/Pane.razor index 9d0c7dd4..48f4d0ce 100644 --- a/Oqtane.Client/UI/Pane.razor +++ b/Oqtane.Client/UI/Pane.razor @@ -32,7 +32,7 @@ } else { - _paneadminborder = ""; + _paneadminborder = "container"; _panetitle = ""; } From 422f3608072bc775db381678d5830dbd5c505b4a Mon Sep 17 00:00:00 2001 From: Cody Date: Thu, 14 May 2020 14:58:09 -0700 Subject: [PATCH 3/9] disabled changed to readonly --- Oqtane.Client/Modules/Admin/SystemInfo/Index.razor | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor index 8e19125f..ca7c7f2c 100644 --- a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor +++ b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor @@ -8,7 +8,7 @@ - + @@ -16,7 +16,7 @@ - + @@ -24,7 +24,7 @@ - + @@ -32,7 +32,7 @@ - + @@ -40,7 +40,7 @@ - + @@ -48,7 +48,7 @@ - + From caabac3e7468766e447f7a341f1006456061d7ba Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Thu, 14 May 2020 18:40:53 -0400 Subject: [PATCH 4/9] removed redundant assembly download logic, added security on download controller methods --- .../Interfaces/IModuleDefinitionService.cs | 1 - .../Services/ModuleDefinitionService.cs | 37 ------------------- Oqtane.Client/Services/ThemeService.cs | 27 -------------- Oqtane.Client/UI/SiteRouter.razor | 2 - .../Controllers/ModuleDefinitionController.cs | 32 ++++++++++------ 5 files changed, 20 insertions(+), 79 deletions(-) diff --git a/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs b/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs index 8560c661..cca5e642 100644 --- a/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs +++ b/Oqtane.Client/Services/Interfaces/IModuleDefinitionService.cs @@ -12,7 +12,6 @@ namespace Oqtane.Services Task UpdateModuleDefinitionAsync(ModuleDefinition moduleDefinition); Task InstallModuleDefinitionsAsync(); Task DeleteModuleDefinitionAsync(int moduleDefinitionId, int siteId); - Task LoadModuleDefinitionsAsync(int siteId, Runtime runtime); Task CreateModuleDefinitionAsync(ModuleDefinition moduleDefinition, int moduleId); } } diff --git a/Oqtane.Client/Services/ModuleDefinitionService.cs b/Oqtane.Client/Services/ModuleDefinitionService.cs index 12d408b4..2159a25d 100644 --- a/Oqtane.Client/Services/ModuleDefinitionService.cs +++ b/Oqtane.Client/Services/ModuleDefinitionService.cs @@ -49,43 +49,6 @@ namespace Oqtane.Services await DeleteAsync($"{Apiurl}/{moduleDefinitionId}?siteid={siteId}"); } - public async Task LoadModuleDefinitionsAsync(int siteId, Runtime runtime) - { - // get list of modules from the server - List moduledefinitions = await GetModuleDefinitionsAsync(siteId); - - // download assemblies to browser when running client-side Blazor - if (runtime == Runtime.WebAssembly) - { - // get list of loaded assemblies on the client ( in the client-side hosting module the browser client has its own app domain ) - Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); - - foreach (ModuleDefinition moduledefinition in moduledefinitions) - { - // if a module has dependencies, check if they are loaded - if (moduledefinition.Dependencies != "") - { - foreach (string dependency in moduledefinition.Dependencies.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) - { - string assemblyname = dependency.Replace(".dll", ""); - if (assemblies.Where(item => item.FullName.StartsWith(assemblyname + ",")).FirstOrDefault() == null) - { - // download assembly from server and load - var bytes = await _http.GetByteArrayAsync($"{Apiurl}/load/{assemblyname}.dll"); - Assembly.Load(bytes); - } - } - } - // check if the module assembly is loaded - if (assemblies.Where(item => item.FullName.StartsWith(moduledefinition.AssemblyName + ",")).FirstOrDefault() == null) - { - // download assembly from server and load - var bytes = await _http.GetByteArrayAsync($"{Apiurl}/load/{moduledefinition.AssemblyName}.dll"); - Assembly.Load(bytes); - } - } - } - } public async Task CreateModuleDefinitionAsync(ModuleDefinition moduleDefinition, int moduleId) { await PostJsonAsync($"{Apiurl}?moduleid={moduleId.ToString()}", moduleDefinition); diff --git a/Oqtane.Client/Services/ThemeService.cs b/Oqtane.Client/Services/ThemeService.cs index e40e83dc..ddb47158 100644 --- a/Oqtane.Client/Services/ThemeService.cs +++ b/Oqtane.Client/Services/ThemeService.cs @@ -23,33 +23,6 @@ namespace Oqtane.Services public async Task> GetThemesAsync() { List themes = await GetJsonAsync>(Apiurl); - - // get list of loaded assemblies - Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); - - foreach (Theme theme in themes) - { - if (theme.Dependencies != "") - { - foreach (string dependency in theme.Dependencies.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) - { - string assemblyname = dependency.Replace(".dll", ""); - if (assemblies.Where(item => item.FullName.StartsWith(assemblyname + ",")).FirstOrDefault() == null) - { - // download assembly from server and load - var bytes = await _http.GetByteArrayAsync($"{Apiurl}/load/{assemblyname}.dll"); - Assembly.Load(bytes); - } - } - } - if (assemblies.Where(item => item.FullName.StartsWith(theme.AssemblyName + ",")).FirstOrDefault() == null) - { - // download assembly from server and load - var bytes = await _http.GetByteArrayAsync($"{Apiurl}/load/{theme.AssemblyName}.dll"); - Assembly.Load(bytes); - } - } - return themes.OrderBy(item => item.Name).ToList(); } diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 3d058032..ac7b692e 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -11,7 +11,6 @@ @inject IPageService PageService @inject IUserService UserService @inject IModuleService ModuleService -@inject IModuleDefinitionService ModuleDefinitionService @inject ILogService LogService @implements IHandleAfterRender @@ -157,7 +156,6 @@ if (PageState == null || reload >= Reload.Site) { - await ModuleDefinitionService.LoadModuleDefinitionsAsync(site.SiteId, runtime); pages = await PageService.GetPagesAsync(site.SiteId); } else diff --git a/Oqtane.Server/Controllers/ModuleDefinitionController.cs b/Oqtane.Server/Controllers/ModuleDefinitionController.cs index 139ec366..d9131d69 100644 --- a/Oqtane.Server/Controllers/ModuleDefinitionController.cs +++ b/Oqtane.Server/Controllers/ModuleDefinitionController.cs @@ -13,6 +13,7 @@ using Oqtane.Repository; using Oqtane.Security; using System; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; // ReSharper disable StringIndexOfIsCultureSpecific.1 namespace Oqtane.Controllers @@ -27,10 +28,11 @@ namespace Oqtane.Controllers private readonly IUserPermissions _userPermissions; private readonly IInstallationManager _installationManager; private readonly IWebHostEnvironment _environment; + private readonly IConfigurationRoot _config; private readonly IServiceProvider _serviceProvider; private readonly ILogManager _logger; - public ModuleDefinitionController(IModuleDefinitionRepository moduleDefinitions, IModuleRepository modules,ITenantRepository tenants, ISqlRepository sql, IUserPermissions userPermissions, IInstallationManager installationManager, IWebHostEnvironment environment, IServiceProvider serviceProvider, ILogManager logger) + public ModuleDefinitionController(IModuleDefinitionRepository moduleDefinitions, IModuleRepository modules,ITenantRepository tenants, ISqlRepository sql, IUserPermissions userPermissions, IInstallationManager installationManager, IWebHostEnvironment environment, IConfigurationRoot config, IServiceProvider serviceProvider, ILogManager logger) { _moduleDefinitions = moduleDefinitions; _modules = modules; @@ -39,6 +41,7 @@ namespace Oqtane.Controllers _userPermissions = userPermissions; _installationManager = installationManager; _environment = environment; + _config = config; _serviceProvider = serviceProvider; _logger = logger; } @@ -158,11 +161,26 @@ namespace Oqtane.Controllers } } + // GET api//load + [HttpGet("load")] + public List Load() + { + List list = new List(); + if (_config.GetSection("Runtime").Value == "WebAssembly") + { + var assemblies = AppDomain.CurrentDomain.GetOqtaneClientAssemblies(); + list = AppDomain.CurrentDomain.GetOqtaneClientAssemblies().Select(a => a.GetName().Name).ToList(); + var deps = assemblies.SelectMany(a => a.GetReferencedAssemblies()).Distinct(); + list.AddRange(deps.Where(a => a.Name.EndsWith(".oqtane", StringComparison.OrdinalIgnoreCase)).Select(a => a.Name)); + } + return list; + } + // GET api//load/assembyname [HttpGet("load/{assemblyname}")] public IActionResult Load(string assemblyname) { - if (Path.GetExtension(assemblyname).ToLower() == ".dll") + if (_config.GetSection("Runtime").Value == "WebAssembly" && Path.GetExtension(assemblyname).ToLower() == ".dll") { string binfolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); byte[] file = System.IO.File.ReadAllBytes(Path.Combine(binfolder, assemblyname)); @@ -175,16 +193,6 @@ namespace Oqtane.Controllers return null; } } - // GET api//load/assembyname - [HttpGet("load")] - public List Load() - { - var assemblies = AppDomain.CurrentDomain.GetOqtaneClientAssemblies(); - var list = AppDomain.CurrentDomain.GetOqtaneClientAssemblies().Select(a => a.GetName().Name).ToList(); - var deps = assemblies.SelectMany(a => a.GetReferencedAssemblies()).Distinct(); - list.AddRange(deps.Where(a=>a.Name.EndsWith(".oqtane",StringComparison.OrdinalIgnoreCase)).Select(a=>a.Name)); - return list; - } // POST api/?moduleid=x [HttpPost] From 39641804f1c93814cd7a19aa3dd8538d81158dee Mon Sep 17 00:00:00 2001 From: Jim Spillane Date: Thu, 14 May 2020 22:02:57 -0400 Subject: [PATCH 5/9] Move Path and File validation to Shared Utilities Created extension methods: IsPathValid(Folder) IsFileValid(File) IsPathOrFileValid(string) Added client side validation check for Folders. --- Oqtane.Client/Modules/Admin/Files/Edit.razor | 98 ++++++++++--------- Oqtane.Server/Controllers/FolderController.cs | 12 +-- Oqtane.Shared/Shared/Utilities.cs | 19 ++++ 3 files changed, 73 insertions(+), 56 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Files/Edit.razor b/Oqtane.Client/Modules/Admin/Files/Edit.razor index 1d7ddc81..5d42485b 100644 --- a/Oqtane.Client/Modules/Admin/Files/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Files/Edit.razor @@ -25,7 +25,7 @@ - + @@ -112,57 +112,63 @@ private async Task SaveFolder() { + if (_name == string.Empty || _parentId == -1) + { + AddModuleMessage("Folders Must Have A Parent And A Name", MessageType.Warning); + return; + } + + if (!_name.IsPathOrFileValid()) + { + AddModuleMessage("Folder Name Not Valid.", MessageType.Warning); + return; + } + try { - if (_name != string.Empty && _parentId != -1) + Folder folder; + if (_folderId != -1) { - Folder folder; - if (_folderId != -1) - { - folder = await FolderService.GetFolderAsync(_folderId); - } - else - { - folder = new Folder(); - } - - folder.SiteId = PageState.Site.SiteId; - - if (_parentId == -1) - { - folder.ParentId = null; - } - else - { - folder.ParentId = _parentId; - } - - folder.Name = _name; - folder.IsSystem = _isSystem; - folder.Permissions = _permissionGrid.GetPermissions(); - - if (_folderId != -1) - { - folder = await FolderService.UpdateFolderAsync(folder); - } - else - { - folder = await FolderService.AddFolderAsync(folder); - } - if (folder != null) - { - await FolderService.UpdateFolderOrderAsync(folder.SiteId, folder.FolderId, folder.ParentId); - await logger.LogInformation("Folder Saved {Folder}", folder); - NavigationManager.NavigateTo(NavigateUrl()); - } - else - { - AddModuleMessage("An Error Was Encountered Saving The Folder", MessageType.Error); - } + folder = await FolderService.GetFolderAsync(_folderId); } else { - AddModuleMessage("Folders Must Have A Parent And A Name", MessageType.Warning); + folder = new Folder(); + } + + folder.SiteId = PageState.Site.SiteId; + + if (_parentId == -1) + { + folder.ParentId = null; + } + else + { + folder.ParentId = _parentId; + } + + folder.Name = _name; + folder.IsSystem = _isSystem; + folder.Permissions = _permissionGrid.GetPermissions(); + + if (_folderId != -1) + { + folder = await FolderService.UpdateFolderAsync(folder); + } + else + { + folder = await FolderService.AddFolderAsync(folder); + } + + if (folder != null) + { + await FolderService.UpdateFolderOrderAsync(folder.SiteId, folder.FolderId, folder.ParentId); + await logger.LogInformation("Folder Saved {Folder}", folder); + NavigationManager.NavigateTo(NavigateUrl()); + } + else + { + AddModuleMessage("An Error Was Encountered Saving The Folder", MessageType.Error); } } catch (Exception ex) diff --git a/Oqtane.Server/Controllers/FolderController.cs b/Oqtane.Server/Controllers/FolderController.cs index fb824641..ebaaa590 100644 --- a/Oqtane.Server/Controllers/FolderController.cs +++ b/Oqtane.Server/Controllers/FolderController.cs @@ -105,7 +105,7 @@ namespace Oqtane.Controllers } if (_userPermissions.IsAuthorized(User, PermissionNames.Edit, permissions)) { - if (FolderPathValid(folder)) + if (folder.IsPathValid()) { if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null) { @@ -140,7 +140,7 @@ namespace Oqtane.Controllers { if (ModelState.IsValid && _userPermissions.IsAuthorized(User, EntityNames.Folder, folder.FolderId, PermissionNames.Edit)) { - if (FolderPathValid(folder)) + if (folder.IsPathValid()) { if (string.IsNullOrEmpty(folder.Path) && folder.ParentId != null) { @@ -210,13 +210,5 @@ namespace Oqtane.Controllers HttpContext.Response.StatusCode = 401; } } - - private bool FolderPathValid(Folder folder) - { - // prevent folder path traversal and reserved devices - return (folder.Name.IndexOfAny(Constants.InvalidFileNameChars) == -1 && - !Constants.InvalidFileNameEndingChars.Any(x => folder.Name.EndsWith(x)) && - !Constants.ReservedDevices.Split(',').Contains(folder.Name.ToUpper().Split('.')[0])); - } } } diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs index 11bef4dd..de81561b 100644 --- a/Oqtane.Shared/Shared/Utilities.cs +++ b/Oqtane.Shared/Shared/Utilities.cs @@ -2,8 +2,10 @@ using System; using System.Globalization; using System.IO; +using System.Linq; using System.Text; using System.Text.RegularExpressions; +using File = Oqtane.Models.File; namespace Oqtane.Shared { @@ -254,5 +256,22 @@ namespace Oqtane.Shared return Path.Combine(segments).TrimEnd(); } + + public static bool IsPathValid(this Folder folder) + { + return IsPathOrFileValid(folder.Name); + } + + public static bool IsFileValid(this File file) + { + return IsPathOrFileValid(file.Name); + } + + public static bool IsPathOrFileValid(this string name) + { + return (name.IndexOfAny(Constants.InvalidFileNameChars) == -1 && + !Constants.InvalidFileNameEndingChars.Any(name.EndsWith) && + !Constants.ReservedDevices.Split(',').Contains(name.ToUpper().Split('.')[0])); + } } } From 5e04cb18a456199c3050934be44d7d1c356ed48e Mon Sep 17 00:00:00 2001 From: Pavel Vesely Date: Fri, 15 May 2020 08:18:07 +0200 Subject: [PATCH 6/9] File Manager Tune-up --- Oqtane.Client/Modules/Admin/Files/Add.razor | 2 +- .../Modules/Admin/ModuleDefinitions/Add.razor | 2 +- Oqtane.Client/Modules/Admin/Site/Index.razor | 8 +- Oqtane.Client/Modules/Admin/Themes/Add.razor | 2 +- .../Modules/Admin/UserProfile/Index.razor | 2 +- Oqtane.Client/Modules/Admin/Users/Edit.razor | 2 +- .../Modules/Controls/FileManager.razor | 163 +++++++++--------- 7 files changed, 87 insertions(+), 94 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Files/Add.razor b/Oqtane.Client/Modules/Admin/Files/Add.razor index a01b9b1c..653f5cf3 100644 --- a/Oqtane.Client/Modules/Admin/Files/Add.razor +++ b/Oqtane.Client/Modules/Admin/Files/Add.razor @@ -12,7 +12,7 @@ - + diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index a63784bc..db9186bd 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -35,7 +35,7 @@ - + diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index e4bae61e..3f3425f6 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -39,7 +39,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -185,7 +185,7 @@ - + @@ -193,7 +193,7 @@ - + diff --git a/Oqtane.Client/Modules/Admin/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor index 5ad4f5c6..da47d8a9 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Add.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor @@ -35,7 +35,7 @@ - + diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor index 6f3ab545..fec53f62 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor @@ -64,7 +64,7 @@ else - + diff --git a/Oqtane.Client/Modules/Admin/Users/Edit.razor b/Oqtane.Client/Modules/Admin/Users/Edit.razor index 3aa30e1b..95449f2d 100644 --- a/Oqtane.Client/Modules/Admin/Users/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Users/Edit.razor @@ -63,7 +63,7 @@ else - + diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor index 8dc70ffb..35f04706 100644 --- a/Oqtane.Client/Modules/Controls/FileManager.razor +++ b/Oqtane.Client/Modules/Controls/FileManager.razor @@ -1,5 +1,6 @@ @namespace Oqtane.Modules.Controls -@inherits ModuleBase +@inherits ModuleBase + @attribute [OqtaneIgnore] @inject IFolderService FolderService @inject IFileService FileService @@ -10,33 +11,36 @@
-
- + @if (string.IsNullOrEmpty(Folder)) { - + } - else + @foreach (Folder folder in _folders) { - + if (folder.FolderId == FolderId) + { + + } + else + { + + } } - } - -
- @if (_showfiles) + +
+ } + @if (ShowFiles) {
} - @if (_haseditpermission) + @if (ShowUpload && _haseditpermission) {
- @if (_uploadmultiple) + @if (UploadMultiple) { - + } else { - + } - - @if (_showfiles && GetFileId() != -1) - { - - } + + @if (_showfiles && GetFileId() != -1) + { + + }
- @((MarkupString)_message) } + @((MarkupString) _message)
@if (_image != string.Empty) {
- @((MarkupString)_image) + @((MarkupString) _image)
}
@@ -84,19 +88,19 @@ @code { private string _id; private List _folders; - private int _folderid = -1; private List _files = new List(); - private int _fileid = -1; private bool _showfiles = true; private string _fileinputid = string.Empty; private string _progressinfoid = string.Empty; private string _progressbarid = string.Empty; private string _filter = "*"; - private bool _uploadmultiple = false; private bool _haseditpermission = false; private string _message = string.Empty; private string _image = string.Empty; private string _guid; + private int _folderId = -1; + private bool _uploadMultiple; + private int _fileId; [Parameter] public string Id { get; set; } // optional - for setting the id of the FileManager component for accessibility @@ -105,19 +109,25 @@ public string Folder { get; set; } // optional - for setting a specific folder by default [Parameter] - public string FolderId { get; set; } // optional - for setting a specific folderid by default + public int FolderId { get; set; } = -1; // optional - for setting a specific folderid by default [Parameter] - public string ShowFiles { get; set; } // optional - for indicating whether a list of files should be displayed - default is true + public bool ShowFiles { get; set; } = true; // optional - for indicating whether a list of files should be displayed - default is true [Parameter] - public string FileId { get; set; } // optional - for setting a specific file by default + public bool ShowUpload { get; set; } = true; // optional - for indicating whether a Upload controls should be displayed - default is true + + [Parameter] + public bool ShowFolders { get; set; } = true; // optional - for indicating whether a list of folders should be displayed - default is true + + [Parameter] + public int FileId { get; set; } = -1; // optional - for setting a specific file by default [Parameter] public string Filter { get; set; } // optional - comma delimited list of file types that can be selected or uploaded ie. "jpg,gif" [Parameter] - public string UploadMultiple { get; set; } // optional - enable multiple file uploads - default false + public bool UploadMultiple { get; set; } = false; // optional - enable multiple file uploads - default false protected override async Task OnInitializedAsync() { @@ -129,56 +139,39 @@ if (!string.IsNullOrEmpty(Folder)) { _folders = new List {new Folder {FolderId = -1, Name = Folder}}; - _folderid = -1; + FolderId = -1; } else { _folders = await FolderService.GetFoldersAsync(ModuleState.SiteId); - if (!string.IsNullOrEmpty(FolderId)) - { - _folderid = int.Parse(FolderId); - } } - if (!string.IsNullOrEmpty(FileId)) + if (FileId != -1) { - _fileid = int.Parse(FileId); - if (_fileid != -1) + File file = await FileService.GetFileAsync(FileId); + if (file != null) { - File file = await FileService.GetFileAsync(int.Parse(FileId)); - if (file != null) - { - _folderid = file.FolderId; - } - else - { - _fileid = -1; // file does not exist - } + FolderId = file.FolderId; + } + else + { + FileId = -1; // file does not exist } - await SetImage(); - } - if (!string.IsNullOrEmpty(ShowFiles)) - { - _showfiles = bool.Parse(ShowFiles); } + await SetImage(); if (!string.IsNullOrEmpty(Filter)) { - _filter = "." + Filter.Replace(",",",."); + _filter = "." + Filter.Replace(",", ",."); } await GetFiles(); - // create unique id for component + // create unique id for component _guid = Guid.NewGuid().ToString("N"); _fileinputid = _guid + "FileInput"; _progressinfoid = _guid + "ProgressInfo"; _progressbarid = _guid + "ProgressBar"; - - if (!string.IsNullOrEmpty(UploadMultiple)) - { - _uploadmultiple = bool.Parse(UploadMultiple); - } } private async Task GetFiles() @@ -191,11 +184,11 @@ } else { - Folder folder = _folders.FirstOrDefault(item => item.FolderId == _folderid); + Folder folder = _folders.FirstOrDefault(item => item.FolderId == FolderId); if (folder != null) { - _haseditpermission = UserSecurity.IsAuthorized(PageState.User,PermissionNames.Edit, folder.Permissions); - _files = await FileService.GetFilesAsync(_folderid); + _haseditpermission = UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, folder.Permissions); + _files = await FileService.GetFilesAsync(FolderId); } else { @@ -222,9 +215,9 @@ _message = string.Empty; try { - _folderid = int.Parse((string)e.Value); + FolderId = int.Parse((string) e.Value); await GetFiles(); - _fileid = -1; + FileId = -1; _image = string.Empty; StateHasChanged(); } @@ -238,7 +231,7 @@ private async Task FileChanged(ChangeEventArgs e) { _message = string.Empty; - _fileid = int.Parse((string)e.Value); + FileId = int.Parse((string) e.Value); await SetImage(); StateHasChanged(); @@ -247,21 +240,21 @@ private async Task SetImage() { _image = string.Empty; - if (_fileid != -1) + if (FileId != -1) { - File file = await FileService.GetFileAsync(_fileid); + File file = await FileService.GetFileAsync(FileId); if (file != null && file.ImageHeight != 0 && file.ImageWidth != 0) { var maxwidth = 200; var maxheight = 200; - var ratioX = (double)maxwidth / (double)file.ImageWidth; - var ratioY = (double)maxheight / (double)file.ImageHeight; + var ratioX = (double) maxwidth / (double) file.ImageWidth; + var ratioY = (double) maxheight / (double) file.ImageHeight; var ratio = ratioX < ratioY ? ratioX : ratioY; - _image = "\"""; + _image = "\"""; } } } @@ -281,7 +274,7 @@ } else { - result = await FileService.UploadFilesAsync(_folderid, upload, _guid); + result = await FileService.UploadFilesAsync(FolderId, upload, _guid); } if (result == string.Empty) @@ -295,7 +288,7 @@ var file = _files.Where(item => item.Name == upload[0]).FirstOrDefault(); if (file != null) { - _fileid = file.FileId; + FileId = file.FileId; await SetImage(); } } @@ -325,21 +318,21 @@ try { - await FileService.DeleteFileAsync(_fileid); - await logger.LogInformation("File Deleted {File}", _fileid); + await FileService.DeleteFileAsync(FileId); + await logger.LogInformation("File Deleted {File}", FileId); _message = "
File Deleted
"; await GetFiles(); - _fileid = -1; + FileId = -1; await SetImage(); StateHasChanged(); } catch (Exception ex) { - await logger.LogError(ex, "Error Deleting File {File} {Error}", _fileid, ex.Message); + await logger.LogError(ex, "Error Deleting File {File} {Error}", FileId, ex.Message); _message = "
Error Deleting File
"; } } - public int GetFileId() => _fileid; + public int GetFileId() => FileId; } From 9850e249fc913a65d2124feaa88918681cb44875 Mon Sep 17 00:00:00 2001 From: Pavel Vesely Date: Fri, 15 May 2020 08:20:00 +0200 Subject: [PATCH 7/9] File Controller bug --- Oqtane.Server/Controllers/FileController.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Oqtane.Server/Controllers/FileController.cs b/Oqtane.Server/Controllers/FileController.cs index 0c30bbdf..0bfe1de2 100644 --- a/Oqtane.Server/Controllers/FileController.cs +++ b/Oqtane.Server/Controllers/FileController.cs @@ -413,8 +413,11 @@ namespace Oqtane.Controllers { _logger.Log(LogLevel.Error, this, LogFunction.Read, "File Does Not Exist {FileId} {FilePath}", id, filepath); HttpContext.Response.StatusCode = 404; - byte[] filebytes = System.IO.File.ReadAllBytes(errorpath); - return File(filebytes, "application/octet-stream", file.Name); + if (System.IO.File.Exists(errorpath)) + { + byte[] filebytes = System.IO.File.ReadAllBytes(errorpath); + return File(filebytes, "application/octet-stream", file.Name); + } } } else @@ -432,6 +435,7 @@ namespace Oqtane.Controllers byte[] filebytes = System.IO.File.ReadAllBytes(errorpath); return File(filebytes, "application/octet-stream", "error.png"); } + return null; } private string GetFolderPath(Folder folder) From ac03afb146c881f1a00673cef7aedde2269857d9 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Fri, 15 May 2020 09:50:48 -0400 Subject: [PATCH 8/9] added ability to set default container at the page level, expanded size of role description in upgrade script for 0.9.2 --- .../Modules/Admin/Modules/Settings.razor | 20 ++++++++- Oqtane.Client/Modules/Admin/Pages/Add.razor | 36 ++++++++++++---- Oqtane.Client/Modules/Admin/Pages/Edit.razor | 41 +++++++++++++++---- Oqtane.Client/UI/SiteRouter.razor | 2 +- Oqtane.Server/Controllers/PageController.cs | 1 + Oqtane.Server/Oqtane.Server.csproj | 2 + Oqtane.Server/Repository/SiteRepository.cs | 1 + Oqtane.Server/Scripts/Tenant.0.9.1.sql | 2 +- Oqtane.Server/Scripts/Tenant.0.9.2.sql | 18 ++++++++ Oqtane.Shared/Models/Page.cs | 1 + 10 files changed, 104 insertions(+), 20 deletions(-) create mode 100644 Oqtane.Server/Scripts/Tenant.0.9.2.sql diff --git a/Oqtane.Client/Modules/Admin/Modules/Settings.razor b/Oqtane.Client/Modules/Admin/Modules/Settings.razor index eec6c6e2..3d981593 100644 --- a/Oqtane.Client/Modules/Admin/Modules/Settings.razor +++ b/Oqtane.Client/Modules/Admin/Modules/Settings.razor @@ -24,7 +24,7 @@ - + @foreach (KeyValuePair item in _themes) { if (item.Key == _themetype) @@ -122,7 +122,7 @@ + + + + + + + + @@ -187,6 +201,7 @@ @code { private Dictionary _themes; private Dictionary _panelayouts; + private Dictionary _containers = new Dictionary(); private List _themeList; private List _pageList; private string _name; @@ -202,6 +217,7 @@ private string _mode = "view"; private string _themetype = "-"; private string _layouttype = "-"; + private string _containertype = "-"; private string _icon = string.Empty; private string _permissions = string.Empty; private PermissionGrid _permissionGrid; @@ -216,11 +232,9 @@ _pageList = PageState.Pages; _children = PageState.Pages.Where(item => item.ParentId == null).ToList(); - _themetype = PageState.Site.DefaultThemeType; - _layouttype = PageState.Site.DefaultLayoutType; - _themes = ThemeService.GetThemeTypes(_themeList); _panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype); + _containers = ThemeService.GetContainerTypes(_themeList); _permissions = string.Empty; } @@ -351,16 +365,20 @@ page.Url = _url; page.EditMode = (_mode == "edit" ? true : false); page.ThemeType = (_themetype != "-") ? _themetype : string.Empty; - page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty; - if (page.ThemeType == PageState.Site.DefaultThemeType) + if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType) { page.ThemeType = string.Empty; } - - if (page.LayoutType == PageState.Site.DefaultLayoutType) + page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty; + if (!string.IsNullOrEmpty(page.LayoutType) && page.LayoutType == PageState.Site.DefaultLayoutType) { page.LayoutType = string.Empty; } + page.DefaultContainerType = (_containertype != "-") ? _containertype : string.Empty; + if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType) + { + page.DefaultContainerType = string.Empty; + } page.Icon = (_icon == null ? string.Empty : _icon); page.Permissions = _permissionGrid.GetPermissions(); page.IsPersonalizable = (_ispersonalizable == null ? false : Boolean.Parse(_ispersonalizable)); diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 8132696d..b25f6b2e 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -112,7 +112,7 @@ - + @foreach (KeyValuePair panelayout in _panelayouts) { if (panelayout.Key == _layouttype) @@ -148,6 +148,20 @@ + + + + + + + + @@ -200,6 +214,7 @@ @code { private Dictionary _themes; private Dictionary _panelayouts; + private Dictionary _containers = new Dictionary(); private List _themeList; private List _pageList; private int _pageId; @@ -217,6 +232,7 @@ private string _mode; private string _themetype = "-"; private string _layouttype = "-"; + private string _containertype = "-"; private string _icon; private string _permissions; private string _createdby; @@ -241,6 +257,7 @@ _children = PageState.Pages.Where(item => item.ParentId == null).ToList(); _themes = ThemeService.GetThemeTypes(_themeList); + _containers = ThemeService.GetContainerTypes(_themeList); _pageId = Int32.Parse(PageState.QueryString["id"]); var page = PageState.Pages.FirstOrDefault(item => item.PageId == _pageId); @@ -270,16 +287,21 @@ _ispersonalizable = page.IsPersonalizable.ToString(); _mode = (page.EditMode) ? "edit" : "view"; _themetype = page.ThemeType; - _panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype); - _layouttype = page.LayoutType; if (_themetype == PageState.Site.DefaultThemeType) { _themetype = "-"; } + _panelayouts = ThemeService.GetPaneLayoutTypes(_themeList, _themetype); + _layouttype = page.LayoutType; if (_layouttype == PageState.Site.DefaultLayoutType) { _layouttype = "-"; } + _containertype = page.DefaultContainerType; + if (string.IsNullOrEmpty(_containertype)) + { + _containertype = "-"; + } _icon = page.Icon; _permissions = page.Permissions; _createdby = page.CreatedBy; @@ -426,15 +448,20 @@ page.Url = _url; page.EditMode = (_mode == "edit"); page.ThemeType = (_themetype != "-") ? _themetype : string.Empty; - page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty; - if (page.ThemeType == PageState.Site.DefaultThemeType) + if (!string.IsNullOrEmpty(page.ThemeType) && page.ThemeType == PageState.Site.DefaultThemeType) { page.ThemeType = string.Empty; } - if (page.LayoutType == PageState.Site.DefaultLayoutType) + page.LayoutType = (_layouttype != "-") ? _layouttype : string.Empty; + if (!string.IsNullOrEmpty(page.LayoutType) && page.LayoutType == PageState.Site.DefaultLayoutType) { page.LayoutType = string.Empty; } + page.DefaultContainerType = (_containertype != "-") ? _containertype : string.Empty; + if (!string.IsNullOrEmpty(page.DefaultContainerType) && page.DefaultContainerType == PageState.Site.DefaultContainerType) + { + page.DefaultContainerType = string.Empty; + } page.Icon = _icon ?? string.Empty; page.Permissions = _permissionGrid.GetPermissions(); page.IsPersonalizable = (_ispersonalizable != null && Boolean.Parse(_ispersonalizable)); diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index ac7b692e..488c43bf 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -260,7 +260,7 @@ if (PageState == null || reload >= Reload.Page) { modules = await ModuleService.GetModulesAsync(site.SiteId); - modules = ProcessModules(modules, page.PageId, _pagestate.ModuleId, _pagestate.Action, page.Panes, site.DefaultContainerType); + modules = ProcessModules(modules, page.PageId, _pagestate.ModuleId, _pagestate.Action, page.Panes, (!string.IsNullOrEmpty(page.DefaultContainerType)) ? page.DefaultContainerType : site.DefaultContainerType); } else { diff --git a/Oqtane.Server/Controllers/PageController.cs b/Oqtane.Server/Controllers/PageController.cs index 915fccdc..6797796a 100644 --- a/Oqtane.Server/Controllers/PageController.cs +++ b/Oqtane.Server/Controllers/PageController.cs @@ -166,6 +166,7 @@ namespace Oqtane.Controllers page.EditMode = false; page.ThemeType = parent.ThemeType; page.LayoutType = parent.LayoutType; + page.DefaultContainerType = parent.DefaultContainerType; page.Icon = parent.Icon; page.Permissions = new List { new Permission(PermissionNames.View, userid, true), diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index b298fc75..88064ed9 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -19,12 +19,14 @@ + + diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index d7c8a1e5..ae179abe 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -757,6 +757,7 @@ namespace Oqtane.Repository EditMode = pagetemplate.EditMode, ThemeType = "", LayoutType = "", + DefaultContainerType = "", Icon = pagetemplate.Icon, Permissions = pagetemplate.PagePermissions, IsPersonalizable = pagetemplate.IsPersonalizable, diff --git a/Oqtane.Server/Scripts/Tenant.0.9.1.sql b/Oqtane.Server/Scripts/Tenant.0.9.1.sql index 94728128..55825ada 100644 --- a/Oqtane.Server/Scripts/Tenant.0.9.1.sql +++ b/Oqtane.Server/Scripts/Tenant.0.9.1.sql @@ -1,6 +1,6 @@ /* -migration script +Version 0.9.1 migration script */ diff --git a/Oqtane.Server/Scripts/Tenant.0.9.2.sql b/Oqtane.Server/Scripts/Tenant.0.9.2.sql new file mode 100644 index 00000000..11330770 --- /dev/null +++ b/Oqtane.Server/Scripts/Tenant.0.9.2.sql @@ -0,0 +1,18 @@ +/* + +Version 0.9.2 migration script + +*/ + +ALTER TABLE [dbo].[Role] +ALTER COLUMN [Description] VARCHAR (256) NOT NULL +GO + +ALTER TABLE [dbo].[Page] ADD + [DefaultContainerType] [nvarchar](200) NULL +GO + +UPDATE [dbo].[Page] +SET [DefaultContainerType] = '' +GO + diff --git a/Oqtane.Shared/Models/Page.cs b/Oqtane.Shared/Models/Page.cs index f1268875..2d3f3624 100644 --- a/Oqtane.Shared/Models/Page.cs +++ b/Oqtane.Shared/Models/Page.cs @@ -15,6 +15,7 @@ namespace Oqtane.Models public string Url { get; set; } public string ThemeType { get; set; } public string LayoutType { get; set; } + public string DefaultContainerType { get; set; } public string Icon { get; set; } public bool IsNavigation { get; set; } public bool EditMode { get; set; } From 3cbb6e3e6ed917001156f55576d070928440bb38 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Fri, 15 May 2020 12:36:52 -0400 Subject: [PATCH 9/9] enable module creator to add embeddedresources to csproj for internal modules --- .../Templates/External/Client/Index.razor | 4 +-- .../Modules/[Module]/Index.razor | 4 +-- .../Controllers/ModuleDefinitionController.cs | 26 ++++++++++++++++--- Oqtane.Server/Oqtane.Server.csproj | 23 +++++----------- 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Client/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Client/Index.razor index df16458b..111e69ab 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Client/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/External/Client/Index.razor @@ -61,8 +61,8 @@ else - Repository\I[Module]Repository.cs - interface for defining repository methods
- Repository\[Module]Respository.cs - implements repository interface methods for data access using EF Core
- Repository\[Module]Context.cs - provides a DB Context for data access
-- Scripts\[Owner].[Module].1.0.0.sql - database schema definition script

-- Scripts\[Owner].[Module].Uninstall.sql - database uninstall script

+- Scripts\[Owner].[Module]s.1.0.0.sql - database schema definition script
+- Scripts\[Owner].[Module]s.Uninstall.sql - database uninstall script

[RootPath]Shared\
- [Owner].[Module]s.csproj - shared project
- Models\[Module].cs - model definition

diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Index.razor index 0656cb80..b683abf4 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Templates/Internal/Oqtane.Client/Modules/[Module]/Index.razor @@ -53,8 +53,8 @@ else - Repository\I[Module]Repository.cs - interface for defining repository methods
- Repository\[Module]Respository.cs - implements repository interface methods for data access using EF Core
- Repository\[Module]Context.cs - provides a DB Context for data access
-- Scripts\[Owner].[Module].1.0.0.sql - database schema definition script

-- Scripts\[Owner].[Module].Uninstall.sql - database uninstall script

+- Scripts\[Owner].[Module]s.1.0.0.sql - database schema definition script
+- Scripts\[Owner].[Module]s.Uninstall.sql - database uninstall script

[RootPath]Oqtane.Shared\Modules\[Module]\
- Models\[Module].cs - model definition

diff --git a/Oqtane.Server/Controllers/ModuleDefinitionController.cs b/Oqtane.Server/Controllers/ModuleDefinitionController.cs index d9131d69..039d6782 100644 --- a/Oqtane.Server/Controllers/ModuleDefinitionController.cs +++ b/Oqtane.Server/Controllers/ModuleDefinitionController.cs @@ -14,6 +14,8 @@ using Oqtane.Security; using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; +using System.Xml.Linq; +using Microsoft.AspNetCore.Mvc.Formatters; // ReSharper disable StringIndexOfIsCultureSpecific.1 namespace Oqtane.Controllers @@ -208,13 +210,13 @@ namespace Oqtane.Controllers if (moduleDefinition.Template == "internal") { rootPath = Utilities.PathCombine(rootFolder.FullName,"\\"); - moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Modules, Oqtane.Client"; + moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s, Oqtane.Client"; moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Manager." + moduleDefinition.Name + "Manager, Oqtane.Server"; } else { rootPath = Utilities.PathCombine(rootFolder.Parent.FullName , moduleDefinition.Owner + "." + moduleDefinition.Name + "s","\\"); - moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Modules, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Client.Oqtane"; + moduleDefinition.ModuleDefinitionName = moduleDefinition.Owner + "." + moduleDefinition.Name + "s, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Client.Oqtane"; moduleDefinition.ServerManagerType = moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Manager." + moduleDefinition.Name + "Manager, " + moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Server.Oqtane"; } @@ -227,7 +229,11 @@ namespace Oqtane.Controllers if (moduleDefinition.Template == "internal") { - // need logic to add embedded scripts to Oqtane.Server.csproj - also you need to remove them on uninstall + // add embedded resources to project + List resources = new List(); + resources.Add(Utilities.PathCombine("Modules", moduleDefinition.Name, "Scripts", moduleDefinition.Owner + "." + moduleDefinition.Name + "s.1.0.0.sql")); + resources.Add(Utilities.PathCombine("Modules", moduleDefinition.Name, "Scripts", moduleDefinition.Owner + "." + moduleDefinition.Name + "s.Uninstall.sql")); + EmbedResourceFiles(Utilities.PathCombine(rootPath, "Oqtane.Server", "Oqtane.Server.csproj"), resources); } _installationManager.RestartApplication(); @@ -276,5 +282,19 @@ namespace Oqtane.Controllers } } } + + private void EmbedResourceFiles(string projectfile, List resources) + { + XDocument project = XDocument.Load(projectfile); + var itemGroup = project.Descendants("ItemGroup").Descendants("EmbeddedResource").FirstOrDefault().Parent; + if (itemGroup != null) + { + foreach (var resource in resources) + { + itemGroup.Add(new XElement("EmbeddedResource", new XAttribute("Include", resource))); + } + } + project.Save(projectfile); + } } } diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index 88064ed9..a2f3e77c 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -1,5 +1,5 @@ - - + + netcoreapp3.1 7.3 @@ -16,21 +16,14 @@ Not for production use. Oqtane - - - - - - + + + + - - - - - @@ -41,10 +34,8 @@ - - - + \ No newline at end of file