Suspicious Peers List

Suspicious Peers List
cln-peer-swap
ShahanaFarooqui 2 years ago
parent 445cc4cd31
commit 781974b8e7

@ -115,7 +115,7 @@ export const addSwapPeer = (req, res, next) => {
if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error });
}
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/addPeer/' + req.params.pubkey;
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/addPeer/' + req.params.list + '/' + req.params.pubkey;
request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Peer Added', data: body });
res.status(200).json(body);
@ -130,7 +130,7 @@ export const removeSwapPeer = (req, res, next) => {
if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error });
}
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/removePeer/' + req.params.pubkey;
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/removePeer/' + req.params.list + '/' + req.params.pubkey;
request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Peer Removed', data: body });
res.status(200).json(body);

@ -10,8 +10,8 @@ router.get('/listActiveSwaps', isAuthenticated, listActiveSwaps);
router.get('/listSwapRequests', isAuthenticated, listSwapRequests);
router.get('/listSwapPeers', isAuthenticated, listSwapPeers);
router.get('/allowSwapRequests/:isAllowed', isAuthenticated, allowSwapRequests);
router.get('/addPeer/:pubkey', isAuthenticated, addSwapPeer);
router.get('/removePeer/:pubkey', isAuthenticated, removeSwapPeer);
router.get('/addPeer/:list/:pubkey', isAuthenticated, addSwapPeer);
router.get('/removePeer/:list/:pubkey', isAuthenticated, removeSwapPeer);
router.get('/resendMessage/:swapId', isAuthenticated, resendMessage);
router.post('/swapOut', isAuthenticated, swapOut);
router.post('/swapIn', isAuthenticated, swapIn);

