mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2024-11-19 18:11:36 +01:00
162 lines
6.1 KiB
C#
162 lines
6.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Net.Http;
|
|
using System.Net.Http.Headers;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading.Tasks;
|
|
using BTCPayServer.Abstractions.Contracts;
|
|
using BTCPayServer.Configuration;
|
|
using BTCPayServer.Lightning.CLightning;
|
|
using BTCPayServer.Services;
|
|
using Microsoft.AspNetCore.Builder;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.Extensions.Caching.Memory;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.FileSystemGlobbing;
|
|
using Microsoft.Extensions.Options;
|
|
using NBitcoin.DataEncoders;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
namespace BTCPayServer.Plugins
|
|
{
|
|
public class PluginService
|
|
{
|
|
private readonly IOptions<DataDirectories> _dataDirectories;
|
|
private readonly PoliciesSettings _policiesSettings;
|
|
private readonly ISettingsRepository _settingsRepository;
|
|
private readonly PluginBuilderClient _pluginBuilderClient;
|
|
public PluginService(
|
|
ISettingsRepository settingsRepository,
|
|
IEnumerable<IBTCPayServerPlugin> btcPayServerPlugins,
|
|
PluginBuilderClient pluginBuilderClient,
|
|
IOptions<DataDirectories> dataDirectories,
|
|
PoliciesSettings policiesSettings,
|
|
BTCPayServerEnvironment env)
|
|
{
|
|
LoadedPlugins = btcPayServerPlugins;
|
|
_pluginBuilderClient = pluginBuilderClient;
|
|
_settingsRepository = settingsRepository;
|
|
_dataDirectories = dataDirectories;
|
|
_policiesSettings = policiesSettings;
|
|
Env = env;
|
|
}
|
|
|
|
public IEnumerable<IBTCPayServerPlugin> LoadedPlugins { get; }
|
|
public BTCPayServerEnvironment Env { get; }
|
|
|
|
public async Task<AvailablePlugin[]> GetRemotePlugins()
|
|
{
|
|
var versions = await _pluginBuilderClient.GetPublishedVersions(null, _policiesSettings.PluginPreReleases);
|
|
return versions.Select(v =>
|
|
{
|
|
var p = v.ManifestInfo.ToObject<AvailablePlugin>();
|
|
p.Documentation = v.Documentation;
|
|
var github = v.BuildInfo.GetGithubRepository();
|
|
if (github != null)
|
|
{
|
|
p.Source = github.GetSourceUrl(v.BuildInfo.gitCommit, v.BuildInfo.pluginDir);
|
|
p.Author = github.Owner;
|
|
p.AuthorLink = $"https://github.com/{github.Owner}";
|
|
}
|
|
p.SystemPlugin = false;
|
|
return p;
|
|
}).ToArray();
|
|
}
|
|
public async Task DownloadRemotePlugin(string pluginIdentifier, string version)
|
|
{
|
|
var dest = _dataDirectories.Value.PluginDir;
|
|
var filedest = Path.Join(dest, pluginIdentifier + ".btcpay");
|
|
Directory.CreateDirectory(Path.GetDirectoryName(filedest));
|
|
var url = $"api/v1/plugins/[{Uri.EscapeDataString(pluginIdentifier)}]/versions/{Uri.EscapeDataString(version)}/download";
|
|
using var resp2 = await _pluginBuilderClient.HttpClient.GetAsync(url);
|
|
using var fs = new FileStream(filedest, FileMode.Create, FileAccess.ReadWrite);
|
|
await resp2.Content.CopyToAsync(fs);
|
|
await fs.FlushAsync();
|
|
}
|
|
|
|
public void InstallPlugin(string plugin)
|
|
{
|
|
var dest = _dataDirectories.Value.PluginDir;
|
|
UninstallPlugin(plugin);
|
|
PluginManager.QueueCommands(dest, ("install", plugin));
|
|
}
|
|
public void UpdatePlugin(string plugin)
|
|
{
|
|
var dest = _dataDirectories.Value.PluginDir;
|
|
PluginManager.QueueCommands(dest, ("update", plugin));
|
|
}
|
|
|
|
public async Task UploadPlugin(IFormFile plugin)
|
|
{
|
|
var dest = _dataDirectories.Value.PluginDir;
|
|
var filedest = Path.Combine(dest, plugin.FileName);
|
|
Directory.CreateDirectory(Path.GetDirectoryName(filedest));
|
|
if (Path.GetExtension(filedest) == PluginManager.BTCPayPluginSuffix)
|
|
{
|
|
await using var stream = new FileStream(filedest, FileMode.Create);
|
|
await plugin.CopyToAsync(stream);
|
|
}
|
|
}
|
|
|
|
public void UninstallPlugin(string plugin)
|
|
{
|
|
var dest = _dataDirectories.Value.PluginDir;
|
|
PluginManager.QueueCommands(dest, ("delete", plugin));
|
|
}
|
|
|
|
public class AvailablePlugin
|
|
{
|
|
public string Identifier { get; set; }
|
|
public string Name { get; set; }
|
|
public Version Version { get; set; }
|
|
public string Description { get; set; }
|
|
public bool SystemPlugin { get; set; } = false;
|
|
|
|
public IBTCPayServerPlugin.PluginDependency[] Dependencies { get; set; } = Array.Empty<IBTCPayServerPlugin.PluginDependency>();
|
|
public string Documentation { get; set; }
|
|
public string Source { get; set; }
|
|
public string Author { get; set; }
|
|
public string AuthorLink { get; set; }
|
|
|
|
public void Execute(IApplicationBuilder applicationBuilder,
|
|
IServiceProvider applicationBuilderApplicationServices)
|
|
{
|
|
}
|
|
|
|
public void Execute(IServiceCollection applicationBuilder)
|
|
{
|
|
}
|
|
}
|
|
|
|
class GithubFile
|
|
{
|
|
[JsonProperty("name")] public string Name { get; set; }
|
|
|
|
[JsonProperty("sha")] public string Sha { get; set; }
|
|
[JsonProperty("type")] public string Type { get; set; }
|
|
[JsonProperty("path")] public string Path { get; set; }
|
|
|
|
[JsonProperty("download_url")] public string DownloadUrl { get; set; }
|
|
}
|
|
|
|
public (string command, string plugin)[] GetPendingCommands()
|
|
{
|
|
return PluginManager.GetPendingCommands(_dataDirectories.Value.PluginDir);
|
|
}
|
|
|
|
public void CancelCommands(string plugin)
|
|
{
|
|
PluginManager.CancelCommands(_dataDirectories.Value.PluginDir, plugin);
|
|
}
|
|
|
|
public string[] GetDisabledPlugins()
|
|
{
|
|
return PluginManager.GetDisabledPlugins(_dataDirectories.Value.PluginDir).ToArray();
|
|
}
|
|
}
|
|
}
|