diff --git a/index.html b/index.html
index ba22ddb..6ca6b5a 100644
--- a/index.html
+++ b/index.html
@@ -12295,14 +12295,22 @@
});
},
- sync_with_supernode: function(trader_flo_address) {
+ sync_with_supernode: async function(trader_flo_address) {
+
+ const user_crypto_balances = await readDBbyIndex('crypto_balances',
+ 'trader_flo_address', trader_flo_address);
+
+ const user_cash_balances = await readDBbyIndex('cash_balances',
+ 'trader_flo_address', trader_flo_address);
+
const RM_RPC = new localbitcoinplusplus.rpc();
RM_RPC.send_rpc
.call(this, "sync_with_supernode", {
trader_flo_address: trader_flo_address,
job: "SYNC_MY_LOCAL_DB_WITH_SUPERNODE_DB",
- receiver_flo_address:
- localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS
+ receiver_flo_address: localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS,
+ user_crypto_balances: user_crypto_balances,
+ user_cash_balances: user_cash_balances
})
.then(sync_request => doSend(sync_request));
},
@@ -12857,6 +12865,33 @@
}
},
+ is_user_blacklisted: function(flo_addr="") {
+ try {
+ storedNames = JSON.parse(localStorage.getItem("blacklisted_flo_addrs"));
+ if(typeof storedNames=="object") {
+ return storedNames.includes(flo_addr);
+ } else return false;
+ } catch (error) {
+ return false;
+ }
+ },
+
+ whitelist_flo_id: function(flo_addr='') {
+ let blacklist = JSON.parse(localStorage.getItem("blacklisted_flo_addrs"));
+ let index = blacklist.indexOf(flo_addr);
+ if(index>=0) {
+ blacklist.splice(index, 1);
+ localStorage.setItem("blacklisted_flo_addrs", JSON.stringify(storedNames));
+ }
+ },
+
+ blacklist_flo_id: function(flo_addr='') {
+ let blacklist = JSON.parse(localStorage.getItem("blacklisted_flo_addrs"));
+ if(!blacklist.includes(flo_addr)) {
+ localStorage.setItem("blacklisted_flo_addrs", JSON.stringify(storedNames));
+ }
+ },
+
};
/*Modified functions from https://github.com/tristanls/k-bucket */
@@ -15718,6 +15753,12 @@
}
);
+ let is_user_blacklisted = localbitcoinplusplus.actions.is_user_blacklisted(params.trader_flo_address);
+ if(is_user_blacklisted===true) {
+ console.warn(`Flo Id ${params.trader_flo_address} is blacklisted.`);
+ return false;
+ }
+
switch (method) {
case "trade_buy":
RM_RPC.filter_legit_requests(
@@ -17277,15 +17318,80 @@
)
.then(function(su_db_data) {
if (typeof su_db_data == "object") {
- su_db_data.trader_flo_address =
- params.trader_flo_address;
- su_db_data.receiver_flo_address =
- params.trader_flo_address;
- RM_RPC.send_rpc
- .call(this, "server_sync_response", su_db_data)
- .then(server_sync_response =>
- doSend(server_sync_response)
- );
+
+ /*The below check for stale data should only run by backup supernode
+ serving other's users.
+ Primary supernode is assumed to have the latest data of user always.
+ And hence this check should not be performed by Primary supernode. It
+ should always send the sync data response to user. */
+
+ if(typeof params.user_crypto_balances == "object"
+ && params.user_crypto_balances.length>0
+ && typeof params.user_crypto_balances == "object"
+ && params.user_crypto_balances.length>0) {
+
+ let user_stale_crypto_data_in_server=true;
+ let user_stale_cash_data_in_server=true;
+
+ user_stale_crypto_data_in_server = su_db_data["crypto_balances"].filter(server_data=>{
+ return params.user_crypto_balances.some(function(user_data){
+ if(server_data.id === user_data.id) {
+ return (server_data.crypto_balance!=user_data.crypto_balance
+ || server_data.vectorClock{
+ return params.user_cash_balances.some(function(user_data){
+ if(server_data.id === user_data.id) {
+ return (server_data.cash_balance!=user_data.cash_balance
+ || server_data.vectorClock
+ doSend(server_response)
+ );
+
+ } else {
+ localbitcoinplusplus.actions.whitelist_flo_id(params.trader_flo_address);
+ su_db_data.trader_flo_address = params.trader_flo_address;
+ su_db_data.receiver_flo_address = params.trader_flo_address;
+ RM_RPC.send_rpc
+ .call(this, "server_sync_response", su_db_data)
+ .then(server_sync_response =>
+ doSend(server_sync_response)
+ );
+ }
+ }
}
});
}
@@ -17379,6 +17485,12 @@
);
}
+ let is_user_blacklisted = localbitcoinplusplus.actions.is_user_blacklisted(params.trader_flo_address);
+ if(is_user_blacklisted===true) {
+ console.warn(`Flo Id ${params.trader_flo_address} is blacklisted.`);
+ return false;
+ }
+
switch (method) {
case "trade_buy":
RM_RPC.filter_legit_backup_requests(
@@ -22173,6 +22285,36 @@
})();
}
break;
+
+ case "service_denied":
+ if (
+ typeof res_obj.params == "object" &&
+ typeof res_obj.params[0] == "object"
+ ) {
+ if (
+ typeof localbitcoinplusplus.wallets
+ .my_local_flo_address !== "string" ||
+ service_denied_data.trader_flo_address !==
+ localbitcoinplusplus.wallets.my_local_flo_address ||
+ localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
+ localbitcoinplusplus.wallets.my_local_flo_public_key
+ )
+ )
+ return false;
+ // Only the relevent user node should get response
+ if (
+ res_obj.params[0].trader_flo_address !==
+ localbitcoinplusplus.wallets.my_local_flo_address
+ )
+ return;
+
+ if(typeof res_obj.params[0].msg=="string" && res_obj.params[0].msg.length>0) {
+ websocket.close();
+ showMessage(res_obj.params[0].msg);
+ }
+ }
+ break;
+
case "deposit_asset_request":
response_from_sever = RM_RPC.receive_rpc_response.call(
this,
@@ -24033,6 +24175,36 @@
})();
}
break;
+
+ case "service_denied":
+ if (
+ typeof res_obj.params == "object" &&
+ typeof res_obj.params[0] == "object"
+ ) {
+ if (
+ typeof localbitcoinplusplus.wallets
+ .my_local_flo_address !== "string" ||
+ service_denied_data.trader_flo_address !==
+ localbitcoinplusplus.wallets.my_local_flo_address ||
+ localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(
+ localbitcoinplusplus.wallets.my_local_flo_public_key
+ )
+ )
+ return false;
+ // Only the relevent user node should get response
+ if (
+ res_obj.params[0].trader_flo_address !==
+ localbitcoinplusplus.wallets.my_local_flo_address
+ )
+ return;
+
+ if(typeof res_obj.params[0].msg=="string" && res_obj.params[0].msg.length>0) {
+ websocket.close();
+ showMessage(res_obj.params[0].msg);
+ }
+ }
+ break;
+
case "deposit_asset_request":
response_from_sever = RM_RPC.backup_receive_rpc_response.call(
this,