Made key exchange more stable.

removed restore key function
sorry introduced lock with my last commit


git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@3924 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
chrisparker126 2010-12-20 16:03:04 +00:00
parent 35f91f5e07
commit 5bc8e68059
6 changed files with 102 additions and 36 deletions

View File

@ -251,6 +251,13 @@ virtual bool channelEditInfo(std::string chId, ChannelInfo &ci) = 0;
*/ */
virtual void getPubKeysAvailableGrpIds(std::list<std::string>& chanIds) = 0; virtual void getPubKeysAvailableGrpIds(std::list<std::string>& chanIds) = 0;
/*!
*
*
*
*/
//virtual void setPrivateChannelDir(const std::string&) = 0;
}; };

View File

@ -65,7 +65,7 @@ RsChannels *rsChannels = NULL;
/* remember 2^16 = 64K max units in store period. /* remember 2^16 = 64K max units in store period.
* PUBPERIOD * 2^16 = max STORE PERIOD */ * PUBPERIOD * 2^16 = max STORE PERIOD */
#define CHANNEL_STOREPERIOD (30*24*3600) /* 30 * 24 * 3600 - secs in a 30 day month */ #define CHANNEL_STOREPERIOD (30*24*3600) /* 30 * 24 * 3600 - secs in a 30 day month */
#define CHANNEL_PUBPERIOD 600 /* 10 minutes ... (max = 455 days) */ #define CHANNEL_PUBPERIOD 120 /* 2 minutes ... (max = 455 days) */
#define MAX_AUTO_DL 1E9 /* auto download of attachment limit; 1 GIG */ #define MAX_AUTO_DL 1E9 /* auto download of attachment limit; 1 GIG */
p3Channels::p3Channels(uint16_t type, CacheStrapper *cs, p3Channels::p3Channels(uint16_t type, CacheStrapper *cs,
@ -658,9 +658,9 @@ bool p3Channels::locked_eventDuplicateMsg(GroupInfo *grp, RsDistribMsg *msg, std
// tho if empty don't bother // tho if empty don't bother
if(!chanMsg->attachment.items.empty()){ if(!chanMsg->attachment.items.empty()){
getChannelInfo(grpId, cInfo);
if(cInfo.channelFlags & RS_DISTRIB_PRIVATE)
if(grp->flags & RS_DISTRIB_PRIVATE)
chanPrivate = true; chanPrivate = true;
} }
@ -679,7 +679,7 @@ bool p3Channels::locked_eventDuplicateMsg(GroupInfo *grp, RsDistribMsg *msg, std
// send to download directory if file is private // send to download directory if file is private
if(chanPrivate){ if(chanPrivate){
localpath = mChannelsDir + "/" + channelname; localpath = mChannelsDir;
flags = RS_FILE_HINTS_BACKGROUND | RS_FILE_HINTS_EXTRA; flags = RS_FILE_HINTS_BACKGROUND | RS_FILE_HINTS_EXTRA;
}else{ }else{

View File

@ -79,6 +79,7 @@ virtual bool channelRestoreKeys(std::string chId);
virtual bool channelShareKeys(std::string chId, std::list<std::string>& peers); virtual bool channelShareKeys(std::string chId, std::list<std::string>& peers);
virtual bool channelEditInfo(std::string chId, ChannelInfo &ci); virtual bool channelEditInfo(std::string chId, ChannelInfo &ci);
virtual void getPubKeysAvailableGrpIds(std::list<std::string>& grpIds); virtual void getPubKeysAvailableGrpIds(std::list<std::string>& grpIds);
//virtual void setPrivateChannelDir(const std::string dirName);
/***************************************************************************************/ /***************************************************************************************/

View File

@ -96,7 +96,7 @@ int p3GroupDistrib::tick()
{ {
RsStackMutex stack(distribMtx); /**** STACK LOCKED MUTEX ****/ RsStackMutex stack(distribMtx); /**** STACK LOCKED MUTEX ****/
toPublish = (mPendingPublish.size() > 0) && (now > (time_t) (mPubPeriod + mLastPublishTime)); toPublish = ((mPendingPublish.size() > 0) || (mPendingPubKeyRecipients.size() > 0)) && (now > (time_t) (mPubPeriod + mLastPublishTime));
} }
@ -136,19 +136,8 @@ int p3GroupDistrib::tick()
bool toReceive = receivedItems(); bool toReceive = receivedItems();
if(toReceive){ if(toReceive){
RsStackMutex stack(distribMtx);
locked_receivePubKeys();
}
{
RsStackMutex stack(distribMtx);
toReceive = (mRecvdPubKeys.size() > 0) && (now > (time_t) (mPubPeriod + mLastRecvdKeyTime));
if(toReceive)
locked_loadRecvdPubKeys();
receivePubKeys();
} }
return 0; return 0;
@ -513,23 +502,44 @@ void p3GroupDistrib::loadGroupKey(RsDistribGrpKey *newKey)
std::map<std::string, GroupInfo>::iterator it; std::map<std::string, GroupInfo>::iterator it;
it = mGroups.find(gid); it = mGroups.find(gid);
//
if (it == mGroups.end()) if (it == mGroups.end())
{ {
#ifdef DISTRIB_DEBUG #ifdef DISTRIB_DEBUG
std::cerr << "p3GroupDistrib::loadGroupKey() Group Not Found - discarding Key"; std::cerr << "p3GroupDistrib::loadGroupKey() Group Not Found - Checking to see if shared Key";
std::cerr << std::endl; std::cerr << std::endl;
#endif #endif
// if this is an in-date publish key then keep to see if group arrives later // if this is an in-date full publish key then keep to see if group arrives later
if(((time_t)(newKey->key.startTS + mStorePeriod) > time(NULL)) && !(newKey->key.keyFlags & RSTLV_KEY_DISTRIB_ADMIN)) if(((time_t)(newKey->key.startTS + mStorePeriod) > time(NULL)) && (newKey->key.keyFlags & RSTLV_KEY_TYPE_FULL)){
// make sure key does not exist
if(mRecvdPubKeys.find(gid) == mRecvdPubKeys.end()){
mRecvdPubKeys.insert(std::pair<std::string, RsDistribGrpKey*>(gid, newKey)); mRecvdPubKeys.insert(std::pair<std::string, RsDistribGrpKey*>(gid, newKey));
else mPubKeyAvailableGrpId.push_back(gid);
delete newKey; }else{
#ifdef DISTRIB_DEBUG
std::cerr << "p3GroupDistrib::loadGroupKey() Key already received; discarding";
std::cerr << std::endl;
#endif
delete newKey;
}
}
else{
#ifdef DISTRIB_DEBUG
std::cerr << "p3GroupDistrib::loadGroupKey() Key out of date: discarding";
std::cerr << std::endl;
#endif
delete newKey;
}
return; return;
} }
/* have the group -> add in the key */ /* have the group -> add in the key */
bool updateOk = false; bool updateOk = false;
if (newKey->key.keyFlags & RSTLV_KEY_DISTRIB_ADMIN) if (newKey->key.keyFlags & RSTLV_KEY_DISTRIB_ADMIN)
@ -548,7 +558,7 @@ void p3GroupDistrib::loadGroupKey(RsDistribGrpKey *newKey)
} }
else else
{ {
if(!locked_updateGroupPublishKey(it->second, newKey)) if(!locked_updateGroupPublishKey(it->second, newKey))
{ {
#ifdef DISTRIB_DEBUG #ifdef DISTRIB_DEBUG
std::cerr << "p3GroupDistrib::loadGroupKey() Failed Publish Key Update"; std::cerr << "p3GroupDistrib::loadGroupKey() Failed Publish Key Update";
@ -559,8 +569,46 @@ void p3GroupDistrib::loadGroupKey(RsDistribGrpKey *newKey)
{ {
updateOk = true; updateOk = true;
} }
} }
std::map<std::string, RsDistribGrpKey* >::iterator kit;
std::list<std::string>::iterator sit;
bool canAdd = false;
// check to see if client has received a private publish key
if(mRecvdPubKeys.end() != (kit = mRecvdPubKeys.find(gid))){
if(!locked_updateGroupPublishKey(it->second, kit->second)){
#ifdef DISTRIB_DEBUG
std::cerr << "p3GroupDistrib::loadGroupKey() Failed Recvd Publish Key Update";
std::cerr << std::endl;
#endif
}else{
#ifdef DISTRIB_DEBUG
std::cerr << "p3GroupDistrib::loadGroupKey() Recvd Publish Key Update";
std::cerr << std::endl;
#endif
sit = mPubKeyAvailableGrpId.begin();
for(; sit != mPubKeyAvailableGrpId.end(); sit++){
if(gid == *sit)
canAdd = true;
}
if(canAdd)
mPubKeyAvailableGrpId.push_back(gid);
mRecvdPubKeys.erase(gid);
updateOk = true;
}
}
if (updateOk) if (updateOk)
{ {
locked_notifyGroupChanged(it->second, GRP_LOAD_KEY); locked_notifyGroupChanged(it->second, GRP_LOAD_KEY);
@ -1230,8 +1278,8 @@ bool p3GroupDistrib::subscribeToGroup(const std::string &grpId, bool subscrib
{ {
git->second.flags |= RS_DISTRIB_SUBSCRIBED; git->second.flags |= RS_DISTRIB_SUBSCRIBED;
if(attemptPublishKeysRecvd(git->second)) // if(attemptPublishKeysRecvd(git->second))
git->second.flags |= RS_DISTRIB_PUBLISH; // git->second.flags |= RS_DISTRIB_PUBLISH;
locked_notifyGroupChanged(git->second, GRP_SUBSCRIBED); locked_notifyGroupChanged(git->second, GRP_SUBSCRIBED);
mGroupsRepublish = true; mGroupsRepublish = true;
@ -1251,8 +1299,9 @@ bool p3GroupDistrib::subscribeToGroup(const std::string &grpId, bool subscrib
{ {
for(pit = git->second.sources.begin(); for(pit = git->second.sources.begin();
pit != git->second.sources.end(); pit++) pit != git->second.sources.end(); pit++)
{ {
locked_eventDuplicateMsg(&(git->second), mit->second, *pit); if(*pit != mOwnId)
locked_eventDuplicateMsg(&(git->second), mit->second, *pit);
} }
} }
} }
@ -2063,7 +2112,7 @@ void p3GroupDistrib::locked_sharePubKey(){
} }
void p3GroupDistrib::locked_receivePubKeys(){ void p3GroupDistrib::receivePubKeys(){
RsItem* item; RsItem* item;
@ -2082,7 +2131,9 @@ void p3GroupDistrib::locked_receivePubKeys(){
std::cerr << "Got key Item" << std::endl; std::cerr << "Got key Item" << std::endl;
#endif #endif
if(key_item->key.keyFlags & RSTLV_KEY_TYPE_FULL){ if(key_item->key.keyFlags & RSTLV_KEY_TYPE_FULL){
mRecvdPubKeys[key_item->grpId] = key_item;
loadGroupKey(key_item);
} }
else{ else{
std::cerr << "p3GroupDistrib::locked_receiveKeys():" << "Not full public key" std::cerr << "p3GroupDistrib::locked_receiveKeys():" << "Not full public key"
@ -2094,8 +2145,14 @@ void p3GroupDistrib::locked_receivePubKeys(){
} }
} }
if(!mRecvdPubKeys.empty())
IndicateConfigChanged(); RsStackMutex stack(distribMtx);
// indicate config changed and also record the groups keys received for
if(!mRecvdPubKeys.empty())
IndicateConfigChanged();
return; return;
} }

View File

@ -507,11 +507,12 @@ class p3GroupDistrib: public CacheSource, public CacheStore, public p3Config, pu
/** /**
* Attempt to receive publication keys * Attempt to receive publication keys
*/ */
virtual void locked_receivePubKeys(); virtual void receivePubKeys();
/*! /*!
* utility function to check whether grps exist * utility function to check whether grps exist
* for private publish keys received * for private publish keys received
* @deprecated
*/ */
virtual void locked_loadRecvdPubKeys(); virtual void locked_loadRecvdPubKeys();

View File

@ -172,8 +172,8 @@ void ChannelFeed::channelListCustomPopupMenu( QPoint point )
QAction *channeldetailsAct = new QAction(QIcon(":/images/info16.png"), tr( "Show Channel Details" ), &contextMnu); QAction *channeldetailsAct = new QAction(QIcon(":/images/info16.png"), tr( "Show Channel Details" ), &contextMnu);
connect( channeldetailsAct , SIGNAL( triggered() ), this, SLOT( showChannelDetails() ) ); connect( channeldetailsAct , SIGNAL( triggered() ), this, SLOT( showChannelDetails() ) );
QAction *restoreKeysAct = new QAction(QIcon(":/images/settings16.png"), tr("Restore Publish Rights for Channel" ), &contextMnu); //QAction *restoreKeysAct = new QAction(QIcon(":/images/settings16.png"), tr("Restore Publish Rights for Channel" ), &contextMnu);
connect( restoreKeysAct , SIGNAL( triggered() ), this, SLOT( restoreChannelKeys() ) ); //connect( restoreKeysAct , SIGNAL( triggered() ), this, SLOT( restoreChannelKeys() ) );
QAction *editChannelDetailAct = new QAction(QIcon(":/images/edit_16.png"), tr("Edit Channel Details"), &contextMnu); QAction *editChannelDetailAct = new QAction(QIcon(":/images/edit_16.png"), tr("Edit Channel Details"), &contextMnu);
connect( editChannelDetailAct, SIGNAL( triggered() ), this, SLOT( editChannelDetail() ) ); connect( editChannelDetailAct, SIGNAL( triggered() ), this, SLOT( editChannelDetail() ) );
@ -197,12 +197,12 @@ void ChannelFeed::channelListCustomPopupMenu( QPoint point )
contextMnu.addAction( unsubscribechannelAct ); contextMnu.addAction( unsubscribechannelAct );
contextMnu.addSeparator(); contextMnu.addSeparator();
contextMnu.addAction( channeldetailsAct ); contextMnu.addAction( channeldetailsAct );
contextMnu.addAction( restoreKeysAct ); // contextMnu.addAction( restoreKeysAct );
} else { } else {
contextMnu.addAction( subscribechannelAct ); contextMnu.addAction( subscribechannelAct );
contextMnu.addSeparator(); contextMnu.addSeparator();
contextMnu.addAction( channeldetailsAct ); contextMnu.addAction( channeldetailsAct );
contextMnu.addAction( restoreKeysAct ); // contextMnu.addAction( restoreKeysAct );
} }
contextMnu.exec(QCursor::pos()); contextMnu.exec(QCursor::pos());