Issue #125 password hash

Issue #125 password hash
pull/145/head
ShahanaFarooqui 5 years ago
parent 5f9066b867
commit 2774185532

@ -195,6 +195,10 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
convert-hex
convert-string
core-js
MIT
Copyright (c) 2014-2018 Denis Pushkarev
@ -1396,6 +1400,8 @@ Apache-2.0
sha256
tslib
Apache-2.0
Apache License

@ -8,5 +8,5 @@
<link rel="stylesheet" href="styles.c7b8be38c41a5a330ca0.css"></head>
<body>
<rtl-app></rtl-app>
<script type="text/javascript" src="runtime.26209474bfa8dc87a77c.js"></script><script type="text/javascript" src="polyfills.181b5a67c421a167a96a.js"></script><script type="text/javascript" src="main.ad42e6127177779617fb.js"></script></body>
<script type="text/javascript" src="runtime.26209474bfa8dc87a77c.js"></script><script type="text/javascript" src="polyfills.181b5a67c421a167a96a.js"></script><script type="text/javascript" src="main.11e4e75d1dc9ee4c1cca.js"></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

@ -2,6 +2,7 @@ var os = require('os');
var fs = require('fs');
var platform = require('os').platform();
var crypto = require('crypto');
var hash = crypto.createHash('sha256');
var clArgs = require('optimist').argv;
var ini = require('ini');
var common = require('./common');
@ -86,6 +87,39 @@ connect.setMacaroonPath = (clArgs, config) => {
}
}
connect.convertCustomToHash = (nodeSetupType) => {
common.rtl_conf_file_path = (undefined !== process.env.RTL_CONFIG_PATH) ? process.env.RTL_CONFIG_PATH.substring(0, process.env.RTL_CONFIG_PATH.length - 9) : path.normalize(__dirname);
if(nodeSetupType === 'SINGLE') {
try {
RTLConfFile = common.rtl_conf_file_path + '/RTL.conf';
var config = ini.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
const authTemp = config.Authentication;
authTemp.rtlPassHashed = hash.update(authTemp.rtlPass).digest('hex');
delete authTemp.rtlPass;
delete config.Authentication;
fs.writeFileSync(RTLConfFile, ini.stringify(config));
fs.appendFileSync(RTLConfFile, ini.stringify(authTemp, { section: 'Authentication' }));
console.log('Please note that RTL has encrypted the plaintext password into its corresponding hash.');
return authTemp.rtlPassHashed;
} catch (err) {
errMsg = errMsg + '\nrtlPass hash conversion failed!';
}
}
if(nodeSetupType === 'MULTI') {
try {
RTLConfFile = common.rtl_conf_file_path + '/RTL-Multi-Node-Conf.json';
var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
config.multiPassHashed = hash.update(config.multiPass).digest('hex');
delete config.multiPass;
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
console.log('Please note that RTL has encrypted the plaintext password into its corresponding hash.');
return config.multiPassHashed;
} catch (err) {
errMsg = errMsg + '\nmultiPass hash conversion failed!';
}
}
}
connect.validateSingleNodeConfig = (config) => {
if(common.nodes[0].macaroon_path === '' || undefined === common.nodes[0].macaroon_path) {
errMsg = 'Please set macaroon path through environment or RTL.conf!';
@ -139,8 +173,10 @@ connect.validateSingleNodeConfig = (config) => {
if (undefined !== process.env.RTL_PASS) {
common.rtl_pass = process.env.RTL_PASS;
} else if (config.Authentication.rtlPassHashed !== '' && undefined !== config.Authentication.rtlPassHashed) {
common.rtl_pass = config.Authentication.rtlPassHashed;
} else if (config.Authentication.rtlPass !== '' && undefined !== config.Authentication.rtlPass) {
common.rtl_pass = config.Authentication.rtlPass;
common.rtl_pass = connect.convertCustomToHash('SINGLE');
}
if (upperCase(common.node_auth_type) === 'CUSTOM' && (common.rtl_pass === '' || undefined === common.rtl_pass)) {
@ -187,7 +223,14 @@ connect.validateSingleNodeConfig = (config) => {
connect.validateMultiNodeConfig = (config) => {
common.node_auth_type = 'CUSTOM';
common.rtl_pass = config.multiPass;
if (config.multiPassHashed !== '' && undefined !== config.multiPassHashed) {
common.rtl_pass = config.multiPassHashed;
} else if (config.multiPass !== '' && undefined !== config.multiPass) {
common.rtl_pass = connect.convertCustomToHash('MULTI');
} else {
errMsg = errMsg + '\nMulti Node Authentication can be set with multiPass only. Please set MultiPass in RTL-Multi-Node-Conf.json';
}
common.port = (undefined !== config.port) ? connect.normalizePort(config.port) : 3000;
config.nodes.forEach((node, idx) => {
@ -247,8 +290,7 @@ connect.setSSOParams = (config) => {
} else if (undefined !== config.SSO && undefined !== config.SSO.logoutRedirectLink) {
common.logout_redirect_link = config.SSO.logoutRedirectLink;
}
if (undefined !== process.env.RTL_COOKIE_PATH) {
common.rtl_cookie_path = process.env.RTL_COOKIE_PATH;
} else if (undefined !== config.SSO && undefined !== config.SSO.rtlCookiePath) {

@ -46,7 +46,7 @@ exports.authenticateUser = (req, res, next) => {
});
}
} else {
const password = atob(req.body.password);
const password = req.body.password;
if (common.multi_node_setup) {
if (common.rtl_pass === password) {
var rpcUser = 'Multi_Node_User';

@ -7,7 +7,11 @@ exports.getInfo = (req, res, next) => {
common.setOptions();
options = common.getOptions();
options.url = common.getSelLNDServerUrl() + '/getinfo';
logger.info('\r\nSelected Node: ' + JSON.stringify(common.selectedNode.ln_node));
if(common.multi_node_setup) {
logger.info('\r\nSelected Node: ' + JSON.stringify(common.selectedNode.ln_node));
} else {
logger.info('\r\nSingle Node Setup!');
}
logger.info('\r\nCalling getinfo from lnd server url: INFO: ' + options.url);
request(options).then((body) => {
logger.info('\r\nGetInfo: 9: ' + JSON.stringify(Date.now()) + ': INFO: ' + JSON.stringify(body));

158
package-lock.json generated

@ -1,6 +1,6 @@
{
"name": "rtl",
"version": "0.3.0-beta",
"version": "0.3.1-beta",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -102,6 +102,34 @@
"uri-js": "^4.2.2"
}
},
"node-sass": {
"version": "4.11.0",
"resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz",
"integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==",
"dev": true,
"optional": true,
"requires": {
"async-foreach": "^0.1.3",
"chalk": "^1.1.1",
"cross-spawn": "^3.0.0",
"gaze": "^1.0.0",
"get-stdin": "^4.0.1",
"glob": "^7.0.3",
"in-publish": "^2.0.0",
"lodash.assign": "^4.2.0",
"lodash.clonedeep": "^4.3.2",
"lodash.mergewith": "^4.6.0",
"meow": "^3.7.0",
"mkdirp": "^0.5.1",
"nan": "^2.10.0",
"node-gyp": "^3.8.0",
"npmlog": "^4.0.0",
"request": "^2.88.0",
"sass-graph": "^2.2.4",
"stdout-stream": "^1.4.0",
"true-case-path": "^1.0.2"
}
},
"parse5": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
@ -417,7 +445,8 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
@ -438,12 +467,14 @@
"balanced-match": {
"version": "1.0.0",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -458,17 +489,20 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
@ -585,7 +619,8 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"ini": {
"version": "1.3.5",
@ -597,6 +632,7 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@ -611,6 +647,7 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@ -618,12 +655,14 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"minipass": {
"version": "2.3.5",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@ -642,6 +681,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@ -722,7 +762,8 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
@ -734,6 +775,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"wrappy": "1"
}
@ -819,7 +861,8 @@
"safe-buffer": {
"version": "5.1.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
@ -855,6 +898,7 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@ -874,6 +918,7 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@ -917,12 +962,14 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"yallist": {
"version": "3.0.3",
"bundled": true,
"dev": true
"dev": true,
"optional": true
}
}
},
@ -3046,6 +3093,11 @@
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
"convert-hex": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/convert-hex/-/convert-hex-0.1.0.tgz",
"integrity": "sha1-CMBFaJIsJ3drii6BqV05M2LqC2U="
},
"convert-source-map": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
@ -3055,6 +3107,11 @@
"safe-buffer": "~5.1.1"
}
},
"convert-string": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/convert-string/-/convert-string-0.1.0.tgz",
"integrity": "sha1-ec5BqbsNA7z3LNxqjzxW+7xkQQo="
},
"cookie": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
@ -4700,7 +4757,6 @@
"version": "1.1.11",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -4869,7 +4925,6 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@ -4877,8 +4932,7 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"minipass": {
"version": "2.3.5",
@ -4982,8 +5036,7 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"object-assign": {
"version": "4.1.1",
@ -6511,9 +6564,9 @@
"dev": true
},
"js-base64": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.0.tgz",
"integrity": "sha512-wlEBIZ5LP8usDylWbDNhKPEFVFdI5hCHpnVoT/Ysvoi/PRhJENm/Rlh9TvjYB38HFfKZN7OzEbRjmjvLkFw11g=="
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
"integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw=="
},
"js-tokens": {
"version": "3.0.2",
@ -6931,12 +6984,15 @@
"lodash.assign": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
"dev": true,
"optional": true
},
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
},
"lodash.debounce": {
"version": "4.0.8",
@ -6977,7 +7033,9 @@
"lodash.mergewith": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ=="
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
"dev": true,
"optional": true
},
"lodash.once": {
"version": "4.1.1",
@ -7523,7 +7581,9 @@
"nan": {
"version": "2.12.1",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
"integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw=="
"integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==",
"dev": true,
"optional": true
},
"nanomatch": {
"version": "1.2.13",
@ -7610,16 +7670,6 @@
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
"integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
},
"tar": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
"integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
"requires": {
"block-stream": "*",
"fstream": "^1.0.2",
"inherits": "2"
}
}
}
},
@ -7672,9 +7722,9 @@
}
},
"node-sass": {
"version": "4.11.0",
"resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz",
"integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==",
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz",
"integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==",
"requires": {
"async-foreach": "^0.1.3",
"chalk": "^1.1.1",
@ -7683,18 +7733,23 @@
"get-stdin": "^4.0.1",
"glob": "^7.0.3",
"in-publish": "^2.0.0",
"lodash.assign": "^4.2.0",
"lodash.clonedeep": "^4.3.2",
"lodash.mergewith": "^4.6.0",
"lodash": "^4.17.11",
"meow": "^3.7.0",
"mkdirp": "^0.5.1",
"nan": "^2.10.0",
"nan": "^2.13.2",
"node-gyp": "^3.8.0",
"npmlog": "^4.0.0",
"request": "^2.88.0",
"sass-graph": "^2.2.4",
"stdout-stream": "^1.4.0",
"true-case-path": "^1.0.2"
},
"dependencies": {
"nan": {
"version": "2.13.2",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz",
"integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw=="
}
}
},
"nopt": {
@ -9389,6 +9444,15 @@
"safe-buffer": "^5.0.1"
}
},
"sha256": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/sha256/-/sha256-0.2.0.tgz",
"integrity": "sha1-c6C0GNqrcDW/+G6EkeNjQS/CqwU=",
"requires": {
"convert-hex": "~0.1.0",
"convert-string": "~0.1.0"
}
},
"shallow-clone": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
@ -10224,6 +10288,16 @@
"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
"dev": true
},
"tar": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
"integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
"requires": {
"block-stream": "*",
"fstream": "^1.0.2",
"inherits": "2"
}
},
"terser": {
"version": "3.17.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz",

@ -1,6 +1,6 @@
{
"name": "rtl",
"version": "0.3.0-beta",
"version": "0.3.1-beta",
"license": "MIT",
"scripts": {
"ng": "ng",
@ -33,19 +33,20 @@
"@swimlane/ngx-charts": "^10.0.0",
"angular-user-idle": "^2.0.0",
"angularx-qrcode": "^1.5.3",
"cookie-parser": "^1.4.4",
"atob": "^2.1.2",
"cookie-parser": "^1.4.4",
"core-js": "^2.5.4",
"express": "^4.16.4",
"hammerjs": "^2.0.8",
"ini": "^1.3.5",
"jsonwebtoken": "^8.4.0",
"ngx-perfect-scrollbar": "^6.3.1",
"node-sass": "^4.9.4",
"node-sass": "^4.12.0",
"optimist": "^0.6.1",
"request-promise": "^4.2.2",
"rxjs": "^6.3.3",
"rxjs-compat": "^6.3.3",
"sha256": "^0.2.0",
"tslib": "^1.9.0",
"upper-case": "^1.1.3",
"zone.js": "~0.8.26"

@ -53,6 +53,7 @@ import { ForwardingHistoryComponent } from './pages/switch/forwarding-history.co
import { RoutingPeersComponent } from './pages/routing-peers/routing-peers.component';
import { ChannelLookupComponent } from './pages/lookups/channel-lookup/channel-lookup.component';
import { NodeLookupComponent } from './pages/lookups/node-lookup/node-lookup.component';
// import { ChannelBackupComponent } from './pages/channels/channel-backup/channel-backup.component';
@NgModule({
imports: [
@ -92,7 +93,8 @@ import { NodeLookupComponent } from './pages/lookups/node-lookup/node-lookup.com
ForwardingHistoryComponent,
RoutingPeersComponent,
ChannelLookupComponent,
NodeLookupComponent
NodeLookupComponent,
// ChannelBackupComponent
],
providers: [
{ provide: LoggerService, useClass: ConsoleLoggerService },

@ -20,6 +20,7 @@ import { SigninComponent } from './pages/signin/signin.component';
import { ForwardingHistoryComponent } from './pages/switch/forwarding-history.component';
import { RoutingPeersComponent } from './pages/routing-peers/routing-peers.component';
import { SsoFailedComponent } from './shared/components/sso-failed/sso-failed.component';
// import { ChannelBackupComponent } from './pages/channels/channel-backup/channel-backup.component';
import { AuthGuard, LNDUnlockedGuard } from './shared/services/auth.guard';
@ -31,6 +32,7 @@ export const routes: Routes = [
{ path: 'chnlclosed', component: ChannelClosedComponent, canActivate: [AuthGuard, LNDUnlockedGuard] },
{ path: 'chnlmanage', component: ChannelManageComponent, canActivate: [AuthGuard, LNDUnlockedGuard] },
{ path: 'chnlpending', component: ChannelPendingComponent, canActivate: [AuthGuard, LNDUnlockedGuard] },
// { path: 'chnlbackup', component: ChannelBackupComponent, canActivate: [AuthGuard, LNDUnlockedGuard] },
{ path: 'transsendreceive', component: SendReceiveTransComponent, canActivate: [AuthGuard, LNDUnlockedGuard] },
{ path: 'translist', component: ListTransactionsComponent, canActivate: [AuthGuard, LNDUnlockedGuard] },
{ path: 'payments', component: PaymentsComponent, canActivate: [AuthGuard, LNDUnlockedGuard] },

@ -1,6 +1,7 @@
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import * as sha256 from 'sha256';
import { Store } from '@ngrx/store';
import { Node } from '../../shared/models/RTLconfig';
@ -45,7 +46,7 @@ export class SigninComponent implements OnInit, OnDestroy {
}
onSignin() {
this.store.dispatch(new RTLActions.Signin(window.btoa(this.password)));
this.store.dispatch(new RTLActions.Signin(sha256(this.password)));
}
resetData() {

@ -14,7 +14,8 @@ export const MENU_DATA: MenuNode = {
{id: 4, parentId: 0, name: 'Channels', icon: 'settings_ethernet', link: '/chnlmanage', children: [
{id: 41, parentId: 4, name: 'Management', icon: 'subtitles', link: '/chnlmanage'},
{id: 42, parentId: 4, name: 'Pending', icon: 'watch', link: '/chnlpending'},
{id: 43, parentId: 4, name: 'Closed', icon: 'watch_later', link: '/chnlclosed'}
{id: 43, parentId: 4, name: 'Closed', icon: 'watch_later', link: '/chnlclosed'},
// {id: 44, parentId: 4, name: 'Backup', icon: 'backup', link: '/chnlbackup'}
]},
{id: 5, parentId: 0, name: 'Payments', icon: 'payment', link: '/payments'},
{id: 6, parentId: 0, name: 'Invoices', icon: 'receipt', link: '/invoices'},

@ -1 +1 @@
export const VERSION = '0.3.0-beta';
export const VERSION = '0.3.1-beta';
Loading…
Cancel
Save