This commit is contained in:
Ikuo Ohba
2025-05-02 23:45:18 +09:00
11 changed files with 128 additions and 112 deletions

View File

@ -40,27 +40,26 @@ namespace Oqtane.Infrastructure
log += "Processing Notifications For Site: " + site.Name + "<br />";
// get site settings
List<Setting> sitesettings = settingRepository.GetSettings(EntityNames.Site, site.SiteId).ToList();
Dictionary<string, string> settings = GetSettings(sitesettings);
if (!site.IsDeleted && (!settings.ContainsKey("SMTPEnabled") || settings["SMTPEnabled"] == "True"))
var settings = settingRepository.GetSettings(EntityNames.Site, site.SiteId, EntityNames.Host, -1);
if (!site.IsDeleted && settingRepository.GetSettingValue(settings, "SMTPEnabled", "True") == "True")
{
if (settings.ContainsKey("SMTPHost") && settings["SMTPHost"] != "" &&
settings.ContainsKey("SMTPPort") && settings["SMTPPort"] != "" &&
settings.ContainsKey("SMTPSSL") && settings["SMTPSSL"] != "" &&
settings.ContainsKey("SMTPSender") && settings["SMTPSender"] != "")
if (settingRepository.GetSettingValue(settings, "SMTPHost", "") != "" &&
settingRepository.GetSettingValue(settings, "SMTPPort", "") != "" &&
settingRepository.GetSettingValue(settings, "SMTPSender", "") != "")
{
// construct SMTP Client
var client = new SmtpClient()
{
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Host = settings["SMTPHost"],
Port = int.Parse(settings["SMTPPort"]),
EnableSsl = bool.Parse(settings["SMTPSSL"])
Host = settingRepository.GetSettingValue(settings, "SMTPHost", ""),
Port = int.Parse(settingRepository.GetSettingValue(settings, "SMTPPort", "")),
EnableSsl = bool.Parse(settingRepository.GetSettingValue(settings, "SMTPSSL", "False"))
};
if (settings["SMTPUsername"] != "" && settings["SMTPPassword"] != "")
if (settingRepository.GetSettingValue(settings, "SMTPUsername", "") != "" && settingRepository.GetSettingValue(settings, "SMTPPassword", "") != "")
{
client.Credentials = new NetworkCredential(settings["SMTPUsername"], settings["SMTPPassword"]);
client.Credentials = new NetworkCredential(settingRepository.GetSettingValue(settings, "SMTPUsername", ""), settingRepository.GetSettingValue(settings, "SMTPPassword", ""));
}
// iterate through undelivered notifications
@ -100,7 +99,7 @@ namespace Oqtane.Infrastructure
MailMessage mailMessage = new MailMessage();
// sender
if (settings.ContainsKey("SMTPRelay") && settings["SMTPRelay"] == "True" && !string.IsNullOrEmpty(notification.FromEmail))
if (settingRepository.GetSettingValue(settings, "SMTPRelay", "False") == "True" && !string.IsNullOrEmpty(notification.FromEmail))
{
if (!string.IsNullOrEmpty(notification.FromDisplayName))
{
@ -113,7 +112,7 @@ namespace Oqtane.Infrastructure
}
else
{
mailMessage.From = new MailAddress(settings["SMTPSender"], (!string.IsNullOrEmpty(notification.FromDisplayName)) ? notification.FromDisplayName : site.Name);
mailMessage.From = new MailAddress(settingRepository.GetSettingValue(settings, "SMTPSender", ""), (!string.IsNullOrEmpty(notification.FromDisplayName)) ? notification.FromDisplayName : site.Name);
}
// recipient
@ -162,7 +161,7 @@ namespace Oqtane.Infrastructure
}
else
{
log += "SMTP Not Configured Properly In Site Settings - Host, Port, SSL, And Sender Are All Required" + "<br />";
log += "SMTP Not Configured Properly In Site Settings - Host, Port, And Sender Are All Required" + "<br />";
}
}
else
@ -173,15 +172,5 @@ namespace Oqtane.Infrastructure
return log;
}
private Dictionary<string, string> GetSettings(List<Setting> settings)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
foreach (Setting setting in settings.OrderBy(item => item.SettingName).ToList())
{
dictionary.Add(setting.SettingName, setting.SettingValue);
}
return dictionary;
}
}
}

