Files
purple-explorer/lib/nodeapi.js
T

356 lines
11 KiB
JavaScript
Raw Normal View History

2021-03-17 17:54:09 -06:00
var onode = require('./node'),
express = require('express'),
settings = require('./settings');
2019-05-27 10:33:22 -07:00
module.exports = function() {
function express_app() {
2019-05-27 10:33:22 -07:00
var app = express();
app.get('*', hasAccess, function(req, res) {
var method = req.path.substring(1, req.path.length);
if ('undefined' != typeof requires_passphrase[method]) {
if (wallet_passphrase)
client.walletPassphrase(wallet_passphrase, 10);
else
res.send('A wallet passphrase is needed and has not been set.');
2019-05-27 10:33:22 -07:00
}
var query_parameters = req.query;
var params = [];
for (var parameter in query_parameters) {
if (query_parameters.hasOwnProperty(parameter)) {
2019-05-27 10:33:22 -07:00
var param = query_parameters[parameter];
2021-03-17 17:54:09 -06:00
if (!isNaN(param))
2019-05-27 10:33:22 -07:00
param = parseFloat(param);
2021-03-17 17:54:09 -06:00
2019-05-27 10:33:22 -07:00
params.push(param);
}
}
var command = [];
switch (method) {
case 'getnetworkhashps':
case 'getmininginfo':
case 'getdifficulty':
case 'getconnectioncount':
case 'getblockcount':
case 'getblockhash':
case 'getblock':
case 'getrawtransaction':
case 'getsupply':
case 'getinfo':
2022-06-24 21:12:35 -06:00
case 'getblockchaininfo':
2020-12-21 16:19:14 -07:00
case 'getpeerinfo':
case 'gettxoutsetinfo':
case 'getmaxmoney':
case 'getmaxvote':
case 'getvote':
case 'getphase':
case 'getreward':
case 'getnextrewardestimate':
case 'getnextrewardwhenstr':
case 'getvotelist':
case 'getmasternodecount':
case 'getmasternodelist':
case 'verifymessage':
2021-03-17 17:54:09 -06:00
case 'sendmany':
command = specialApiCase(method, query_parameters);
break;
default:
command = [{
method: method,
params: params
}];
2021-03-17 17:54:09 -06:00
break;
2019-05-27 10:33:22 -07:00
}
client.cmd(command, function(err, response) {
if (err) {
console.log(err);
res.send("There was an error. Check your console.");
} else {
if (typeof response === 'object')
2019-05-27 10:33:22 -07:00
res.json(response);
else {
res.setHeader('content-type', 'text/plain');
res.end(response.toString());
2019-05-27 10:33:22 -07:00
}
}
});
});
function hasAccess(req, res, next) {
var method = req.path.substring(1, req.path.length);
2021-01-22 15:04:32 -07:00
var method_enabled = false;
// check if this is a "normal" api method
if (settings.api_page.public_apis.rpc[method] != null) {
// check the enabled property of this normal method
method_enabled = settings.api_page.public_apis.rpc[method].enabled;
} else {
// look for this method in the list of blockchain specific features
Object.keys(settings.blockchain_specific).forEach(function(key, index, map) {
// check if this feature is enabled and has a definition for this api cmd
if (settings.blockchain_specific[key].enabled == true && settings.blockchain_specific[key]['public_apis'] != null && settings.blockchain_specific[key]['public_apis'][method] != null) {
// check the enabled properly of this blockchain specific method
method_enabled = settings.blockchain_specific[key]['public_apis'][method].enabled;
}
});
}
// only show disabled msg for outside calls. internal calls should always go through
2021-01-22 15:04:32 -07:00
if ((!settings.api_page.enabled || method_enabled == null || !method_enabled) && req.headers.host.indexOf('127.0.0.1') == -1)
res.end('This method is disabled');
2021-01-22 15:04:32 -07:00
else if (method == 'getnetworkhashps' && !settings.shared_pages.show_hashrate) {
// getnetworkhashps requires show_hashrate to be enabled or else hashrate cannot be returned
res.end('-');
} else {
if (accesslist.type == 'all')
2019-05-27 10:33:22 -07:00
return next();
if ('undefined' == typeof accesslist[method]) {
if (accesslist.type == 'only')
res.end('This method is restricted');
else
return next();
} else {
if (accesslist[method] == true)
return next();
else
res.end('This method is restricted');
2019-05-27 10:33:22 -07:00
}
}
2019-05-27 10:33:22 -07:00
}
function prepareRpcCommand(cmd, addParams) {
var method_name = '';
var params = addParams || [];
// Check for null/blank string
if (cmd != null && cmd.trim() != '') {
// Split cmd by spaces
var split = cmd.split(' ');
for (i=0; i<split.length; i++) {
if (i==0)
method_name = split[i];
else
params.push(split[i]);
}
}
return { method: method_name, parameters: params };
}
2019-05-27 10:33:22 -07:00
function specialApiCase(method_name, query_parameters) {
2019-05-27 10:33:22 -07:00
var params = [];
switch (method_name) {
case 'getnetworkhashps':
case 'getmininginfo':
case 'getdifficulty':
case 'getconnectioncount':
case 'getblockcount':
case 'getinfo':
2022-06-24 21:12:35 -06:00
case 'getblockchaininfo':
2020-12-21 16:19:14 -07:00
case 'getpeerinfo':
case 'gettxoutsetinfo':
case 'getvotelist':
case 'getmasternodecount':
case 'getmasternodelist':
var cmd = prepareRpcCommand(settings.api_cmds[method_name]);
2021-03-17 17:54:09 -06:00
method_name = cmd.method;
params = cmd.parameters;
2021-03-17 17:54:09 -06:00
break;
case 'getmaxmoney':
case 'getmaxvote':
case 'getvote':
case 'getphase':
case 'getreward':
case 'getnextrewardestimate':
case 'getnextrewardwhenstr':
case 'getsupply':
2021-01-22 15:04:32 -07:00
var cmd = prepareRpcCommand(settings.blockchain_specific.heavycoin.api_cmds[method_name]);
2021-03-17 17:54:09 -06:00
method_name = cmd.method;
params = cmd.parameters;
2021-03-17 17:54:09 -06:00
break;
case 'getblockhash':
for (var parameter in query_parameters) {
if (query_parameters.hasOwnProperty(parameter) && (parameter == 'height' || parameter == 'index'))
params.push(parseInt(query_parameters[parameter]));
}
2021-03-17 17:54:09 -06:00
var cmd = prepareRpcCommand(settings.api_cmds.getblockhash, params);
2021-03-17 17:54:09 -06:00
method_name = cmd.method;
params = cmd.parameters;
2021-03-17 17:54:09 -06:00
break;
case 'getblock':
for (var parameter in query_parameters) {
if (query_parameters.hasOwnProperty(parameter) && parameter == 'hash')
params.push(query_parameters[parameter]);
}
2021-03-17 17:54:09 -06:00
var cmd = prepareRpcCommand(settings.api_cmds.getblock, params);
2021-03-17 17:54:09 -06:00
method_name = cmd.method;
params = cmd.parameters;
2021-03-17 17:54:09 -06:00
break;
case 'getrawtransaction':
for (var parameter in query_parameters) {
if (query_parameters.hasOwnProperty(parameter)) {
if (parameter == 'txid')
params.push(query_parameters[parameter]);
else if (parameter == 'decrypt')
params.push(parseInt(query_parameters[parameter]));
}
}
2021-03-17 17:54:09 -06:00
var cmd = prepareRpcCommand(settings.api_cmds.getrawtransaction, params);
2021-03-17 17:54:09 -06:00
method_name = cmd.method;
params = cmd.parameters;
2021-03-17 17:54:09 -06:00
break;
case 'verifymessage':
for (var parameter in query_parameters) {
if (query_parameters.hasOwnProperty(parameter)) {
if (parameter == 'address' || parameter == 'message')
params.push(query_parameters[parameter]);
if (parameter == 'signature') {
var param = decodeURIComponent(query_parameters[parameter]);
while (param.indexOf(" ") > -1)
param = param.replace(" ", "+");
params.push(param);
}
}
}
2021-03-17 17:54:09 -06:00
2020-12-21 18:12:40 -07:00
var cmd = prepareRpcCommand(settings.api_cmds.verifymessage, params);
2021-03-17 17:54:09 -06:00
2020-12-21 18:12:40 -07:00
method_name = cmd.method;
params = cmd.parameters;
2021-03-17 17:54:09 -06:00
break;
case 'sendmany':
var after_account = false;
var before_min_conf = true;
var address_info = {};
2021-03-17 17:54:09 -06:00
for (var parameter in query_parameters) {
if (query_parameters.hasOwnProperty(parameter)) {
if (parameter == 'minconf') {
before_min_conf = false;
params.push(address_info);
}
2021-03-17 17:54:09 -06:00
var param = query_parameters[parameter];
2021-03-17 17:54:09 -06:00
if (!isNaN(param))
param = parseFloat(param);
2021-03-17 17:54:09 -06:00
if (after_account && before_min_conf)
address_info[parameter] = param;
else
params.push(param);
2021-03-17 17:54:09 -06:00
if (parameter == 'account')
after_account = true;
2019-05-27 10:33:22 -07:00
}
}
2021-03-17 17:54:09 -06:00
if (before_min_conf)
params.push(address_info);
2021-03-17 17:54:09 -06:00
break;
2019-05-27 10:33:22 -07:00
}
return [{
method: method_name,
params: params
}];
}
return app;
};
var accesslist = {};
var client = {};
var wallet_passphrase = null;
var requires_passphrase = {
'dumpprivkey': true,
'importprivkey': true,
'keypoolrefill': true,
'sendfrom': true,
'sendmany': true,
'sendtoaddress': true,
'signmessage': true,
'signrawtransaction': true
};
2021-03-17 17:54:09 -06:00
accesslist.type = 'all';
function setAccess(type, access_list) {
2021-03-17 17:54:09 -06:00
// reset
2019-05-27 10:33:22 -07:00
accesslist = {};
accesslist.type = type;
if (type == "only") {
for (i = 0; i < access_list.length; i++)
2019-05-27 10:33:22 -07:00
accesslist[access_list[i]] = true;
}
if (type == "restrict") {
for (i = 0; i < access_list.length; i++)
2019-05-27 10:33:22 -07:00
accesslist[access_list[i]] = false;
}
2021-03-17 17:54:09 -06:00
// default is for security reasons. Prevents accidental theft of coins/attack
if (type == 'default-safe') {
var restrict_list = ['dumpprivkey', 'walletpassphrasechange', 'stop'];
2019-05-27 10:33:22 -07:00
accesslist.type = 'restrict';
for (i = 0; i < restrict_list.length; i++)
2019-05-27 10:33:22 -07:00
accesslist[restrict_list[i]] = false;
}
if (type == 'read-only') {
2019-05-27 10:33:22 -07:00
var restrict_list = ['addmultisigaddress', 'addnode', 'backupwallet', 'createmultisig', 'createrawtransaction', 'encryptwallet', 'importprivkey', 'keypoolrefill', 'lockunspent', 'move', 'sendfrom', 'sendmany', 'sendrawtransaction', 'sendtoaddress', 'setaccount', 'setgenerate', 'settxfee', 'signmessage', 'signrawtransaction', 'stop', 'submitblock', 'walletlock', 'walletpassphrasechange'];
accesslist.type = 'restrict';
2021-03-17 17:54:09 -06:00
for (i = 0; i < restrict_list.length; i++)
2019-05-27 10:33:22 -07:00
accesslist[restrict_list[i]] = false;
}
};
function setWalletDetails(details) {
if ('undefined' == typeof details.rpc)
2019-05-27 10:33:22 -07:00
client = new onode.Client(details);
else
2019-05-27 10:33:22 -07:00
client = details;
};
function setWalletPassphrase(passphrase) {
2019-05-27 10:33:22 -07:00
wallet_passphrase = passphrase;
};
return {
app: express_app(),
setAccess: setAccess,
setWalletDetails: setWalletDetails,
setWalletPassphrase: setWalletPassphrase
}
}();