コード例 #1
0
        public async Task <IActionResult> SetupLightningNode(string storeId, LightningNodeViewModel vm, string command, string cryptoCode)
        {
            vm.CryptoCode = cryptoCode;
            var store = HttpContext.GetStoreData();

            if (store == null)
            {
                return(NotFound());
            }

            vm.CanUseInternalNode = CanUseInternalLightning();

            if (vm.CryptoCode == null)
            {
                ModelState.AddModelError(nameof(vm.CryptoCode), "Invalid network");
                return(View(vm));
            }

            var network         = _ExplorerProvider.GetNetwork(vm.CryptoCode);
            var paymentMethodId = new PaymentMethodId(network.CryptoCode, PaymentTypes.LightningLike);

            LightningSupportedPaymentMethod?paymentMethod = null;

            if (vm.LightningNodeType == LightningNodeType.Internal)
            {
                if (!CanUseInternalLightning())
                {
                    ModelState.AddModelError(nameof(vm.ConnectionString), "You are not authorized to use the internal lightning node");
                    return(View(vm));
                }
                paymentMethod = new LightningSupportedPaymentMethod
                {
                    CryptoCode = paymentMethodId.CryptoCode
                };
                paymentMethod.SetInternalNode();
            }
            else
            {
                if (string.IsNullOrEmpty(vm.ConnectionString))
                {
                    ModelState.AddModelError(nameof(vm.ConnectionString), "Please provide a connection string");
                    return(View(vm));
                }
                if (!LightningConnectionString.TryParse(vm.ConnectionString, false, out var connectionString, out var error))
                {
                    ModelState.AddModelError(nameof(vm.ConnectionString), $"Invalid URL ({error})");
                    return(View(vm));
                }
                if (connectionString.ConnectionType == LightningConnectionType.LndGRPC)
                {
                    ModelState.AddModelError(nameof(vm.ConnectionString), $"BTCPay does not support gRPC connections");
                    return(View(vm));
                }
                if (!User.IsInRole(Roles.ServerAdmin) && !connectionString.IsSafe())
                {
                    ModelState.AddModelError(nameof(vm.ConnectionString), "You are not a server admin, so the connection string should not contain 'cookiefilepath', 'macaroondirectorypath', 'macaroonfilepath', and should not point to a local ip or to a dns name ending with '.internal', '.local', '.lan' or '.'.");
                    return(View(vm));
                }

                paymentMethod = new LightningSupportedPaymentMethod
                {
                    CryptoCode = paymentMethodId.CryptoCode
                };
                paymentMethod.SetLightningUrl(connectionString);
            }

            switch (command)
            {
            case "save":
                var lnurl = new PaymentMethodId(vm.CryptoCode, PaymentTypes.LNURLPay);
                store.SetSupportedPaymentMethod(paymentMethodId, paymentMethod);
                store.SetSupportedPaymentMethod(lnurl, new LNURLPaySupportedPaymentMethod()
                {
                    CryptoCode                = vm.CryptoCode,
                    UseBech32Scheme           = true,
                    EnableForStandardInvoices = false,
                    LUD12Enabled              = false
                });

                await _Repo.UpdateStore(store);

                TempData[WellKnownTempData.SuccessMessage] = $"{network.CryptoCode} Lightning node updated.";
                return(RedirectToAction(nameof(LightningSettings), new { storeId, cryptoCode }));

            case "test":
                var handler = _ServiceProvider.GetRequiredService <LightningLikePaymentHandler>();
                try
                {
                    var info = await handler.GetNodeInfo(paymentMethod, network, new InvoiceLogs(), Request.IsOnion(), true);

                    if (!vm.SkipPortTest)
                    {
                        using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(20));
                        await handler.TestConnection(info.First(), cts.Token);
                    }
                    TempData[WellKnownTempData.SuccessMessage] = $"Connection to the Lightning node successful. Your node address: {info.First()}";
                }
                catch (Exception ex)
                {
                    TempData[WellKnownTempData.ErrorMessage] = ex.Message;
                    return(View(vm));
                }
                return(View(vm));

            default:
                return(View(vm));
            }
        }
コード例 #2
0
        public async Task <IActionResult> UpdateLightningNetworkPaymentMethod(string cryptoCode,
                                                                              [FromBody] LightningNetworkPaymentMethodData paymentMethodData)
        {
            var paymentMethodId = new PaymentMethodId(cryptoCode, PaymentTypes.LightningLike);

            if (!GetNetwork(cryptoCode, out var network))
            {
                return(NotFound());
            }

            if (string.IsNullOrEmpty(paymentMethodData?.ConnectionString))
            {
                ModelState.AddModelError(nameof(LightningNetworkPaymentMethodData.ConnectionString),
                                         "Missing connectionString");
            }

            if (!ModelState.IsValid)
            {
                return(this.CreateValidationError(ModelState));
            }

            LightningSupportedPaymentMethod paymentMethod = null;

            if (!string.IsNullOrEmpty(paymentMethodData.ConnectionString))
            {
                if (paymentMethodData.ConnectionString == LightningSupportedPaymentMethod.InternalNode)
                {
                    if (!await CanUseInternalLightning())
                    {
                        ModelState.AddModelError(nameof(paymentMethodData.ConnectionString), $"You are not authorized to use the internal lightning node");
                        return(this.CreateValidationError(ModelState));
                    }
                    paymentMethod = new Payments.Lightning.LightningSupportedPaymentMethod()
                    {
                        CryptoCode = paymentMethodId.CryptoCode
                    };
                    paymentMethod.SetInternalNode();
                }
                else
                {
                    if (!LightningConnectionString.TryParse(paymentMethodData.ConnectionString, false,
                                                            out var connectionString, out var error))
                    {
                        ModelState.AddModelError(nameof(paymentMethodData.ConnectionString), $"Invalid URL ({error})");
                        return(this.CreateValidationError(ModelState));
                    }
                    if (connectionString.ConnectionType == LightningConnectionType.LndGRPC)
                    {
                        ModelState.AddModelError(nameof(paymentMethodData.ConnectionString),
                                                 $"BTCPay does not support gRPC connections");
                        return(this.CreateValidationError(ModelState));
                    }
                    if (!await CanManageServer() && !connectionString.IsSafe())
                    {
                        ModelState.AddModelError(nameof(paymentMethodData.ConnectionString), $"You do not have 'btcpay.server.canmodifyserversettings' rights, so the connection string should not contain 'cookiefilepath', 'macaroondirectorypath', 'macaroonfilepath', and should not point to a local ip or to a dns name ending with '.internal', '.local', '.lan' or '.'.");
                        return(this.CreateValidationError(ModelState));
                    }
                    paymentMethod = new Payments.Lightning.LightningSupportedPaymentMethod()
                    {
                        CryptoCode = paymentMethodId.CryptoCode
                    };
                    paymentMethod.SetLightningUrl(connectionString);
                }
            }

            var store     = Store;
            var storeBlob = store.GetStoreBlob();

            store.SetSupportedPaymentMethod(paymentMethodId, paymentMethod);
            storeBlob.SetExcluded(paymentMethodId, !paymentMethodData.Enabled);
            store.SetStoreBlob(storeBlob);
            await _storeRepository.UpdateStore(store);

            return(Ok(GetExistingLightningLikePaymentMethod(cryptoCode, store)));
        }