Fail gracefully when requesting membership on an unknown circle

This commit is contained in:
Gioacchino Mazzurco 2019-09-27 16:57:07 +02:00
parent ce3e2a2c9d
commit 86957c9843
No known key found for this signature in database
GPG Key ID: A1FBCA3872E87051
2 changed files with 36 additions and 23 deletions

View File

@ -2061,29 +2061,41 @@ void p3GxsCircles::handle_event(uint32_t event_type, const std::string &elabel)
// | | Grp Subscribed: NO | Grp Subscribed: NO |
// +-------------+------------------------------+-----------------------------+
bool p3GxsCircles::pushCircleMembershipRequest(const RsGxsId& own_gxsid,const RsGxsCircleId& circle_id,uint32_t request_type)
bool p3GxsCircles::pushCircleMembershipRequest(
const RsGxsId& own_gxsid, const RsGxsCircleId& circle_id,
uint32_t request_type )
{
#ifdef DEBUG_CIRCLES
std::cerr << "Circle membership request: own_gxsid = " << own_gxsid << ", circle=" << circle_id << ", req type=" << request_type << std::endl;
#endif
// check for some consistency
if(request_type != RsGxsCircleSubscriptionRequestItem::SUBSCRIPTION_REQUEST_SUBSCRIBE && request_type != RsGxsCircleSubscriptionRequestItem::SUBSCRIPTION_REQUEST_UNSUBSCRIBE)
return false ;
std::list<RsGxsId> own_ids ;
if(!rsIdentity->getOwnIds(own_ids))
return false ;
bool found = false ;
for(std::list<RsGxsId>::const_iterator it(own_ids.begin());it!=own_ids.end() && !found;++it)
found = ( (*it) == own_gxsid) ;
Dbg3() << __PRETTY_FUNCTION__ << "own_gxsid = " << own_gxsid
<< ", circle=" << circle_id << ", req type=" << request_type
<< std::endl;
if(!found)
return false ;
// Create a subscribe item
if( request_type !=
RsGxsCircleSubscriptionRequestItem::SUBSCRIPTION_REQUEST_SUBSCRIBE &&
request_type !=
RsGxsCircleSubscriptionRequestItem::SUBSCRIPTION_REQUEST_UNSUBSCRIBE )
{
RsErr() << __PRETTY_FUNCTION__ << " Unknown request type: "
<< request_type << std::endl;
return false;
}
if(!rsIdentity->isOwnId(own_gxsid))
{
RsErr() << __PRETTY_FUNCTION__ << " Cannot generate membership request "
<< "from not-own id: " << own_gxsid << std::endl;
return false;
}
if(!getCirclesInfo(
std::list<RsGxsGroupId>{static_cast<RsGxsGroupId>(circle_id)},
RS_DEFAULT_STORAGE_PARAM(std::vector<RsGxsCircleGroup>) ))
{
RsErr() << __PRETTY_FUNCTION__ << " Cannot generate membership request "
<< "from unknown circle: " << circle_id << std::endl;
return false;
}
// Create a subscribe item
RsGxsCircleSubscriptionRequestItem *s = new RsGxsCircleSubscriptionRequestItem ;

View File

@ -26,12 +26,11 @@
#include "retroshare/rsgxscircles.h" // External Interfaces.
#include "gxs/rsgenexchange.h" // GXS service.
#include "gxs/rsgixs.h" // Internal Interfaces.
#include "services/p3idservice.h" // For constructing Caches
#include "gxs/gxstokenqueue.h"
#include "util/rstickevent.h"
#include "util/rsmemcache.h"
#include "util/rsdebug.h"
#include <map>
#include <string>
@ -321,4 +320,6 @@ virtual RsServiceInfo getServiceInfo();
uint32_t mDummyIdToken;
std::list<RsGxsId> mDummyPgpLinkedIds;
std::list<RsGxsId> mDummyOwnIds;
RS_SET_CONTEXT_DEBUG_LEVEL(2)
};