diff --git a/app.js b/app.js index d8cee98..cd1f33d 100644 --- a/app.js +++ b/app.js @@ -19,7 +19,7 @@ nodeapi.setWalletDetails(settings.wallet); if (settings.heavy != true) { nodeapi.setAccess('only', ['getinfo', 'getnetworkhashps', 'getmininginfo','getdifficulty', 'getconnectioncount', 'getmasternodecount', 'getmasternodelist', 'getvotelist', 'getblockcount', 'getblockhash', 'getblock', 'getrawtransaction', - 'getpeerinfo', 'gettxoutsetinfo']); + 'getpeerinfo', 'gettxoutsetinfo', 'verifymessage']); } else { // enable additional heavy api calls /* @@ -36,7 +36,7 @@ if (settings.heavy != true) { nodeapi.setAccess('only', ['getinfo', 'getstakinginfo', 'getnetworkhashps', 'getdifficulty', 'getconnectioncount', 'getmasternodecount', 'getmasternodelist', 'getvotelist', 'getblockcount', 'getblockhash', 'getblock', 'getrawtransaction', 'getmaxmoney', 'getvote', 'getmaxvote', 'getphase', 'getreward', 'getpeerinfo', - 'getnextrewardestimate', 'getnextrewardwhenstr', 'getnextrewardwhensec', 'getsupply', 'gettxoutsetinfo']); + 'getnextrewardestimate', 'getnextrewardwhenstr', 'getnextrewardwhensec', 'getsupply', 'gettxoutsetinfo', 'verifymessage']); } // determine if cors should be enabled if (settings.usecors == true) { @@ -244,6 +244,27 @@ app.use('/ext/getaddresstxsajax/:address', function(req,res){ }); }); +app.post('/address/:hash/claim', function(req, res){ + var address = req.body.address; + var signature = req.body.signature; + var message = req.body.message; + request({ + url: 'http://127.0.0.1:' + settings.port + '/api/verifymessage?address='+address+ '&signature='+ signature + '&message=' + message, + method: 'GET', + }, function(error, response, body){ + //console.log('error', error); + //console.log('response', response); + if(body == "false"){ + console.log('failed'); + res.json({"status": "failed", "error":true, "message": error}); + }else if(body == "true"){ + db.update_label(address, message, function(){ + res.json({"status": "success"}); + }) + } + }); +}) + app.use('/ext/connections', function(req,res){ db.get_peers(function(peers){ res.send({data: peers}); diff --git a/lib/database.js b/lib/database.js index c58a890..c899b3d 100644 --- a/lib/database.js +++ b/lib/database.js @@ -330,6 +330,18 @@ module.exports = { }); }, + update_label: function(hash, message, cb){ + find_address(hash, false, function(address){ + if (address){ + Address.updateOne({a_id:hash}, { + name: message, + }, function(){ + return cb(); + }); + } + }); + }, + check_stats: function(coin, cb) { Stats.findOne({coin: coin}, function(err, stats) { if(stats) { diff --git a/lib/explorer.js b/lib/explorer.js index 3a30c0c..ddbecc6 100644 --- a/lib/explorer.js +++ b/lib/explorer.js @@ -117,7 +117,7 @@ module.exports = { } else { client.cmd([{method:'getblockhash', params: [parseInt(height)]}], function(err, response){ if (err) - console.log('There was an error. Check your console.'); + return cb('There was an error. Check your console.'); else return cb(response); }); @@ -133,7 +133,7 @@ module.exports = { } else { client.cmd([{method:'getblock', params: [hash]}], function(err, response){ if (err) - console.log('There was an error. Check your console.'); + return cb('There was an error. Check your console.'); else return cb(response); }); @@ -149,7 +149,7 @@ module.exports = { } else { client.cmd([{method:'getrawtransaction', params: [hash, 1]}], function(err, response){ if (err) - console.log('There was an error. Check your console.'); + return cb('There was an error. Check your console.'); else return cb(response); }); diff --git a/lib/nodeapi.js b/lib/nodeapi.js index 2d4459a..1db2221 100644 --- a/lib/nodeapi.js +++ b/lib/nodeapi.js @@ -29,12 +29,14 @@ module.exports = function(){ var command = []; - if (method == 'sendmany' || - method == 'getmasternodecountonline' || - method == 'getmasternodecount' || - method == 'getmasternodelist' || + if (method == 'sendmany' || + method == 'getmasternodecountonline' || + method == 'getmasternodecount' || + method == 'getmasternodelist' || method == 'getvotelist') { command = specialApiCase(method); + } else if (method == 'verifymessage') { + command = specialApiCase(method, query_parameters); } else { command = [{ method: method, @@ -74,7 +76,7 @@ module.exports = function(){ } } - function specialApiCase(method_name){ + function specialApiCase(method_name, query_parameters){ var params = []; switch(method_name) { @@ -128,6 +130,21 @@ module.exports = function(){ params.push(sSplit[i]); } 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); + } + } + } + break; } return [{ diff --git a/models/address.js b/models/address.js index d8780b7..f8eda5f 100644 --- a/models/address.js +++ b/models/address.js @@ -3,9 +3,10 @@ var mongoose = require('mongoose') var AddressSchema = new Schema({ a_id: { type: String, unique: true, index: true}, - received: { type: Number, default: 0 }, + name: { type: String, default: ''}, + received: { type: Number, default: 0, index: true }, sent: { type: Number, default: 0 }, - balance: {type: Number, default: 0}, + balance: {type: Number, default: 0, index: true}, }, {id: false}); module.exports = mongoose.model('Address', AddressSchema); diff --git a/routes/index.js b/routes/index.js index 29c8dc2..7b610e9 100644 --- a/routes/index.js +++ b/routes/index.js @@ -109,6 +109,16 @@ function route_get_address(res, hash, count) { }); } +function route_get_claim_form(res, hash){ + db.get_address(hash, false, function(address) { + if (address) { + res.render("claim_address", { active: "address", address: address}); + } else { + route_get_index(res, hash + ' not found'); + } + }); +} + /* GET home page. */ router.get('/', function(req, res) { route_get_index(res, null); @@ -207,6 +217,10 @@ router.get('/block/:hash', function(req, res) { route_get_block(res, req.params.hash); }); +router.get('/address/:hash/claim', function(req,res){ + route_get_claim_form(res, req.params.hash); +}); + router.get('/address/:hash', function(req, res) { route_get_address(res, req.params.hash, settings.txcount); }); diff --git a/views/address.pug b/views/address.pug index 2a6b7a7..4a85a88 100644 --- a/views/address.pug +++ b/views/address.pug @@ -11,19 +11,26 @@ block content .panel.panel-default.panel-address-summary .panel-heading(style='position:relative;') strong #{address.a_id} - if settings.labels[address.a_id] - if settings.labels[address.a_id].type - label(class='label label-' + settings.labels[address.a_id].type + ' pull-right hidden-xs', style='margin-left:15px;') - =settings.labels[address.a_id].label - if settings.labels[address.a_id].url - a(href=settings.labels[address.a_id].url, target='_blank') - span.fa.fa-question-circle(style='margin-left:5px;') + if settings.labels[address.a_id] + if settings.labels[address.a_id].type + label(class='label label-'+settings.labels[address.a_id].type+' pull-right hidden-xs', style='margin-left:15px;') + =settings.labels[address.a_id].label + if settings.labels[address.a_id].url + a(href=settings.labels[address.a_id].url, target='_blank') + span.fa.fa-question-circle(style='margin-left:5px;') + else + label.label.label-default.pull-right.hidden-xs(style='margin-left:15px;') + =settings.labels[address.a_id].label + if settings.labels[address.a_id].url + a(href=settings.labels[address.a_id].url, target='_blank') + span.fa.fa-question-circle(style='margin-left:5px;') else - label.label.label-default.pull-right.hidden-xs(style='margin-left:15px;') - =settings.labels[address.a_id].label - if settings.labels[address.a_id].url - a(href=settings.labels[address.a_id].url, target='_blank') - span.fa.fa-question-circle(style='margin-left:5px;') + if address.name !== "" && typeof address.name !== "undefined" + label(class='label label-default pull-right hidden-xs', style='margin-left:15px;') + =address.name + else + a.badge.badge-pill.pull-right(href="/address/"+ address.a_id +"/claim" style="font-size: smaller;") + =" Is this yours? Claim it now for free!" table.table.table-bordered.table-striped.summary-table thead tr diff --git a/views/claim_address.pug b/views/claim_address.pug new file mode 100644 index 0000000..487bd1d --- /dev/null +++ b/views/claim_address.pug @@ -0,0 +1,98 @@ +extends layout + +block content + script. + $(function () { + + $('form').on('submit', function (e) { + + e.preventDefault(); + var address; + var message; + var signature; + address = $('input#address').val(); + message = $('input#message').val(); + signature = $('input#signature').val(); + var url = '/address/'+address+'/claim'; + $.ajax({ + type: 'post', + url: url, + data: { + 'address': address, + 'message': message, + 'signature': signature + }, + success: function (data) { + if(data.status == "success") + window.location = "/address/"+address; + + } + }); + + }); + + }); + - var balance = ((address.received - address.sent) / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); + - var balanceParts = balance.split('.'); + - var sent = (address.sent /100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); + - var sentParts = sent.split('.'); + - var received = (address.received / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); + - var receivedParts = received.split('.'); + .col-xs-12.col-md-10.col-md-offset-1 + .panel.panel-default.panel-address-summary + .panel-heading(style='position:relative;') + strong=address.a_id + if settings.labels[address.a_id] + if settings.labels[address.a_id].type + label(class='badge label-#{ settings.labels[address.a_id].type} pull-right d-none d-sm-block', style='margin-left:15px;') + =settings.labels[address.a_id].label + if settings.labels[address.a_id].url + a(href="#{ settings.labels[address.a_id].url}'", target='_blank') + span.fa.fa-question-circle(style='margin-left:5px;') + else + label.badge.badge-pill.pull-right.d-none.d-sm-block(style='margin-left:15px;') + =settings.labels[address.a_id].label + if settings.labels[address.a_id].url + a(href='#{settings.labels[address.a_id].url}', target='_blank') + span.fa.fa-question-circle(style='margin-left:5px;') + table.table.table-bordered.table-striped.summary-table + thead + tr + if settings.show_sent_received == true + th.hidden-xs #{settings.locale.total_sent} (#{settings.symbol}) + if address.a_id !== 'coinbase' + if settings.show_sent_received == true + th.hidden-xs #{settings.locale.total_received} (#{settings.symbol}) + th #{settings.locale.rl_balance} (#{settings.symbol}) + th #{settings.locale.a_qr} + tbody + tr + if settings.show_sent_received == true + td.addr-summary.hidden-xs #{sentParts[0]}. + span.decimal #{sentParts[1]} + if address.a_id !== 'coinbase' + if settings.show_sent_received == true + td.addr-summary.hidden-xs #{receivedParts[0]}. + span.decimal #{receivedParts[1]} + td.addr-summary #{balanceParts[0]}. + span.decimal #{balanceParts[1]} + td.addr-summary + img.qrcode(src='/qr/'+address.a_id) + .panel.panel-default + .panel-heading + strong Claim this Address + form#claimForm + .form-group + fieldset + label.control-label(for='address') Wallet Address + input#address.form-control(type='text' value=address.a_id readonly="") + .form-group + fieldset + label(for='message') Username + input#message.form-control(type='text' placeholder='User Name') + .form-group + fieldset + label(for='signature') Signature + input#signature.form-control(type='text' placeholder='Signature') + button.btn.btn-primary(type='submit') Submit + .footer-padding diff --git a/views/includes/rl_labels.pug b/views/includes/rl_labels.pug index 1cf337e..485bded 100644 --- a/views/includes/rl_labels.pug +++ b/views/includes/rl_labels.pug @@ -1,13 +1,17 @@ if settings.labels[item.a_id] - if settings.labels[item.a_id].type - label(class='label label-' + settings.labels[item.a_id].type + ' hidden-xs', style='margin-left:15px;') + if settings.labels[item.a_id].type + label(class='label label-' + settings.labels[item.a_id].type + ' pull-right hidden-xs', style='margin-left:15px;') =settings.labels[item.a_id].label if settings.labels[item.a_id].url a(href=settings.labels[item.a_id].url, target='_blank') span.fa.fa-question-circle(style='margin-left:5px;') else - label.label.label-default.hidden-xs(style='margin-left:15px;') + label.label.label-default.pull-right.hidden-xs(style='margin-left:15px;') =settings.labels[item.a_id].label if settings.labels[item.a_id].url a(href=settings.labels[item.a_id].url, target='_blank') - span.fa.fa-question-circle(style='margin-left:5px;') \ No newline at end of file + span.fa.fa-question-circle(style='margin-left:5px;') +else + if item.name !== "" && typeof item.name !== "undefined" + label(class='label label-default pull-right hidden-xs', style='margin-left:15px;') + =item.name \ No newline at end of file