云库增加 AI识图,缓存,我的云库收藏增加安全标志
调用外部API 扣费
This commit is contained in:
1 parent
7c29e57623
commit
150e8644b7
49 files changed
+1069
-28
No files matched your search
@@ -25,7 +25,7 @@ catch (TargetInvocationException ex) when (mode == "failure" && ex.InnerExceptio
|
||||
return;
|
||||
}
|
||||
if (mode == "failure") throw new Exception("Expected loading failure");
|
||||
var plugins = assemblies.Where(a => a.GetName().Name is "Store.CloudProduct" or "Store.ImageCache").ToArray();
|
||||
var plugins = assemblies.Where(a => a.GetName().Name is "Store.CloudProduct" or "Store.ImageCache" or "Store.ProductInspection").ToArray();
|
||||
if (mode == "empty")
|
||||
{
|
||||
if (plugins.Length != 0) throw new Exception("Unexpected plugins");
|
||||
@@ -43,6 +43,8 @@ if (mode != "image" && !feature.Controllers.Any(t => t.Name == "GoodsController"
|
||||
if (mode is "image" or "plugins")
|
||||
{
|
||||
var host = Host.CreateApplicationBuilder();
|
||||
host.Services.AddHttpContextAccessor();
|
||||
host.Services.AddScoped<MAX.Framework.Security.ICurrentUser, MAX.Framework.Security.CurrentUser>();
|
||||
var core = typeof(ServiceCollectionExtensions).GetMethod("AddStoreCore", BindingFlags.Static | BindingFlags.NonPublic)!;
|
||||
host.Configuration["Search:Url"] = "https://host.invalid";
|
||||
host.Configuration["ImageCache:ConnectionString"] = "host-only";
|
||||
@@ -50,12 +52,35 @@ if (mode is "image" or "plugins")
|
||||
if (host.Services.Any(d => d.ServiceType == typeof(Hangfire.JobStorage)))
|
||||
throw new Exception("Plugins must not register shared Hangfire storage");
|
||||
using var built = host.Build();
|
||||
foreach (var pluginType in plugins.SelectMany(a => a.GetTypes()).Where(t => !t.IsAbstract && typeof(IPlugin).IsAssignableFrom(t)))
|
||||
{
|
||||
var contextType = typeof(PluginContext<>).MakeGenericType(pluginType);
|
||||
// 先解析泛型入口,确认无需提前解析键名上下文。
|
||||
var typed = built.Services.GetRequiredService(contextType);
|
||||
var id = (string)contextType.GetProperty("Id")!.GetValue(typed)!;
|
||||
var keyed = built.Services.GetRequiredKeyedService<PluginContext>(id);
|
||||
if (!ReferenceEquals(contextType.GetProperty("Configuration")!.GetValue(typed), keyed.Configuration)
|
||||
|| !Equals(contextType.GetProperty("DirectoryPath")!.GetValue(typed), keyed.DirectoryPath)
|
||||
|| !ReferenceEquals(contextType.GetProperty("Environment")!.GetValue(typed), keyed.Environment))
|
||||
throw new Exception("Typed context must share the plugin configuration and environment");
|
||||
using var scope = built.Services.CreateScope();
|
||||
if (!ReferenceEquals(typed, scope.ServiceProvider.GetRequiredService(contextType)))
|
||||
throw new Exception("Typed plugin context must be singleton");
|
||||
}
|
||||
var image = built.Services.GetRequiredKeyedService<PluginContext>("ImageCache");
|
||||
if (image.Configuration["ImageCache:ConnectionString"] is null or "host-only") throw new Exception("Image config isolation failed");
|
||||
if (image.Configuration["Search:Url"] != null) throw new Exception("Host settings leaked into ImageCache");
|
||||
if (host.Configuration["ImageCache:ConnectionString"] != "host-only") throw new Exception("Plugin modified host configuration");
|
||||
if (mode == "plugins")
|
||||
{
|
||||
var inspection = plugins.Single(p => p.GetName().Name == "Store.CloudProduct");
|
||||
using (var scope = built.Services.CreateScope())
|
||||
{
|
||||
scope.ServiceProvider.GetRequiredService(inspection.GetTypes().Single(t => t.Name == "ProductInspectionService"));
|
||||
scope.ServiceProvider.GetRequiredService(inspection.GetTypes().Single(t => t.Name == "QwenInspectionIntegration"));
|
||||
}
|
||||
if (!feature.Controllers.Any(t => t.Name == "ProductInspectionController"))
|
||||
throw new Exception("Product inspection controller missing");
|
||||
var cloud = built.Services.GetRequiredKeyedService<PluginContext>("CloudProduct");
|
||||
if (cloud.Configuration["Search:Url"] is null or "https://host.invalid") throw new Exception("Cloud config isolation failed");
|
||||
if (host.Configuration["Search:Url"] != "https://host.invalid") throw new Exception("Cloud modified host configuration");
|
||||
|
||||
Reference in new issue
Block a user