- Added flags for services and service permissions for peers

Flags are identity-related, meaning that all locations of the same peers have the same flags.
- It's now possible to tweak which services each peer can use. Service that can be disabled are
  forums/channels, discovery, anonymous routing.
- by default, peers have all flags on.
- fixed missing error msg in p3cfgmgr when serialisation fails.
- fixed bug in RemoteDirModel causing infinite loop to happen when group name is unknown




git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@5924 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
csoler 2012-12-01 19:22:22 +00:00
parent 099a3ad33e
commit e3da77612a
24 changed files with 887 additions and 242 deletions

View file

@ -939,6 +939,9 @@ bool p3Config::saveConfig()
written = written && stream->encryptedSendItems(toSave);
if(!written)
std::cerr << "(EE) Error while writing config file " << Filename() << ": file dropped!!" << std::endl;
/* store the hash */
setHash(cfg_bio->gethash());

View file

@ -150,7 +150,7 @@ const std::string& Hash();
/**
* Checks if configuration has changed
*/
void IndicateConfigChanged();
virtual void IndicateConfigChanged();
void setHash(const std::string& h);
RsMutex cfgMtx;

View file

@ -441,7 +441,7 @@ bool p3PeerMgrIMPL::haveOnceConnected()
/*******************************************************************/
/*******************************************************************/
bool p3PeerMgrIMPL::addFriend(const std::string& input_id, const std::string& input_gpg_id, uint32_t netMode, uint32_t visState, time_t lastContact)
bool p3PeerMgrIMPL::addFriend(const std::string& input_id, const std::string& input_gpg_id, uint32_t netMode, uint32_t visState, time_t lastContact,ServicePermissionFlags service_flags)
{
bool notifyLinkMgr = false;
std::string id = input_id ;
@ -463,7 +463,8 @@ bool p3PeerMgrIMPL::addFriend(const std::string& input_id, const std::string& in
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
if (id == AuthSSL::getAuthSSL()->OwnId()) {
if (id == AuthSSL::getAuthSSL()->OwnId())
{
#ifdef PEER_DEBUG
std::cerr << "p3PeerMgrIMPL::addFriend() cannot add own id as a friend." << std::endl;
#endif
@ -560,6 +561,8 @@ bool p3PeerMgrIMPL::addFriend(const std::string& input_id, const std::string& in
mLinkMgr->addFriend(id, !(visState & RS_VIS_STATE_NODHT));
}
setServicePermissionFlags(gpg_id,service_flags) ;
#ifdef PEER_DEBUG
printPeerLists(std::cerr);
mLinkMgr->printPeerLists(std::cerr);
@ -579,7 +582,8 @@ bool p3PeerMgrIMPL::removeFriend(const std::string &id)
rslog(RSL_WARNING, p3peermgrzone, "p3PeerMgr::removeFriend() id: " + id);
std::list<std::string> toRemove; // This is a list of SSLIds.
std::list<std::string> sslid_toRemove; // This is a list of SSLIds.
std::list<std::string> pgpid_toRemove; // This is a list of SSLIds.
{
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
@ -596,7 +600,8 @@ bool p3PeerMgrIMPL::removeFriend(const std::string &id)
#endif
peerState peer = it->second;
toRemove.push_back(it->second.id);
sslid_toRemove.push_back(it->second.id);
pgpid_toRemove.push_back(it->second.gpg_id);
mOthersList[id] = peer;
mStatusChanged = true;
@ -606,13 +611,15 @@ bool p3PeerMgrIMPL::removeFriend(const std::string &id)
}
std::list<std::string>::iterator rit;
for(rit = toRemove.begin(); rit != toRemove.end(); rit++)
{
for(rit = sslid_toRemove.begin(); rit != sslid_toRemove.end(); rit++)
if (mFriendList.end() != (it = mFriendList.find(*rit)))
{
mFriendList.erase(it);
}
}
std::map<std::string,ServicePermissionFlags>::iterator it2 ;
for(rit = pgpid_toRemove.begin(); rit != pgpid_toRemove.end(); rit++)
if (mFriendsPermissionFlags.end() != (it2 = mFriendsPermissionFlags.find(*rit)))
mFriendsPermissionFlags.erase(it2);
#ifdef PEER_DEBUG
std::cerr << "p3PeerMgrIMPL::removeFriend() new mFriendList.size() : " << mFriendList.size() << std::endl;
@ -620,7 +627,7 @@ bool p3PeerMgrIMPL::removeFriend(const std::string &id)
}
std::list<std::string>::iterator rit;
for(rit = toRemove.begin(); rit != toRemove.end(); rit++)
for(rit = sslid_toRemove.begin(); rit != sslid_toRemove.end(); rit++)
{
mLinkMgr->removeFriend(*rit);
}
@ -638,7 +645,7 @@ bool p3PeerMgrIMPL::removeFriend(const std::string &id)
mLinkMgr->printPeerLists(std::cerr);
#endif
return !toRemove.empty();
return !sslid_toRemove.empty();
}
@ -1312,6 +1319,17 @@ bool p3PeerMgrIMPL::saveList(bool &cleanup, std::list<RsItem *>& saveData)
#endif
}
RsPeerServicePermissionItem *sitem = new RsPeerServicePermissionItem ;
for(std::map<std::string,ServicePermissionFlags>::const_iterator it(mFriendsPermissionFlags.begin());it!=mFriendsPermissionFlags.end();++it)
{
sitem->pgp_ids.push_back(it->first) ;
sitem->service_flags.push_back(it->second) ;
}
saveData.push_back(sitem) ;
saveCleanupList.push_back(sitem);
// Now save config for network digging strategies
RsConfigKeyValueSet *vitem = new RsConfigKeyValueSet ;
@ -1414,7 +1432,7 @@ bool p3PeerMgrIMPL::loadList(std::list<RsItem *>& load)
std::cerr << std::endl;
#endif
/* ************* */
addFriend(pitem->pid, pitem->gpg_id, pitem->netMode, pitem->visState, pitem->lastContact);
addFriend(pitem->pid, pitem->gpg_id, pitem->netMode, pitem->visState, pitem->lastContact, RS_SERVICE_PERM_ALL);
setLocation(pitem->pid, pitem->location);
}
@ -1483,6 +1501,23 @@ bool p3PeerMgrIMPL::loadList(std::list<RsItem *>& load)
continue;
}
RsPeerServicePermissionItem *sitem = dynamic_cast<RsPeerServicePermissionItem*>(*it) ;
if(sitem)
{
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
std::cerr << "Loaded service permission item: " << std::endl;
for(uint32_t i=0;i<sitem->pgp_ids.size();++i)
if(AuthGPG::getAuthGPG()->isGPGAccepted(sitem->pgp_ids[i]))
{
mFriendsPermissionFlags[sitem->pgp_ids[i]] = sitem->service_flags[i] ;
std::cerr << " " << sitem->pgp_ids[i] << " - " << sitem->service_flags[i] << std::endl;
}
else
std::cerr << " " << sitem->pgp_ids[i] << " - Not a friend!" << std::endl;
}
delete (*it);
}
@ -1766,6 +1801,52 @@ bool p3PeerMgrIMPL::assignPeersToGroup(const std::string &groupId, const std::li
}
/**********************************************************************
**********************************************************************
******************** Service permission stuff ************************
**********************************************************************
**********************************************************************/
ServicePermissionFlags p3PeerMgrIMPL::servicePermissionFlags_sslid(const std::string& ssl_id)
{
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
std::map<std::string, peerState>::const_iterator it = mFriendList.find(ssl_id);
if(it == mFriendList.end())
return RS_SERVICE_PERM_ALL ;
else
return servicePermissionFlags(it->second.gpg_id) ;
}
ServicePermissionFlags p3PeerMgrIMPL::servicePermissionFlags(const std::string& pgp_id)
{
//
std::map<std::string,ServicePermissionFlags>::const_iterator it = mFriendsPermissionFlags.find( pgp_id ) ;
if(it == mFriendsPermissionFlags.end())
return RS_SERVICE_PERM_ALL ;
else
return it->second ;
}
void p3PeerMgrIMPL::setServicePermissionFlags(const std::string& pgp_id, const ServicePermissionFlags& flags)
{
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
// Check that we have a PGP id. This should not be necessary, but because
// we use std::string, anything can get passed down here.
//
if(pgp_id.length() != 16)
{
std::cerr << "Bad parameter passed to setServicePermissionFlags(): " << pgp_id << std::endl;
return ;
}
mFriendsPermissionFlags[pgp_id] = flags ;
IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/
}
/**********************************************************************
**********************************************************************
******************** Stuff moved from p3peers ************************

View file

@ -26,6 +26,7 @@
#ifndef MRK_PQI_PEER_MANAGER_HEADER
#define MRK_PQI_PEER_MANAGER_HEADER
#include <retroshare/rspeers.h>
#include "pqi/pqimonitor.h"
#include "pqi/pqiipset.h"
#include "pqi/pqiassist.h"
@ -122,7 +123,7 @@ class p3PeerMgr
virtual ~p3PeerMgr() { return; }
virtual bool addFriend(const std::string &ssl_id, const std::string &gpg_id, uint32_t netMode = RS_NET_MODE_UDP,
uint32_t visState = RS_VIS_STATE_STD , time_t lastContact = 0) = 0;
uint32_t visState = RS_VIS_STATE_STD , time_t lastContact = 0,ServicePermissionFlags = RS_SERVICE_PERM_ALL) = 0;
virtual bool removeFriend(const std::string &ssl_id) = 0;
virtual bool isFriend(const std::string &ssl_id) = 0;
@ -141,6 +142,9 @@ virtual bool getGroupInfo(const std::string &groupId, RsGroupInfo &groupInfo)
virtual bool getGroupInfoList(std::list<RsGroupInfo> &groupInfoList) = 0;
virtual bool assignPeersToGroup(const std::string &groupId, const std::list<std::string> &peerIds, bool assign) = 0;
virtual ServicePermissionFlags servicePermissionFlags(const std::string& gpg_id) =0;
virtual ServicePermissionFlags servicePermissionFlags_sslid(const std::string& ssl_id) =0;
virtual void setServicePermissionFlags(const std::string& gpg_id,const ServicePermissionFlags& flags) =0;
/**************** Set Net Info ****************/
/*
@ -210,7 +214,7 @@ class p3PeerMgrIMPL: public p3PeerMgr, public p3Config
/************************************************************************************************/
virtual bool addFriend(const std::string &ssl_id, const std::string &gpg_id, uint32_t netMode = RS_NET_MODE_UDP,
uint32_t visState = RS_VIS_STATE_STD , time_t lastContact = 0);
uint32_t visState = RS_VIS_STATE_STD , time_t lastContact = 0,ServicePermissionFlags = RS_SERVICE_PERM_ALL);
virtual bool removeFriend(const std::string &ssl_id);
virtual bool isFriend(const std::string &ssl_id);
@ -229,6 +233,9 @@ virtual bool getGroupInfo(const std::string &groupId, RsGroupInfo &groupInfo)
virtual bool getGroupInfoList(std::list<RsGroupInfo> &groupInfoList);
virtual bool assignPeersToGroup(const std::string &groupId, const std::list<std::string> &peerIds, bool assign);
virtual ServicePermissionFlags servicePermissionFlags(const std::string& gpg_id) ;
virtual ServicePermissionFlags servicePermissionFlags_sslid(const std::string& ssl_id) ;
virtual void setServicePermissionFlags(const std::string& gpg_id,const ServicePermissionFlags& flags) ;
/**************** Set Net Info ****************/
/*
@ -330,13 +337,15 @@ private:
peerState mOwnState;
std::map<std::string, peerState> mFriendList;
std::map<std::string, peerState> mFriendList; // <SSLid , peerState>
std::map<std::string, peerState> mOthersList;
std::list<RsPeerGroupItem *> groupList;
uint32_t lastGroupId;
std::list<RsItem *> saveCleanupList; /* TEMPORARY LIST WHEN SAVING */
std::map<std::string, ServicePermissionFlags> mFriendsPermissionFlags ; // permission flags for each gpg key
};
#endif // MRK_PQI_PEER_MANAGER_HEADER

View file

@ -384,7 +384,10 @@ bool pqiSSLstore::encryptedSendItems(const std::list<RsItem*>& rsItemList)
{
sizeItem = rsSerialiser->size(*it);
if(!rsSerialiser->serialise(*it, (data+offset),&sizeItem))
{
std::cerr << "(EE) pqiSSLstore::encryptedSendItems(): One item did not serialize. sizeItem=" << sizeItem << ". Dropping the entire file. " << std::endl;
return false;
}
offset += sizeItem;
if (!(bio_flags & BIN_FLAGS_NO_DELETE))