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(); const RM_RPC = new localbitcoinplusplus.rpc();
RM_RPC.send_rpc RM_RPC.send_rpc
.call(this, "sync_with_supernode", { .call(this, "sync_with_supernode", {
trader_flo_address: trader_flo_address, trader_flo_address: trader_flo_address,
job: "SYNC_MY_LOCAL_DB_WITH_SUPERNODE_DB", job: "SYNC_MY_LOCAL_DB_WITH_SUPERNODE_DB",
receiver_flo_address: receiver_flo_address: localbitcoinplusplus.MY_SUPERNODE_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)); .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 */ /*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) { switch (method) {
case "trade_buy": case "trade_buy":
RM_RPC.filter_legit_requests( RM_RPC.filter_legit_requests(
@ -17277,15 +17318,80 @@
) )
.then(function(su_db_data) { .then(function(su_db_data) {
if (typeof su_db_data == "object") { if (typeof su_db_data == "object") {
su_db_data.trader_flo_address =
params.trader_flo_address; /*The below check for stale data should only run by backup supernode
su_db_data.receiver_flo_address = serving other's users.
params.trader_flo_address; Primary supernode is assumed to have the latest data of user always.
RM_RPC.send_rpc And hence this check should not be performed by Primary supernode. It
.call(this, "server_sync_response", su_db_data) should always send the sync data response to user. */
.then(server_sync_response =>
doSend(server_sync_response) 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) { switch (method) {
case "trade_buy": case "trade_buy":
RM_RPC.filter_legit_backup_requests( RM_RPC.filter_legit_backup_requests(
@ -22173,6 +22285,36 @@
})(); })();
} }
break; 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": case "deposit_asset_request":
response_from_sever = RM_RPC.receive_rpc_response.call( response_from_sever = RM_RPC.receive_rpc_response.call(
this, this,
@ -24033,6 +24175,36 @@
})(); })();
} }
break; 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": case "deposit_asset_request":
response_from_sever = RM_RPC.backup_receive_rpc_response.call( response_from_sever = RM_RPC.backup_receive_rpc_response.call(
this, this,