@@ -130,7 +122,6 @@ else
string tenantid = "-1";
string name = "";
string urls = "";
- FileManager filemanager;
string themetype = "";
string layouttype = "";
string containertype = "";
@@ -210,6 +201,8 @@ else
if (isvalid)
{
+ ShowProgressIndicator();
+
List aliases = new List();
urls = urls.Replace("\n", ",");
foreach (string name in urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
@@ -226,11 +219,6 @@ else
site.TenantId = int.Parse(tenantid);
site.Name = name;
site.LogoFileId = null;
- int logofileid = filemanager.GetFileId();
- if (logofileid != -1)
- {
- site.LogoFileId = logofileid;
- }
site.DefaultThemeType = themetype;
site.DefaultLayoutType = (layouttype == null ? "" : layouttype);
site.DefaultContainerType = containertype;
diff --git a/Oqtane.Client/Modules/Admin/Sites/Index.razor b/Oqtane.Client/Modules/Admin/Sites/Index.razor
index 9b758fdd..5cf9bdbb 100644
--- a/Oqtane.Client/Modules/Admin/Sites/Index.razor
+++ b/Oqtane.Client/Modules/Admin/Sites/Index.razor
@@ -19,8 +19,8 @@ else
Name |
- |
- |
+ Edit |
+ Delete |
@context.Name |
@@ -47,19 +47,4 @@ else
}
}
}
-
- private async Task DeleteSite(Alias Alias)
- {
- try
- {
- await SiteService.DeleteSiteAsync(Alias.SiteId, Alias);
- await logger.LogInformation("Sited Deleted {Alias}", Alias);
- StateHasChanged();
- }
- catch (Exception ex)
- {
- await logger.LogError(ex, "Error Deleting Site {Error}", ex.Message);
- AddModuleMessage("Error Deleting Site", MessageType.Error);
- }
- }
}
\ No newline at end of file
diff --git a/Oqtane.Client/Modules/Admin/Tenants/Add.razor b/Oqtane.Client/Modules/Admin/Tenants/Add.razor
index e12a27a3..6acbe5be 100644
--- a/Oqtane.Client/Modules/Admin/Tenants/Add.razor
+++ b/Oqtane.Client/Modules/Admin/Tenants/Add.razor
@@ -4,32 +4,78 @@
@inject ITenantService TenantService
@inject IInstallationService InstallationService
-
+
Cancel
@@ -37,46 +83,72 @@
public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } }
string name = "";
- string connectionstring = "";
+ string type = "LocalDB";
+ string server = "(LocalDb)\\MSSQLLocalDB";
+ string database = "Oqtane-" + DateTime.Now.ToString("yyyyMMddHHmm");
+ string username = "";
+ string password = "";
string schema = "";
+ string integratedsecurity = "display: none;";
- protected override async Task OnInitializedAsync()
+ private void SetIntegratedSecurity(ChangeEventArgs e)
{
- try
+ if (Convert.ToBoolean((string)e.Value))
{
- List tenants = await TenantService.GetTenantsAsync();
- connectionstring = tenants.FirstOrDefault().DBConnectionString;
- schema = tenants.FirstOrDefault().DBSchema;
+ integratedsecurity = "display: none;";
}
- catch (Exception ex)
+ else
{
- await logger.LogError(ex, "Error Loading Tenants {Error}", ex.Message);
- AddModuleMessage("Error Loading Tenants", MessageType.Error);
+ integratedsecurity = "";
}
}
private async Task SaveTenant()
{
- ShowProgressIndicator();
-
- connectionstring = connectionstring.Replace("\\\\", "\\");
- GenericResponse response = await InstallationService.Install(connectionstring);
- if (response.Success)
+ if (!string.IsNullOrEmpty(name))
{
- Tenant tenant = new Tenant();
- tenant.Name = name;
- tenant.DBConnectionString = connectionstring;
- tenant.DBSchema = schema;
- tenant.IsInitialized = false;
- await TenantService.AddTenantAsync(tenant);
- await logger.LogInformation("Tenant Created {Tenant}", tenant);
+ ShowProgressIndicator();
- NavigationManager.NavigateTo(NavigateUrl());
+ string connectionstring = "";
+ if (type == "LocalDB")
+ {
+ connectionstring = "Data Source=" + server + ";AttachDbFilename=|DataDirectory|\\" + database + ".mdf;Initial Catalog=" + database + ";Integrated Security=SSPI;";
+ }
+ else
+ {
+ connectionstring = "Data Source=" + server + ";Initial Catalog=" + database + ";";
+ if (integratedsecurity == "display: none;")
+ {
+ connectionstring += "Integrated Security=SSPI;";
+ }
+ else
+ {
+ connectionstring += "User ID=" + username + ";Password=" + password;
+
+ }
+ }
+ GenericResponse response = await InstallationService.Install(connectionstring);
+ if (response.Success)
+ {
+ Tenant tenant = new Tenant();
+ tenant.Name = name;
+ tenant.DBConnectionString = connectionstring;
+ tenant.DBSchema = schema;
+ tenant.IsInitialized = false;
+ await TenantService.AddTenantAsync(tenant);
+ await logger.LogInformation("Tenant Created {Tenant}", tenant);
+
+ NavigationManager.NavigateTo(NavigateUrl());
+ }
+ else
+ {
+ await logger.LogError("Error Creating Tenant {Error}", response.Message);
+ AddModuleMessage(response.Message, MessageType.Error);
+ }
}
else
{
- await logger.LogError("Error Creating Tenant {Error}", response.Message);
- AddModuleMessage(response.Message, MessageType.Error);
+ AddModuleMessage("You Must Provide A Name For The Tenant", MessageType.Warning);
}
}
}
diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor
index d0ebc303..3259c7a9 100644
--- a/Oqtane.Client/Modules/Controls/FileManager.razor
+++ b/Oqtane.Client/Modules/Controls/FileManager.razor
@@ -93,7 +93,6 @@
[Parameter]
public string UploadMultiple { get; set; } // optional - enable multiple file uploads - default false
-
string id;
List folders;
int folderid = -1;
diff --git a/Oqtane.Client/Services/Interfaces/ISiteService.cs b/Oqtane.Client/Services/Interfaces/ISiteService.cs
index d852d32a..1e0637bf 100644
--- a/Oqtane.Client/Services/Interfaces/ISiteService.cs
+++ b/Oqtane.Client/Services/Interfaces/ISiteService.cs
@@ -9,15 +9,11 @@ namespace Oqtane.Services
Task> GetSitesAsync();
Task GetSiteAsync(int SiteId);
- Task GetSiteAsync(int SiteId, Alias Alias);
- Task AddSiteAsync(Site Site);
Task AddSiteAsync(Site Site, Alias Alias);
Task UpdateSiteAsync(Site Site);
- Task UpdateSiteAsync(Site Site, Alias Alias);
Task DeleteSiteAsync(int SiteId);
- Task DeleteSiteAsync(int SiteId, Alias Alias);
}
}
diff --git a/Oqtane.Client/Services/Interfaces/IUserService.cs b/Oqtane.Client/Services/Interfaces/IUserService.cs
index 820c2231..c00fa59c 100644
--- a/Oqtane.Client/Services/Interfaces/IUserService.cs
+++ b/Oqtane.Client/Services/Interfaces/IUserService.cs
@@ -12,7 +12,7 @@ namespace Oqtane.Services
Task AddUserAsync(User User);
- Task AddUserAsync(User User, Alias alias);
+ Task AddUserAsync(User User, Alias Alias);
Task UpdateUserAsync(User User);
diff --git a/Oqtane.Client/Services/SiteService.cs b/Oqtane.Client/Services/SiteService.cs
index 432fc17e..bf5add07 100644
--- a/Oqtane.Client/Services/SiteService.cs
+++ b/Oqtane.Client/Services/SiteService.cs
@@ -36,37 +36,27 @@ namespace Oqtane.Services
{
return await http.GetJsonAsync(apiurl + "/" + SiteId.ToString());
}
- public async Task GetSiteAsync(int SiteId, Alias Alias)
- {
- return await http.GetJsonAsync(CreateApiUrl(Alias, NavigationManager.Uri, "Site") + "/" + SiteId.ToString());
- }
-
- public async Task AddSiteAsync(Site Site)
- {
- return await http.PostJsonAsync(apiurl, Site);
- }
public async Task AddSiteAsync(Site Site, Alias Alias)
{
- return await http.PostJsonAsync(CreateApiUrl(Alias, NavigationManager.Uri, "Site"), Site);
+ if (Alias == null)
+ {
+ return await http.PostJsonAsync(apiurl, Site);
+ }
+ else
+ {
+ return await http.PostJsonAsync(CreateApiUrl(Alias, NavigationManager.Uri, "Site"), Site);
+ }
}
public async Task UpdateSiteAsync(Site Site)
{
return await http.PutJsonAsync(apiurl + "/" + Site.SiteId.ToString(), Site);
}
- public async Task UpdateSiteAsync(Site Site, Alias Alias)
- {
- return await http.PutJsonAsync(CreateApiUrl(Alias, NavigationManager.Uri, "Site") + "/" + Site.SiteId.ToString(), Site);
- }
public async Task DeleteSiteAsync(int SiteId)
{
await http.DeleteAsync(apiurl + "/" + SiteId.ToString());
}
- public async Task DeleteSiteAsync(int SiteId, Alias Alias)
- {
- await http.DeleteAsync(CreateApiUrl(Alias, NavigationManager.Uri, "Site") + "/" + SiteId.ToString());
- }
}
}
diff --git a/Oqtane.Client/Shared/Installer.razor b/Oqtane.Client/Shared/Installer.razor
index f999cdb2..71b5a846 100644
--- a/Oqtane.Client/Shared/Installer.razor
+++ b/Oqtane.Client/Shared/Installer.razor
@@ -187,7 +187,7 @@
site.DefaultThemeType = Constants.DefaultTheme;
site.DefaultLayoutType = Constants.DefaultLayout;
site.DefaultContainerType = Constants.DefaultContainer;
- site = await SiteService.AddSiteAsync(site);
+ site = await SiteService.AddSiteAsync(site, null);
User user = new User();
user.SiteId = site.SiteId;
diff --git a/Oqtane.Server/Controllers/AliasController.cs b/Oqtane.Server/Controllers/AliasController.cs
index e07db160..dd7b82e5 100644
--- a/Oqtane.Server/Controllers/AliasController.cs
+++ b/Oqtane.Server/Controllers/AliasController.cs
@@ -7,6 +7,7 @@ using Oqtane.Shared;
using Oqtane.Infrastructure;
using System.Linq;
using System;
+using System.Net;
namespace Oqtane.Controllers
{
@@ -42,6 +43,7 @@ namespace Oqtane.Controllers
[HttpGet("name/{name}")]
public Alias Get(string name)
{
+ name = WebUtility.UrlDecode(name);
List aliases = Aliases.GetAliases().ToList();
Alias alias = null;
alias = aliases.Where(item => item.Name == name).FirstOrDefault();
diff --git a/Oqtane.Server/Controllers/SiteController.cs b/Oqtane.Server/Controllers/SiteController.cs
index dc8361ec..19a87c46 100644
--- a/Oqtane.Server/Controllers/SiteController.cs
+++ b/Oqtane.Server/Controllers/SiteController.cs
@@ -63,7 +63,7 @@ namespace Oqtane.Controllers
if (authorized)
{
Site = Sites.AddSite(Site);
- logger.Log(LogLevel.Information, this, LogFunction.Create, "Site Added {Site}", Site);
+ logger.Log(Site.SiteId, LogLevel.Information, this, LogFunction.Create, "Site Added {Site}", Site);
}
}
return Site;
@@ -77,7 +77,7 @@ namespace Oqtane.Controllers
if (ModelState.IsValid)
{
Site = Sites.UpdateSite(Site);
- logger.Log(LogLevel.Information, this, LogFunction.Update, "Site Updated {Site}", Site);
+ logger.Log(Site.SiteId, LogLevel.Information, this, LogFunction.Update, "Site Updated {Site}", Site);
}
return Site;
}
@@ -87,14 +87,15 @@ namespace Oqtane.Controllers
[Authorize(Roles = Constants.HostRole)]
public void Delete(int id)
{
+ Site Site = Sites.GetSite(id);
if (Sites.GetSites().Count() > 1)
{
Sites.DeleteSite(id);
- logger.Log(LogLevel.Information, this, LogFunction.Delete, "Site Deleted {SiteId}", id);
+ logger.Log(Site.SiteId, LogLevel.Information, this, LogFunction.Delete, "Site Deleted {SiteId}", id);
}
else
{
- logger.Log(LogLevel.Warning, this, LogFunction.Delete, "Unable to delete the root site.");
+ logger.Log(Site.SiteId, LogLevel.Warning, this, LogFunction.Delete, "Unable to delete the root site.");
}
}
}
diff --git a/Oqtane.Server/Controllers/UserController.cs b/Oqtane.Server/Controllers/UserController.cs
index b01404af..ab16c183 100644
--- a/Oqtane.Server/Controllers/UserController.cs
+++ b/Oqtane.Server/Controllers/UserController.cs
@@ -160,7 +160,7 @@ namespace Oqtane.Controllers
}
}
user.Password = ""; // remove sensitive information
- logger.Log(LogLevel.Information, this, LogFunction.Create, "User Added {User}", user);
+ logger.Log(User.SiteId, LogLevel.Information, this, LogFunction.Create, "User Added {User}", user);
}
return user;
diff --git a/Oqtane.Server/Infrastructure/Interfaces/ILogManager.cs b/Oqtane.Server/Infrastructure/Interfaces/ILogManager.cs
index f51ee4bd..0798f86c 100644
--- a/Oqtane.Server/Infrastructure/Interfaces/ILogManager.cs
+++ b/Oqtane.Server/Infrastructure/Interfaces/ILogManager.cs
@@ -8,6 +8,8 @@ namespace Oqtane.Infrastructure
{
void Log(LogLevel Level, object Class, LogFunction Function, string Message, params object[] Args);
void Log(LogLevel Level, object Class, LogFunction Function, Exception Exception, string Message, params object[] Args);
+ void Log(int SiteId, LogLevel Level, object Class, LogFunction Function, string Message, params object[] Args);
+ void Log(int SiteId, LogLevel Level, object Class, LogFunction Function, Exception Exception, string Message, params object[] Args);
void Log(Log Log);
}
}
diff --git a/Oqtane.Server/Infrastructure/LogManager.cs b/Oqtane.Server/Infrastructure/LogManager.cs
index 2beb795e..494ee7fb 100644
--- a/Oqtane.Server/Infrastructure/LogManager.cs
+++ b/Oqtane.Server/Infrastructure/LogManager.cs
@@ -29,14 +29,35 @@ namespace Oqtane.Infrastructure
public void Log(LogLevel Level, object Class, LogFunction Function, string Message, params object[] Args)
{
- Log(Level, Class.GetType().AssemblyQualifiedName, Function, null, Message, Args);
+ Log(-1, Level, Class.GetType().AssemblyQualifiedName, Function, null, Message, Args);
}
public void Log(LogLevel Level, object Class, LogFunction Function, Exception Exception, string Message, params object[] Args)
{
- Alias alias = TenantResolver.GetAlias();
+ Log(-1, Level, Class.GetType().AssemblyQualifiedName, Function, Exception, Message, Args);
+ }
+
+ public void Log(int SiteId, LogLevel Level, object Class, LogFunction Function, string Message, params object[] Args)
+ {
+ Log(SiteId, Level, Class.GetType().AssemblyQualifiedName, Function, null, Message, Args);
+ }
+
+ public void Log(int SiteId, LogLevel Level, object Class, LogFunction Function, Exception Exception, string Message, params object[] Args)
+ {
Log log = new Log();
- log.SiteId = alias.SiteId;
+ if (SiteId == -1)
+ {
+ log.SiteId = null;
+ Alias alias = TenantResolver.GetAlias();
+ if (alias != null)
+ {
+ log.SiteId = alias.SiteId;
+ }
+ }
+ else
+ {
+ log.SiteId = SiteId;
+ }
log.PageId = null;
log.ModuleId = null;
log.UserId = null;
@@ -96,56 +117,70 @@ namespace Oqtane.Infrastructure
Log.Server = Environment.MachineName;
Log.MessageTemplate = Log.Message;
Log = ProcessStructuredLog(Log);
- Logs.AddLog(Log);
+ try
+ {
+ Logs.AddLog(Log);
+ }
+ catch
+ {
+ // an error occurred writing to the database
+ }
}
}
private Log ProcessStructuredLog(Log Log)
{
- string message = Log.Message;
- string properties = "";
- if (!string.IsNullOrEmpty(message) && message.Contains("{") && message.Contains("}") && !string.IsNullOrEmpty(Log.Properties))
+ try
{
- // get the named holes in the message and replace values
- object[] values = JsonSerializer.Deserialize |