@ -10,9 +10,9 @@
<link i18n-rel="" rel="mask-icon" href="assets/images/favicon-light/safari-pinned-tab.svg" color="#5bbad5">
<meta i18n-content="" name="msapplication-TileColor" content="#da532c">
<meta i18n-content="" name="theme-color" content="#ffffff">
<style>@font-face{font-family:Roboto;src:url(Roboto-Thin.f7a95c9c5999532c.woff2) format("woff2"),url(Roboto-Thin.c13c157cb81e8ebb.woff) format("woff");font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-ThinItalic.b0e084abf689f393.woff2) format("woff2"),url(Roboto-ThinItalic.1111028df6cea564.woff) format("woff");font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Light.0e01b6cd13b3857f.woff2) format("woff2"),url(Roboto-Light.603ca9a537b88428.woff) format("woff");font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-LightItalic.232ef4b20215f720.woff2) format("woff2"),url(Roboto-LightItalic.1b5e142f787151c8.woff) format("woff");font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Regular.475ba9e4e2d63456.woff2) format("woff2"),url(Roboto-Regular.bcefbfee882bc1cb.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-RegularItalic.e3a9ebdaac06bbc4.woff2) format("woff2"),url(Roboto-RegularItalic.0668fae6af0cf8c2.woff) format("woff");font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Medium.457532032ceb0168.woff2) format("woff2"),url(Roboto-Medium.6e1ae5f0b324a0aa.woff) format("woff");font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-MediumItalic.872f7060602d55d2.woff2) format("woff2"),url(Roboto-MediumItalic.e06fb533801cbb08.woff) format("woff");font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Bold.447291a88c067396.woff2) format("woff2"),url(Roboto-Bold.fc482e6133cf5e26.woff) format("woff");font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-BoldItalic.1b15168ef6fa4e16.woff2) format("woff2"),url(Roboto-BoldItalic.e26ba339b06f09f7.woff) format("woff");font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Black.2eaa390d458c877d.woff2) format("woff2"),url(Roboto-Black.b25f67ad8583da68.woff) format("woff");font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-BlackItalic.7dc03ee444552bc5.woff2) format("woff2"),url(Roboto-BlackItalic.c8dc642467cb3099.woff) format("woff");font-weight:900;font-style:italic}html{width:100%;height:99%;line-height:1.5;overflow-x:hidden;font-family:Roboto,sans-serif!important;font-size:62.5%}body{box-sizing:border-box;height:100%;margin:0;overflow:hidden}*{margin:0;padding:0}</style><link rel="stylesheet" href="styles.b8a4cc0e3dcfa6f3.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.b8a4cc0e3dcfa6f3.css"></noscript></head>
<style>@font-face{font-family:Roboto;src:url(Roboto-Thin.f7a95c9c5999532c.woff2) format("woff2"),url(Roboto-Thin.c13c157cb81e8ebb.woff) format("woff");font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-ThinItalic.b0e084abf689f393.woff2) format("woff2"),url(Roboto-ThinItalic.1111028df6cea564.woff) format("woff");font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Light.0e01b6cd13b3857f.woff2) format("woff2"),url(Roboto-Light.603ca9a537b88428.woff) format("woff");font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-LightItalic.232ef4b20215f720.woff2) format("woff2"),url(Roboto-LightItalic.1b5e142f787151c8.woff) format("woff");font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Regular.475ba9e4e2d63456.woff2) format("woff2"),url(Roboto-Regular.bcefbfee882bc1cb.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-RegularItalic.e3a9ebdaac06bbc4.woff2) format("woff2"),url(Roboto-RegularItalic.0668fae6af0cf8c2.woff) format("woff");font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Medium.457532032ceb0168.woff2) format("woff2"),url(Roboto-Medium.6e1ae5f0b324a0aa.woff) format("woff");font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-MediumItalic.872f7060602d55d2.woff2) format("woff2"),url(Roboto-MediumItalic.e06fb533801cbb08.woff) format("woff");font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Bold.447291a88c067396.woff2) format("woff2"),url(Roboto-Bold.fc482e6133cf5e26.woff) format("woff");font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-BoldItalic.1b15168ef6fa4e16.woff2) format("woff2"),url(Roboto-BoldItalic.e26ba339b06f09f7.woff) format("woff");font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Black.2eaa390d458c877d.woff2) format("woff2"),url(Roboto-Black.b25f67ad8583da68.woff) format("woff");font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-BlackItalic.7dc03ee444552bc5.woff2) format("woff2"),url(Roboto-BlackItalic.c8dc642467cb3099.woff) format("woff");font-weight:900;font-style:italic}html{width:100%;height:99%;line-height:1.5;overflow-x:hidden;font-family:Roboto,sans-serif!important;font-size:62.5%}body{box-sizing:border-box;height:100%;margin:0;overflow:hidden}*{margin:0;padding:0}</style><link rel="stylesheet" href="styles.8b7bf48e29ea0adc.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.8b7bf48e29ea0adc.css"></noscript></head>
<body>
<rtl-app></rtl-app>
<script src="runtime.6242e8cc52d30154.js" type="module"></script><script src="polyfills.eddc63f1737a019a.js" type="module"></script><script src="main.0d408a12943660a3.js" type="module"></script>
<script src="runtime.50cb59e7683fa4a2.js" type="module"></script><script src="polyfills.eddc63f1737a019a.js" type="module"></script><script src="main.5188d0d0f471f1e7.js" type="module"></script>
</body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
(()=>{"use strict";var e,v={},g={};function r(e){var n=g[e];if(void 0!==n)return n.exports;var t=g[e]={id:e,loaded:!1,exports:{}};return v[e].call(t.exports,t,t.exports,r),t.loaded=!0,t.exports}r.m=v,e=[],r.O=(n,t,f,d)=>{if(!t){var a=1/0;for(i=0;i<e.length;i++){for(var[t,f,d]=e[i],c=!0,o=0;o<t.length;o++)(!1&d||a>=d)&&Object.keys(r.O).every(b=>r.O[b](t[o]))?t.splice(o--,1):(c=!1,d<a&&(a=d));if(c){e.splice(i--,1);var l=f();void 0!==l&&(n=l)}}return n}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[t,f,d]},r.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return r.d(n,{a:n}),n},r.d=(e,n)=>{for(var t in n)r.o(n,t)&&!r.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((n,t)=>(r.f[t](e,n),n),[])),r.u=e=>e+"."+{258:"525782ba4bbc257e",508:"06f7dec065381b97",515:"73bff63b24de0558",706:"174f47f29c93805b"}[e]+".js",r.miniCssF=e=>{},r.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e={},n="RTLApp:";r.l=(t,f,d,i)=>{if(e[t])e[t].push(f);else{var a,c;if(void 0!==d)for(var o=document.getElementsByTagName("script"),l=0;l<o.length;l++){var u=o[l];if(u.getAttribute("src")==t||u.getAttribute("data-webpack")==n+d){a=u;break}}a||(c=!0,(a=document.createElement("script")).type="module",a.charset="utf-8",a.timeout=120,r.nc&&a.setAttribute("nonce",r.nc),a.setAttribute("data-webpack",n+d),a.src=r.tu(t)),e[t]=[f];var s=(m,b)=>{a.onerror=a.onload=null,clearTimeout(p);var h=e[t];if(delete e[t],a.parentNode&&a.parentNode.removeChild(a),h&&h.forEach(_=>_(b)),m)return m(b)},p=setTimeout(s.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=s.bind(null,a.onerror),a.onload=s.bind(null,a.onload),c&&document.head.appendChild(a)}}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:n=>n},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="",(()=>{var e={666:0};r.f.j=(f,d)=>{var i=r.o(e,f)?e[f]:void 0;if(0!==i)if(i)d.push(i[2]);else if(666!=f){var a=new Promise((u,s)=>i=e[f]=[u,s]);d.push(i[2]=a);var c=r.p+r.u(f),o=new Error;r.l(c,u=>{if(r.o(e,f)&&(0!==(i=e[f])&&(e[f]=void 0),i)){var s=u&&("load"===u.type?"missing":u.type),p=u&&u.target&&u.target.src;o.message="Loading chunk "+f+" failed.\n("+s+": "+p+")",o.name="ChunkLoadError",o.type=s,o.request=p,i[1](o)}},"chunk-"+f,f)}else e[f]=0},r.O.j=f=>0===e[f];var n=(f,d)=>{var o,l,[i,a,c]=d,u=0;if(i.some(p=>0!==e[p])){for(o in a)r.o(a,o)&&(r.m[o]=a[o]);if(c)var s=c(r)}for(f&&f(d);u<i.length;u++)r.o(e,l=i[u])&&e[l]&&e[l][0](),e[l]=0;return r.O(s)},t=self.webpackChunkRTLApp=self.webpackChunkRTLApp||[];t.forEach(n.bind(null,0)),t.push=n.bind(null,t.push.bind(t))})()})();

