From 04c0b9d37d4c5bc29c714c999db2bbdfe2d77873 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Tue, 14 Mar 2023 20:37:42 -0400 Subject: [PATCH 1/3] add defensive logic to Oqtane.Maui for loading modules which have not declared all dependencies --- Oqtane.Maui/MauiProgram.cs | 30 ++++++++++++++++++++++-------- Oqtane.Maui/Oqtane.Maui.csproj | 2 +- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Oqtane.Maui/MauiProgram.cs b/Oqtane.Maui/MauiProgram.cs index f3bf065a..0c297b0e 100644 --- a/Oqtane.Maui/MauiProgram.cs +++ b/Oqtane.Maui/MauiProgram.cs @@ -212,23 +212,37 @@ public static class MauiProgram private static void RegisterModuleServices(Assembly assembly, IServiceCollection services) { // dynamically register module scoped services - var implementationTypes = assembly.GetInterfaces(); - foreach (var implementationType in implementationTypes) + try { - if (implementationType.AssemblyQualifiedName != null) + var implementationTypes = assembly.GetInterfaces(); + foreach (var implementationType in implementationTypes) { - var serviceType = Type.GetType(implementationType.AssemblyQualifiedName.Replace(implementationType.Name, $"I{implementationType.Name}")); - services.AddScoped(serviceType ?? implementationType, implementationType); + if (implementationType.AssemblyQualifiedName != null) + { + var serviceType = Type.GetType(implementationType.AssemblyQualifiedName.Replace(implementationType.Name, $"I{implementationType.Name}")); + services.AddScoped(serviceType ?? implementationType, implementationType); + } } } + catch + { + // could not interrogate assembly - likely missing dependencies + } } private static void RegisterClientStartups(Assembly assembly, IServiceCollection services) { - var startUps = assembly.GetInstances(); - foreach (var startup in startUps) + try { - startup.ConfigureServices(services); + var startUps = assembly.GetInstances(); + foreach (var startup in startUps) + { + startup.ConfigureServices(services); + } + } + catch + { + // could not interrogate assembly - likely missing dependencies } } } diff --git a/Oqtane.Maui/Oqtane.Maui.csproj b/Oqtane.Maui/Oqtane.Maui.csproj index 54a5dc8a..45e07f6c 100644 --- a/Oqtane.Maui/Oqtane.Maui.csproj +++ b/Oqtane.Maui/Oqtane.Maui.csproj @@ -1,9 +1,9 @@ - net6.0-android;net6.0-ios;net6.0-maccatalyst $(TargetFrameworks);net6.0-windows10.0.19041.0 + Exe 3.4.1 From 497ef1750b5aef8f155e89d632d02ffdbd3d57a8 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Tue, 14 Mar 2023 20:40:49 -0400 Subject: [PATCH 2/3] add defensive logic to Oqtane.Client for loading modules on which have not declared all dependencies on WebAssembly --- Oqtane.Client/Program.cs | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index cd9290a5..1c89bc09 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -198,23 +198,37 @@ namespace Oqtane.Client private static void RegisterModuleServices(Assembly assembly, IServiceCollection services) { // dynamically register module scoped services - var implementationTypes = assembly.GetInterfaces(); - foreach (var implementationType in implementationTypes) + try { - if (implementationType.AssemblyQualifiedName != null) + var implementationTypes = assembly.GetInterfaces(); + foreach (var implementationType in implementationTypes) { - var serviceType = Type.GetType(implementationType.AssemblyQualifiedName.Replace(implementationType.Name, $"I{implementationType.Name}")); - services.AddScoped(serviceType ?? implementationType, implementationType); + if (implementationType.AssemblyQualifiedName != null) + { + var serviceType = Type.GetType(implementationType.AssemblyQualifiedName.Replace(implementationType.Name, $"I{implementationType.Name}")); + services.AddScoped(serviceType ?? implementationType, implementationType); + } } } + catch + { + // could not interrogate assembly - likely missing dependencies + } } private static void RegisterClientStartups(Assembly assembly, IServiceCollection services) { - var startUps = assembly.GetInstances(); - foreach (var startup in startUps) + try { - startup.ConfigureServices(services); + var startUps = assembly.GetInstances(); + foreach (var startup in startUps) + { + startup.ConfigureServices(services); + } + } + catch + { + // could not interrogate assembly - likely missing dependencies } } From 00f039d31e6139acd857d888ed11da245335331b Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Thu, 16 Mar 2023 13:26:18 -0400 Subject: [PATCH 3/3] Fix #2687 - add Setters to Permissions property to provide improved backward compatibility --- Oqtane.Shared/Models/Folder.cs | 4 ++++ Oqtane.Shared/Models/Module.cs | 4 ++++ Oqtane.Shared/Models/ModuleDefinition.cs | 4 ++++ Oqtane.Shared/Models/Page.cs | 4 ++++ Oqtane.Shared/Models/SiteTemplate.cs | 8 ++++++++ 5 files changed, 24 insertions(+) diff --git a/Oqtane.Shared/Models/Folder.cs b/Oqtane.Shared/Models/Folder.cs index 7837f334..9aa2aa9c 100644 --- a/Oqtane.Shared/Models/Folder.cs +++ b/Oqtane.Shared/Models/Folder.cs @@ -97,6 +97,10 @@ namespace Oqtane.Models { return JsonSerializer.Serialize(PermissionList); } + set + { + PermissionList = JsonSerializer.Deserialize>(value); + } } #endregion diff --git a/Oqtane.Shared/Models/Module.cs b/Oqtane.Shared/Models/Module.cs index c77cda42..07c2a507 100644 --- a/Oqtane.Shared/Models/Module.cs +++ b/Oqtane.Shared/Models/Module.cs @@ -121,6 +121,10 @@ namespace Oqtane.Models { return JsonSerializer.Serialize(PermissionList); } + set + { + PermissionList = JsonSerializer.Deserialize>(value); + } } #endregion diff --git a/Oqtane.Shared/Models/ModuleDefinition.cs b/Oqtane.Shared/Models/ModuleDefinition.cs index f7ce57c6..7912165f 100644 --- a/Oqtane.Shared/Models/ModuleDefinition.cs +++ b/Oqtane.Shared/Models/ModuleDefinition.cs @@ -136,6 +136,10 @@ namespace Oqtane.Models { return JsonSerializer.Serialize(PermissionList); } + set + { + PermissionList = JsonSerializer.Deserialize>(value); + } } #endregion diff --git a/Oqtane.Shared/Models/Page.cs b/Oqtane.Shared/Models/Page.cs index 4c3f6607..9298f46b 100644 --- a/Oqtane.Shared/Models/Page.cs +++ b/Oqtane.Shared/Models/Page.cs @@ -132,6 +132,10 @@ namespace Oqtane.Models { return JsonSerializer.Serialize(PermissionList); } + set + { + PermissionList = JsonSerializer.Deserialize>(value); + } } #endregion diff --git a/Oqtane.Shared/Models/SiteTemplate.cs b/Oqtane.Shared/Models/SiteTemplate.cs index 92c816e0..885b99ab 100644 --- a/Oqtane.Shared/Models/SiteTemplate.cs +++ b/Oqtane.Shared/Models/SiteTemplate.cs @@ -33,6 +33,10 @@ namespace Oqtane.Models { return JsonSerializer.Serialize(PermissionList); } + set + { + PermissionList = JsonSerializer.Deserialize>(value); + } } } @@ -51,6 +55,10 @@ namespace Oqtane.Models { return JsonSerializer.Serialize(PermissionList); } + set + { + PermissionList = JsonSerializer.Deserialize>(value); + } } } }