- Added service_createGroup function which gives access to group keys and grpItem just before GXS group creation

- Temp fix for GXS services hang on dummy data generation. Given each GXS service own thread and chunked grp creation (separate thread may need to be permanent, no obvious around move grp gen cost away from critical path of tick, but unscientifically increases each services thread tick period to reduce cpu cost)

- change grpId assignment from hash of grp data to admin keyid

git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-gxs-b1@5772 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
chrisparker126 2012-11-04 01:38:48 +00:00
parent e42cc1123c
commit 49096d29d2
3 changed files with 189 additions and 93 deletions

View file

@ -57,6 +57,22 @@ RsGenExchange::~RsGenExchange()
} }
void RsGenExchange::run()
{
double timeDelta = 0.06; // slow tick
while(true)
{
tick();
#ifndef WINDOWS_SYS
usleep((int) (timeDelta * 1000000));
#else
Sleep((int) (timeDelta * 1000));
#endif
}
}
void RsGenExchange::tick() void RsGenExchange::tick()
{ {
@ -125,7 +141,7 @@ bool RsGenExchange::acknowledgeTokenGrp(const uint32_t& token,
return true; return true;
} }
bool RsGenExchange::createGroup(RsNxsGrp *grp) void RsGenExchange::generateGroupKeys(RsTlvSecurityKeySet& keySet)
{ {
/* create Keys */ /* create Keys */
@ -149,6 +165,17 @@ bool RsGenExchange::createGroup(RsNxsGrp *grp)
GxsSecurity::setRSAPublicKey(pubKey, rsa_publish_pub); GxsSecurity::setRSAPublicKey(pubKey, rsa_publish_pub);
GxsSecurity::setRSAPrivateKey(privPubKey, rsa_publish); GxsSecurity::setRSAPrivateKey(privPubKey, rsa_publish);
adminKey.startTS = time(NULL);
adminKey.endTS = 0; /* no end */
privAdminKey.startTS = time(NULL);
privAdminKey.endTS = 0; /* no end */
pubKey.startTS = time(NULL);
pubKey.endTS = 0; /* no end */
privPubKey.startTS = time(NULL);
privPubKey.endTS = 0; /* no end */
// for now all public // for now all public
adminKey.keyFlags = RSTLV_KEY_DISTRIB_ADMIN | RSTLV_KEY_TYPE_PUBLIC_ONLY; adminKey.keyFlags = RSTLV_KEY_DISTRIB_ADMIN | RSTLV_KEY_TYPE_PUBLIC_ONLY;
@ -158,14 +185,46 @@ bool RsGenExchange::createGroup(RsNxsGrp *grp)
pubKey.keyFlags = RSTLV_KEY_DISTRIB_PUBLIC | RSTLV_KEY_TYPE_PUBLIC_ONLY; pubKey.keyFlags = RSTLV_KEY_DISTRIB_PUBLIC | RSTLV_KEY_TYPE_PUBLIC_ONLY;
privPubKey.keyFlags = RSTLV_KEY_DISTRIB_PRIVATE | RSTLV_KEY_TYPE_FULL; privPubKey.keyFlags = RSTLV_KEY_DISTRIB_PRIVATE | RSTLV_KEY_TYPE_FULL;
adminKey.startTS = time(NULL); keySet.keys[adminKey.keyId] = adminKey;
adminKey.endTS = 0; /* no end */ keySet.keys[pubKey.keyId] = pubKey;
keySet.keys[privAdminKey.keyId] = privAdminKey;
keySet.keys[privPubKey.keyId] = privPubKey;
// clean up
RSA_free(rsa_admin);
RSA_free(rsa_admin_pub);
RSA_free(rsa_publish);
RSA_free(rsa_publish_pub);
}
bool RsGenExchange::createGroup(RsNxsGrp *grp, RsTlvSecurityKeySet& keySet)
{
RsGxsGrpMetaData* meta = grp->metaData; RsGxsGrpMetaData* meta = grp->metaData;
/* add public keys to grp */ /* add keys to grp */
meta->keys = keySet;
meta->keys.keys[adminKey.keyId] = adminKey; // find private admin key
meta->keys.keys[pubKey.keyId] = pubKey; RsTlvSecurityKey privAdminKey;
std::map<std::string, RsTlvSecurityKey>::iterator mit = keySet.keys.begin();
for(; mit != keySet.keys.end(); mit++)
{
RsTlvSecurityKey& pk = mit->second;
if(pk.keyFlags & (RSTLV_KEY_DISTRIB_ADMIN | RSTLV_KEY_TYPE_FULL))
{
privAdminKey = pk;
break;
}
}
if(mit == keySet.keys.end())
return false;
// group is self signing // group is self signing
// for the creation of group signature // for the creation of group signature
@ -185,32 +244,12 @@ bool RsGenExchange::createGroup(RsNxsGrp *grp)
RsTlvKeySignature adminSign; RsTlvKeySignature adminSign;
bool ok = GxsSecurity::getSignature(allGrpData, allGrpDataLen, &privAdminKey, adminSign); bool ok = GxsSecurity::getSignature(allGrpData, allGrpDataLen, &privAdminKey, adminSign);
/* now add private keys to grp */
meta->keys.keys[privAdminKey.keyId] = privAdminKey;
meta->keys.keys[privPubKey.keyId] = privPubKey;
// add admin sign to grpMeta // add admin sign to grpMeta
meta->signSet.keySignSet[GXS_SERV::FLAG_AUTHEN_ADMIN] = adminSign; meta->signSet.keySignSet[GXS_SERV::FLAG_AUTHEN_ADMIN] = adminSign;
pqihash hash; grp->grpId = meta->mGroupId = privAdminKey.keyId;
// get hash of msg data to create msg id
hash.addData(allGrpData, allGrpDataLen);
hash.Complete(meta->mGroupId);
grp->grpId = meta->mGroupId;
adminKey.TlvClear();
privAdminKey.TlvClear();
privPubKey.TlvClear();
pubKey.TlvClear();
// clean up // clean up
RSA_free(rsa_admin);
RSA_free(rsa_admin_pub);
RSA_free(rsa_publish);
RSA_free(rsa_publish_pub);
delete[] allGrpData; delete[] allGrpData;
delete[] metaData; delete[] metaData;
@ -684,20 +723,41 @@ void RsGenExchange::publishMsgs()
mMsgsToPublish.clear(); mMsgsToPublish.clear();
} }
void RsGenExchange::service_CreateGroup(RsGxsGrpItem* grpItem, RsTlvSecurityKeySet& keySet)
{
#ifdef GEN_EXCH_DEBUG
std::cerr << "RsGenExchange::service_CreateGroup(): Does nothing"
<< std::endl;
#endif
return;
}
#define GEN_EXCH_GRP_CHUNK 3
void RsGenExchange::publishGrps() void RsGenExchange::publishGrps()
{ {
RsStackMutex stack(mGenMtx); RsStackMutex stack(mGenMtx);
std::map<uint32_t, RsGxsGrpItem*>::iterator mit = mGrpsToPublish.begin(); std::map<uint32_t, RsGxsGrpItem*>::iterator mit = mGrpsToPublish.begin();
std::vector<uint32_t> toRemove;
int i = 0;
for(; mit != mGrpsToPublish.end(); mit++) for(; mit != mGrpsToPublish.end(); mit++)
{ {
toRemove.push_back(mit->first);
i++;
if(i > GEN_EXCH_GRP_CHUNK) break;
RsNxsGrp* grp = new RsNxsGrp(mServType); RsNxsGrp* grp = new RsNxsGrp(mServType);
RsGxsGrpItem* grpItem = mit->second; RsGxsGrpItem* grpItem = mit->second;
uint32_t size = mSerialiser->size(grpItem); uint32_t size = mSerialiser->size(grpItem);
RsTlvSecurityKeySet keySet;
generateGroupKeys(keySet);
service_CreateGroup(grpItem, keySet);
char gData[size]; char gData[size];
bool ok = mSerialiser->serialise(grpItem, gData, &size); bool ok = mSerialiser->serialise(grpItem, gData, &size);
grp->grp.setBinData(gData, size); grp->grp.setBinData(gData, size);
@ -708,7 +768,7 @@ void RsGenExchange::publishGrps()
grpItem->meta.mPublishTs = time(NULL); grpItem->meta.mPublishTs = time(NULL);
*(grp->metaData) = grpItem->meta; *(grp->metaData) = grpItem->meta;
grp->metaData->mSubscribeFlags = GXS_SERV::GROUP_SUBSCRIBE_ADMIN; grp->metaData->mSubscribeFlags = GXS_SERV::GROUP_SUBSCRIBE_ADMIN;
ok &= createGroup(grp); ok &= createGroup(grp, keySet);
size = grp->metaData->serial_size(); size = grp->metaData->serial_size();
char mData[size]; char mData[size];
grp->metaData->mGroupId = grp->grpId; grp->metaData->mGroupId = grp->grpId;
@ -737,11 +797,15 @@ void RsGenExchange::publishGrps()
} }
delete grpItem; delete grpItem;
} }
// clear grp list as we're done publishing them and entries // clear grp list as we're done publishing them and entries
// are invalid // are invalid
mGrpsToPublish.clear();
for(int i = 0; i < toRemove.size(); i++)
mGrpsToPublish.erase(toRemove[i]);
} }
@ -801,13 +865,18 @@ void RsGenExchange::createDummyGroup(RsGxsGrpItem *grpItem)
bool ok = mSerialiser->serialise(grpItem, gData, &size); bool ok = mSerialiser->serialise(grpItem, gData, &size);
grp->grp.setBinData(gData, size); grp->grp.setBinData(gData, size);
RsTlvSecurityKeySet keySet;
generateGroupKeys(keySet);
service_CreateGroup(grpItem, keySet);
if(ok) if(ok)
{ {
grp->metaData = new RsGxsGrpMetaData(); grp->metaData = new RsGxsGrpMetaData();
grpItem->meta.mPublishTs = time(NULL); grpItem->meta.mPublishTs = time(NULL);
*(grp->metaData) = grpItem->meta; *(grp->metaData) = grpItem->meta;
grp->metaData->mSubscribeFlags = ~GXS_SERV::GROUP_SUBSCRIBE_MASK; grp->metaData->mSubscribeFlags = ~GXS_SERV::GROUP_SUBSCRIBE_MASK;
createGroup(grp); createGroup(grp, keySet);
size = grp->metaData->serial_size(); size = grp->metaData->serial_size();
char mData[size]; char mData[size];
grp->metaData->mGroupId = grp->grpId; grp->metaData->mGroupId = grp->grpId;

View file

@ -64,7 +64,7 @@ typedef std::map<RsGxsGroupId, std::vector<RsMsgMetaData> > GxsMsgMetaMap;
class RsGixs; class RsGixs;
class RsGenExchange : public RsGxsService, public RsNxsObserver class RsGenExchange : public RsGxsService, public RsNxsObserver, public RsThread
{ {
public: public:
@ -117,6 +117,8 @@ public:
*/ */
RsTokenService* getTokenService(); RsTokenService* getTokenService();
void run();
public: public:
/** data access functions **/ /** data access functions **/
@ -265,6 +267,20 @@ protected:
*/ */
void publishMsg(uint32_t& token, RsGxsMsgItem* msgItem); void publishMsg(uint32_t& token, RsGxsMsgItem* msgItem);
/*!
* This represents the group before its signature is calculated
* Reimplement this function if you need to access keys to further extend
* security of your group items using keyset properties
* @warning do not modify keySet!
* @param grp The group which is stored by GXS prior
* service can make specific modifications need
* in particular access to its keys and meta
* @param keySet this is the key set used to define the group
* contains private and public admin and publish keys
* (use key flags to distinguish)
*/
virtual void service_CreateGroup(RsGxsGrpItem* grpItem, RsTlvSecurityKeySet& keySet);
public: public:
/*! /*!
@ -355,7 +371,7 @@ private:
* by assigning it a groupId and signature via SHA1 and EVP_sign respectively * by assigning it a groupId and signature via SHA1 and EVP_sign respectively
* @param grp Nxs group to create * @param grp Nxs group to create
*/ */
bool createGroup(RsNxsGrp* grp); bool createGroup(RsNxsGrp* grp, RsTlvSecurityKeySet& keySet);
/*! /*!
* This completes the creation of an instance on RsNxsMsg * This completes the creation of an instance on RsNxsMsg
@ -373,6 +389,12 @@ private:
*/ */
bool locked_validateGrpMetaChange(GrpLocMetaData&); bool locked_validateGrpMetaChange(GrpLocMetaData&);
/*!
* Generate a set of keys that can define a GXS group
* @param keySet this is set generated keys
*/
void generateGroupKeys(RsTlvSecurityKeySet& keySet);
private: private:
RsMutex mGenMtx; RsMutex mGenMtx;

View file

@ -1830,7 +1830,7 @@ RsTurtle *rsTurtle = NULL ;
#include "services/p3photoserviceV2.h" #include "services/p3photoserviceV2.h"
// Not too many to convert now! // Not too many to convert now!
//#include "services/p3wikiserviceVEG.h" #include "services/p3wikiserviceVEG.h"
#include "services/p3wireVEG.h" #include "services/p3wireVEG.h"
//#include "services/p3idserviceVEG.h" //#include "services/p3idserviceVEG.h"
#include "services/p3forumsVEG.h" #include "services/p3forumsVEG.h"
@ -2281,8 +2281,8 @@ int RsServer::StartupRetroShare()
#ifdef ENABLE_GXS_SERVICES #ifdef ENABLE_GXS_SERVICES
// Testing New Cache Services. // Testing New Cache Services.
//p3WikiServiceVEG *mWikis = new p3WikiServiceVEG(RS_SERVICE_GXSV1_TYPE_WIKI); p3WikiServiceVEG *mWikis = new p3WikiServiceVEG(RS_SERVICE_GXSV1_TYPE_WIKI);
//pqih -> addService(mWikis); pqih -> addService(mWikis);
// Testing New Cache Services. // Testing New Cache Services.
p3WireVEG *mWire = new p3WireVEG(RS_SERVICE_GXSV1_TYPE_WIRE); p3WireVEG *mWire = new p3WireVEG(RS_SERVICE_GXSV1_TYPE_WIRE);
@ -2371,12 +2371,17 @@ int RsServer::StartupRetroShare()
/*** start up GXS core runner ***/ /*** start up GXS core runner ***/
GxsCoreServer* mGxsCore = new GxsCoreServer(); // GxsCoreServer* mGxsCore = new GxsCoreServer();
mGxsCore->addService(mGxsIdService); //mGxsCore->addService(mGxsIdService);
#if ENABLE_OTHER_GXS_SERVICES #if ENABLE_OTHER_GXS_SERVICES
mGxsCore->addService(mPhotoV2); createThread(*mGxsIdService);
mGxsCore->addService(mPosted); createThread(*mPhotoV2);
mGxsCore->addService(mWiki); createThread(*mPosted);
createThread(*mWiki);
//
// mGxsCore->addService(mPhotoV2);
// mGxsCore->addService(mPosted);
// mGxsCore->addService(mWiki);
#endif #endif
// cores ready start up GXS net servers // cores ready start up GXS net servers
@ -2396,7 +2401,7 @@ int RsServer::StartupRetroShare()
#endif #endif
// start up gxs core server // start up gxs core server
createThread(*mGxsCore); //createThread(*mGxsCore);
#endif #endif