View File

@ -40,18 +40,13 @@ namespace Oqtane.Infrastructure
foreach (Site site in sites)
{
log += "<br />Processing Site: " + site.Name + "<br />";
int retention;
int count;
// get site settings
Dictionary<string, string> settings = GetSettings(settingRepository.GetSettings(EntityNames.Site, site.SiteId).ToList());
var settings = settingRepository.GetSettings(EntityNames.Site, site.SiteId, EntityNames.Host, -1);
// purge event log
retention = 30; // 30 days
if (settings.ContainsKey("LogRetention") && !string.IsNullOrEmpty(settings["LogRetention"]))
{
retention = int.Parse(settings["LogRetention"]);
}
var retention = int.Parse(settingRepository.GetSettingValue(settings, "LogRetention", "30")); // 30 day default
try
{
count = logRepository.DeleteLogs(site.SiteId, retention);
@ -65,11 +60,7 @@ namespace Oqtane.Infrastructure
// purge visitors
if (site.VisitorTracking)
{
retention = 30; // 30 days
if (settings.ContainsKey("VisitorRetention") && !string.IsNullOrEmpty(settings["VisitorRetention"]))
{
retention = int.Parse(settings["VisitorRetention"]);
}
retention = int.Parse(settingRepository.GetSettingValue(settings, "VisitorRetention", "30")); // 30 day default
try
{
count = visitorRepository.DeleteVisitors(site.SiteId, retention);
@ -82,11 +73,7 @@ namespace Oqtane.Infrastructure
}
// purge notifications
retention = 30; // 30 days
if (settings.ContainsKey("NotificationRetention") && !string.IsNullOrEmpty(settings["NotificationRetention"]))
{
retention = int.Parse(settings["NotificationRetention"]);
}
retention = int.Parse(settingRepository.GetSettingValue(settings, "NotificationRetention", "30")); // 30 day default
try
{
count = notificationRepository.DeleteNotifications(site.SiteId, retention);
@ -98,11 +85,7 @@ namespace Oqtane.Infrastructure
}
// purge broken urls
retention = 30; // 30 days
if (settings.ContainsKey("UrlMappingRetention") && !string.IsNullOrEmpty(settings["UrlMappingRetention"]))
{
retention = int.Parse(settings["UrlMappingRetention"]);
}
retention = int.Parse(settingRepository.GetSettingValue(settings, "UrlMappingRetention", "30")); // 30 day default
try
{
count = urlMappingRepository.DeleteUrlMappings(site.SiteId, retention);
@ -127,15 +110,5 @@ namespace Oqtane.Infrastructure
return log;
}
private Dictionary<string, string> GetSettings(List<Setting> settings)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
foreach (Setting setting in settings.OrderBy(item => item.SettingName).ToList())
{
dictionary.Add(setting.SettingName, setting.SettingValue);
}
return dictionary;
}
}
}

View File

