diff --git a/Oqtane.Application/.gitignore b/Oqtane.Application/.gitignore new file mode 100644 index 00000000..ce6c2edc --- /dev/null +++ b/Oqtane.Application/.gitignore @@ -0,0 +1,9 @@ +.vs/ +bin/ +obj/ +*.user +artifacts/ +msbuild.binlog +.vscode/ +*.binlog +*.nupkg diff --git a/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj b/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj index a31aeff0..9490f607 100644 --- a/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj +++ b/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj @@ -9,7 +9,7 @@ - + all @@ -44,4 +44,8 @@ + + + + diff --git a/Oqtane.Application/AppHost/readme.md b/Oqtane.Application/AppHost/readme.md deleted file mode 100644 index 881a01c1..00000000 --- a/Oqtane.Application/AppHost/readme.md +++ /dev/null @@ -1,7 +0,0 @@ -# Oqtane Application Template - -![Oqtane](https://github.com/oqtane/framework/blob/master/oqtane.png?raw=true "Oqtane") - -Oqtane is an open source CMS and Application Framework that provides advanced functionality for developing web, mobile, and desktop applications on .NET. It leverages Blazor to compose a fully dynamic digital experience which can be hosted on Static Blazor, Blazor Server, Blazor WebAssembly, or Blazor Hybrid (via .NET MAUI). - -More information about Oqtane can be found at: [https://www.oqtane.org](https://www.oqtane.org) diff --git a/Oqtane.Application/AppHost/release.cmd b/Oqtane.Application/AppHost/release.cmd deleted file mode 100644 index e3d503bc..00000000 --- a/Oqtane.Application/AppHost/release.cmd +++ /dev/null @@ -1,3 +0,0 @@ -del "*.nupkg" -"../Build/nuget.exe" pack ../Oqtane.Application.Template.nuspec -pause diff --git a/Oqtane.Application/Build/Oqtane.Application.nuspec b/Oqtane.Application/Build/Oqtane.Application.nuspec deleted file mode 100644 index 1cca2e51..00000000 --- a/Oqtane.Application/Build/Oqtane.Application.nuspec +++ /dev/null @@ -1,32 +0,0 @@ - - - - $projectname$ - 1.0.0 - Oqtane.Application - Oqtane.Application - Oqtane.Application - Oqtane.Application - Oqtane.Application - false - MIT - https://github.com/oqtane/oqtane.framework - icon.png - oqtane module - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Oqtane.Application/Build/debug.cmd b/Oqtane.Application/Build/debug.cmd index 6ac5c190..697dd3ae 100644 --- a/Oqtane.Application/Build/debug.cmd +++ b/Oqtane.Application/Build/debug.cmd @@ -1,11 +1 @@ -@echo off -set TargetFramework=%1 -set ProjectName=%2 - -XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.dll" "..\AppHost\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.pdb" "..\AppHost\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Server\bin\Debug\%TargetFramework%\%ProjectName%.Server.Oqtane.dll" "..\AppHost\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Server\bin\Debug\%TargetFramework%\%ProjectName%.Server.Oqtane.pdb" "..\AppHost\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Shared\bin\Debug\%TargetFramework%\%ProjectName%.Shared.Oqtane.dll" "..\AppHost\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Shared\bin\Debug\%TargetFramework%\%ProjectName%.Shared.Oqtane.pdb" "..\AppHost\bin\Debug\%TargetFramework%\" /Y XCOPY "..\Server\wwwroot\*" "..\AppHost\wwwroot\" /Y /S /I \ No newline at end of file diff --git a/Oqtane.Application/Build/debug.sh b/Oqtane.Application/Build/debug.sh index 7c4beb97..bf088d67 100644 --- a/Oqtane.Application/Build/debug.sh +++ b/Oqtane.Application/Build/debug.sh @@ -1,12 +1 @@ -#!/bin/bash - -TargetFramework=$1 -ProjectName=$2 - -cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.dll" "../AppHost/bin/Debug/$TargetFramework/" -cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.pdb" "../AppHost/bin/Debug/$TargetFramework/" -cp -f "../Server/bin/Debug/$TargetFramework/$ProjectName$.Server.Oqtane.dll" "../AppHost/bin/Debug/$TargetFramework/" -cp -f "../Server/bin/Debug/$TargetFramework/$ProjectName$.Server.Oqtane.pdb" "../AppHost/bin/Debug/$TargetFramework/" -cp -f "../Shared/bin/Debug/$TargetFramework/$ProjectName$.Shared.Oqtane.dll" "../AppHost/bin/Debug/$TargetFramework/" -cp -f "../Shared/bin/Debug/$TargetFramework/$ProjectName$.Shared.Oqtane.pdb" "../AppHost/bin/Debug/$TargetFramework/" cp -rf "../Server/wwwroot/"* "../AppHost/wwwroot/" \ No newline at end of file diff --git a/Oqtane.Application/Build/icon.png b/Oqtane.Application/Build/icon.png deleted file mode 100644 index 7422cf2f..00000000 Binary files a/Oqtane.Application/Build/icon.png and /dev/null differ diff --git a/Oqtane.Application/Build/nuget.exe b/Oqtane.Application/Build/nuget.exe deleted file mode 100644 index 89f85528..00000000 Binary files a/Oqtane.Application/Build/nuget.exe and /dev/null differ diff --git a/Oqtane.Application/Build/release.cmd b/Oqtane.Application/Build/release.cmd deleted file mode 100644 index a71d781e..00000000 --- a/Oqtane.Application/Build/release.cmd +++ /dev/null @@ -1,2 +0,0 @@ -del "*.nupkg" -"nuget.exe" pack Oqtane.Application.nuspec -Properties projectname=Oqtane.Application diff --git a/Oqtane.Application/Build/release.sh b/Oqtane.Application/Build/release.sh deleted file mode 100644 index 0a01b394..00000000 --- a/Oqtane.Application/Build/release.sh +++ /dev/null @@ -1 +0,0 @@ -"nuget.exe" pack Oqtane.Application.nuspec -Properties projectname=Oqtane.Application \ No newline at end of file diff --git a/Oqtane.Application/Client/Services/ArticleService.cs b/Oqtane.Application/Client/Services/MyModuleService.cs similarity index 100% rename from Oqtane.Application/Client/Services/ArticleService.cs rename to Oqtane.Application/Client/Services/MyModuleService.cs diff --git a/Oqtane.Application/Oqtane.Application.Template.nuspec b/Oqtane.Application/Oqtane.Application.Template.nuspec index a740abe0..35a1c956 100644 --- a/Oqtane.Application/Oqtane.Application.Template.nuspec +++ b/Oqtane.Application/Oqtane.Application.Template.nuspec @@ -8,12 +8,12 @@ false MIT https://licenses.nuget.org/MIT - Build/icon.png + icon.png https://github.com/oqtane/oqtane.framework Oqtane is an open source CMS and Application Framework that provides advanced functionality for developing web, mobile, and desktop applications on .NET. It leverages Blazor to compose a fully dynamic digital experience which can be hosted on Static Blazor, Blazor Server, Blazor WebAssembly, or Blazor Hybrid (via .NET MAUI). en-US Web ASP.NET Blazor Oqtane Modular Multi-Tenant "Open Source" "SQL Server" MySQL PostgreSQL SQLite - AppHost/README.md + README.md diff --git a/Oqtane.Application/README.md b/Oqtane.Application/README.md index 3c0a3897..a6880aff 100644 --- a/Oqtane.Application/README.md +++ b/Oqtane.Application/README.md @@ -1,15 +1,19 @@ # Oqtane Application Template -This folder contains content files for a Visual Studio Project Template designed for Oqtane development projects. The template relies on the native templating capabilities of the .NET Command Line Interface (CLI): +This is a Visual Studio Project Template designed for Oqtane development projects. This template relies on the native templating capabilities of the .NET Command Line Interface (CLI): ``` dotnet new install Oqtane.Application.Template dotnet new oqtane-app -o MyCompany.MyProject -dotnet new uninstall Oqtane.Application.Template ``` When using this approach you do not need to have a local copy of the oqtane.framework source code - you simply utilize Oqtane as a standard application dependency. -The solution contains an AppHost project which must be identified as the Startup project. It is only responsible for loading the development environment and launching the Oqtane framework. +The solution contains an AppHost project which must be identified as the Startup project. It is responsible for loading the development environment and launching the Oqtane framework. + +The solution also contains Build, Client, Server, and Shared folders which is where you you would implement your custom functionality. An example module and theme are included for reference, and you can add additional modules and themes within the same projects by following the standard Oqtane folder/namespace conventions. + +*Known Issues* + +- do not use the term "Oqtane" in your output name or else you will experience namespace conflicts -The solution also contains Build, Client, Server, and Shared folders which is where you you would implement your custom functionality. An example module and theme are included for reference, and you can add additional modules and themes within the same projects by following the standard Oqtane conventions. diff --git a/Oqtane.Application/icon.png b/Oqtane.Application/icon.png new file mode 100644 index 00000000..3c43cce4 Binary files /dev/null and b/Oqtane.Application/icon.png differ diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 115f29a0..7e1385ff 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -224,11 +224,14 @@
- +
- + + + + +
@@ -504,7 +507,7 @@ private string _smtpauthentication = "Basic"; private string _smtphost = string.Empty; private string _smtpport = string.Empty; - private string _smtpssl = "True"; + private string _smtpssl = "Auto"; private string _smtpusername = string.Empty; private string _smtppassword = string.Empty; private string _smtppasswordtype = "password"; @@ -613,7 +616,9 @@ { _smtphost = SettingService.GetSetting(settings, "SMTPHost", string.Empty); _smtpport = SettingService.GetSetting(settings, "SMTPPort", string.Empty); - _smtpssl = SettingService.GetSetting(settings, "SMTPSSL", "False"); + _smtpssl = SettingService.GetSetting(settings, "SMTPSSL", "Auto"); + if (_smtpssl == "True") _smtpssl = "SslOnConnect"; + if (_smtpssl == "False") _smtpssl = "StartTlsWhenAvailable"; _smtpauthentication = SettingService.GetSetting(settings, "SMTPAuthentication", "Basic"); _smtpusername = SettingService.GetSetting(settings, "SMTPUsername", string.Empty); _smtppassword = SettingService.GetSetting(settings, "SMTPPassword", string.Empty); diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor index b8e5ef08..719802bb 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Index.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor @@ -20,7 +20,6 @@ else
-       @SharedLocalizer["Name"] @@ -38,7 +37,6 @@ else } - @Localizer["Assign"] @context.Name @context.Version diff --git a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx index 97e4e8f3..5379db80 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx @@ -193,7 +193,7 @@ Enter the port number for the SMTP server. Please note this field is required if you provide a host name. - Specify if SSL is required for your SMTP server + Specify the type of SSL connection for your SMTP server Enter the username for your SMTP account @@ -241,7 +241,7 @@ Port: - SSL Required: + SSL Options: Username: @@ -489,4 +489,19 @@ The Authority Url for the SMTP provider + + None + + + Automatic + + + Upgrade To TLS + + + Require SSL/TLS + + + Use TLS When Available + \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/Themes/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Themes/Index.resx index 0d3b97ed..4865dc89 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Themes/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Themes/Index.resx @@ -156,9 +156,6 @@ Enabled? - - Assign - Check For Updates diff --git a/Oqtane.Maui/Oqtane.Maui.csproj b/Oqtane.Maui/Oqtane.Maui.csproj index f7dbf38d..f9cf6f34 100644 --- a/Oqtane.Maui/Oqtane.Maui.csproj +++ b/Oqtane.Maui/Oqtane.Maui.csproj @@ -72,9 +72,9 @@ - - - + + + diff --git a/Oqtane.Package/Oqtane.Application.Template.cmd b/Oqtane.Package/Oqtane.Application.Template.cmd new file mode 100644 index 00000000..2352d0e9 --- /dev/null +++ b/Oqtane.Package/Oqtane.Application.Template.cmd @@ -0,0 +1,3 @@ +nuget.exe pack ..\Oqtane.Application\Oqtane.Application.Template.nuspec -NoDefaultExcludes +pause + diff --git a/Oqtane.Server/Components/App.razor b/Oqtane.Server/Components/App.razor index 638c8031..a4e1f4ab 100644 --- a/Oqtane.Server/Components/App.razor +++ b/Oqtane.Server/Components/App.razor @@ -646,8 +646,6 @@ var typename = ""; if (module.ModuleDefinition != null) { - resources = AddResources(resources, module.ModuleDefinition.Resources, ResourceLevel.Module, alias, "Modules", Utilities.GetTypeName(module.ModuleDefinition.ModuleDefinitionName), module.ModuleDefinition.Fingerprint, site.RenderMode); - // handle default action if (action == Constants.DefaultAction && !string.IsNullOrEmpty(module.ModuleDefinition.DefaultAction)) { @@ -692,7 +690,11 @@ var moduleobject = Activator.CreateInstance(moduletype) as IModuleControl; if (moduleobject != null) { - resources = AddResources(resources, moduleobject.Resources, ResourceLevel.Module, alias, "Modules", moduletype.Namespace, module.ModuleDefinition?.Fingerprint, site.RenderMode); + if (module.ModuleDefinition != null) + { + resources = AddResources(resources, module.ModuleDefinition.Resources, ResourceLevel.Module, alias, "Modules", moduletype.Namespace, module.ModuleDefinition.Fingerprint, moduleobject.RenderMode); + } + resources = AddResources(resources, moduleobject.Resources, ResourceLevel.Module, alias, "Modules", moduletype.Namespace, module.ModuleDefinition?.Fingerprint, moduleobject.RenderMode); // settings components are dynamically loaded within the framework Settings module if (action.ToLower() == "settings" && module.ModuleDefinition != null) diff --git a/Oqtane.Server/Infrastructure/DatabaseManager.cs b/Oqtane.Server/Infrastructure/DatabaseManager.cs index bfb3be45..3d72ae06 100644 --- a/Oqtane.Server/Infrastructure/DatabaseManager.cs +++ b/Oqtane.Server/Infrastructure/DatabaseManager.cs @@ -754,7 +754,11 @@ namespace Oqtane.Infrastructure private void ValidateConfiguration() { var defaultDatabaseType = _configManager.GetSetting(SettingKeys.DatabaseSection, SettingKeys.DatabaseTypeKey, ""); - if (defaultDatabaseType == "" || defaultDatabaseType.Contains(", Oqtane.Database.")) + if (defaultDatabaseType == "") + { + _configManager.AddOrUpdateSetting($"{SettingKeys.DatabaseSection}:{SettingKeys.DatabaseTypeKey}", Constants.DefaultDBType, true); + } + if (defaultDatabaseType.Contains(", Oqtane.Database.")) { // DefaultDBType migrated to Oqtane.Server in 6.1.5 defaultDatabaseType = defaultDatabaseType.Substring(0, defaultDatabaseType.IndexOf(", ")) + ", Oqtane.Server"; @@ -769,8 +773,8 @@ namespace Oqtane.Infrastructure else { // available databases migrated to Oqtane.Server in 6.1.5 - updateAvailableDatabases = !_configManager.GetSection(SettingKeys.AvailableDatabasesSection).GetChildren() - .Any(item => item.GetSection("DBType").Value == "Oqtane.Database.SqlServer.SqlServerDatabase, Oqtane.Server"); + updateAvailableDatabases = _configManager.GetSection(SettingKeys.AvailableDatabasesSection).GetChildren() + .Any(item => item.GetSection("DBType").Value.Contains(", Oqtane.Database.")); } if (updateAvailableDatabases) { diff --git a/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs b/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs index 6b755e89..65b53cc0 100644 --- a/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs @@ -81,9 +81,31 @@ namespace Oqtane.Infrastructure // construct SMTP Client using var client = new SmtpClient(); + var secureSocketOptions = SecureSocketOptions.Auto; + switch (settingRepository.GetSettingValue(settings, "SMTPSSL", "Auto")) + { + case "None": + secureSocketOptions = SecureSocketOptions.None; + break; + case "Auto": + secureSocketOptions = SecureSocketOptions.Auto; + break; + case "StartTls": + secureSocketOptions = SecureSocketOptions.StartTls; + break; + case "SslOnConnect": + case "True": // legacy setting value + secureSocketOptions = SecureSocketOptions.SslOnConnect; + break; + case "StartTlsWhenAvailable": + case "False": // legacy setting value + secureSocketOptions = SecureSocketOptions.StartTlsWhenAvailable; + break; + } + await client.ConnectAsync(settingRepository.GetSettingValue(settings, "SMTPHost", ""), - int.Parse(settingRepository.GetSettingValue(settings, "SMTPPort", "")), - bool.Parse(settingRepository.GetSettingValue(settings, "SMTPSSL", "False")) ? SecureSocketOptions.StartTls : SecureSocketOptions.None); + int.Parse(settingRepository.GetSettingValue(settings, "SMTPPort", "")), + secureSocketOptions); if (settingRepository.GetSettingValue(settings, "SMTPAuthentication", "Basic") == "Basic") { diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index fc21ef6a..da8a2bb1 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -37,7 +37,7 @@ - + all diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index b1138db7..3642addd 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -11,7 +11,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Oqtane.Extensions; using Oqtane.Infrastructure; -using Oqtane.Models; using Oqtane.Repository; using Oqtane.Security; using Oqtane.Shared; diff --git a/README.md b/README.md index cdad0222..57553e3e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Oqtane is being developed based on some fundamental principles which are outline # Latest Release -[6.1.4](https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.4) was released on July 30, 2025 and is a maintenance release including 49 pull requests by 4 different contributors, pushing the total number of project commits all-time to over 6700. The Oqtane framework continues to evolve at a rapid pace to meet the needs of .NET developers. +[6.1.5](https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5) was released on August 17, 2025 and is a maintenance release including 46 pull requests by 3 different contributors, pushing the total number of project commits all-time to almost 6900. The Oqtane framework continues to evolve at a rapid pace to meet the needs of .NET developers. # Try It Now! @@ -92,6 +92,10 @@ Connect with other developers, get support, and share ideas by joining the Oqtan # Roadmap This project is open source, and therefore is a work in progress... +[6.1.5](https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5) (Aug 17, 2025) +- [x] Stabilization improvements +- [x] Database provider improvements + [6.1.4](https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.4) (Jul 30, 2025) - [x] Stabilization improvements - [x] SMTP OAuth2 Support diff --git a/azuredeploy.json b/azuredeploy.json index f4718349..40b5a30b 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -220,7 +220,7 @@ "apiVersion": "2024-04-01", "name": "[concat(parameters('BlazorWebsiteName'), '/ZipDeploy')]", "properties": { - "packageUri": "https://github.com/oqtane/oqtane.framework/releases/download/v6.1.4/Oqtane.Framework.6.1.4.Install.zip" + "packageUri": "https://github.com/oqtane/oqtane.framework/releases/download/v6.1.5/Oqtane.Framework.6.1.5.Install.zip" }, "dependsOn": [ "[resourceId('Microsoft.Web/sites', parameters('BlazorWebsiteName'))]"