mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-12 02:55:18 -04:00
Incremental Improvements to DHT:
Added Knowledge of Friends, Friends of Friends and Relays. - Added bdfriendlist class to store information. - New interface function updateKnownPeer(). - includes IP addresses, if known. (for filtering) Bad Peer Filtering. - Check IDs against known peer IP addresses. - Added checks in checkPotentialPeer(). - Added checks in addPeer(). - Running in TestMode at the moment (Bad Peers are only flagged). Other Fixes: - Removed some warning about int/uint comparisons. - added bdSpace::flagpeer() fn to support above. git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-dhtmods@4680 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
1cfcac7377
commit
4cd7523947
16 changed files with 487 additions and 18 deletions
|
@ -66,7 +66,7 @@
|
|||
|
||||
|
||||
bdNode::bdNode(bdNodeId *ownId, std::string dhtVersion, std::string bootfile, bdDhtFunctions *fns)
|
||||
:mNodeSpace(ownId, fns), mQueryMgr(NULL), mConnMgr(NULL), mFilterPeers(NULL), mOwnId(*ownId), mDhtVersion(dhtVersion), mStore(bootfile, fns), mFns(fns)
|
||||
:mNodeSpace(ownId, fns), mQueryMgr(NULL), mConnMgr(NULL), mFilterPeers(NULL), mOwnId(*ownId), mDhtVersion(dhtVersion), mStore(bootfile, fns), mFns(fns), mFriendList(ownId)
|
||||
{
|
||||
|
||||
init(); /* (uses this pointers) stuff it - do it here! */
|
||||
|
@ -88,7 +88,7 @@ void bdNode::init()
|
|||
#define ATTACH_NUMBER 5
|
||||
void bdNode::setNodeOptions(uint32_t optFlags)
|
||||
{
|
||||
mNodeOptionFlags = optFlags;
|
||||
mNodeOptionFlags = optFlags;
|
||||
if (optFlags & BITDHT_OPTIONS_MAINTAIN_UNSTABLE_PORT)
|
||||
{
|
||||
mNodeSpace.setAttachedFlag(BITDHT_PEER_STATUS_DHT_ENGINE | BITDHT_PEER_STATUS_DHT_ENGINE_VERSION, ATTACH_NUMBER);
|
||||
|
@ -392,9 +392,61 @@ void bdNode::send_connect_msg(bdId *id, int msgtype, bdId *srcAddr, bdId *destAd
|
|||
|
||||
|
||||
|
||||
#define TEST_BAD_PEER 1
|
||||
|
||||
void bdNode::checkPotentialPeer(bdId *id, bdId *src)
|
||||
{
|
||||
/* Check BadPeer Filters for Potential Peers too */
|
||||
|
||||
/* first check the filters */
|
||||
if (!mFilterPeers->addrOkay(&(id->addr)))
|
||||
{
|
||||
std::cerr << "bdNode::checkPotentialPeer(";
|
||||
mFns->bdPrintId(std::cerr, id);
|
||||
std::cerr << ") BAD ADDRESS!!!! SHOULD DISCARD POTENTIAL PEER";
|
||||
std::cerr << std::endl;
|
||||
|
||||
#ifdef TEST_BAD_PEER
|
||||
std::cerr << "IN TEST MODE... so letting it through.";
|
||||
std::cerr << std::endl;
|
||||
#else
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* is it masquarading? */
|
||||
bdFriendEntry entry;
|
||||
if (mFriendList.findPeerEntry(&(id->id), entry))
|
||||
{
|
||||
struct sockaddr_in knownAddr;
|
||||
if (entry.addrKnown(&knownAddr))
|
||||
{
|
||||
if (knownAddr.sin_addr.s_addr != id->addr.sin_addr.s_addr)
|
||||
{
|
||||
std::cerr << "bdNode::checkPotentialPeer(";
|
||||
mFns->bdPrintId(std::cerr, id);
|
||||
std::cerr << ") MASQARADING AS KNOWN PEER - FLAGGING AS BAD";
|
||||
std::cerr << std::endl;
|
||||
|
||||
#ifdef TEST_BAD_PEER
|
||||
std::cerr << "IN TEST MODE... so letting it through.";
|
||||
std::cerr << std::endl;
|
||||
#else
|
||||
|
||||
mFilterPeers->addBadPeer(id, 0);
|
||||
// Stores in queue for later callback and desemination around the network.
|
||||
mBadPeerList->queuePeer(id, 0);
|
||||
|
||||
std::list<struct sockaddr_in> filteredIPs;
|
||||
mFilterPeers->filteredIPs(filteredIPs);
|
||||
mStore.filterIpList(filteredIPs);
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool isWorthyPeer = mQueryMgr->checkPotentialPeer(id, src);
|
||||
|
||||
if (isWorthyPeer)
|
||||
|
@ -445,9 +497,66 @@ void bdNode::addPeer(const bdId *id, uint32_t peerflags)
|
|||
return;
|
||||
}
|
||||
|
||||
// NB: TODO CLEANUP THIS CODE - ONCE LOGIC IS TESTED!
|
||||
|
||||
/* next we check if it is a friend, whitelist etc, and adjust flags */
|
||||
bdFriendEntry entry;
|
||||
|
||||
#ifdef TEST_BAD_PEER
|
||||
bool peerBad = false;
|
||||
#endif
|
||||
if (mFriendList.findPeerEntry(&(id->id), entry))
|
||||
{
|
||||
/* found! */
|
||||
peerflags |= entry.getPeerFlags(); // translates internal into general ones.
|
||||
|
||||
struct sockaddr_in knownAddr;
|
||||
if (entry.addrKnown(&knownAddr))
|
||||
{
|
||||
if (knownAddr.sin_addr.s_addr != id->addr.sin_addr.s_addr)
|
||||
{
|
||||
std::cerr << "bdNode::addPeer(";
|
||||
mFns->bdPrintId(std::cerr, id);
|
||||
std::cerr << ", " << std::hex << peerflags << std::dec;
|
||||
std::cerr << ") MASQARADING AS KNOWN PEER - FLAGGING AS BAD";
|
||||
std::cerr << std::endl;
|
||||
|
||||
#ifdef TEST_BAD_PEER
|
||||
peerBad = true;
|
||||
#else
|
||||
mFilterPeers->addBadPeer(id, peerflags);
|
||||
// Stores in queue for later callback and desemination around the network.
|
||||
mBadPeerList->queuePeer(id, peerflags);
|
||||
|
||||
std::list<struct sockaddr_in> filteredIPs;
|
||||
mFilterPeers->filteredIPs(filteredIPs);
|
||||
mStore.filterIpList(filteredIPs);
|
||||
|
||||
// DO WE EXPLICITLY NEED TO DO THIS, OR WILL THEY JUST BE DROPPED?
|
||||
//mNodeSpace.remove_badpeer(id);
|
||||
//mQueryMgr->remove_badpeer(id);
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mQueryMgr->addPeer(id, peerflags);
|
||||
mNodeSpace.add_peer(id, peerflags);
|
||||
|
||||
#ifdef TEST_BAD_PEER
|
||||
// NOTE: We will push bad peers to Query in the testing case.
|
||||
// This allows us to test the multiple solutions... as well.
|
||||
// In normal behaviour - they will just get stripped and never added.
|
||||
if (peerBad)
|
||||
{
|
||||
mNodeSpace.flagpeer(id, 0, BITDHT_PEER_EXFLAG_BADPEER);
|
||||
//mQueryMgr->flag_badpeer(id);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
bdPeer peer;
|
||||
peer.mPeerId = *id;
|
||||
peer.mPeerFlags = peerflags;
|
||||
|
@ -1529,7 +1638,7 @@ void bdNode::msgin_pong(bdId *id, bdToken *transId, bdToken *versionId)
|
|||
{
|
||||
sameDhtVersion = false;
|
||||
std::cerr << "bdNode::msgin_pong() STRANGE Peer Version: ";
|
||||
for(int i = 0; i < versionId->len; i++)
|
||||
for(uint32_t i = 0; i < versionId->len; i++)
|
||||
{
|
||||
std::cerr << versionId->data[i];
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue