added autoupdate external scripts feature

This commit is contained in:
Abhishek Sinha 2019-02-01 19:10:10 +05:30
parent 4811e9e8b1
commit 402e0ab6fb

View File

@ -9104,10 +9104,13 @@
// remove this line later // remove this line later
// btcTradeMargin is tolerable difference between Crypto trader should deposit and cryptos he actually deposited // btcTradeMargin is tolerable difference between Crypto trader should deposit and cryptos he actually deposited
RMAssets = RMAssets =
`tradableAsset1=BTC,FLO,BTC_TEST,FLO_TEST#!#tradableAsset2=INR,USD,BTC,FLO,BTC_TEST,FLO_TEST#!#supernodes=127.0.0.1,212.88.88.2#!#MASTER_NODE=023B9F60692A17FAC805D012C5C8ADA3DD19A980A3C5F0D8A5B3500CC54D6E8B75 `tradableAsset1=BTC,FLO,BTC_TEST,FLO_TEST#!#tradableAsset2=INR,USD,BTC,FLO,BTC_TEST,FLO_TEST
#!#supernodes=127.0.0.1,212.88.88.2#!#MASTER_NODE=023B9F60692A17FAC805D012C5C8ADA3DD19A980A3C5F0D8A5B3500CC54D6E8B75
#!#MASTER_RECEIVING_ADDRESS=oVRq2nka1GtALQT8pbuLHAGjqAQ7PAo6uy#!#validTradingAmount=10000,50000,100000#!#btcTradeMargin=5000 #!#MASTER_RECEIVING_ADDRESS=oVRq2nka1GtALQT8pbuLHAGjqAQ7PAo6uy#!#validTradingAmount=10000,50000,100000#!#btcTradeMargin=5000
#!#supernodesPubKeys=033038E5F9A9CD59F21E4E1577BAC732DF7F4988634CF1ADE2EB74FC512689FC27,038C6D5C0DF3AA49501C20DD8333F9F67A854E87AA639A688FAE4F434718F2792D, #!#supernodesPubKeys=02BCBC8186CE5E978BCBC6B70F6CAD8FED936A725FEF377EFE4A56AD6E6D4E8392,
#!#d3js=58f54395efa8346e8e94d12609770f66b916897e7f4e05f6c98780cffa5c70a3#!#ShamirsMaxShares=8`; #!#externalFiles={"testjs":"bebabf9b08571c23064b35c25850fdbc004044779af58f6327e3b316410f5884",
"d3js":"58f54395efa8346e8e94d12609770f66b916897e7f4e05f6c98780cffa5c70a3"}
#!#ShamirsMaxShares=8`;
let floAssetsArray = RMAssets.split('#!#'); let floAssetsArray = RMAssets.split('#!#');
if (floAssetsArray.length > 0 && typeof floAssetsArray[0] !== undefined && if (floAssetsArray.length > 0 && typeof floAssetsArray[0] !== undefined &&
@ -9554,7 +9557,7 @@
let publicKey_for_users_entered_private_key; let publicKey_for_users_entered_private_key;
try { try {
publicKey_for_users_entered_private_key = RM_WALLET.generateFloKeys(users_entered_private_key).pubKeyHex; publicKey_for_users_entered_private_key = localbitcoinplusplus.wallets.prototype.generateFloKeys(users_entered_private_key).pubKeyHex;
} catch (error) { } catch (error) {
throw new Error(error); throw new Error(error);
} }
@ -10139,6 +10142,8 @@
}); });
} else { } else {
console.error(`Withdrawal request failed: You are trying to withdraw more Bitcoins than you have.`);
// Return error to the requester // Return error to the requester
return { return {
error: true, error: true,
@ -10147,6 +10152,9 @@
}; };
} }
} else { } else {
console.error(`Withdrawal request failed: You don't seem to have any Bitcoin balance in the system yet.
Please buy some Bitcoins to withdraw.`);
// Return error to the requester // Return error to the requester
return { return {
error: true, error: true,
@ -10249,9 +10257,6 @@
} else { } else {
console.log("withdraw request error"); console.log("withdraw request error");
} }
//});
} }
}); });
break; break;
@ -10376,6 +10381,31 @@
} }
break; break;
case "update_external_file_server_response":
if (typeof params=="object") {
if (params.filename=="UPDATE_ALL_FILES") {
let file_details_str = JSON.stringify(params.file_updated);
if(localbitcoinplusplus.wallets.prototype.verify(file_details_str,
params.server_sign, params.server_pubkey)) {
params.file_updated.map(new_file=>{
updateinDB("external_files", new_file);
createScript(new_file.filename, new_file.content);
});
return true;
}
} else {
let file_details_string = JSON.stringify(params.file_updated);
if(localbitcoinplusplus.wallets.prototype.verify(file_details_string,
params.server_sign, params.server_pubkey)) {
updateinDB("external_files", params.file_updated);
createScript(params.file_updated.filename, params.file_updated.content);
return true;
}
}
console.warn(`Failed to update externl files from server.`);
}
break;
default: default:
alert("Unknown method called for execution."); alert("Unknown method called for execution.");
break; break;
@ -11185,9 +11215,6 @@
}).catch(e=>console.warn(e)); }).catch(e=>console.warn(e));
}, },
} }
</script> </script>
@ -11412,7 +11439,8 @@
/* Websocket Code Starts here */ /* Websocket Code Starts here */
//var wsUri = "ws://localhost:9000/"; //var wsUri = "ws://localhost:9000/";
var wsUri = "ws://ranchimall.duckdns.org:9000/"; //var wsUri = "ws://ranchimall.duckdns.org:9000/";
var wsUri = "ws://167.99.5.116:9000/";
var output; var output;
function init() { function init() {
@ -11451,7 +11479,6 @@
if (res_pos >= 0) { if (res_pos >= 0) {
var res = response.substr(res_pos); var res = response.substr(res_pos);
try { try {
var res_obj = JSON.parse(res); var res_obj = JSON.parse(res);
if (typeof res_obj.method !== undefined) { if (typeof res_obj.method !== undefined) {
@ -11940,6 +11967,62 @@
}); });
break; break;
case "update_external_file_request":
localbitcoinplusplus.rpc.prototype.filter_legit_requests(is_valid_request=>{
if (is_valid_request !== true) return false;
let update_script_request = res_obj.params[0];
if (typeof update_script_request.user_flo_address !=="string") throw new Error("Unknown user");
if(!localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) throw new Error("Unauthorized server.");
let server_pubkey = localbitcoinplusplus.wallets.my_local_flo_public_key;
if (typeof update_script_request.file_to_update=="string") {
readDB("external_files", update_script_request.file_to_update).then(file_details=>{
if (typeof file_details.content=="string" && file_details.content.length>0) {
let file_details_string = JSON.stringify(file_details);
let server_sign = localbitcoinplusplus.wallets.prototype
.sign(file_details_string, localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY);
response_from_sever = localbitcoinplusplus.rpc.prototype.send_rpc
.call(this, "update_external_file_server_response", {
user_flo_address: update_script_request.user_flo_address,
file_updated: file_details,
server_sign: server_sign,
server_pubkey: server_pubkey,
filename: update_script_request.file_to_update
});
doSend(response_from_sever);
}
});
} else {
readAllDB("external_files").then(file_details=>{
if (file_details.length>0) {
let file_details_str = JSON.stringify(file_details);
let server_sign = localbitcoinplusplus.wallets.prototype
.sign(file_details_str, localbitcoinplusplus.wallets.MY_SUPERNODE_PRIVATE_KEY);
response_from_sever = localbitcoinplusplus.rpc.prototype.send_rpc
.call(this, "update_external_file_server_response", {
user_flo_address: update_script_request.user_flo_address,
file_updated: file_details,
server_sign: server_sign,
server_pubkey: server_pubkey,
filename: "UPDATE_ALL_FILES"
});
doSend(response_from_sever);
}
});
}
});
break;
case "update_external_file_server_response":
response_from_sever = localbitcoinplusplus.rpc.prototype.receive_rpc_response.call(this,
JSON.stringify(res_obj));
doSend(JSON.stringify(response_from_sever)); // send response to client
break;
case "testMessageBroadcasting": case "testMessageBroadcasting":
console.log(res_obj); console.log(res_obj);
try { try {
@ -12086,8 +12169,8 @@
timestamp: null timestamp: null
} }
const d3js = { const external_files = {
version: null, filename: null,
filehash: null, filehash: null,
content: null content: null
} }
@ -12105,7 +12188,6 @@
request.onsuccess = function (event) { request.onsuccess = function (event) {
db = request.result; db = request.result;
runInitialDBOperations();
}; };
request.onupgradeneeded = function (event) { request.onupgradeneeded = function (event) {
@ -12228,9 +12310,12 @@
unique: false unique: false
}); });
} }
if (!db.objectStoreNames.contains('d3js')) { if (!db.objectStoreNames.contains('external_files')) {
var objectStore = db.createObjectStore("d3js", { var objectStore = db.createObjectStore("external_files", {
keyPath: 'filehash' keyPath: 'filename'
});
objectStore.createIndex('filehash', 'filehash', {
unique: true
}); });
} }
@ -12279,7 +12364,6 @@
}); });
} }
function readAllDB(tablename) { function readAllDB(tablename) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let response = []; let response = [];
@ -12370,17 +12454,14 @@
<!-- Initialization of objects --> <!-- Initialization of objects -->
<script> <script>
var RM_WALLET = new localbitcoinplusplus.wallets;
var RM_TRADE = new localbitcoinplusplus.trade;
var RM_RPC = new localbitcoinplusplus.rpc;
// Fetch configs from Master Key // Fetch configs from Master Key
const doShreeGanesh = () => { const doShreeGanesh = () => {
try { try {
var rm_configs = localbitcoinplusplus.actions.fetch_configs(function (...fetch_configs_res) { var rm_configs = localbitcoinplusplus.actions.fetch_configs(async function (...fetch_configs_res) {
dataBaseUIOperations(); await loadExternalFiles();
await dataBaseUIOperations();
window.bitjs = []; // Launch bitjs window.bitjs = []; // Launch bitjs
localbitcoinplusplus.master_configurations.tradableAsset1.map(asset=>bitjslib(asset)) await localbitcoinplusplus.master_configurations.tradableAsset1.map(asset=>bitjslib(asset));
}); });
} catch (error) { } catch (error) {
throw new Error(`Failed to fetch configurations: ${error}`); throw new Error(`Failed to fetch configurations: ${error}`);
@ -12390,17 +12471,34 @@
<!-- Database operations --> <!-- Database operations -->
<script> <script>
// These DB functions run as soon as th page and indexed db loads const createScript = (id, content)=>{
const runInitialDBOperations = function() { let getScriptId = document.getElementById(id);
try { if (getScriptId==null) {
readDB('d3js', "58f54395efa8346e8e94d12609770f66b916897e7f4e05f6c98780cffa5c70a3").then(fileContent=>{
if (typeof fileContent=="object" && typeof fileContent.content=="string") {
var oScript = document.createElement("script"); var oScript = document.createElement("script");
var oScriptText = document.createTextNode(fileContent.content); oScript.id = id;
var oScriptText = document.createTextNode(content);
oScript.appendChild(oScriptText); oScript.appendChild(oScriptText);
document.body.appendChild(oScript); document.body.appendChild(oScript);
} else { } else {
console.warn("Failed to load d3.js"); getScriptId.innerText = content;
}
}
const loadExternalFiles = async function() {
try {
const user_flo_details = await readDB("localbitcoinUser", "00-01");
if (typeof user_flo_details.myLocalFLOAddress == "undefined" || user_flo_details.myLocalFLOAddress
.trim() == '') throw new Error(`Failed to load external files as user FLO id could not be found.`);
const ext_scripts_hashes_object = JSON.parse(localbitcoinplusplus.master_configurations.externalFiles);
Object.keys(ext_scripts_hashes_object).map(async ext_file=>{
let readExtFile = await readDB("external_files", ext_file);
if (typeof readExtFile=="object" && readExtFile.filehash==ext_scripts_hashes_object[ext_file]) {
createScript(ext_file, readExtFile.content);
} else {
updateFileRequest(user_flo_details.myLocalFLOAddress, ext_file);
} }
}); });
} catch (error) { } catch (error) {
@ -12408,6 +12506,21 @@
} }
} }
const updateFileRequest = (user_flo_address, filename)=>{
let update_external_file = localbitcoinplusplus.rpc.prototype
.send_rpc
.call(this, "update_external_file_request",
{
user_flo_address: user_flo_address,
file_to_update: filename
}
);
doSend(update_external_file);
let file_to_be_updated = (filename==null ? 'each':filename);
console.log(`Updating ${file_to_be_updated} file. Please do not
perform any operation until next confirmation.`);
}
const privateKeyBuilder = ()=>{ const privateKeyBuilder = ()=>{
return new Promise(async(resolve, reject)=>{ return new Promise(async(resolve, reject)=>{
let supernode_transaction_key_arr = []; let supernode_transaction_key_arr = [];
@ -12435,6 +12548,10 @@
// localbitcoinUser Databse // localbitcoinUser Databse
const dataBaseUIOperations = async function () { const dataBaseUIOperations = async function () {
var RM_WALLET = new localbitcoinplusplus.wallets;
var RM_TRADE = new localbitcoinplusplus.trade;
var RM_RPC = new localbitcoinplusplus.rpc;
// rebuild private key // rebuild private key
privateKeyBuilder(); privateKeyBuilder();
@ -12954,13 +13071,13 @@
} }
/* Function to load files to db */ /* Function to load files to db */
function readBlob(version) { function readBlob(file_name) {
var files = document.getElementById('upload_file_db').files; var files = document.getElementById('upload_file_db').files;
if (!files.length) return('Please select a file!'); if (!files.length) return('Please select a file!');
if (isNaN(version)) throw new Error('Please provide a valid version number for thhis file.'); if (typeof file_name !== "string") throw new Error('Please provide a valid file name.');
var file = files[0]; var file = files[0];
var start = 0; var start = 0;
@ -12973,10 +13090,10 @@
if (evt.target.readyState == FileReader.DONE) { // DONE == 2 if (evt.target.readyState == FileReader.DONE) { // DONE == 2
let data = evt.target.result; let data = evt.target.result;
let hash = Crypto.SHA256(data); let hash = Crypto.SHA256(data);
addDB("d3js", { updateinDB("external_files", {
content: data, filename: file_name,
filehash: hash, filehash: hash,
version: version content: data,
}); });
}; };
}; };
@ -13002,8 +13119,8 @@
document.querySelector('#uploadFileButton').addEventListener('click', function(evt) { document.querySelector('#uploadFileButton').addEventListener('click', function(evt) {
if (evt.target.tagName.toLowerCase() == 'button') { if (evt.target.tagName.toLowerCase() == 'button') {
let version_num = prompt("Enter version number for this file.", 1); let fname = prompt("Enter name of this file.");
readBlob(version_num); readBlob(fname);
} }
}, false); }, false);
@ -13083,8 +13200,6 @@
return false; return false;
} }
} }
</script> </script>
</body> </body>