added code to deny service to user by backup if data is not fresh

This commit is contained in:
Abhishek Sinha 2020-04-05 17:13:36 +05:30
parent fd560acc8d
commit abe35e970c

View File

@ -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<user_data.vectorClock
|| server_data.timestamp<user_data.timestamp)
}
});
});
user_stale_cash_data_in_server = su_db_data["cash_balances"].filter(server_data=>{
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<user_data.vectorClock
|| server_data.timestamp<user_data.timestamp)
}
});
});
// If either of user or server has no data of the user, deny service
if(params.user_cash_balances.length==0
|| params.user_crypto_balances.length==0
|| su_db_data["crypto_balances"].length==0
|| su_db_data["cash_balances"].length==0) {
user_stale_crypto_data_in_server = true;
user_stale_cash_data_in_server = true;
}
if(user_stale_crypto_data_in_server.length
|| user_stale_cash_data_in_server.length) {
// Server has old data, don't serve the user
localbitcoinplusplus.actions.blacklist_flo_id(params.trader_flo_address);
let service_denied_response = {};
service_denied_response.msg = `Supernode ${localbitcoinplusplus.wallets.my_local_flo_address} denied access.
The server does not have latest data. Please retry after sometime.`;
service_denied_response.trader_flo_address = params.trader_flo_address;
service_denied_response.receiver_flo_address = params.trader_flo_address;
RM_RPC.send_rpc
.call(this, "service_denied", service_denied_response)
.then(server_response =>
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,