From 8e60932f81e949b4be074440251495dff1eec2b4 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 17 Apr 2023 10:34:41 +0900 Subject: [PATCH] Migrate reference to AppType in server settings (Fix #4882) --- BTCPayServer.Tests/UnitTest1.cs | 25 +++++++++++ BTCPayServer/Hosting/MigrationStartupTask.cs | 44 ++++++++++++++++++++ BTCPayServer/Services/MigrationSettings.cs | 1 + 3 files changed, 70 insertions(+) diff --git a/BTCPayServer.Tests/UnitTest1.cs b/BTCPayServer.Tests/UnitTest1.cs index e4d550585..661f4166f 100644 --- a/BTCPayServer.Tests/UnitTest1.cs +++ b/BTCPayServer.Tests/UnitTest1.cs @@ -2445,6 +2445,31 @@ namespace BTCPayServer.Tests Assert.False(fn.Seen); } + [Fact(Timeout = LongRunningTestTimeout)] + [Trait("Integration", "Integration")] + public async Task CanFixMappedDomainAppType() + { + using var tester = CreateServerTester(newDb: true); + await tester.StartAsync(); + var f = tester.PayTester.GetService(); + using (var ctx = f.CreateContext()) + { + var setting = new SettingData() { Id = "BTCPayServer.Services.PoliciesSettings" }; + setting.Value = JObject.Parse("{\"RootAppId\": null, \"RootAppType\": 1, \"Experimental\": false, \"PluginSource\": null, \"LockSubscription\": false, \"DisableSSHService\": false, \"PluginPreReleases\": false, \"BlockExplorerLinks\": [],\"DomainToAppMapping\": [{\"AppId\": \"87kj5yKay8mB4UUZcJhZH5TqDKMD3CznjwLjiu1oYZXe\", \"Domain\": \"donate.nicolas-dorier.com\", \"AppType\": 0}], \"CheckForNewVersions\": false, \"AllowHotWalletForAll\": false, \"RequiresConfirmedEmail\": false, \"DiscourageSearchEngines\": false, \"DisableInstantNotifications\": false, \"DisableNonAdminCreateUserApi\": false, \"AllowHotWalletRPCImportForAll\": false, \"AllowLightningInternalNodeForAll\": false, \"DisableStoresToUseServerEmailSettings\": false}").ToString(); + ctx.Settings.Add(setting); + await ctx.SaveChangesAsync(); + } + await RestartMigration(tester); + using (var ctx = f.CreateContext()) + { + var setting = await ctx.Settings.FirstOrDefaultAsync(c => c.Id == "BTCPayServer.Services.PoliciesSettings"); + var o = JObject.Parse(setting.Value); + Assert.Equal("Crowdfund", o["RootAppType"].Value()); + o = (JObject)((JArray)o["DomainToAppMapping"])[0]; + Assert.Equal("PointOfSale", o["AppType"].Value()); + } + } + [Fact(Timeout = LongRunningTestTimeout)] [Trait("Integration", "Integration")] public async Task CanDoLightningInternalNodeMigration() diff --git a/BTCPayServer/Hosting/MigrationStartupTask.cs b/BTCPayServer/Hosting/MigrationStartupTask.cs index 71e38e88b..c39c8f4f7 100644 --- a/BTCPayServer/Hosting/MigrationStartupTask.cs +++ b/BTCPayServer/Hosting/MigrationStartupTask.cs @@ -242,6 +242,12 @@ namespace BTCPayServer.Hosting settings.FixSeqAfterSqliteMigration = true; await _Settings.UpdateSetting(settings); } + if (!settings.FixMappedDomainAppType) + { + await FixMappedDomainAppType(); + settings.FixMappedDomainAppType = true; + await _Settings.UpdateSetting(settings); + } } catch (Exception ex) { @@ -250,6 +256,44 @@ namespace BTCPayServer.Hosting } } + private async Task FixMappedDomainAppType() + { + await using var ctx = _DBContextFactory.CreateContext(); + var setting = await ctx.Settings.FirstOrDefaultAsync(s => s.Id == "BTCPayServer.Services.PoliciesSettings"); + if (setting?.Value is null) + return; + string MapToString(int v) + { + return v switch + { + 0 => "PointOfSale", + 1 => "Crowdfund", + _ => throw new NotSupportedException() + }; + } + var data = JObject.Parse(setting.Value); + if (data["RootAppType"]?.Type is JTokenType.Integer) + { + var v = data["RootAppType"].Value(); + data["RootAppType"] = new JValue(MapToString(v)); + } + var arr = data["DomainToAppMapping"] as JArray; + if (arr != null) + { + foreach (var map in arr) + { + if (map["AppType"]?.Type is JTokenType.Integer) + { + var v = map["AppType"].Value(); + map["AppType"] = new JValue(MapToString(v)); + } + } + } + setting.Value = data.ToString(); + await ctx.SaveChangesAsync(); + } + + private async Task FixSeqAfterSqliteMigration() { await using var ctx = _DBContextFactory.CreateContext(); diff --git a/BTCPayServer/Services/MigrationSettings.cs b/BTCPayServer/Services/MigrationSettings.cs index 8249f32a3..7676476f4 100644 --- a/BTCPayServer/Services/MigrationSettings.cs +++ b/BTCPayServer/Services/MigrationSettings.cs @@ -36,5 +36,6 @@ namespace BTCPayServer.Services public bool MigrateWalletColors { get; set; } public bool FileSystemStorageAsDefault { get; set; } public bool FixSeqAfterSqliteMigration { get; set; } + public bool FixMappedDomainAppType { get; set; } } }