@ -1 +0,0 @@
(()=>{"use strict";var e,v={},g={};function r(e){var n=g[e];if(void 0!==n)return n.exports;var t=g[e]={id:e,loaded:!1,exports:{}};return v[e].call(t.exports,t,t.exports,r),t.loaded=!0,t.exports}r.m=v,e=[],r.O=(n,t,f,o)=>{if(!t){var a=1/0;for(i=0;i<e.length;i++){for(var[t,f,o]=e[i],s=!0,u=0;u<t.length;u++)(!1&o||a>=o)&&Object.keys(r.O).every(b=>r.O[b](t[u]))?t.splice(u--,1):(s=!1,o<a&&(a=o));if(s){e.splice(i--,1);var l=f();void 0!==l&&(n=l)}}return n}o=o||0;for(var i=e.length;i>0&&e[i-1][2]>o;i--)e[i]=e[i-1];e[i]=[t,f,o]},r.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return r.d(n,{a:n}),n},r.d=(e,n)=>{for(var t in n)r.o(n,t)&&!r.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((n,t)=>(r.f[t](e,n),n),[])),r.u=e=>e+"."+{258:"525782ba4bbc257e",508:"06f7dec065381b97",515:"73bff63b24de0558",706:"174f47f29c93805b"}[e]+".js",r.miniCssF=e=>{},r.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e={},n="RTLApp:";r.l=(t,f,o,i)=>{if(e[t])e[t].push(f);else{var a,s;if(void 0!==o)for(var u=document.getElementsByTagName("script"),l=0;l<u.length;l++){var d=u[l];if(d.getAttribute("src")==t||d.getAttribute("data-webpack")==n+o){a=d;break}}a||(s=!0,(a=document.createElement("script")).type="module",a.charset="utf-8",a.timeout=120,r.nc&&a.setAttribute("nonce",r.nc),a.setAttribute("data-webpack",n+o),a.src=r.tu(t)),e[t]=[f];var c=(m,b)=>{a.onerror=a.onload=null,clearTimeout(p);var h=e[t];if(delete e[t],a.parentNode&&a.parentNode.removeChild(a),h&&h.forEach(_=>_(b)),m)return m(b)},p=setTimeout(c.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=c.bind(null,a.onerror),a.onload=c.bind(null,a.onload),s&&document.head.appendChild(a)}}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:n=>n},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="",(()=>{var e={666:0};r.f.j=(f,o)=>{var i=r.o(e,f)?e[f]:void 0;if(0!==i)if(i)o.push(i[2]);else if(666!=f){var a=new Promise((d,c)=>i=e[f]=[d,c]);o.push(i[2]=a);var s=r.p+r.u(f),u=new Error;r.l(s,d=>{if(r.o(e,f)&&(0!==(i=e[f])&&(e[f]=void 0),i)){var c=d&&("load"===d.type?"missing":d.type),p=d&&d.target&&d.target.src;u.message="Loading chunk "+f+" failed.\n("+c+": "+p+")",u.name="ChunkLoadError",u.type=c,u.request=p,i[1](u)}},"chunk-"+f,f)}else e[f]=0},r.O.j=f=>0===e[f];var n=(f,o)=>{var u,l,[i,a,s]=o,d=0;if(i.some(p=>0!==e[p])){for(u in a)r.o(a,u)&&(r.m[u]=a[u]);if(s)var c=s(r)}for(f&&f(o);d<i.length;d++)r.o(e,l=i[d])&&e[l]&&e[l][0](),e[l]=0;return r.O(c)},t=self.webpackChunkRTLApp=self.webpackChunkRTLApp||[];t.forEach(n.bind(null,0)),t.push=n.bind(null,t.push.bind(t))})()})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -107,7 +107,7 @@ export const addSwapPeer = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Adding Swap 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/peerswap/addPeer/' + req.params.pubkey;
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/addPeer/' + req.params.list + '/' + req.params.pubkey;
request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Peer Added', data: body });
res.status(200).json(body);
@ -121,7 +121,7 @@ export const removeSwapPeer = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Removing Swap 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/peerswap/removePeer/' + req.params.pubkey;
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/removePeer/' + req.params.list + '/' + req.params.pubkey;
request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Peer Removed', data: body });
res.status(200).json(body);

