mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-19 06:54:19 +01:00
fix: ensure unlisted installed plugins appear as updatable
This commit is contained in:
@@ -20,6 +20,18 @@ namespace BTCPayServer.Plugins
|
|||||||
private readonly IOptions<DataDirectories> _dataDirectories;
|
private readonly IOptions<DataDirectories> _dataDirectories;
|
||||||
private readonly PoliciesSettings _policiesSettings;
|
private readonly PoliciesSettings _policiesSettings;
|
||||||
private readonly PluginBuilderClient _pluginBuilderClient;
|
private readonly PluginBuilderClient _pluginBuilderClient;
|
||||||
|
private static readonly HashSet<string> _builtInPluginIdentifiers = new(StringComparer.OrdinalIgnoreCase)
|
||||||
|
{
|
||||||
|
"BTCPayServer",
|
||||||
|
"BTCPayServer.Plugins.Altcoins",
|
||||||
|
"BTCPayServer.Plugins.Bitcoin",
|
||||||
|
"BTCPayServer.Plugins.Crowdfund",
|
||||||
|
"BTCPayServer.Plugins.NFC",
|
||||||
|
"BTCPayServer.Plugins.PayButton",
|
||||||
|
"BTCPayServer.Plugins.PointOfSale",
|
||||||
|
"BTCPayServer.Plugins.Shopify"
|
||||||
|
};
|
||||||
|
|
||||||
public PluginService(
|
public PluginService(
|
||||||
IEnumerable<IBTCPayServerPlugin> btcPayServerPlugins,
|
IEnumerable<IBTCPayServerPlugin> btcPayServerPlugins,
|
||||||
PluginBuilderClient pluginBuilderClient,
|
PluginBuilderClient pluginBuilderClient,
|
||||||
@@ -54,7 +66,8 @@ namespace BTCPayServer.Plugins
|
|||||||
string btcpayVersion = Env.Version.TrimStart('v').Split('+')[0];
|
string btcpayVersion = Env.Version.TrimStart('v').Split('+')[0];
|
||||||
var versions = await _pluginBuilderClient.GetPublishedVersions(
|
var versions = await _pluginBuilderClient.GetPublishedVersions(
|
||||||
btcpayVersion, _policiesSettings.PluginPreReleases, searchPluginName);
|
btcpayVersion, _policiesSettings.PluginPreReleases, searchPluginName);
|
||||||
return versions.Select(v =>
|
|
||||||
|
var plugins = versions.Select(v =>
|
||||||
{
|
{
|
||||||
var p = v.ManifestInfo.ToObject<AvailablePlugin>();
|
var p = v.ManifestInfo.ToObject<AvailablePlugin>();
|
||||||
p.Documentation = v.Documentation;
|
p.Documentation = v.Documentation;
|
||||||
@@ -67,7 +80,81 @@ namespace BTCPayServer.Plugins
|
|||||||
}
|
}
|
||||||
p.SystemPlugin = false;
|
p.SystemPlugin = false;
|
||||||
return p;
|
return p;
|
||||||
}).ToArray();
|
}).ToList();
|
||||||
|
|
||||||
|
var unlistedUpdates = await GetUpdatesForUnlistedInstalledAsync(plugins, btcpayVersion);
|
||||||
|
plugins.AddRange(unlistedUpdates);
|
||||||
|
|
||||||
|
return plugins.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<List<AvailablePlugin>> GetUpdatesForUnlistedInstalledAsync(
|
||||||
|
List<AvailablePlugin> publishedPlugins,
|
||||||
|
string btcpayVersion)
|
||||||
|
{
|
||||||
|
var updatables = new List<AvailablePlugin>();
|
||||||
|
var presentIdentifiers = new HashSet<string>(
|
||||||
|
publishedPlugins.Select(p => p.Identifier),
|
||||||
|
StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
foreach (var (installedIdentifier, installedVersion) in Installed)
|
||||||
|
{
|
||||||
|
if (_builtInPluginIdentifiers.Contains(installedIdentifier))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (presentIdentifiers.Contains(installedIdentifier))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var publishedVersions = await _pluginBuilderClient.GetPluginVersionsForDownload(
|
||||||
|
installedIdentifier,
|
||||||
|
btcpayVersion,
|
||||||
|
_policiesSettings.PluginPreReleases,
|
||||||
|
includeAllVersions: true);
|
||||||
|
|
||||||
|
if (publishedVersions == null || !publishedVersions.Any())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var candidates = publishedVersions
|
||||||
|
.Select(versionInfo => new
|
||||||
|
{
|
||||||
|
VersionInfo = versionInfo,
|
||||||
|
Available = versionInfo.ManifestInfo?.ToObject<AvailablePlugin>()
|
||||||
|
})
|
||||||
|
.Where(candidate => candidate.Available != null &&
|
||||||
|
candidate.Available.Identifier.Equals(installedIdentifier, StringComparison.OrdinalIgnoreCase))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
if (candidates.Count == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var latestCandidate = candidates
|
||||||
|
.OrderByDescending(candidate => candidate.Available!.Version)
|
||||||
|
.First();
|
||||||
|
|
||||||
|
var latestAvailable = latestCandidate.Available!;
|
||||||
|
|
||||||
|
|
||||||
|
if (latestAvailable.Version <= installedVersion)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
latestAvailable.Documentation = latestCandidate.VersionInfo.Documentation;
|
||||||
|
|
||||||
|
var githubRepository = latestCandidate.VersionInfo.BuildInfo.GetGithubRepository();
|
||||||
|
if (githubRepository != null)
|
||||||
|
{
|
||||||
|
latestAvailable.Source = githubRepository.GetSourceUrl(
|
||||||
|
latestCandidate.VersionInfo.BuildInfo.gitCommit,
|
||||||
|
latestCandidate.VersionInfo.BuildInfo.pluginDir);
|
||||||
|
latestAvailable.Author = githubRepository.Owner;
|
||||||
|
latestAvailable.AuthorLink = $"https://github.com/{githubRepository.Owner}";
|
||||||
|
}
|
||||||
|
|
||||||
|
latestAvailable.SystemPlugin = false;
|
||||||
|
|
||||||
|
updatables.Add(latestAvailable);
|
||||||
|
}
|
||||||
|
|
||||||
|
return updatables;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<AvailablePlugin> DownloadRemotePlugin(string pluginIdentifier, string version, VersionCondition condition = null)
|
public async Task<AvailablePlugin> DownloadRemotePlugin(string pluginIdentifier, string version, VersionCondition condition = null)
|
||||||
|
|||||||
Reference in New Issue
Block a user