@ -23,10 +23,6 @@ namespace Oqtane.Infrastructure
var config = context.RequestServices.GetService(typeof(IConfigManager)) as IConfigManager;
string path = context.Request.Path.ToString();
// note that in order to support Alias subfolders we used to ignore Blazor framework requests...
// but this does not work in static rendering as the web UI request originates from /_blazor
//if (config.IsInstalled() && !path.StartsWith("/_"))
if (config.IsInstalled())
{
// get alias (note that this also sets SiteState.Alias)
@ -43,7 +39,7 @@ namespace Oqtane.Infrastructure
var sitesettings = cache.GetOrCreate(Constants.HttpContextSiteSettingsKey + alias.SiteKey, entry =>
{
var settingRepository = context.RequestServices.GetService(typeof(ISettingRepository)) as ISettingRepository;
return settingRepository.GetSettings(EntityNames.Site, alias.SiteId)
return settingRepository.GetSettings(EntityNames.Site, alias.SiteId, EntityNames.Host, -1)
.ToDictionary(setting => setting.SettingName, setting => setting.SettingValue);
});
context.Items.Add(Constants.HttpContextSiteSettingsKey, sitesettings);

View File

@ -1,5 +1,6 @@
using System.Collections.Generic;
using Oqtane.Models;
using Oqtane.Shared;
namespace Oqtane.Repository
{
@ -7,11 +8,13 @@ namespace Oqtane.Repository
{
IEnumerable<Setting> GetSettings(string entityName);
IEnumerable<Setting> GetSettings(string entityName, int entityId);
IEnumerable<Setting> GetSettings(string entityName1, int entityId1, string entityName2, int entityId2);
Setting AddSetting(Setting setting);
Setting UpdateSetting(Setting setting);
Setting GetSetting(string entityName, int settingId);
Setting GetSetting(string entityName, int entityId, string settingName);
void DeleteSetting(string entityName, int settingId);
void DeleteSettings(string entityName, int entityId);
string GetSettingValue(IEnumerable<Setting> settings, string settingName, string defaultValue);
}
}

View File

@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Oqtane.Infrastructure;
@ -39,24 +38,27 @@ namespace Oqtane.Repository
public IEnumerable<Setting> GetSettings(string entityName, int entityId)
{
var settings = GetSettings(entityName).ToList();
if (entityName == EntityNames.Site)
return GetSettings(entityName).Where(item => item.EntityId == entityId);
}
public IEnumerable<Setting> GetSettings(string entityName1, int entityId1, string entityName2, int entityId2)
{
// merge settings from entity2 into entity1
var settings1 = GetSettings(entityName1, entityId1).ToList();
foreach (var setting2 in GetSettings(entityName2, entityId2))
{
// site settings can be overridden by host settings
var hostsettings = GetSettings(EntityNames.Host);
foreach (var hostsetting in hostsettings)
var setting1 = settings1.FirstOrDefault(item => item.SettingName == setting2.SettingName);
if (setting1 == null)
{
if (settings.Any(item => item.SettingName == hostsetting.SettingName))
{
settings.First(item => item.SettingName == hostsetting.SettingName).SettingValue = hostsetting.SettingValue;
}
else
{
settings.Add(new Setting { SettingId = -1, EntityName = entityName, EntityId = entityId, SettingName = hostsetting.SettingName, SettingValue = hostsetting.SettingValue, IsPrivate = hostsetting.IsPrivate });
}
settings1.Add(new Setting { EntityName = entityName1, EntityId = entityId1, SettingName = setting2.SettingName, SettingValue = setting2.SettingValue, IsPrivate = setting2.IsPrivate });
}
else
{
setting1.SettingValue = setting2.SettingValue;
setting1.IsPrivate = setting2.IsPrivate;
}
}
return settings.Where(item => item.EntityId == entityId);
return settings1;
}
public Setting AddSetting(Setting setting)
@ -165,6 +167,19 @@ namespace Oqtane.Repository
ManageCache(entityName);
}
public string GetSettingValue(IEnumerable<Setting> settings, string settingName, string defaultValue)
{
var setting = settings.FirstOrDefault(item => item.SettingName == settingName);
if (setting != null)
{
return setting.SettingValue;
}
else
{
return defaultValue;
}
}
private bool IsMaster(string EntityName)
{
return (EntityName == EntityNames.ModuleDefinition || EntityName == EntityNames.Host);

View File

@ -111,7 +111,7 @@ namespace Oqtane.Services
if (site != null && site.SiteId == alias.SiteId)
{
// site settings
site.Settings = _settings.GetSettings(EntityNames.Site, site.SiteId)
site.Settings = _settings.GetSettings(EntityNames.Site, site.SiteId, EntityNames.Host, -1)
.ToDictionary(setting => setting.SettingName, setting => (setting.IsPrivate ? _private : "") + setting.SettingValue);
// populate file extensions

View File

@ -195,9 +195,6 @@ namespace Oqtane
app.UseHsts();
}
// execute any IServerStartup logic
app.ConfigureOqtaneAssemblies(env);
// allow oqtane localization middleware
app.UseOqtaneLocalization();
@ -248,6 +245,9 @@ namespace Oqtane
.AddAdditionalAssemblies(typeof(SiteRouter).Assembly);
});
// execute any IServerStartup logic
app.ConfigureOqtaneAssemblies(env);
// simulate the fallback routing approach of traditional Blazor - allowing the custom SiteRouter to handle all routing concerns
app.UseEndpoints(endpoints =>
{