@ -12,8 +12,8 @@ router.get('/listActiveSwaps', isAuthenticated, listActiveSwaps);
router.get('/listSwapRequests', isAuthenticated, listSwapRequests);
router.get('/listSwapPeers', isAuthenticated, listSwapPeers);
router.get('/allowSwapRequests/:isAllowed', isAuthenticated, allowSwapRequests);
router.get('/addPeer/:pubkey', isAuthenticated, addSwapPeer);
router.get('/removePeer/:pubkey', isAuthenticated, removeSwapPeer);
router.get('/addPeer/:list/:pubkey', isAuthenticated, addSwapPeer);
router.get('/removePeer/:list/:pubkey', isAuthenticated, removeSwapPeer);
router.get('/resendMessage/:swapId', isAuthenticated, resendMessage);
router.post('/swapOut', isAuthenticated, swapOut);
router.post('/swapIn', isAuthenticated, swapIn);

@ -4,7 +4,7 @@
<span>Please ensure that <strong>peerswap plugin</strong> is running and accessible to RTL before enabling this service. Click <strong><a href="https://www.peerswap.dev/" target="_blank">here</a></strong> to learn more about peerswap.</span>
</div>
<div fxLayout="column" fxFlex="100" fxLayoutAlign="start stretch" class="settings-container page-sub-title-container">
<mat-slide-toggle autoFocus class="my-2" tabindex="1" color="primary" [(ngModel)]="enablePeerswap" (change)="onUpdateService()" name="peerswap">Enable Peerswap Service</mat-slide-toggle>
<mat-slide-toggle autoFocus class="my-1" tabindex="1" color="primary" [(ngModel)]="enablePeerswap" (change)="onUpdateService()" name="peerswap">Enable Peerswap Service</mat-slide-toggle>
<div *ngIf="enablePeerswap && reloadPolicyError !== ''" class="padding-gap-large error-border">
<div fxLayout="row">
<div fxFlex="100" class="alert alert-danger mt-1">
@ -30,37 +30,53 @@
<mat-divider [inset]="true" class="my-1"></mat-divider>
<div fxLayout="row">
<div fxFlex="100">
<h4 fxLayoutAlign="start" class="font-bold-500">Update Peerswap Whitelist</h4>
<div *ngIf="addRemoveError !== ''" class="padding-gap error-border">
<div fxLayout="row">
<div fxFlex="100" class="alert alert-danger mt-1">
<fa-icon [icon]="faExclamationTriangle" class="mr-1 alert-icon"></fa-icon>
<span>{{addRemoveError}}</span>
</div>
</div>
</div>
<div>
<mat-card *ngFor="let allowedPeer of reloadPolicy?.PeerAllowlist" fxLayout="row" fxLayoutAlign="start center" class="mb-1 peer-card">
<div fxLayoutAlign="center center">
<button mat-icon-button color="primary" (click)="onRemovePeer(allowedPeer)" class="mr-1" matTooltip="Remove Peer" matTooltipPosition="below">
<mat-icon>remove_circle_outline</mat-icon>
</button>
</div>
<div fxLayoutAlign="start center" class="mt-5px">{{allowedPeer}}</div>
</mat-card>
<mat-card fxLayout="row" fxLayoutAlign="start center" class="mb-1 peer-card" >
<div fxLayoutAlign="center center" matTooltip="Add Peer" matTooltipPosition="below">
<button mat-icon-button color="primary" [disabled]="!addPeerNodeId || addPeerNodeId === '' || addPeerNodeId.length < 50" (click)="onAddPeer()" class="mr-1">
<mat-icon>add_circle_outline</mat-icon>
</button>
</div>
<mat-form-field fxLayoutAlign="start stretch" fxFlex="50" class="mt-5px">
<input matInput placeholder="Node Id" [(ngModel)]="addPeerNodeId" name="nodeId" tabindex="4">
</mat-form-field>
</mat-card>
</div>
<ng-container [ngTemplateOutlet]="listExpansionPanel" [ngTemplateOutletContext]="{$implicit: dataForSuspiciousList}"></ng-container>
</div>
</div>
<mat-divider [inset]="true" class="my-1"></mat-divider>
<div fxLayout="row">
<div fxFlex="100">
<ng-container [ngTemplateOutlet]="listExpansionPanel" [ngTemplateOutletContext]="{$implicit: dataForAllowedList}"></ng-container>
</div>
</div>
</div>
</div>
</div>
<ng-template #listExpansionPanel let-listPeers>
<mat-expansion-panel class="flat-expansion-panel" fxFlex="100" [expanded]="false">
<mat-expansion-panel-header>
<mat-panel-title>
<span fxLayoutAlign="start center" fxFlex="100"><mat-icon class="mr-5px icon-small" [ngClass]="listPeers.class">{{listPeers.icon}}</mat-icon>{{listPeers.title | titlecase}}</span>
</mat-panel-title>
</mat-expansion-panel-header>
<div *ngIf="listPeers.addRemoveError !== ''" class="padding-gap error-border">
<div fxLayout="row">
<div fxFlex="100" class="alert alert-danger mt-1">
<fa-icon [icon]="faExclamationTriangle" class="mr-1 alert-icon"></fa-icon>
<span>{{listPeers.addRemoveError}}</span>
</div>
</div>
</div>
<div>
<mat-card *ngFor="let peer of reloadPolicy?.[listPeers.dataSource]" fxLayout="row" fxLayoutAlign="start center" class="peer-card">
<div fxLayoutAlign="center center">
<button mat-icon-button color="primary" (click)="onRemovePeer(peer, listPeers.list)" class="mr-1" [matTooltip]="'Remove peer from ' + listPeers.title + ' list'" matTooltipPosition="below">
<mat-icon>remove_circle_outline</mat-icon>
</button>
</div>
<div fxLayoutAlign="start center" class="mt-5px">{{peer}}</div>
</mat-card>
<mat-card fxLayout="row" fxLayoutAlign="start center" class="peer-card" >
<div fxLayoutAlign="center center" [matTooltip]="'Add peer to ' + listPeers.title + ' list'" matTooltipPosition="below">
<button mat-icon-button color="primary" [disabled]="!listPeers.ngModelVar || listPeers.ngModelVar === '' || listPeers.ngModelVar?.length < 50" (click)="onAddPeer(listPeers.ngModelVar, listPeers.list)" class="mr-1">
<mat-icon>add_circle_outline</mat-icon>
</button>
</div>
<mat-form-field fxLayoutAlign="start stretch" fxFlex="50" class="mt-5px">
<input matInput placeholder="Node Id" [(ngModel)]="listPeers.ngModelVar" name="nodeId" tabindex="4">
</mat-form-field>
</mat-card>
</div>
</mat-expansion-panel>
</ng-template>

