From a322b23094432ba3c19d6dca2c68de7c2e608f61 Mon Sep 17 00:00:00 2001 From: Abhishek Sinha Date: Mon, 8 Apr 2019 14:39:21 +0530 Subject: [PATCH] linked temporary ip of nodes to flo ids --- supernode/index.html | 135 +++++++++++++++++++++++++++++++------ supernode/websocket_chat.c | 2 +- 2 files changed, 117 insertions(+), 20 deletions(-) diff --git a/supernode/index.html b/supernode/index.html index afb3d9a..ac1830d 100644 --- a/supernode/index.html +++ b/supernode/index.html @@ -13691,13 +13691,13 @@ async handle_backup_server_messages(evt) { var response = evt.data; console.log('backup response: '+response); - - // let isRequestToLinkIp = response.search("linkMyLocalIPToMyFloId"); - // if (isRequestToLinkIp>=0) { - // linkIpToFloId(response); - // return; - // } + let isItANodeLeavingMessage = response.search(`\\-- left`); + + if(isItANodeLeavingMessage >= 0) { + reactor.dispatchEvent('fireNodeGoodByeEvent', response); + } + var res_pos = response.indexOf('{'); if (res_pos >= 0) { let isRequestToLinkIp = response.search("linkMyLocalIPToMyFloId"); @@ -14075,6 +14075,25 @@ updateinDB('ipTable', { 'flo_public_key': req_params.requesters_pub_key, 'temporary_ip': incoming_msg_local_ip + }).then((ipRes)=>{ + reactor.dispatchEvent('fireNodeWelcomeBackEvent', ipRes); + }).finally(()=>{ + linkBackOthersLocalIPToTheirFloId(); + }); + } + break; + case "link_Others_Local_IP_To_Their_Flo_Id": + if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { + const req_params = res_obj.params[0]; + if(typeof req_params.requesters_pub_key !== "string") return; + let flo_addr_for_pubkey = bitjs.FLO_TEST.pubkey2address(req_params.requesters_pub_key); + if(typeof flo_addr_for_pubkey !== "string") return; + if(flo_addr_for_pubkey !== res_obj.globalParams.senderFloId) return; + updateinDB('ipTable', { + 'flo_public_key': req_params.requesters_pub_key, + 'temporary_ip': incoming_msg_local_ip + }).then((ipRes)=>{ + reactor.dispatchEvent('fireNodeWelcomeBackEvent', ipRes); }); } break; @@ -14270,19 +14289,33 @@ async function onMessage(evt) { var response = evt.data; + + // If the message is about leaving of a node determine its FLO Id + // and fire respective events + let isItANodeLeavingMessage = response.search(`\\-- left`); + + if(isItANodeLeavingMessage >= 0) { + reactor.dispatchEvent('fireNodeGoodByeEvent', response); + } + + // let isItANodeJoiningMessage = response.search(`\\++ joined`); + + // if(isItANodeJoiningMessage >= 0) { + // reactor.dispatchEvent('fireNodeWelcomeBackEvent', response); + // } var res_pos = response.indexOf('{'); if (res_pos >= 0) { - + // Link Temporary IP Address to FLO ID let isRequestToLinkIp = response.search("linkMyLocalIPToMyFloId"); let incoming_msg_local_ip = ``; if (isRequestToLinkIp>=0) { let index_of_ip = response.indexOf(' '); - if (incoming_msg_local_ip>=0) { + if (index_of_ip>=0) { incoming_msg_local_ip = response.substr(0, index_of_ip); } } - + var res = response.substr(res_pos); try { var res_obj = JSON.parse(res); @@ -14850,7 +14883,7 @@ } return false; } - break; + break; case "add_user_public_data": let supernode_flo_public_key = localbitcoinplusplus.wallets.my_local_flo_public_key; @@ -15052,6 +15085,24 @@ break; case "link_My_Local_IP_To_My_Flo_Id": + if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { + const req_params = res_obj.params[0]; + if(typeof req_params.requesters_pub_key !== "string") return; + let flo_addr_for_pubkey = bitjs.FLO_TEST.pubkey2address(req_params.requesters_pub_key); + if(typeof flo_addr_for_pubkey !== "string") return; + if(flo_addr_for_pubkey !== res_obj.globalParams.senderFloId) return; + updateinDB('ipTable', { + 'flo_public_key': req_params.requesters_pub_key, + 'temporary_ip': incoming_msg_local_ip + }).then((ipRes)=>{ + reactor.dispatchEvent('fireNodeWelcomeBackEvent', ipRes); + }).finally(()=>{ + linkBackOthersLocalIPToTheirFloId(); + }); + } + break; + + case "link_Others_Local_IP_To_Their_Flo_Id": if (typeof res_obj.params == "object" && typeof res_obj.params[0] == "object") { const req_params = res_obj.params[0]; if(typeof req_params.requesters_pub_key !== "string") return; @@ -15061,6 +15112,8 @@ updateinDB('ipTable', { 'flo_public_key': req_params.requesters_pub_key, 'temporary_ip': incoming_msg_local_ip + }).then((ipRes)=>{ + reactor.dispatchEvent('fireNodeWelcomeBackEvent', ipRes); }); } break; @@ -15417,7 +15470,7 @@ var db; const DBName = "localbitcoinDB"; - const request = window.indexedDB.open(DBName, 2); + const request = window.indexedDB.open(DBName, 3); request.onerror = function (event) { //https://stackoverflow.com/questions/13972385/invalidstateerror-while-opening-indexeddb-in-firefox @@ -15592,6 +15645,9 @@ var objectStore = db.createObjectStore("ipTable", { keyPath: 'flo_public_key' }); + objectStore.createIndex('temporary_ip', 'temporary_ip', { + unique: false + }); } } @@ -16196,11 +16252,13 @@ if (!localbitcoinplusplus.master_configurations.supernodesPubKeys .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) { let kbuck = localbitcoinplusplus.kademlia.floIdToKbucketId("FLO_TEST", MY_LOCAL_FLO_ADDRESS); - readDB('kBucketStore', kbuck).then(userKBData=>{ + readDB('kBucketStore', kbuck).then(async userKBData=>{ if(typeof userKBData == "undefined") { - msf = `WARNING: Failed to determine KBucket Id and hence failed to send Kbucket Id to Supernode.` - showMessage(msf) - throw new Error(msf) + userKBData = await localbitcoinplusplus.kademlia + .addNewUserNodeInKbucketAndDB("FLO_TEST", MY_LOCAL_FLO_ADDRESS, {id:MY_LOCAL_FLO_ADDRESS}, KB=KBucket); + // msf = `WARNING: Failed to determine KBucket Id and hence failed to send Kbucket Id to Supernode.` + // showMessage(msf) + // throw new Error(msf) }; let addNewKNode = localbitcoinplusplus.rpc.prototype .send_rpc @@ -16864,7 +16922,7 @@ requesters_pub_key: localbitcoinplusplus.wallets.my_local_flo_public_key, trader_flo_address: localbitcoinplusplus.wallets.my_local_flo_address }); - doSend(send_backup_request); + doSend(send_backup_request); } function linkMyLocalIPToMyFloId() { @@ -16877,9 +16935,15 @@ }); doSend(request); } - - function linkIpToFloId(params) { - console.log(params); + function linkBackOthersLocalIPToTheirFloId() { + const RM_RPC = new localbitcoinplusplus.rpc; + let request = RM_RPC.send_rpc.call(this, + "link_Others_Local_IP_To_Their_Flo_Id", { + "JOB": "linkBackOthersLocalIPToTheirFloId", + requesters_pub_key: localbitcoinplusplus.wallets.my_local_flo_public_key, + requesters_flo_address: localbitcoinplusplus.wallets.my_local_flo_address + }); + doSend(request); } @@ -16889,6 +16953,39 @@ reactor.registerEvent('primary_supernode_down'); reactor.registerEvent('backup_supernode_up'); reactor.registerEvent('backup_supernode_down'); + reactor.registerEvent('fireNodeWelcomeBackEvent'); + reactor.addEventListener('fireNodeWelcomeBackEvent', function(evt) { + let getFLOId = bitjs.FLO_TEST.pubkey2address(evt.flo_public_key); + if(localbitcoinplusplus.master_configurations.supernodesPubKeys + .includes(evt.flo_public_key)) { + msg = `INFO: Supernode ${getFLOId} joined.`; + } else { + msg = `INFO: User node ${getFLOId} joined.`; + } + showMessage(msg); + }) + + reactor.registerEvent('fireNodeGoodByeEvent'); + reactor.addEventListener('fireNodeGoodByeEvent', function(evt_msg) { + console.log(evt_msg); + let i = evt_msg.indexOf(' ') + let temp_ip = evt_msg.substr(0, i) + console.log(temp_ip); + + readDBbyIndex('ipTable', 'temporary_ip', temp_ip).then((op)=>{ + console.log(op); + if(op.length < 1 || typeof op[0].temporary_ip !== 'string') return; + let getFLOId = bitjs.FLO_TEST.pubkey2address(op[0].flo_public_key); + if(localbitcoinplusplus.master_configurations.supernodesPubKeys + .includes(op[0].flo_public_key)) { + msg = `INFO: Supernode ${getFLOId} left.`; + } else { + msg = `INFO: User node ${getFLOId} left.`; + } + + showMessage(msg); + }); + }) diff --git a/supernode/websocket_chat.c b/supernode/websocket_chat.c index ec53b7b..f6c9caf 100644 --- a/supernode/websocket_chat.c +++ b/supernode/websocket_chat.c @@ -6,7 +6,7 @@ #include "mongoose.h" static sig_atomic_t s_signal_received = 0; -static const char *s_http_port = "9001"; +static const char *s_http_port = "9003"; static struct mg_serve_http_opts s_http_server_opts; static void signal_handler(int sig_num) {