From 86cef687a0d99f5a5fd8963185464e9da3777ef0 Mon Sep 17 00:00:00 2001 From: ShahanaFarooqui Date: Thu, 14 Mar 2024 15:07:06 -0700 Subject: [PATCH] Request Params Cleanup --- backend/controllers/cln/channels.js | 5 +- backend/controllers/cln/network.js | 7 ++- backend/controllers/cln/offers.js | 5 +- backend/controllers/cln/payments.js | 27 ++++---- backend/controllers/eclair/channels.js | 17 ++--- backend/controllers/eclair/invoices.js | 3 +- backend/controllers/eclair/network.js | 3 +- backend/controllers/eclair/onchain.js | 7 +-- backend/controllers/eclair/payments.js | 8 ++- backend/controllers/lnd/channels.js | 73 +++++++++++----------- backend/controllers/lnd/message.js | 8 ++- backend/controllers/lnd/payments.js | 5 +- backend/controllers/lnd/peers.js | 7 ++- backend/controllers/lnd/switch.js | 3 +- backend/controllers/lnd/transactions.js | 13 ++-- backend/controllers/lnd/wallet.js | 48 +++++++------- backend/controllers/shared/RTLConf.js | 73 ++++++++++++---------- backend/controllers/shared/authenticate.js | 17 ++--- backend/controllers/shared/boltz.js | 21 ++++--- backend/controllers/shared/loop.js | 32 +++++----- server/controllers/cln/channels.ts | 5 +- server/controllers/cln/network.ts | 7 ++- server/controllers/cln/offers.ts | 5 +- server/controllers/cln/payments.ts | 23 +++---- server/controllers/eclair/channels.ts | 17 ++--- server/controllers/eclair/invoices.ts | 3 +- server/controllers/eclair/network.ts | 3 +- server/controllers/eclair/onchain.ts | 7 +-- server/controllers/eclair/payments.ts | 8 ++- server/controllers/lnd/channels.ts | 65 ++++++++++--------- server/controllers/lnd/message.ts | 8 ++- server/controllers/lnd/payments.ts | 5 +- server/controllers/lnd/peers.ts | 7 ++- server/controllers/lnd/switch.ts | 3 +- server/controllers/lnd/transactions.ts | 13 ++-- server/controllers/lnd/wallet.ts | 48 +++++++------- server/controllers/shared/RTLConf.ts | 73 ++++++++++++---------- server/controllers/shared/authenticate.ts | 17 ++--- server/controllers/shared/boltz.ts | 15 +++-- server/controllers/shared/loop.ts | 28 +++++---- 40 files changed, 396 insertions(+), 346 deletions(-) diff --git a/backend/controllers/cln/channels.js b/backend/controllers/cln/channels.js index 78600fe2..4f8a239e 100644 --- a/backend/controllers/cln/channels.js +++ b/backend/controllers/cln/channels.js @@ -80,6 +80,7 @@ export const closeChannel = (req, res, next) => { }); }; export const listForwards = (req, res, next) => { + const { status } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channel List Forwards..' }); options = common.getOptions(req); if (options.error) { @@ -88,8 +89,8 @@ export const listForwards = (req, res, next) => { options.url = req.session.selectedNode.ln_server_url + '/v1/listforwards'; options.body = req.body; request.post(options).then((body) => { - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + req.body.status, data: body }); - body.forwards = !body.forwards ? [] : (req.body.status === 'failed' || req.body.status === 'local_failed') ? body.forwards.slice(Math.max(0, body.forwards.length - 1000), Math.max(1000, body.forwards.length)).reverse() : body.forwards.reverse(); + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + status, data: body }); + body.forwards = !body.forwards ? [] : (status === 'failed' || status === 'local_failed') ? body.forwards.slice(Math.max(0, body.forwards.length - 1000), Math.max(1000, body.forwards.length)).reverse() : body.forwards.reverse(); res.status(200).json(body.forwards); }).catch((errRes) => { const err = common.handleError(errRes, 'Channels', 'Forwarding History Error', req.session.selectedNode); diff --git a/backend/controllers/cln/network.js b/backend/controllers/cln/network.js index d4716995..de74ebdf 100644 --- a/backend/controllers/cln/network.js +++ b/backend/controllers/cln/network.js @@ -40,6 +40,7 @@ export const listChannels = (req, res, next) => { }); }; export const feeRates = (req, res, next) => { + const { style } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Getting Network Fee Rates..' }); options = common.getOptions(req); if (options.error) { @@ -48,7 +49,7 @@ export const feeRates = (req, res, next) => { options.url = req.session.selectedNode.ln_server_url + '/v1/feerates'; options.body = req.body; request.post(options).then((body) => { - logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + req.body.style, data: body }); + logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + style, data: body }); res.status(200).json(body); }).catch((errRes) => { const err = common.handleError(errRes, 'Network', 'Fee Rates Error', req.session.selectedNode); @@ -56,14 +57,14 @@ export const feeRates = (req, res, next) => { }); }; export const listNodes = (req, res, next) => { + const filter_liquidity_ads = !!req.body.liquidity_ads; + delete req.body.liquidity_ads; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'List Nodes..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listnodes'; - const filter_liquidity_ads = !!req.body.liquidity_ads; - delete req.body.liquidity_ads; options.body = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url }); request.post(options).then((body) => { diff --git a/backend/controllers/cln/offers.js b/backend/controllers/cln/offers.js index f6fd3c10..7b6113b9 100644 --- a/backend/controllers/cln/offers.js +++ b/backend/controllers/cln/offers.js @@ -18,10 +18,11 @@ export const listOfferBookmarks = (req, res, next) => { }); }; export const deleteOfferBookmark = (req, res, next) => { + const { offer_str } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Deleting Offer Bookmark..' }); - databaseService.remove(req.session.selectedNode, CollectionsEnum.OFFERS, CollectionFieldsEnum.BOLT12, req.body.offer_str).then((deleteRes) => { + databaseService.remove(req.session.selectedNode, CollectionsEnum.OFFERS, CollectionFieldsEnum.BOLT12, offer_str).then((deleteRes) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Bookmark Deleted', data: deleteRes }); - res.status(204).json(req.body.offer_str); + res.status(204).json(offer_str); }).catch((errRes) => { const err = common.handleError(errRes, 'Offers', 'Offer Bookmark Delete Error', req.session.selectedNode); return res.status(err.statusCode).json({ message: err.message, error: err.error }); diff --git a/backend/controllers/cln/payments.js b/backend/controllers/cln/payments.js index 900aa192..2cacaaf6 100644 --- a/backend/controllers/cln/payments.js +++ b/backend/controllers/cln/payments.js @@ -95,12 +95,13 @@ export const listPayments = (req, res, next) => { }); }; export const postPayment = (req, res, next) => { + const { paymentType, saveToDB, bolt12, zeroAmtOffer, amount_msat, title, issuer, description } = req.body; options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } const options_body = JSON.parse(JSON.stringify(req.body)); - if (req.body.paymentType === 'KEYSEND') { + if (paymentType === 'KEYSEND') { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..' }); options.url = req.session.selectedNode.ln_server_url + '/v1/keysend'; delete options_body.uiMessage; @@ -121,13 +122,13 @@ export const postPayment = (req, res, next) => { options.body = options_body; } else { - if (req.body.paymentType === 'OFFER') { + if (paymentType === 'OFFER') { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Offer Payment..' }); } else { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Invoice Payment..' }); } - if (req.body.paymentType === 'OFFER') { + if (paymentType === 'OFFER') { // delete amount for zero amt offer also as fetchinvoice already has amount information delete options_body.amount_msat; } @@ -147,18 +148,18 @@ export const postPayment = (req, res, next) => { } request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent', data: body }); - if (req.body.paymentType === 'OFFER') { - if (req.body.saveToDB && req.body.bolt12) { - const offerToUpdate = { bolt12: req.body.bolt12, amountMSat: (req.body.zeroAmtOffer ? 0 : req.body.amount_msat), title: req.body.title, lastUpdatedAt: new Date(Date.now()).getTime() }; - if (req.body.issuer) { - offerToUpdate['issuer'] = req.body.issuer; + if (paymentType === 'OFFER') { + if (saveToDB && bolt12) { + const offerToUpdate = { bolt12: bolt12, amountMSat: (zeroAmtOffer ? 0 : amount_msat), title: title, lastUpdatedAt: new Date(Date.now()).getTime() }; + if (issuer) { + offerToUpdate['issuer'] = issuer; } - if (req.body.description) { - offerToUpdate['description'] = req.body.description; + if (description) { + offerToUpdate['description'] = description; } // eslint-disable-next-line arrow-body-style return databaseService.validateDocument(CollectionsEnum.OFFERS, offerToUpdate).then((validated) => { - return databaseService.update(req.session.selectedNode, CollectionsEnum.OFFERS, offerToUpdate, CollectionFieldsEnum.BOLT12, req.body.bolt12).then((updatedOffer) => { + return databaseService.update(req.session.selectedNode, CollectionsEnum.OFFERS, offerToUpdate, CollectionFieldsEnum.BOLT12, bolt12).then((updatedOffer) => { logger.log({ level: 'DEBUG', fileName: 'Payments', msg: 'Offer Updated', data: updatedOffer }); return res.status(201).json({ paymentResponse: body, saveToDBResponse: updatedOffer }); }).catch((errDB) => { @@ -174,10 +175,10 @@ export const postPayment = (req, res, next) => { return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' }); } } - if (req.body.paymentType === 'INVOICE') { + if (paymentType === 'INVOICE') { return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' }); } - if (req.body.paymentType === 'KEYSEND') { + if (paymentType === 'KEYSEND') { return res.status(201).json(body); } }).catch((errRes) => { diff --git a/backend/controllers/eclair/channels.js b/backend/controllers/eclair/channels.js index 3a6b7851..4923724e 100644 --- a/backend/controllers/eclair/channels.js +++ b/backend/controllers/eclair/channels.js @@ -158,7 +158,8 @@ export const closeChannel = (req, res, next) => { }); }; export const circularRebalance = (req, res, next) => { - const crInvDescription = 'Circular rebalancing invoice for ' + (req.body.amountMsat / 1000) + ' Sats'; + const { amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format, sourceShortChannelId, targetShortChannelId } = req.body; + const crInvDescription = 'Circular rebalancing invoice for ' + (amountMsat / 1000) + ' Sats'; options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); @@ -168,22 +169,22 @@ export const circularRebalance = (req, res, next) => { const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString(); // Check if unpaid Invoice exists already listPendingInvoicesRequestCall(req.session.selectedNode).then((callRes) => { - const foundExistingInvoice = callRes.find((inv) => inv.description.includes(crInvDescription) && inv.amount === req.body.amountMsat && inv.expiry && inv.timestamp && ((inv.expiry + inv.timestamp) >= tillToday)); + const foundExistingInvoice = callRes.find((inv) => inv.description.includes(crInvDescription) && inv.amount === amountMsat && inv.expiry && inv.timestamp && ((inv.expiry + inv.timestamp) >= tillToday)); // Create new invoice if doesn't exist already const requestCalls = foundExistingInvoice && foundExistingInvoice.serialized ? - [findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format)] : - [findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format), createInvoiceRequestCall(req.session.selectedNode, crInvDescription, req.body.amountMsat)]; + [findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format)] : + [findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format), createInvoiceRequestCall(req.session.selectedNode, crInvDescription, amountMsat)]; Promise.all(requestCalls).then((values) => { // eslint-disable-next-line arrow-body-style const routes = values[0]?.routes?.filter((route) => { - return !((route.shortChannelIds[0] === req.body.sourceShortChannelId && route.shortChannelIds[1] === req.body.targetShortChannelId) || - (route.shortChannelIds[1] === req.body.sourceShortChannelId && route.shortChannelIds[0] === req.body.targetShortChannelId)); + return !((route.shortChannelIds[0] === sourceShortChannelId && route.shortChannelIds[1] === targetShortChannelId) || + (route.shortChannelIds[1] === sourceShortChannelId && route.shortChannelIds[0] === targetShortChannelId)); }); const firstRoute = routes[0].shortChannelIds.join() || ''; - const shortChannelIds = req.body.sourceShortChannelId + ',' + firstRoute + ',' + req.body.targetShortChannelId; + const shortChannelIds = sourceShortChannelId + ',' + firstRoute + ',' + targetShortChannelId; const invoice = (foundExistingInvoice && foundExistingInvoice.serialized ? foundExistingInvoice.serialized : (values[1] ? values[1].serialized : '')) || ''; const paymentHash = (foundExistingInvoice && foundExistingInvoice.paymentHash ? foundExistingInvoice.paymentHash : (values[1] ? values[1].paymentHash : '') || ''); - return sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, req.body.amountMsat).then((payToRouteCallRes) => { + return sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, amountMsat).then((payToRouteCallRes) => { // eslint-disable-next-line arrow-body-style setTimeout(() => { return getSentInfoFromPaymentRequest(req.session.selectedNode, paymentHash).then((sentInfoCallRes) => { diff --git a/backend/controllers/eclair/invoices.js b/backend/controllers/eclair/invoices.js index 45310605..712f9e74 100644 --- a/backend/controllers/eclair/invoices.js +++ b/backend/controllers/eclair/invoices.js @@ -135,12 +135,13 @@ export const createInvoiceRequestCall = (selectedNode, description, amount) => { }); }; export const createInvoice = (req, res, next) => { + const { description, amountMsat } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - createInvoiceRequestCall(req.session.selectedNode, req.body.description, req.body.amountMsat).then((invRes) => { + createInvoiceRequestCall(req.session.selectedNode, description, amountMsat).then((invRes) => { res.status(201).json(invRes); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }; diff --git a/backend/controllers/eclair/network.js b/backend/controllers/eclair/network.js index 1cd0aae3..276d5def 100644 --- a/backend/controllers/eclair/network.js +++ b/backend/controllers/eclair/network.js @@ -35,11 +35,12 @@ export const findRouteBetweenNodesRequestCall = (selectedNode, amountMsat, sourc }); }; export const findRouteBetweenNodes = (req, res, next) => { + const { amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format } = req.body; options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format).then((callRes) => { + findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format).then((callRes) => { res.status(200).json(callRes); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }; diff --git a/backend/controllers/eclair/onchain.js b/backend/controllers/eclair/onchain.js index d69b1de2..696d6b3b 100644 --- a/backend/controllers/eclair/onchain.js +++ b/backend/controllers/eclair/onchain.js @@ -74,17 +74,14 @@ export const getTransactions = (req, res, next) => { }); }; export const sendFunds = (req, res, next) => { + const { address, amount, blocks } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Sending On Chain Funds..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/sendonchain'; - options.form = { - address: req.body.address, - amountSatoshis: req.body.amount, - confirmationTarget: req.body.blocks - }; + options.form = { address: address, amountSatoshis: amount, confirmationTarget: blocks }; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Onchain', msg: 'On Chain Funds Sent', data: body }); diff --git a/backend/controllers/eclair/payments.js b/backend/controllers/eclair/payments.js index 38922282..fc7e1980 100644 --- a/backend/controllers/eclair/payments.js +++ b/backend/controllers/eclair/payments.js @@ -104,13 +104,14 @@ export const queryPaymentRoute = (req, res, next) => { }); }; export const getSentPaymentsInformation = (req, res, next) => { + const { payments } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting Sent Payment Information..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - if (req.body.payments) { - const paymentsArr = req.body.payments.split(','); + if (payments) { + const paymentsArr = payments.split(','); return Promise.all(paymentsArr?.map((payment) => getSentInfoFromPaymentRequest(req.session.selectedNode, payment))). then((values) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent Information Received', data: values }); @@ -142,12 +143,13 @@ export const sendPaymentToRouteRequestCall = (selectedNode, shortChannelIds, inv }); }; export const sendPaymentToRoute = (req, res, next) => { + const { shortChannelIds, invoice, amountMsat } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Send Payment To Route..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - sendPaymentToRouteRequestCall(req.session.selectedNode, req.body.shortChannelIds, req.body.invoice, req.body.amountMsat).then((callRes) => { + sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, amountMsat).then((callRes) => { res.status(200).json(callRes); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }; diff --git a/backend/controllers/lnd/channels.js b/backend/controllers/lnd/channels.js index eaccd798..20a7922e 100644 --- a/backend/controllers/lnd/channels.js +++ b/backend/controllers/lnd/channels.js @@ -123,6 +123,7 @@ export const getClosedChannels = (req, res, next) => { }); }; export const postChannel = (req, res, next) => { + const { node_pubkey, private: privateChannel, spend_unconfirmed, local_funding_amount, trans_type, trans_type_value, commitment_type } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' }); options = common.getOptions(req); if (options.error) { @@ -130,19 +131,19 @@ export const postChannel = (req, res, next) => { } options.url = req.session.selectedNode.ln_server_url + '/v1/channels'; options.form = { - node_pubkey_string: req.body.node_pubkey, - local_funding_amount: req.body.local_funding_amount, - private: req.body.private, - spend_unconfirmed: req.body.spend_unconfirmed + node_pubkey_string: node_pubkey, + local_funding_amount: local_funding_amount, + private: privateChannel, + spend_unconfirmed: spend_unconfirmed }; - if (req.body.trans_type === '1') { - options.form.target_conf = req.body.trans_type_value; + if (trans_type === '1') { + options.form.target_conf = trans_type_value; } - else if (req.body.trans_type === '2') { - options.form.sat_per_byte = req.body.trans_type_value; + else if (trans_type === '2') { + options.form.sat_per_byte = trans_type_value; } - if (req.body.commitment_type) { - options.form.commitment_type = req.body.commitment_type; + if (commitment_type) { + options.form.commitment_type = commitment_type; } options.form = JSON.stringify(options.form); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Channel Open Options', data: options.form }); @@ -155,27 +156,28 @@ export const postChannel = (req, res, next) => { }); }; export const postTransactions = (req, res, next) => { + const { paymentReq, paymentAmount, feeLimit, outgoingChannel, allowSelfPayment, lastHopPubkey } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Sending Payment..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/channels/transaction-stream'; - options.form = { payment_request: req.body.paymentReq }; - if (req.body.paymentAmount) { - options.form.amt = req.body.paymentAmount; + options.form = { payment_request: paymentReq }; + if (paymentAmount) { + options.form.amt = paymentAmount; } - if (req.body.feeLimit) { - options.form.fee_limit = req.body.feeLimit; + if (feeLimit) { + options.form.fee_limit = feeLimit; } - if (req.body.outgoingChannel) { - options.form.outgoing_chan_id = req.body.outgoingChannel; + if (outgoingChannel) { + options.form.outgoing_chan_id = outgoingChannel; } - if (req.body.allowSelfPayment) { - options.form.allow_self_payment = req.body.allowSelfPayment; + if (allowSelfPayment) { + options.form.allow_self_payment = allowSelfPayment; } - if (req.body.lastHopPubkey) { - options.form.last_hop_pubkey = Buffer.from(req.body.lastHopPubkey, 'hex').toString('base64'); + if (lastHopPubkey) { + options.form.last_hop_pubkey = Buffer.from(lastHopPubkey, 'hex').toString('base64'); } options.form = JSON.stringify(options.form); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Send Payment Options', data: options.form }); @@ -224,35 +226,36 @@ export const closeChannel = (req, res, next) => { } }; export const postChanPolicy = (req, res, next) => { + const { chanPoint, baseFeeMsat, feeRate, timeLockDelta, max_htlc_msat, min_htlc_msat } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Policy..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/chanpolicy'; - if (req.body.chanPoint === 'all') { + if (chanPoint === 'all') { options.form = JSON.stringify({ global: true, - base_fee_msat: req.body.baseFeeMsat, - fee_rate: parseFloat((req.body.feeRate / 1000000).toString()), - time_lock_delta: parseInt(req.body.timeLockDelta) + base_fee_msat: baseFeeMsat, + fee_rate: parseFloat((feeRate / 1000000).toString()), + time_lock_delta: parseInt(timeLockDelta) }); } else { - const breakPoint = req.body.chanPoint.indexOf(':'); - const txid_str = req.body.chanPoint.substring(0, breakPoint); - const output_idx = req.body.chanPoint.substring(breakPoint + 1, req.body.chanPoint.length); + const breakPoint = chanPoint.indexOf(':'); + const txid_str = chanPoint.substring(0, breakPoint); + const output_idx = chanPoint.substring(breakPoint + 1, chanPoint.length); const optionsBody = { - base_fee_msat: req.body.baseFeeMsat, - fee_rate: parseFloat((req.body.feeRate / 1000000).toString()), - time_lock_delta: parseInt(req.body.timeLockDelta), + base_fee_msat: baseFeeMsat, + fee_rate: parseFloat((feeRate / 1000000).toString()), + time_lock_delta: parseInt(timeLockDelta), chan_point: { funding_txid_str: txid_str, output_index: parseInt(output_idx) } }; - if (req.body.max_htlc_msat) { - optionsBody['max_htlc_msat'] = req.body.max_htlc_msat; + if (max_htlc_msat) { + optionsBody['max_htlc_msat'] = max_htlc_msat; } - if (req.body.min_htlc_msat) { - optionsBody['min_htlc_msat'] = req.body.min_htlc_msat; + if (min_htlc_msat) { + optionsBody['min_htlc_msat'] = min_htlc_msat; optionsBody['min_htlc_msat_specified'] = true; } options.form = JSON.stringify(optionsBody); diff --git a/backend/controllers/lnd/message.js b/backend/controllers/lnd/message.js index 19a62aa3..d4151417 100644 --- a/backend/controllers/lnd/message.js +++ b/backend/controllers/lnd/message.js @@ -5,6 +5,7 @@ let options = null; const logger = Logger; const common = Common; export const signMessage = (req, res, next) => { + const { message } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' }); options = common.getOptions(req); if (options.error) { @@ -12,7 +13,7 @@ export const signMessage = (req, res, next) => { } options.url = req.session.selectedNode.ln_server_url + '/v1/signmessage'; options.form = JSON.stringify({ - msg: Buffer.from(req.body.message).toString('base64') + msg: Buffer.from(message).toString('base64') }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body }); @@ -23,6 +24,7 @@ export const signMessage = (req, res, next) => { }); }; export const verifyMessage = (req, res, next) => { + const { message, signature } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' }); options = common.getOptions(req); if (options.error) { @@ -30,8 +32,8 @@ export const verifyMessage = (req, res, next) => { } options.url = req.session.selectedNode.ln_server_url + '/v1/verifymessage'; options.form = JSON.stringify({ - msg: Buffer.from(req.body.message).toString('base64'), - signature: req.body.signature + msg: Buffer.from(message).toString('base64'), + signature: signature }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body }); diff --git a/backend/controllers/lnd/payments.js b/backend/controllers/lnd/payments.js index 1e34ce95..eb813925 100644 --- a/backend/controllers/lnd/payments.js +++ b/backend/controllers/lnd/payments.js @@ -27,13 +27,14 @@ export const decodePayment = (req, res, next) => { }); }; export const decodePayments = (req, res, next) => { + const { payments } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Decoding Payments List..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - if (req.body.payments) { - const paymentsArr = req.body.payments.split(','); + if (payments) { + const paymentsArr = payments.split(','); return Promise.all(paymentsArr?.map((payment) => decodePaymentFromPaymentRequest(req.session.selectedNode, payment))). then((values) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment List Decoded', data: values }); diff --git a/backend/controllers/lnd/peers.js b/backend/controllers/lnd/peers.js index 9920860a..fce9e0d9 100644 --- a/backend/controllers/lnd/peers.js +++ b/backend/controllers/lnd/peers.js @@ -35,6 +35,7 @@ export const getPeers = (req, res, next) => { }); }; export const postPeer = (req, res, next) => { + const { host, pubkey, perm } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' }); options = common.getOptions(req); if (options.error) { @@ -42,8 +43,8 @@ export const postPeer = (req, res, next) => { } options.url = req.session.selectedNode.ln_server_url + '/v1/peers'; options.form = JSON.stringify({ - addr: { host: req.body.host, pubkey: req.body.pubkey }, - perm: req.body.perm + addr: { host: host, pubkey: pubkey }, + perm: perm }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body }); @@ -52,7 +53,7 @@ export const postPeer = (req, res, next) => { const peers = (!body.peers) ? [] : body.peers; return Promise.all(peers?.map((peer) => getAliasForPeers(req.session.selectedNode, peer))).then((values) => { if (body.peers) { - body.peers = common.newestOnTop(body.peers, 'pub_key', req.body.pubkey); + body.peers = common.newestOnTop(body.peers, 'pub_key', pubkey); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: body }); } res.status(201).json(body.peers); diff --git a/backend/controllers/lnd/switch.js b/backend/controllers/lnd/switch.js index fb16f1d4..9307a92d 100644 --- a/backend/controllers/lnd/switch.js +++ b/backend/controllers/lnd/switch.js @@ -7,7 +7,8 @@ const common = Common; const responseData = { switch: { forwarding_events: [], last_offset_index: 0 }, fees: { forwarding_events: [], last_offset_index: 0 } }; const num_max_events = 100; export const forwardingHistory = (req, res, next) => { - getAllForwardingEvents(req, req.body.start_time, req.body.end_time, 0, 'switch', (eventsResponse) => { + const { start_time, end_time } = req.body; + getAllForwardingEvents(req, start_time, end_time, 0, 'switch', (eventsResponse) => { if (eventsResponse.error) { res.status(eventsResponse.error.statusCode).json(eventsResponse); } diff --git a/backend/controllers/lnd/transactions.js b/backend/controllers/lnd/transactions.js index 0b4684d8..769751c4 100644 --- a/backend/controllers/lnd/transactions.js +++ b/backend/controllers/lnd/transactions.js @@ -20,6 +20,7 @@ export const getTransactions = (req, res, next) => { }); }; export const postTransactions = (req, res, next) => { + const { amount, address, fees, blocks, sendAll } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Sending Transaction..' }); options = common.getOptions(req); if (options.error) { @@ -27,13 +28,13 @@ export const postTransactions = (req, res, next) => { } options.url = req.session.selectedNode.ln_server_url + '/v1/transactions'; options.form = { - amount: req.body.amount, - addr: req.body.address, - sat_per_byte: req.body.fees, - target_conf: req.body.blocks + amount: amount, + addr: address, + sat_per_byte: fees, + target_conf: blocks }; - if (req.body.sendAll) { - options.form.send_all = req.body.sendAll; + if (sendAll) { + options.form.send_all = sendAll; } options.form = JSON.stringify(options.form); request.post(options).then((body) => { diff --git a/backend/controllers/lnd/wallet.js b/backend/controllers/lnd/wallet.js index 61b1c4e4..5bdd943c 100644 --- a/backend/controllers/lnd/wallet.js +++ b/backend/controllers/lnd/wallet.js @@ -26,6 +26,7 @@ export const genSeed = (req, res, next) => { }); }; export const operateWallet = (req, res, next) => { + const { wallet_password, aezeed_passphrase, cipher_seed_mnemonic } = req.body; let err_message = ''; options = common.getOptions(req); if (options.error) { @@ -36,24 +37,24 @@ export const operateWallet = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..' }); options.url = req.session.selectedNode.ln_server_url + '/v1/unlockwallet'; options.form = JSON.stringify({ - wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64') + wallet_password: Buffer.from(atob(wallet_password)).toString('base64') }); err_message = 'Unlocking wallet failed! Verify that lnd is running and the wallet is locked!'; } else { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..' }); options.url = req.session.selectedNode.ln_server_url + '/v1/initwallet'; - if (req.body.aezeed_passphrase && req.body.aezeed_passphrase !== '') { + if (aezeed_passphrase && aezeed_passphrase !== '') { options.form = JSON.stringify({ - wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64'), - cipher_seed_mnemonic: req.body.cipher_seed_mnemonic, - aezeed_passphrase: Buffer.from(atob(req.body.aezeed_passphrase)).toString('base64') + wallet_password: Buffer.from(atob(wallet_password)).toString('base64'), + cipher_seed_mnemonic: cipher_seed_mnemonic, + aezeed_passphrase: Buffer.from(atob(aezeed_passphrase)).toString('base64') }); } else { options.form = JSON.stringify({ - wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64'), - cipher_seed_mnemonic: req.body.cipher_seed_mnemonic + wallet_password: Buffer.from(atob(wallet_password)).toString('base64'), + cipher_seed_mnemonic: cipher_seed_mnemonic }); } err_message = 'Initializing wallet failed!'; @@ -119,6 +120,7 @@ export const getUTXOs = (req, res, next) => { }); }; export const bumpFee = (req, res, next) => { + const { txid, outputIndex, targetConf, satPerByte } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Bumping Fee..' }); options = common.getOptions(req); if (options.error) { @@ -127,14 +129,14 @@ export const bumpFee = (req, res, next) => { options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/bumpfee'; options.form = {}; options.form.outpoint = { - txid_str: req.body.txid, - output_index: req.body.outputIndex + txid_str: txid, + output_index: outputIndex }; - if (req.body.targetConf) { - options.form.target_conf = req.body.targetConf; + if (targetConf) { + options.form.target_conf = targetConf; } - else if (req.body.satPerByte) { - options.form.sat_per_byte = req.body.satPerByte; + else if (satPerByte) { + options.form.sat_per_byte = satPerByte; } options.form = JSON.stringify(options.form); request.post(options).then((body) => { @@ -152,11 +154,7 @@ export const labelTransaction = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/tx/label'; - options.form = {}; - options.form.txid = req.body.txid; - options.form.label = req.body.label; - options.form.overwrite = req.body.overwrite; - options.form = JSON.stringify(options.form); + options.form = JSON.parse(JSON.stringify(options.form)); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Transaction Labelled', data: body }); @@ -167,6 +165,7 @@ export const labelTransaction = (req, res, next) => { }); }; export const leaseUTXO = (req, res, next) => { + const { txid, outputIndex } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Leasing UTXO..' }); options = common.getOptions(req); if (options.error) { @@ -174,10 +173,10 @@ export const leaseUTXO = (req, res, next) => { } options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/lease'; options.form = {}; - options.form.id = req.body.txid; + options.form.id = txid; options.form.outpoint = { - txid_bytes: req.body.txid, - output_index: req.body.outputIndex + txid_bytes: txid, + output_index: outputIndex }; options.form = JSON.stringify(options.form); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'UTXO Lease Options', data: options.form }); @@ -190,6 +189,7 @@ export const leaseUTXO = (req, res, next) => { }); }; export const releaseUTXO = (req, res, next) => { + const { txid, outputIndex } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Releasing UTXO..' }); options = common.getOptions(req); if (options.error) { @@ -197,10 +197,10 @@ export const releaseUTXO = (req, res, next) => { } options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/release'; options.form = {}; - options.form.id = req.body.txid; + options.form.id = txid; options.form.outpoint = { - txid_bytes: req.body.txid, - output_index: req.body.outputIndex + txid_bytes: txid, + output_index: outputIndex }; options.form = JSON.stringify(options.form); request.post(options).then((body) => { diff --git a/backend/controllers/shared/RTLConf.js b/backend/controllers/shared/RTLConf.js index 55225e28..d0a5669f 100644 --- a/backend/controllers/shared/RTLConf.js +++ b/backend/controllers/shared/RTLConf.js @@ -132,30 +132,31 @@ export const getRTLConfig = (req, res, next) => { }); }; export const updateUISettings = (req, res, next) => { + const { updatedSettings } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating UI Settings..' }); const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const node = config.nodes.find((node) => (node.index === req.session.selectedNode.index)); if (node && node.Settings) { - node.Settings.userPersona = req.body.updatedSettings.userPersona; - node.Settings.themeMode = req.body.updatedSettings.themeMode; - node.Settings.themeColor = req.body.updatedSettings.themeColor; - node.Settings.unannouncedChannels = req.body.updatedSettings.unannouncedChannels; - node.Settings.fiatConversion = req.body.updatedSettings.fiatConversion; - if (req.body.updatedSettings.fiatConversion) { - node.Settings.currencyUnit = req.body.updatedSettings.currencyUnit ? req.body.updatedSettings.currencyUnit : 'USD'; + node.Settings.userPersona = updatedSettings.userPersona; + node.Settings.themeMode = updatedSettings.themeMode; + node.Settings.themeColor = updatedSettings.themeColor; + node.Settings.unannouncedChannels = updatedSettings.unannouncedChannels; + node.Settings.fiatConversion = updatedSettings.fiatConversion; + if (updatedSettings.fiatConversion) { + node.Settings.currencyUnit = updatedSettings.currencyUnit ? updatedSettings.currencyUnit : 'USD'; } else { delete node.Settings.currencyUnit; } const selectedNode = common.findNode(req.session.selectedNode.index); - selectedNode.user_persona = req.body.updatedSettings.userPersona; - selectedNode.theme_mode = req.body.updatedSettings.themeMode; - selectedNode.theme_color = req.body.updatedSettings.themeColor; - selectedNode.unannounced_channels = req.body.updatedSettings.unannouncedChannels; - selectedNode.fiat_conversion = req.body.updatedSettings.fiatConversion; - if (req.body.updatedSettings.fiatConversion) { - selectedNode.currency_unit = req.body.updatedSettings.currencyUnit ? req.body.updatedSettings.currencyUnit : 'USD'; + selectedNode.user_persona = updatedSettings.userPersona; + selectedNode.theme_mode = updatedSettings.themeMode; + selectedNode.theme_color = updatedSettings.themeColor; + selectedNode.unannounced_channels = updatedSettings.unannouncedChannels; + selectedNode.fiat_conversion = updatedSettings.fiatConversion; + if (updatedSettings.fiatConversion) { + selectedNode.currency_unit = updatedSettings.currencyUnit ? updatedSettings.currencyUnit : 'USD'; } else { delete selectedNode.currency_unit; @@ -174,16 +175,17 @@ export const updateUISettings = (req, res, next) => { } }; export const update2FASettings = (req, res, next) => { + const { secret2fa } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating 2FA Settings..' }); const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); - if (req.body.secret2fa && req.body.secret2fa.trim() !== '') { - config.secret2fa = req.body.secret2fa; + if (secret2fa && secret2fa.trim() !== '') { + config.secret2fa = secret2fa; } else { delete config.secret2fa; } - const message = req.body.secret2fa.trim() === '' ? 'Two factor authentication disabled successfully.' : 'Two factor authentication enabled successfully.'; + const message = secret2fa.trim() === '' ? 'Two factor authentication disabled successfully.' : 'Two factor authentication enabled successfully.'; try { fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); common.rtl_secret2fa = config.secret2fa; @@ -197,10 +199,11 @@ export const update2FASettings = (req, res, next) => { } }; export const updateDefaultNode = (req, res, next) => { + const { defaultNodeIndex } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Default Node..' }); const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); - config.defaultNodeIndex = req.body.defaultNodeIndex; + config.defaultNodeIndex = defaultNodeIndex; try { fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Default Node Updated', data: maskPasswords(config) }); @@ -296,11 +299,12 @@ export const getCurrencyRates = (req, res, next) => { }); }; export const updateSSO = (req, res, next) => { + const { SSO } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating SSO Settings..' }); const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); delete config.SSO; - config.SSO = req.body.SSO; + config.SSO = SSO; try { fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'SSO Setting Updated', data: maskPasswords(config) }); @@ -313,19 +317,20 @@ export const updateSSO = (req, res, next) => { } }; export const updateServiceSettings = (req, res, next) => { + const { service, settings } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Service Settings..' }); const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const selectedNode = common.findNode(req.session.selectedNode.index); config.nodes.forEach((node) => { if (node.index === req.session.selectedNode.index) { - switch (req.body.service) { + switch (service) { case 'LOOP': - if (req.body.settings.enable) { - node.Settings.swapServerUrl = req.body.settings.serverUrl; - node.Authentication.swapMacaroonPath = req.body.settings.macaroonPath; - selectedNode.swap_server_url = req.body.settings.serverUrl; - selectedNode.swap_macaroon_path = req.body.settings.macaroonPath; + if (settings.enable) { + node.Settings.swapServerUrl = settings.serverUrl; + node.Authentication.swapMacaroonPath = settings.macaroonPath; + selectedNode.swap_server_url = settings.serverUrl; + selectedNode.swap_macaroon_path = settings.macaroonPath; } else { delete node.Settings.swapServerUrl; @@ -335,11 +340,11 @@ export const updateServiceSettings = (req, res, next) => { } break; case 'BOLTZ': - if (req.body.settings.enable) { - node.Settings.boltzServerUrl = req.body.settings.serverUrl; - node.Authentication.boltzMacaroonPath = req.body.settings.macaroonPath; - selectedNode.boltz_server_url = req.body.settings.serverUrl; - selectedNode.boltz_macaroon_path = req.body.settings.macaroonPath; + if (settings.enable) { + node.Settings.boltzServerUrl = settings.serverUrl; + node.Authentication.boltzMacaroonPath = settings.macaroonPath; + selectedNode.boltz_server_url = settings.serverUrl; + selectedNode.boltz_macaroon_path = settings.macaroonPath; } else { delete node.Settings.boltzServerUrl; @@ -349,12 +354,12 @@ export const updateServiceSettings = (req, res, next) => { } break; case 'OFFERS': - node.Settings.enableOffers = req.body.settings.enableOffers; - selectedNode.enable_offers = req.body.settings.enableOffers; + node.Settings.enableOffers = settings.enableOffers; + selectedNode.enable_offers = settings.enableOffers; break; case 'PEERSWAP': - node.Settings.enablePeerswap = req.body.settings.enablePeerswap; - selectedNode.enable_peerswap = req.body.settings.enablePeerswap; + node.Settings.enablePeerswap = settings.enablePeerswap; + selectedNode.enable_peerswap = settings.enablePeerswap; break; default: break; diff --git a/backend/controllers/shared/authenticate.js b/backend/controllers/shared/authenticate.js index ff5e71ad..1d34f8e9 100644 --- a/backend/controllers/shared/authenticate.js +++ b/backend/controllers/shared/authenticate.js @@ -46,14 +46,15 @@ const handleMultipleFailedAttemptsError = (failed, currentTime, errMsg) => { }; export const verifyToken = (twoFAToken) => !!(common.rtl_secret2fa && common.rtl_secret2fa !== '' && otplib.authenticator.check(twoFAToken, common.rtl_secret2fa)); export const authenticateUser = (req, res, next) => { + const { authenticateWith, authenticationValue, twoFAToken } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Authenticating User..' }); if (+common.rtl_sso) { - if (req.body.authenticateWith === 'JWT' && jwt.verify(req.body.authenticationValue, common.secret_key)) { + if (authenticateWith === 'JWT' && jwt.verify(authenticationValue, common.secret_key)) { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'User Authenticated' }); res.status(406).json({ message: 'SSO Authentication Error', error: 'Login with Password is not allowed with SSO.' }); } - else if (req.body.authenticateWith === 'PASSWORD') { - if (common.cookie_value.trim().length >= 32 && crypto.timingSafeEqual(Buffer.from(crypto.createHash('sha256').update(common.cookie_value).digest('hex'), 'utf-8'), Buffer.from(req.body.authenticationValue, 'utf-8'))) { + else if (authenticateWith === 'PASSWORD') { + if (common.cookie_value.trim().length >= 32 && crypto.timingSafeEqual(Buffer.from(crypto.createHash('sha256').update(common.cookie_value).digest('hex'), 'utf-8'), Buffer.from(authenticationValue, 'utf-8'))) { common.refreshCookie(); if (!req.session.selectedNode) { req.session.selectedNode = common.initSelectedNode; @@ -73,10 +74,10 @@ export const authenticateUser = (req, res, next) => { const currentTime = new Date().getTime(); const reqIP = common.getRequestIP(req); const failed = getFailedInfo(reqIP, currentTime); - const password = req.body.authenticationValue; + const password = authenticationValue; if (common.rtl_pass === password && failed.count < ALLOWED_LOGIN_ATTEMPTS) { - if (req.body.twoFAToken && req.body.twoFAToken !== '') { - if (!verifyToken(req.body.twoFAToken)) { + if (twoFAToken && twoFAToken !== '') { + if (!verifyToken(twoFAToken)) { logger.log({ selectedNode: req.session.selectedNode, level: 'ERROR', fileName: 'Authenticate', msg: 'Invalid Token! Failed IP ' + reqIP, error: { error: 'Invalid token.' } }); failed.count = failed.count + 1; failed.lastTried = currentTime; @@ -100,6 +101,7 @@ export const authenticateUser = (req, res, next) => { } }; export const resetPassword = (req, res, next) => { + const { currPassword, newPassword } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Resetting Password..' }); if (+common.rtl_sso) { const errMsg = 'Password cannot be reset for SSO authentication'; @@ -107,9 +109,8 @@ export const resetPassword = (req, res, next) => { return res.status(err.statusCode).json({ message: err.message, error: err.error }); } else { - const currPassword = req.body.currPassword; if (common.rtl_pass === currPassword) { - common.rtl_pass = common.replacePasswordWithHash(req.body.newPassword); + common.rtl_pass = common.replacePasswordWithHash(newPassword); const token = jwt.sign({ user: 'NODE_USER' }, common.secret_key); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Password Reset Successful' }); res.status(200).json({ token: token }); diff --git a/backend/controllers/shared/boltz.js b/backend/controllers/shared/boltz.js index f47395ec..8314b465 100644 --- a/backend/controllers/shared/boltz.js +++ b/backend/controllers/shared/boltz.js @@ -79,6 +79,7 @@ export const getSwapInfo = (req, res, next) => { }); }; export const createSwap = (req, res, next) => { + const { amount, address } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Swap..' }); options = common.getBoltzServerOptions(req); if (options.url === '') { @@ -87,9 +88,9 @@ export const createSwap = (req, res, next) => { return res.status(err.statusCode).json({ message: err.message, error: err.error }); } options.url = options.url + '/v1/createswap'; - options.body = { amount: req.body.amount }; - if (req.body.address !== '') { - options.body.address = req.body.address; + options.body = { amount: amount }; + if (address && address !== '') { + options.body.address = address; } logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Swap Options Body', data: options.body }); request.post(options).then((createSwapRes) => { @@ -101,6 +102,7 @@ export const createSwap = (req, res, next) => { }); }; export const createReverseSwap = (req, res, next) => { + const { amount, acceptZeroConf, address } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Reverse Swap..' }); options = common.getBoltzServerOptions(req); if (options.url === '') { @@ -109,9 +111,9 @@ export const createReverseSwap = (req, res, next) => { return res.status(err.statusCode).json({ message: err.message, error: err.error }); } options.url = options.url + '/v1/createreverseswap'; - options.body = { amount: req.body.amount, accept_zero_conf: req.body.acceptZeroConf || false }; - if (req.body.address !== '') { - options.body.address = req.body.address; + options.body = { amount: amount, accept_zero_conf: acceptZeroConf || false }; + if (address && address !== '') { + options.body.address = address; } logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Reverse Swap Body', data: options.body }); request.post(options).then((createReverseSwapRes) => { @@ -123,6 +125,7 @@ export const createReverseSwap = (req, res, next) => { }); }; export const createChannel = (req, res, next) => { + const { amount, address } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Boltz Channel..' }); options = common.getBoltzServerOptions(req); if (options.url === '') { @@ -131,9 +134,9 @@ export const createChannel = (req, res, next) => { return res.status(err.statusCode).json({ message: err.message, error: err.error }); } options.url = options.url + '/v1/createchannel'; - options.body = { amount: req.body.amount }; - if (req.body.address !== '') { - options.body.address = req.body.address; + options.body = { amount: amount }; + if (address && address !== '') { + options.body.address = address; } logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Channel Options Body', data: options.body }); request.post(options).then((createChannelRes) => { diff --git a/backend/controllers/shared/loop.js b/backend/controllers/shared/loop.js index f0160b04..525b635d 100644 --- a/backend/controllers/shared/loop.js +++ b/backend/controllers/shared/loop.js @@ -5,24 +5,25 @@ let options = null; const logger = Logger; const common = Common; export const loopOut = (req, res, next) => { + const { amount, targetConf, swapRoutingFee, minerFee, prepayRoutingFee, prepayAmt, swapFee, swapPublicationDeadline, chanId, destAddress } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping Out..' }); options.uri = '/v1/loop/out'; options.body = { - amt: req.body.amount, - sweep_conf_target: req.body.targetConf, - max_swap_routing_fee: req.body.swapRoutingFee, - max_miner_fee: req.body.minerFee, - max_prepay_routing_fee: req.body.prepayRoutingFee, - max_prepay_amt: req.body.prepayAmt, - max_swap_fee: req.body.swapFee, - swap_publication_deadline: req.body.swapPublicationDeadline, + amt: amount, + sweep_conf_target: targetConf, + max_swap_routing_fee: swapRoutingFee, + max_miner_fee: minerFee, + max_prepay_routing_fee: prepayRoutingFee, + max_prepay_amt: prepayAmt, + max_swap_fee: swapFee, + swap_publication_deadline: swapPublicationDeadline, initiator: 'RTL' }; - if (req.body.chanId !== '') { - options.body['loop_out_channel'] = req.body.chanId; + if (chanId !== '') { + options.body['loop_out_channel'] = chanId; } - if (req.body.destAddress !== '') { - options.body['dest'] = req.body.destAddress; + if (destAddress !== '') { + options.body['dest'] = destAddress; } logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Body', data: options.body }); request.post(options).then((loopOutRes) => { @@ -87,12 +88,13 @@ export const loopOutTermsAndQuotes = (req, res, next) => { }); }; export const loopIn = (req, res, next) => { + const { amount, swapFee, minerFee } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping In..' }); options.uri = '/v1/loop/in'; options.body = { - amt: req.body.amount, - max_swap_fee: req.body.swapFee, - max_miner_fee: req.body.minerFee, + amt: amount, + max_swap_fee: swapFee, + max_miner_fee: minerFee, initiator: 'RTL' }; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Loop In Body', data: options.body }); diff --git a/server/controllers/cln/channels.ts b/server/controllers/cln/channels.ts index cc91f685..7529d37a 100644 --- a/server/controllers/cln/channels.ts +++ b/server/controllers/cln/channels.ts @@ -78,14 +78,15 @@ export const closeChannel = (req, res, next) => { }; export const listForwards = (req, res, next) => { + const { status } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channel List Forwards..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listforwards'; options.body = req.body; request.post(options).then((body) => { - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + req.body.status, data: body }); - body.forwards = !body.forwards ? [] : (req.body.status === 'failed' || req.body.status === 'local_failed') ? body.forwards.slice(Math.max(0, body.forwards.length - 1000), Math.max(1000, body.forwards.length)).reverse() : body.forwards.reverse(); + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + status, data: body }); + body.forwards = !body.forwards ? [] : (status === 'failed' || status === 'local_failed') ? body.forwards.slice(Math.max(0, body.forwards.length - 1000), Math.max(1000, body.forwards.length)).reverse() : body.forwards.reverse(); res.status(200).json(body.forwards); }).catch((errRes) => { const err = common.handleError(errRes, 'Channels', 'Forwarding History Error', req.session.selectedNode); diff --git a/server/controllers/cln/network.ts b/server/controllers/cln/network.ts index 2286bf17..31e14d41 100644 --- a/server/controllers/cln/network.ts +++ b/server/controllers/cln/network.ts @@ -41,13 +41,14 @@ export const listChannels = (req, res, next) => { }; export const feeRates = (req, res, next) => { + const { style } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Getting Network Fee Rates..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/feerates'; options.body = req.body; request.post(options).then((body) => { - logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + req.body.style, data: body }); + logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + style, data: body }); res.status(200).json(body); }).catch((errRes) => { const err = common.handleError(errRes, 'Network', 'Fee Rates Error', req.session.selectedNode); @@ -56,12 +57,12 @@ export const feeRates = (req, res, next) => { }; export const listNodes = (req, res, next) => { + const filter_liquidity_ads = !!req.body.liquidity_ads; + delete req.body.liquidity_ads; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'List Nodes..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listnodes'; - const filter_liquidity_ads = !!req.body.liquidity_ads; - delete req.body.liquidity_ads; options.body = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url }); request.post(options).then((body) => { diff --git a/server/controllers/cln/offers.ts b/server/controllers/cln/offers.ts index d9bfa453..8fd2fe28 100644 --- a/server/controllers/cln/offers.ts +++ b/server/controllers/cln/offers.ts @@ -21,10 +21,11 @@ export const listOfferBookmarks = (req, res, next) => { }; export const deleteOfferBookmark = (req, res, next) => { + const { offer_str } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Deleting Offer Bookmark..' }); - databaseService.remove(req.session.selectedNode, CollectionsEnum.OFFERS, CollectionFieldsEnum.BOLT12, req.body.offer_str).then((deleteRes) => { + databaseService.remove(req.session.selectedNode, CollectionsEnum.OFFERS, CollectionFieldsEnum.BOLT12, offer_str).then((deleteRes) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Bookmark Deleted', data: deleteRes }); - res.status(204).json(req.body.offer_str); + res.status(204).json(offer_str); }).catch((errRes) => { const err = common.handleError(errRes, 'Offers', 'Offer Bookmark Delete Error', req.session.selectedNode); return res.status(err.statusCode).json({ message: err.message, error: err.error }); diff --git a/server/controllers/cln/payments.ts b/server/controllers/cln/payments.ts index 735087bc..6a716c90 100644 --- a/server/controllers/cln/payments.ts +++ b/server/controllers/cln/payments.ts @@ -89,10 +89,11 @@ export const listPayments = (req, res, next) => { }; export const postPayment = (req, res, next) => { + const { paymentType, saveToDB, bolt12, zeroAmtOffer, amount_msat, title, issuer, description } = req.body; options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } const options_body = JSON.parse(JSON.stringify(req.body)); - if (req.body.paymentType === 'KEYSEND') { + if (paymentType === 'KEYSEND') { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..' }); options.url = req.session.selectedNode.ln_server_url + '/v1/keysend'; delete options_body.uiMessage; @@ -112,12 +113,12 @@ export const postPayment = (req, res, next) => { delete options_body.saveToDB; options.body = options_body; } else { - if (req.body.paymentType === 'OFFER') { + if (paymentType === 'OFFER') { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Offer Payment..' }); } else { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Invoice Payment..' }); } - if (req.body.paymentType === 'OFFER') { + if (paymentType === 'OFFER') { // delete amount for zero amt offer also as fetchinvoice already has amount information delete options_body.amount_msat; } @@ -137,14 +138,14 @@ export const postPayment = (req, res, next) => { } request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent', data: body }); - if (req.body.paymentType === 'OFFER') { - if (req.body.saveToDB && req.body.bolt12) { - const offerToUpdate: Offer = { bolt12: req.body.bolt12, amountMSat: (req.body.zeroAmtOffer ? 0 : req.body.amount_msat), title: req.body.title, lastUpdatedAt: new Date(Date.now()).getTime() }; - if (req.body.issuer) { offerToUpdate['issuer'] = req.body.issuer; } - if (req.body.description) { offerToUpdate['description'] = req.body.description; } + if (paymentType === 'OFFER') { + if (saveToDB && bolt12) { + const offerToUpdate: Offer = { bolt12: bolt12, amountMSat: (zeroAmtOffer ? 0 : amount_msat), title: title, lastUpdatedAt: new Date(Date.now()).getTime() }; + if (issuer) { offerToUpdate['issuer'] = issuer; } + if (description) { offerToUpdate['description'] = description; } // eslint-disable-next-line arrow-body-style return databaseService.validateDocument(CollectionsEnum.OFFERS, offerToUpdate).then((validated) => { - return databaseService.update(req.session.selectedNode, CollectionsEnum.OFFERS, offerToUpdate, CollectionFieldsEnum.BOLT12, req.body.bolt12).then((updatedOffer) => { + return databaseService.update(req.session.selectedNode, CollectionsEnum.OFFERS, offerToUpdate, CollectionFieldsEnum.BOLT12, bolt12).then((updatedOffer) => { logger.log({ level: 'DEBUG', fileName: 'Payments', msg: 'Offer Updated', data: updatedOffer }); return res.status(201).json({ paymentResponse: body, saveToDBResponse: updatedOffer }); }).catch((errDB) => { @@ -159,10 +160,10 @@ export const postPayment = (req, res, next) => { return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' }); } } - if (req.body.paymentType === 'INVOICE') { + if (paymentType === 'INVOICE') { return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' }); } - if (req.body.paymentType === 'KEYSEND') { + if (paymentType === 'KEYSEND') { return res.status(201).json(body); } }).catch((errRes) => { diff --git a/server/controllers/eclair/channels.ts b/server/controllers/eclair/channels.ts index 7bd5a4cf..d5b98053 100644 --- a/server/controllers/eclair/channels.ts +++ b/server/controllers/eclair/channels.ts @@ -154,7 +154,8 @@ export const closeChannel = (req, res, next) => { }; export const circularRebalance = (req, res, next) => { - const crInvDescription = 'Circular rebalancing invoice for ' + (req.body.amountMsat / 1000) + ' Sats'; + const { amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format, sourceShortChannelId, targetShortChannelId } = req.body; + const crInvDescription = 'Circular rebalancing invoice for ' + (amountMsat / 1000) + ' Sats'; options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.form = req.body; @@ -162,22 +163,22 @@ export const circularRebalance = (req, res, next) => { const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString(); // Check if unpaid Invoice exists already listPendingInvoicesRequestCall(req.session.selectedNode).then((callRes: any[]) => { - const foundExistingInvoice = callRes.find((inv) => inv.description.includes(crInvDescription) && inv.amount === req.body.amountMsat && inv.expiry && inv.timestamp && ((inv.expiry + inv.timestamp) >= tillToday)); + const foundExistingInvoice = callRes.find((inv) => inv.description.includes(crInvDescription) && inv.amount === amountMsat && inv.expiry && inv.timestamp && ((inv.expiry + inv.timestamp) >= tillToday)); // Create new invoice if doesn't exist already const requestCalls = foundExistingInvoice && foundExistingInvoice.serialized ? - [findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format)] : - [findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format), createInvoiceRequestCall(req.session.selectedNode, crInvDescription, req.body.amountMsat)]; + [findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format)] : + [findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format), createInvoiceRequestCall(req.session.selectedNode, crInvDescription, amountMsat)]; Promise.all(requestCalls).then((values: any[]) => { // eslint-disable-next-line arrow-body-style const routes = values[0]?.routes?.filter((route) => { - return !((route.shortChannelIds[0] === req.body.sourceShortChannelId && route.shortChannelIds[1] === req.body.targetShortChannelId) || - (route.shortChannelIds[1] === req.body.sourceShortChannelId && route.shortChannelIds[0] === req.body.targetShortChannelId)); + return !((route.shortChannelIds[0] === sourceShortChannelId && route.shortChannelIds[1] === targetShortChannelId) || + (route.shortChannelIds[1] === sourceShortChannelId && route.shortChannelIds[0] === targetShortChannelId)); }); const firstRoute = routes[0].shortChannelIds.join() || ''; - const shortChannelIds = req.body.sourceShortChannelId + ',' + firstRoute + ',' + req.body.targetShortChannelId; + const shortChannelIds = sourceShortChannelId + ',' + firstRoute + ',' + targetShortChannelId; const invoice = (foundExistingInvoice && foundExistingInvoice.serialized ? foundExistingInvoice.serialized : (values[1] ? values[1].serialized : '')) || ''; const paymentHash = (foundExistingInvoice && foundExistingInvoice.paymentHash ? foundExistingInvoice.paymentHash : (values[1] ? values[1].paymentHash : '') || ''); - return sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, req.body.amountMsat).then((payToRouteCallRes) => { + return sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, amountMsat).then((payToRouteCallRes) => { // eslint-disable-next-line arrow-body-style setTimeout(() => { return getSentInfoFromPaymentRequest(req.session.selectedNode, paymentHash).then((sentInfoCallRes) => { diff --git a/server/controllers/eclair/invoices.ts b/server/controllers/eclair/invoices.ts index 4b21b9b7..6738a3a0 100644 --- a/server/controllers/eclair/invoices.ts +++ b/server/controllers/eclair/invoices.ts @@ -131,10 +131,11 @@ export const createInvoiceRequestCall = (selectedNode: CommonSelectedNode, descr }; export const createInvoice = (req, res, next) => { + const { description, amountMsat } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - createInvoiceRequestCall(req.session.selectedNode, req.body.description, req.body.amountMsat).then((invRes) => { + createInvoiceRequestCall(req.session.selectedNode, description, amountMsat).then((invRes) => { res.status(201).json(invRes); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }; diff --git a/server/controllers/eclair/network.ts b/server/controllers/eclair/network.ts index 3b347eb8..7dfe7bdb 100644 --- a/server/controllers/eclair/network.ts +++ b/server/controllers/eclair/network.ts @@ -37,9 +37,10 @@ export const findRouteBetweenNodesRequestCall = (selectedNode: CommonSelectedNod }; export const findRouteBetweenNodes = (req, res, next) => { + const { amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format } = req.body; options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format).then((callRes) => { + findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format).then((callRes) => { res.status(200).json(callRes); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }; diff --git a/server/controllers/eclair/onchain.ts b/server/controllers/eclair/onchain.ts index a431e8f8..34f3666b 100644 --- a/server/controllers/eclair/onchain.ts +++ b/server/controllers/eclair/onchain.ts @@ -68,15 +68,12 @@ export const getTransactions = (req, res, next) => { }; export const sendFunds = (req, res, next) => { + const { address, amount, blocks } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Sending On Chain Funds..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/sendonchain'; - options.form = { - address: req.body.address, - amountSatoshis: req.body.amount, - confirmationTarget: req.body.blocks - }; + options.form = { address: address, amountSatoshis: amount, confirmationTarget: blocks }; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Onchain', msg: 'On Chain Funds Sent', data: body }); diff --git a/server/controllers/eclair/payments.ts b/server/controllers/eclair/payments.ts index 06c4ea0d..2a588a0f 100644 --- a/server/controllers/eclair/payments.ts +++ b/server/controllers/eclair/payments.ts @@ -98,11 +98,12 @@ export const queryPaymentRoute = (req, res, next) => { }; export const getSentPaymentsInformation = (req, res, next) => { + const { payments } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting Sent Payment Information..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - if (req.body.payments) { - const paymentsArr = req.body.payments.split(','); + if (payments) { + const paymentsArr = payments.split(','); return Promise.all(paymentsArr?.map((payment) => getSentInfoFromPaymentRequest(req.session.selectedNode, payment))). then((values) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent Information Received', data: values }); @@ -135,10 +136,11 @@ export const sendPaymentToRouteRequestCall = (selectedNode: CommonSelectedNode, }; export const sendPaymentToRoute = (req, res, next) => { + const { shortChannelIds, invoice, amountMsat } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Send Payment To Route..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - sendPaymentToRouteRequestCall(req.session.selectedNode, req.body.shortChannelIds, req.body.invoice, req.body.amountMsat).then((callRes) => { + sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, amountMsat).then((callRes) => { res.status(200).json(callRes); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }; diff --git a/server/controllers/lnd/channels.ts b/server/controllers/lnd/channels.ts index 58401a71..3defaa49 100644 --- a/server/controllers/lnd/channels.ts +++ b/server/controllers/lnd/channels.ts @@ -125,23 +125,24 @@ export const getClosedChannels = (req, res, next) => { }; export const postChannel = (req, res, next) => { + const { node_pubkey, private: privateChannel, spend_unconfirmed, local_funding_amount, trans_type, trans_type_value, commitment_type } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/channels'; options.form = { - node_pubkey_string: req.body.node_pubkey, - local_funding_amount: req.body.local_funding_amount, - private: req.body.private, - spend_unconfirmed: req.body.spend_unconfirmed + node_pubkey_string: node_pubkey, + local_funding_amount: local_funding_amount, + private: privateChannel, + spend_unconfirmed: spend_unconfirmed }; - if (req.body.trans_type === '1') { - options.form.target_conf = req.body.trans_type_value; - } else if (req.body.trans_type === '2') { - options.form.sat_per_byte = req.body.trans_type_value; + if (trans_type === '1') { + options.form.target_conf = trans_type_value; + } else if (trans_type === '2') { + options.form.sat_per_byte = trans_type_value; } - if (req.body.commitment_type) { - options.form.commitment_type = req.body.commitment_type; + if (commitment_type) { + options.form.commitment_type = commitment_type; } options.form = JSON.stringify(options.form); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Channel Open Options', data: options.form }); @@ -155,18 +156,19 @@ export const postChannel = (req, res, next) => { }; export const postTransactions = (req, res, next) => { + const { paymentReq, paymentAmount, feeLimit, outgoingChannel, allowSelfPayment, lastHopPubkey } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Sending Payment..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/channels/transaction-stream'; - options.form = { payment_request: req.body.paymentReq }; - if (req.body.paymentAmount) { - options.form.amt = req.body.paymentAmount; + options.form = { payment_request: paymentReq }; + if (paymentAmount) { + options.form.amt = paymentAmount; } - if (req.body.feeLimit) { options.form.fee_limit = req.body.feeLimit; } - if (req.body.outgoingChannel) { options.form.outgoing_chan_id = req.body.outgoingChannel; } - if (req.body.allowSelfPayment) { options.form.allow_self_payment = req.body.allowSelfPayment; } - if (req.body.lastHopPubkey) { options.form.last_hop_pubkey = Buffer.from(req.body.lastHopPubkey, 'hex').toString('base64'); } + if (feeLimit) { options.form.fee_limit = feeLimit; } + if (outgoingChannel) { options.form.outgoing_chan_id = outgoingChannel; } + if (allowSelfPayment) { options.form.allow_self_payment = allowSelfPayment; } + if (lastHopPubkey) { options.form.last_hop_pubkey = Buffer.from(lastHopPubkey, 'hex').toString('base64'); } options.form = JSON.stringify(options.form); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Send Payment Options', data: options.form }); request.post(options).then((body) => { @@ -208,32 +210,33 @@ export const closeChannel = (req, res, next) => { }; export const postChanPolicy = (req, res, next) => { + const { chanPoint, baseFeeMsat, feeRate, timeLockDelta, max_htlc_msat, min_htlc_msat } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Policy..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/chanpolicy'; - if (req.body.chanPoint === 'all') { + if (chanPoint === 'all') { options.form = JSON.stringify({ global: true, - base_fee_msat: req.body.baseFeeMsat, - fee_rate: parseFloat((req.body.feeRate / 1000000).toString()), - time_lock_delta: parseInt(req.body.timeLockDelta) + base_fee_msat: baseFeeMsat, + fee_rate: parseFloat((feeRate / 1000000).toString()), + time_lock_delta: parseInt(timeLockDelta) }); } else { - const breakPoint = req.body.chanPoint.indexOf(':'); - const txid_str = req.body.chanPoint.substring(0, breakPoint); - const output_idx = req.body.chanPoint.substring(breakPoint + 1, req.body.chanPoint.length); + const breakPoint = chanPoint.indexOf(':'); + const txid_str = chanPoint.substring(0, breakPoint); + const output_idx = chanPoint.substring(breakPoint + 1, chanPoint.length); const optionsBody = { - base_fee_msat: req.body.baseFeeMsat, - fee_rate: parseFloat((req.body.feeRate / 1000000).toString()), - time_lock_delta: parseInt(req.body.timeLockDelta), + base_fee_msat: baseFeeMsat, + fee_rate: parseFloat((feeRate / 1000000).toString()), + time_lock_delta: parseInt(timeLockDelta), chan_point: { funding_txid_str: txid_str, output_index: parseInt(output_idx) } }; - if (req.body.max_htlc_msat) { - optionsBody['max_htlc_msat'] = req.body.max_htlc_msat; + if (max_htlc_msat) { + optionsBody['max_htlc_msat'] = max_htlc_msat; } - if (req.body.min_htlc_msat) { - optionsBody['min_htlc_msat'] = req.body.min_htlc_msat; + if (min_htlc_msat) { + optionsBody['min_htlc_msat'] = min_htlc_msat; optionsBody['min_htlc_msat_specified'] = true; } options.form = JSON.stringify(optionsBody); diff --git a/server/controllers/lnd/message.ts b/server/controllers/lnd/message.ts index c859b9de..4ac609da 100644 --- a/server/controllers/lnd/message.ts +++ b/server/controllers/lnd/message.ts @@ -6,12 +6,13 @@ const logger: LoggerService = Logger; const common: CommonService = Common; export const signMessage = (req, res, next) => { + const { message } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/signmessage'; options.form = JSON.stringify({ - msg: Buffer.from(req.body.message).toString('base64') + msg: Buffer.from(message).toString('base64') }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body }); @@ -23,13 +24,14 @@ export const signMessage = (req, res, next) => { }; export const verifyMessage = (req, res, next) => { + const { message, signature } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/verifymessage'; options.form = JSON.stringify({ - msg: Buffer.from(req.body.message).toString('base64'), - signature: req.body.signature + msg: Buffer.from(message).toString('base64'), + signature: signature }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body }); diff --git a/server/controllers/lnd/payments.ts b/server/controllers/lnd/payments.ts index 6122bbdd..83322075 100644 --- a/server/controllers/lnd/payments.ts +++ b/server/controllers/lnd/payments.ts @@ -30,11 +30,12 @@ export const decodePayment = (req, res, next) => { }; export const decodePayments = (req, res, next) => { + const { payments } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Decoding Payments List..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - if (req.body.payments) { - const paymentsArr = req.body.payments.split(','); + if (payments) { + const paymentsArr = payments.split(','); return Promise.all(paymentsArr?.map((payment) => decodePaymentFromPaymentRequest(req.session.selectedNode, payment))). then((values) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment List Decoded', data: values }); diff --git a/server/controllers/lnd/peers.ts b/server/controllers/lnd/peers.ts index af6e46c8..5ef14d6b 100644 --- a/server/controllers/lnd/peers.ts +++ b/server/controllers/lnd/peers.ts @@ -37,13 +37,14 @@ export const getPeers = (req, res, next) => { }; export const postPeer = (req, res, next) => { + const { host, pubkey, perm } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/peers'; options.form = JSON.stringify({ - addr: { host: req.body.host, pubkey: req.body.pubkey }, - perm: req.body.perm + addr: { host: host, pubkey: pubkey }, + perm: perm }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body }); @@ -52,7 +53,7 @@ export const postPeer = (req, res, next) => { const peers = (!body.peers) ? [] : body.peers; return Promise.all(peers?.map((peer) => getAliasForPeers(req.session.selectedNode, peer))).then((values) => { if (body.peers) { - body.peers = common.newestOnTop(body.peers, 'pub_key', req.body.pubkey); + body.peers = common.newestOnTop(body.peers, 'pub_key', pubkey); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: body }); } res.status(201).json(body.peers); diff --git a/server/controllers/lnd/switch.ts b/server/controllers/lnd/switch.ts index 6d634e9f..b12f78e9 100644 --- a/server/controllers/lnd/switch.ts +++ b/server/controllers/lnd/switch.ts @@ -8,7 +8,8 @@ const responseData = { switch: { forwarding_events: [], last_offset_index: 0 }, const num_max_events = 100; export const forwardingHistory = (req, res, next) => { - getAllForwardingEvents(req, req.body.start_time, req.body.end_time, 0, 'switch', (eventsResponse) => { + const { start_time, end_time } = req.body; + getAllForwardingEvents(req, start_time, end_time, 0, 'switch', (eventsResponse) => { if (eventsResponse.error) { res.status(eventsResponse.error.statusCode).json(eventsResponse); } else { diff --git a/server/controllers/lnd/transactions.ts b/server/controllers/lnd/transactions.ts index 688ddb78..0310238a 100644 --- a/server/controllers/lnd/transactions.ts +++ b/server/controllers/lnd/transactions.ts @@ -20,19 +20,18 @@ export const getTransactions = (req, res, next) => { }; export const postTransactions = (req, res, next) => { + const { amount, address, fees, blocks, sendAll } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Sending Transaction..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/transactions'; options.form = { - amount: req.body.amount, - addr: req.body.address, - sat_per_byte: req.body.fees, - target_conf: req.body.blocks + amount: amount, + addr: address, + sat_per_byte: fees, + target_conf: blocks }; - if (req.body.sendAll) { - options.form.send_all = req.body.sendAll; - } + if (sendAll) { options.form.send_all = sendAll; } options.form = JSON.stringify(options.form); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Transaction Sent', data: body }); diff --git a/server/controllers/lnd/wallet.ts b/server/controllers/lnd/wallet.ts index 063a2906..ee177c85 100644 --- a/server/controllers/lnd/wallet.ts +++ b/server/controllers/lnd/wallet.ts @@ -25,6 +25,7 @@ export const genSeed = (req, res, next) => { }; export const operateWallet = (req, res, next) => { + const { wallet_password, aezeed_passphrase, cipher_seed_mnemonic } = req.body; let err_message = ''; options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } @@ -33,22 +34,22 @@ export const operateWallet = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..' }); options.url = req.session.selectedNode.ln_server_url + '/v1/unlockwallet'; options.form = JSON.stringify({ - wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64') + wallet_password: Buffer.from(atob(wallet_password)).toString('base64') }); err_message = 'Unlocking wallet failed! Verify that lnd is running and the wallet is locked!'; } else { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..' }); options.url = req.session.selectedNode.ln_server_url + '/v1/initwallet'; - if (req.body.aezeed_passphrase && req.body.aezeed_passphrase !== '') { + if (aezeed_passphrase && aezeed_passphrase !== '') { options.form = JSON.stringify({ - wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64'), - cipher_seed_mnemonic: req.body.cipher_seed_mnemonic, - aezeed_passphrase: Buffer.from(atob(req.body.aezeed_passphrase)).toString('base64') + wallet_password: Buffer.from(atob(wallet_password)).toString('base64'), + cipher_seed_mnemonic: cipher_seed_mnemonic, + aezeed_passphrase: Buffer.from(atob(aezeed_passphrase)).toString('base64') }); } else { options.form = JSON.stringify({ - wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64'), - cipher_seed_mnemonic: req.body.cipher_seed_mnemonic + wallet_password: Buffer.from(atob(wallet_password)).toString('base64'), + cipher_seed_mnemonic: cipher_seed_mnemonic }); } err_message = 'Initializing wallet failed!'; @@ -109,19 +110,20 @@ export const getUTXOs = (req, res, next) => { }; export const bumpFee = (req, res, next) => { + const { txid, outputIndex, targetConf, satPerByte } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Bumping Fee..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/bumpfee'; options.form = {}; options.form.outpoint = { - txid_str: req.body.txid, - output_index: req.body.outputIndex + txid_str: txid, + output_index: outputIndex }; - if (req.body.targetConf) { - options.form.target_conf = req.body.targetConf; - } else if (req.body.satPerByte) { - options.form.sat_per_byte = req.body.satPerByte; + if (targetConf) { + options.form.target_conf = targetConf; + } else if (satPerByte) { + options.form.sat_per_byte = satPerByte; } options.form = JSON.stringify(options.form); request.post(options).then((body) => { @@ -138,11 +140,7 @@ export const labelTransaction = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/tx/label'; - options.form = {}; - options.form.txid = req.body.txid; - options.form.label = req.body.label; - options.form.overwrite = req.body.overwrite; - options.form = JSON.stringify(options.form); + options.form = JSON.parse(JSON.stringify(options.form)); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Transaction Labelled', data: body }); @@ -154,15 +152,16 @@ export const labelTransaction = (req, res, next) => { }; export const leaseUTXO = (req, res, next) => { + const { txid, outputIndex } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Leasing UTXO..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/lease'; options.form = {}; - options.form.id = req.body.txid; + options.form.id = txid; options.form.outpoint = { - txid_bytes: req.body.txid, - output_index: req.body.outputIndex + txid_bytes: txid, + output_index: outputIndex }; options.form = JSON.stringify(options.form); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'UTXO Lease Options', data: options.form }); @@ -176,15 +175,16 @@ export const leaseUTXO = (req, res, next) => { }; export const releaseUTXO = (req, res, next) => { + const { txid, outputIndex } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Releasing UTXO..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/release'; options.form = {}; - options.form.id = req.body.txid; + options.form.id = txid; options.form.outpoint = { - txid_bytes: req.body.txid, - output_index: req.body.outputIndex + txid_bytes: txid, + output_index: outputIndex }; options.form = JSON.stringify(options.form); request.post(options).then((body) => { diff --git a/server/controllers/shared/RTLConf.ts b/server/controllers/shared/RTLConf.ts index e8eb23d4..acae9dc3 100644 --- a/server/controllers/shared/RTLConf.ts +++ b/server/controllers/shared/RTLConf.ts @@ -134,29 +134,30 @@ export const getRTLConfig = (req, res, next) => { }; export const updateUISettings = (req, res, next) => { + const { updatedSettings } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating UI Settings..' }); const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const node = config.nodes.find((node) => (node.index === req.session.selectedNode.index)); if (node && node.Settings) { - node.Settings.userPersona = req.body.updatedSettings.userPersona; - node.Settings.themeMode = req.body.updatedSettings.themeMode; - node.Settings.themeColor = req.body.updatedSettings.themeColor; - node.Settings.unannouncedChannels = req.body.updatedSettings.unannouncedChannels; - node.Settings.fiatConversion = req.body.updatedSettings.fiatConversion; - if (req.body.updatedSettings.fiatConversion) { - node.Settings.currencyUnit = req.body.updatedSettings.currencyUnit ? req.body.updatedSettings.currencyUnit : 'USD'; + node.Settings.userPersona = updatedSettings.userPersona; + node.Settings.themeMode = updatedSettings.themeMode; + node.Settings.themeColor = updatedSettings.themeColor; + node.Settings.unannouncedChannels = updatedSettings.unannouncedChannels; + node.Settings.fiatConversion = updatedSettings.fiatConversion; + if (updatedSettings.fiatConversion) { + node.Settings.currencyUnit = updatedSettings.currencyUnit ? updatedSettings.currencyUnit : 'USD'; } else { delete node.Settings.currencyUnit; } const selectedNode = common.findNode(req.session.selectedNode.index); - selectedNode.user_persona = req.body.updatedSettings.userPersona; - selectedNode.theme_mode = req.body.updatedSettings.themeMode; - selectedNode.theme_color = req.body.updatedSettings.themeColor; - selectedNode.unannounced_channels = req.body.updatedSettings.unannouncedChannels; - selectedNode.fiat_conversion = req.body.updatedSettings.fiatConversion; - if (req.body.updatedSettings.fiatConversion) { - selectedNode.currency_unit = req.body.updatedSettings.currencyUnit ? req.body.updatedSettings.currencyUnit : 'USD'; + selectedNode.user_persona = updatedSettings.userPersona; + selectedNode.theme_mode = updatedSettings.themeMode; + selectedNode.theme_color = updatedSettings.themeColor; + selectedNode.unannounced_channels = updatedSettings.unannouncedChannels; + selectedNode.fiat_conversion = updatedSettings.fiatConversion; + if (updatedSettings.fiatConversion) { + selectedNode.currency_unit = updatedSettings.currencyUnit ? updatedSettings.currencyUnit : 'USD'; } else { delete selectedNode.currency_unit; } @@ -174,15 +175,16 @@ export const updateUISettings = (req, res, next) => { }; export const update2FASettings = (req, res, next) => { + const { secret2fa } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating 2FA Settings..' }); const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); - if (req.body.secret2fa && req.body.secret2fa.trim() !== '') { - config.secret2fa = req.body.secret2fa; + if (secret2fa && secret2fa.trim() !== '') { + config.secret2fa = secret2fa; } else { delete config.secret2fa; } - const message = req.body.secret2fa.trim() === '' ? 'Two factor authentication disabled successfully.' : 'Two factor authentication enabled successfully.'; + const message = secret2fa.trim() === '' ? 'Two factor authentication disabled successfully.' : 'Two factor authentication enabled successfully.'; try { fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); common.rtl_secret2fa = config.secret2fa; @@ -196,10 +198,11 @@ export const update2FASettings = (req, res, next) => { }; export const updateDefaultNode = (req, res, next) => { + const { defaultNodeIndex } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Default Node..' }); const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); - config.defaultNodeIndex = req.body.defaultNodeIndex; + config.defaultNodeIndex = defaultNodeIndex; try { fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Default Node Updated', data: maskPasswords(config) }); @@ -293,11 +296,12 @@ export const getCurrencyRates = (req, res, next) => { }; export const updateSSO = (req, res, next) => { + const { SSO } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating SSO Settings..' }); const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); delete config.SSO; - config.SSO = req.body.SSO; + config.SSO = SSO; try { fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'SSO Setting Updated', data: maskPasswords(config) }); @@ -310,19 +314,20 @@ export const updateSSO = (req, res, next) => { }; export const updateServiceSettings = (req, res, next) => { + const { service, settings } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Service Settings..' }); const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const selectedNode = common.findNode(req.session.selectedNode.index); config.nodes.forEach((node) => { if (node.index === req.session.selectedNode.index) { - switch (req.body.service) { + switch (service) { case 'LOOP': - if (req.body.settings.enable) { - node.Settings.swapServerUrl = req.body.settings.serverUrl; - node.Authentication.swapMacaroonPath = req.body.settings.macaroonPath; - selectedNode.swap_server_url = req.body.settings.serverUrl; - selectedNode.swap_macaroon_path = req.body.settings.macaroonPath; + if (settings.enable) { + node.Settings.swapServerUrl = settings.serverUrl; + node.Authentication.swapMacaroonPath = settings.macaroonPath; + selectedNode.swap_server_url = settings.serverUrl; + selectedNode.swap_macaroon_path = settings.macaroonPath; } else { delete node.Settings.swapServerUrl; delete node.Authentication.swapMacaroonPath; @@ -332,11 +337,11 @@ export const updateServiceSettings = (req, res, next) => { break; case 'BOLTZ': - if (req.body.settings.enable) { - node.Settings.boltzServerUrl = req.body.settings.serverUrl; - node.Authentication.boltzMacaroonPath = req.body.settings.macaroonPath; - selectedNode.boltz_server_url = req.body.settings.serverUrl; - selectedNode.boltz_macaroon_path = req.body.settings.macaroonPath; + if (settings.enable) { + node.Settings.boltzServerUrl = settings.serverUrl; + node.Authentication.boltzMacaroonPath = settings.macaroonPath; + selectedNode.boltz_server_url = settings.serverUrl; + selectedNode.boltz_macaroon_path = settings.macaroonPath; } else { delete node.Settings.boltzServerUrl; delete node.Authentication.boltzMacaroonPath; @@ -346,13 +351,13 @@ export const updateServiceSettings = (req, res, next) => { break; case 'OFFERS': - node.Settings.enableOffers = req.body.settings.enableOffers; - selectedNode.enable_offers = req.body.settings.enableOffers; + node.Settings.enableOffers = settings.enableOffers; + selectedNode.enable_offers = settings.enableOffers; break; case 'PEERSWAP': - node.Settings.enablePeerswap = req.body.settings.enablePeerswap; - selectedNode.enable_peerswap = req.body.settings.enablePeerswap; + node.Settings.enablePeerswap = settings.enablePeerswap; + selectedNode.enable_peerswap = settings.enablePeerswap; break; default: diff --git a/server/controllers/shared/authenticate.ts b/server/controllers/shared/authenticate.ts index 1275ae48..2a68acec 100644 --- a/server/controllers/shared/authenticate.ts +++ b/server/controllers/shared/authenticate.ts @@ -50,13 +50,14 @@ const handleMultipleFailedAttemptsError = (failed, currentTime, errMsg) => { export const verifyToken = (twoFAToken) => !!(common.rtl_secret2fa && common.rtl_secret2fa !== '' && otplib.authenticator.check(twoFAToken, common.rtl_secret2fa)); export const authenticateUser = (req, res, next) => { + const { authenticateWith, authenticationValue, twoFAToken } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Authenticating User..' }); if (+common.rtl_sso) { - if (req.body.authenticateWith === 'JWT' && jwt.verify(req.body.authenticationValue, common.secret_key)) { + if (authenticateWith === 'JWT' && jwt.verify(authenticationValue, common.secret_key)) { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'User Authenticated' }); res.status(406).json({ message: 'SSO Authentication Error', error: 'Login with Password is not allowed with SSO.' }); - } else if (req.body.authenticateWith === 'PASSWORD') { - if (common.cookie_value.trim().length >= 32 && crypto.timingSafeEqual(Buffer.from(crypto.createHash('sha256').update(common.cookie_value).digest('hex'), 'utf-8'), Buffer.from(req.body.authenticationValue, 'utf-8'))) { + } else if (authenticateWith === 'PASSWORD') { + if (common.cookie_value.trim().length >= 32 && crypto.timingSafeEqual(Buffer.from(crypto.createHash('sha256').update(common.cookie_value).digest('hex'), 'utf-8'), Buffer.from(authenticationValue, 'utf-8'))) { common.refreshCookie(); if (!req.session.selectedNode) { req.session.selectedNode = common.initSelectedNode; } const token = jwt.sign({ user: 'SSO_USER' }, common.secret_key); @@ -72,10 +73,10 @@ export const authenticateUser = (req, res, next) => { const currentTime = new Date().getTime(); const reqIP = common.getRequestIP(req); const failed = getFailedInfo(reqIP, currentTime); - const password = req.body.authenticationValue; + const password = authenticationValue; if (common.rtl_pass === password && failed.count < ALLOWED_LOGIN_ATTEMPTS) { - if (req.body.twoFAToken && req.body.twoFAToken !== '') { - if (!verifyToken(req.body.twoFAToken)) { + if (twoFAToken && twoFAToken !== '') { + if (!verifyToken(twoFAToken)) { logger.log({ selectedNode: req.session.selectedNode, level: 'ERROR', fileName: 'Authenticate', msg: 'Invalid Token! Failed IP ' + reqIP, error: { error: 'Invalid token.' } }); failed.count = failed.count + 1; failed.lastTried = currentTime; @@ -97,15 +98,15 @@ export const authenticateUser = (req, res, next) => { }; export const resetPassword = (req, res, next) => { + const { currPassword, newPassword } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Resetting Password..' }); if (+common.rtl_sso) { const errMsg = 'Password cannot be reset for SSO authentication'; const err = common.handleError({ statusCode: 401, message: 'Password Reset Error', error: errMsg }, 'Authenticate', errMsg, req.session.selectedNode); return res.status(err.statusCode).json({ message: err.message, error: err.error }); } else { - const currPassword = req.body.currPassword; if (common.rtl_pass === currPassword) { - common.rtl_pass = common.replacePasswordWithHash(req.body.newPassword); + common.rtl_pass = common.replacePasswordWithHash(newPassword); const token = jwt.sign({ user: 'NODE_USER' }, common.secret_key); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Password Reset Successful' }); res.status(200).json({ token: token }); diff --git a/server/controllers/shared/boltz.ts b/server/controllers/shared/boltz.ts index 7a378dff..539b8e81 100644 --- a/server/controllers/shared/boltz.ts +++ b/server/controllers/shared/boltz.ts @@ -80,6 +80,7 @@ export const getSwapInfo = (req, res, next) => { }; export const createSwap = (req, res, next) => { + const { amount, address } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Swap..' }); options = common.getBoltzServerOptions(req); if (options.url === '') { @@ -88,8 +89,8 @@ export const createSwap = (req, res, next) => { return res.status(err.statusCode).json({ message: err.message, error: err.error }); } options.url = options.url + '/v1/createswap'; - options.body = { amount: req.body.amount }; - if (req.body.address !== '') { options.body.address = req.body.address; } + options.body = { amount: amount }; + if (address && address !== '') { options.body.address = address; } logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Swap Options Body', data: options.body }); request.post(options).then((createSwapRes) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Swap Created', data: createSwapRes }); @@ -101,6 +102,7 @@ export const createSwap = (req, res, next) => { }; export const createReverseSwap = (req, res, next) => { + const { amount, acceptZeroConf, address } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Reverse Swap..' }); options = common.getBoltzServerOptions(req); if (options.url === '') { @@ -109,8 +111,8 @@ export const createReverseSwap = (req, res, next) => { return res.status(err.statusCode).json({ message: err.message, error: err.error }); } options.url = options.url + '/v1/createreverseswap'; - options.body = { amount: req.body.amount, accept_zero_conf: req.body.acceptZeroConf || false }; - if (req.body.address !== '') { options.body.address = req.body.address; } + options.body = { amount: amount, accept_zero_conf: acceptZeroConf || false }; + if (address && address !== '') { options.body.address = address; } logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Reverse Swap Body', data: options.body }); request.post(options).then((createReverseSwapRes) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Reverse Swap Created', data: createReverseSwapRes }); @@ -122,6 +124,7 @@ export const createReverseSwap = (req, res, next) => { }; export const createChannel = (req, res, next) => { + const { amount, address } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Boltz Channel..' }); options = common.getBoltzServerOptions(req); if (options.url === '') { @@ -130,8 +133,8 @@ export const createChannel = (req, res, next) => { return res.status(err.statusCode).json({ message: err.message, error: err.error }); } options.url = options.url + '/v1/createchannel'; - options.body = { amount: req.body.amount }; - if (req.body.address !== '') { options.body.address = req.body.address; } + options.body = { amount: amount }; + if (address && address !== '') { options.body.address = address; } logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Channel Options Body', data: options.body }); request.post(options).then((createChannelRes) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Boltz Channel Created', data: createChannelRes }); diff --git a/server/controllers/shared/loop.ts b/server/controllers/shared/loop.ts index 3f8dc76a..b86a81bd 100644 --- a/server/controllers/shared/loop.ts +++ b/server/controllers/shared/loop.ts @@ -6,21 +6,22 @@ const logger: LoggerService = Logger; const common: CommonService = Common; export const loopOut = (req, res, next) => { + const { amount, targetConf, swapRoutingFee, minerFee, prepayRoutingFee, prepayAmt, swapFee, swapPublicationDeadline, chanId, destAddress } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping Out..' }); options.uri = '/v1/loop/out'; options.body = { - amt: req.body.amount, - sweep_conf_target: req.body.targetConf, - max_swap_routing_fee: req.body.swapRoutingFee, - max_miner_fee: req.body.minerFee, - max_prepay_routing_fee: req.body.prepayRoutingFee, - max_prepay_amt: req.body.prepayAmt, - max_swap_fee: req.body.swapFee, - swap_publication_deadline: req.body.swapPublicationDeadline, + amt: amount, + sweep_conf_target: targetConf, + max_swap_routing_fee: swapRoutingFee, + max_miner_fee: minerFee, + max_prepay_routing_fee: prepayRoutingFee, + max_prepay_amt: prepayAmt, + max_swap_fee: swapFee, + swap_publication_deadline: swapPublicationDeadline, initiator: 'RTL' }; - if (req.body.chanId !== '') { options.body['loop_out_channel'] = req.body.chanId; } - if (req.body.destAddress !== '') { options.body['dest'] = req.body.destAddress; } + if (chanId !== '') { options.body['loop_out_channel'] = chanId; } + if (destAddress !== '') { options.body['dest'] = destAddress; } logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Body', data: options.body }); request.post(options).then((loopOutRes) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looped Out', data: loopOutRes }); @@ -87,12 +88,13 @@ export const loopOutTermsAndQuotes = (req, res, next) => { }; export const loopIn = (req, res, next) => { + const { amount, swapFee, minerFee } = req.body; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping In..' }); options.uri = '/v1/loop/in'; options.body = { - amt: req.body.amount, - max_swap_fee: req.body.swapFee, - max_miner_fee: req.body.minerFee, + amt: amount, + max_swap_fee: swapFee, + max_miner_fee: minerFee, initiator: 'RTL' }; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Loop In Body', data: options.body });