@ -3,7 +3,7 @@ import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { Store } from '@ngrx/store';
import { ServicesEnum, UI_MESSAGES } from '../../../../services/consts-enums-functions';
import { ServicesEnum, UI_MESSAGES, PeerswapPeersLists } from '../../../../services/consts-enums-functions';
import { ConfigSettingsNode } from '../../../../models/RTLconfig';
import { LoggerService } from '../../../../services/logger.service';
import { DataService } from '../../../../services/data.service';
@ -31,8 +31,9 @@ export class PeerswapServiceSettingsComponent implements OnInit, OnDestroy {
public allowSwapRequests = false;
public reloadPolicy: PeerswapReloadPolicy | null = null;
public reloadPolicyError = '';
public addRemoveError = '';
public addPeerNodeId = '';
public peerswapPeersLists = PeerswapPeersLists;
public dataForAllowedList = { icon: 'check', class: 'green', title: 'whitelisted peers', dataSource: 'PeerAllowlist', list: PeerswapPeersLists.ALLOWED, ngModelVar: '', addRemoveError: '' };
public dataForSuspiciousList = { icon: 'close', class: 'red', title: 'suspicious peers', dataSource: 'SuspiciousPeerList', list: PeerswapPeersLists.SUSPICIOUS, ngModelVar: '', addRemoveError: '' };
public unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];
constructor(private logger: LoggerService, private store: Store<RTLState>, private dataService: DataService) { }
@ -78,29 +79,61 @@ export class PeerswapServiceSettingsComponent implements OnInit, OnDestroy {
}));
}
onAddPeer() {
this.addRemoveError = '';
this.dataService.addPeerToPeerswap(this.addPeerNodeId).pipe(takeUntil(this.unSubs[2])).
onAddPeer(ngModelVar: string, list: PeerswapPeersLists) {
if (list !== PeerswapPeersLists.ALLOWED) {
this.dataForSuspiciousList.addRemoveError = '';
} else {
this.dataForAllowedList.addRemoveError = '';
}
this.dataService.addPeerToPeerswap(ngModelVar, list).pipe(takeUntil(this.unSubs[2])).
subscribe({
next: (res) => {
this.reloadPolicy = res;
this.addPeerNodeId = '';
if (list !== PeerswapPeersLists.ALLOWED) {
this.dataForSuspiciousList.ngModelVar = '';
} else {
this.dataForAllowedList.ngModelVar = '';
}
}, error: (err) => {
this.addRemoveError = 'ERROR: ' + err;
setTimeout(() => { this.addRemoveError = ''; }, 3000);
if (list !== PeerswapPeersLists.ALLOWED) {
this.dataForSuspiciousList.addRemoveError = 'ERROR: ' + err;
} else {
this.dataForAllowedList.addRemoveError = 'ERROR: ' + err;
}
setTimeout(() => {
if (list !== PeerswapPeersLists.ALLOWED) {
this.dataForSuspiciousList.addRemoveError = '';
} else {
this.dataForAllowedList.addRemoveError = '';
}
}, 3000);
}
});
}
onRemovePeer(peerNodeId: string) {
this.addRemoveError = '';
this.dataService.removePeerFromPeerswap(peerNodeId).pipe(takeUntil(this.unSubs[3])).
onRemovePeer(peerNodeId: string, list: PeerswapPeersLists) {
if (list !== PeerswapPeersLists.ALLOWED) {
this.dataForSuspiciousList.addRemoveError = '';
} else {
this.dataForAllowedList.addRemoveError = '';
}
this.dataService.removePeerFromPeerswap(peerNodeId, list).pipe(takeUntil(this.unSubs[3])).
subscribe({
next: (res) => {
this.reloadPolicy = res;
}, error: (err) => {
this.addRemoveError = 'ERROR: ' + err;
setTimeout(() => { this.addRemoveError = ''; }, 3000);
if (list !== PeerswapPeersLists.ALLOWED) {
this.dataForSuspiciousList.addRemoveError = 'ERROR: ' + err;
} else {
this.dataForAllowedList.addRemoveError = 'ERROR: ' + err;
}
setTimeout(() => {
if (list !== PeerswapPeersLists.ALLOWED) {
this.dataForSuspiciousList.addRemoveError = '';
} else {
this.dataForAllowedList.addRemoveError = '';
}
}, 3000);
}
});
}

@ -501,12 +501,7 @@ export interface FetchListForwards {
export interface PeerswapReloadPolicy {
ReserveOnchainMsat?: number;
PeerAllowlist?: string[];
AcceptAllPeers?: boolean;
}
export interface PeerswapReloadPolicy {
ReserveOnchainMsat?: number;
PeerAllowlist?: string[];
SuspiciousPeerList?: string[];
AcceptAllPeers?: boolean;
}

@ -665,3 +665,8 @@ export enum PeerswapRoles {
export enum PeerswapStates {
SWAP_CANCELED = 'State_SwapCanceled'
}
export enum PeerswapPeersLists {
ALLOWED = 'allowed',
SUSPICIOUS = 'suspicious'
}

@ -8,7 +8,7 @@ import { MatSnackBar } from '@angular/material/snack-bar';
import { LoggerService } from '../../shared/services/logger.service';
import { environment, API_URL } from '../../../environments/environment';
import { APICallStatusEnum, UI_MESSAGES } from './consts-enums-functions';
import { APICallStatusEnum, PeerswapPeersLists, UI_MESSAGES } from './consts-enums-functions';
import { Channel, ClosedChannel, PendingChannels, SwitchReq } from '../models/lndModels';
import { ErrorMessageComponent } from '../components/data-modal/error-message/error-message.component';
import { closeAllDialogs, closeSpinner, logout, openAlert, openSnackBar, openSpinner, updateRootAPICallStatus } from '../../store/rtl.actions';
@ -350,10 +350,10 @@ export class DataService implements OnDestroy {
}));
}
addPeerToPeerswap(peerNodeId: string) {
addPeerToPeerswap(peerNodeId: string, list: PeerswapPeersLists) {
return this.lnImplementationUpdated.pipe(first((val) => val !== null), mergeMap((updatedLnImplementation) => {
this.store.dispatch(openSpinner({ payload: UI_MESSAGES.ADD_PEER_PEERSWAP }));
return this.httpClient.get(this.APIUrl + '/' + updatedLnImplementation + environment.PEERSWAP_API + '/addPeer/' + peerNodeId).pipe(
return this.httpClient.get(this.APIUrl + '/' + updatedLnImplementation + environment.PEERSWAP_API + '/addPeer/' + list + '/' + peerNodeId).pipe(
takeUntil(this.unSubs[13]),
mergeMap((res) => {
this.store.dispatch(closeSpinner({ payload: UI_MESSAGES.ADD_PEER_PEERSWAP }));
@ -366,10 +366,10 @@ export class DataService implements OnDestroy {
}));
}
removePeerFromPeerswap(peerNodeId: string) {
removePeerFromPeerswap(peerNodeId: string, list: PeerswapPeersLists) {
return this.lnImplementationUpdated.pipe(first((val) => val !== null), mergeMap((updatedLnImplementation) => {
this.store.dispatch(openSpinner({ payload: UI_MESSAGES.REMOVE_PEER_PEERSWAP }));
return this.httpClient.get(this.APIUrl + '/' + updatedLnImplementation + environment.PEERSWAP_API + '/removePeer/' + peerNodeId).pipe(
return this.httpClient.get(this.APIUrl + '/' + updatedLnImplementation + environment.PEERSWAP_API + '/removePeer/' + list + '/' + peerNodeId).pipe(
takeUntil(this.unSubs[14]),
mergeMap((res) => {
this.store.dispatch(closeSpinner({ payload: UI_MESSAGES.REMOVE_PEER_PEERSWAP }));

@ -8,9 +8,6 @@
.mat-header-cell {
font-weight: 700;
}
.mr-4 {
margin-right: 1rem !important;
}
.mat-menu-item, .mat-tree .mat-tree-node, .mat-tree .mat-nested-tree-node-parent {
min-height: $tree-node-height * 0.7;
height: $tree-node-height * 0.7;

Loading…
Cancel
Save