2012-02-13 13:22:35 -05:00
|
|
|
/*
|
|
|
|
* libretroshare/src/services: p3idservice.h
|
|
|
|
*
|
|
|
|
* Identity interface for RetroShare.
|
|
|
|
*
|
|
|
|
* Copyright 2012-2012 by Robert Fernie.
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
2012-10-14 14:32:33 -04:00
|
|
|
* License Version 2.1 as published by the Free Software Foundation.
|
2012-02-13 13:22:35 -05:00
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
|
|
* USA.
|
|
|
|
*
|
|
|
|
* Please report all bugs and problems to "retroshare@lunamutt.com".
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef P3_IDENTITY_SERVICE_HEADER
|
|
|
|
#define P3_IDENTITY_SERVICE_HEADER
|
|
|
|
|
|
|
|
|
2012-10-21 11:48:18 -04:00
|
|
|
#include "retroshare/rsidentity.h" // External Interfaces.
|
|
|
|
#include "gxs/rsgenexchange.h" // GXS service.
|
|
|
|
#include "gxs/rsgixs.h" // Internal Interfaces.
|
2012-02-13 13:22:35 -05:00
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <string>
|
|
|
|
|
2012-11-03 09:15:21 -04:00
|
|
|
#include "util/rsmemcache.h"
|
|
|
|
|
2012-11-05 17:28:08 -05:00
|
|
|
#include "pqi/authgpg.h"
|
|
|
|
|
2012-02-13 13:22:35 -05:00
|
|
|
/*
|
2012-06-07 13:10:47 -04:00
|
|
|
* Identity Service
|
2012-02-13 13:22:35 -05:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
// INTERNAL DATA TYPES.
|
2012-07-29 09:09:36 -04:00
|
|
|
// Describes data stored in GroupServiceString.
|
2012-11-05 17:28:08 -05:00
|
|
|
|
|
|
|
class SSBit
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual bool load(const std::string &input) = 0;
|
|
|
|
virtual std::string save() const = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SSGxsIdPgp: public SSBit
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
SSGxsIdPgp()
|
|
|
|
:idKnown(false), lastCheckTs(0), checkAttempts(0) { return; }
|
|
|
|
|
|
|
|
virtual bool load(const std::string &input);
|
|
|
|
virtual std::string save() const;
|
|
|
|
|
|
|
|
bool idKnown;
|
|
|
|
time_t lastCheckTs;
|
|
|
|
uint32_t checkAttempts;
|
|
|
|
std::string pgpId;
|
|
|
|
};
|
|
|
|
|
|
|
|
class SSGxsIdScore: public SSBit
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
SSGxsIdScore()
|
|
|
|
:score(0) { return; }
|
|
|
|
|
|
|
|
virtual bool load(const std::string &input);
|
|
|
|
virtual std::string save() const;
|
|
|
|
|
|
|
|
int score;
|
|
|
|
};
|
|
|
|
|
|
|
|
class SSGxsIdCumulator: public SSBit
|
2012-07-29 09:09:36 -04:00
|
|
|
{
|
|
|
|
public:
|
2012-11-05 17:28:08 -05:00
|
|
|
SSGxsIdCumulator()
|
|
|
|
:count(0), nullcount(0), sum(0), sumsq(0) { return; }
|
|
|
|
|
|
|
|
virtual bool load(const std::string &input);
|
|
|
|
virtual std::string save() const;
|
|
|
|
|
2012-07-29 09:09:36 -04:00
|
|
|
uint32_t count;
|
|
|
|
uint32_t nullcount;
|
|
|
|
double sum;
|
|
|
|
double sumsq;
|
|
|
|
|
|
|
|
// derived parameters:
|
|
|
|
};
|
|
|
|
|
2012-11-05 17:28:08 -05:00
|
|
|
class SSGxsIdGroup: public SSBit
|
2012-07-29 09:09:36 -04:00
|
|
|
{
|
|
|
|
public:
|
2012-11-05 17:28:08 -05:00
|
|
|
SSGxsIdGroup() { return; }
|
|
|
|
|
|
|
|
virtual bool load(const std::string &input);
|
|
|
|
virtual std::string save() const;
|
|
|
|
|
|
|
|
// pgphash status
|
|
|
|
SSGxsIdPgp pgp;
|
|
|
|
|
|
|
|
// reputation score.
|
|
|
|
SSGxsIdScore score;
|
|
|
|
SSGxsIdCumulator opinion;
|
|
|
|
SSGxsIdCumulator reputation;
|
2012-07-29 09:09:36 -04:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
#define ID_LOCAL_STATUS_FULL_CALC_FLAG 0x00010000
|
|
|
|
#define ID_LOCAL_STATUS_INC_CALC_FLAG 0x00020000
|
|
|
|
|
2012-02-13 13:22:35 -05:00
|
|
|
|
2012-10-21 15:15:46 -04:00
|
|
|
#define MAX_CACHE_SIZE 100 // Small for testing..
|
|
|
|
//#define MAX_CACHE_SIZE 10000 // More useful size
|
|
|
|
|
2012-10-22 16:36:28 -04:00
|
|
|
class RsGxsIdGroupItem;
|
|
|
|
|
2012-10-21 15:15:46 -04:00
|
|
|
class RsGxsIdCache
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
RsGxsIdCache();
|
2012-11-03 07:57:27 -04:00
|
|
|
RsGxsIdCache(const RsGxsIdGroupItem *item, const RsTlvSecurityKey &in_pkey);
|
2012-10-21 15:15:46 -04:00
|
|
|
|
|
|
|
RsGxsId id;
|
|
|
|
std::string name;
|
|
|
|
RsTlvSecurityKey pubkey;
|
|
|
|
double reputation;
|
|
|
|
time_t lastUsedTs;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class LruData
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
RsGxsId key;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
// Not sure exactly what should be inherited here?
|
|
|
|
// Chris - please correct as necessary.
|
2012-02-13 13:22:35 -05:00
|
|
|
|
2012-11-05 17:28:08 -05:00
|
|
|
class p3IdService: public RsGxsIdExchange, public RsIdentity
|
2012-10-14 14:32:33 -04:00
|
|
|
{
|
2012-02-13 13:22:35 -05:00
|
|
|
public:
|
2012-10-14 14:32:33 -04:00
|
|
|
p3IdService(RsGeneralDataService* gds, RsNetworkExchangeService* nes);
|
2012-02-13 13:22:35 -05:00
|
|
|
|
2012-10-28 19:13:15 -04:00
|
|
|
virtual void service_tick(); // needed for background processing.
|
2012-06-07 13:10:47 -04:00
|
|
|
|
2012-06-13 20:27:28 -04:00
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
/* General Interface is provided by RsIdentity / RsGxsIfaceImpl. */
|
2012-06-13 20:27:28 -04:00
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
/* Data Specific Interface */
|
2012-06-13 20:27:28 -04:00
|
|
|
|
2012-10-21 11:48:18 -04:00
|
|
|
// These are exposed via RsIdentity.
|
|
|
|
virtual bool getGroupData(const uint32_t &token, std::vector<RsGxsIdGroup> &groups);
|
2012-06-13 20:27:28 -04:00
|
|
|
|
2012-10-21 11:48:18 -04:00
|
|
|
// These are local - and not exposed via RsIdentity.
|
|
|
|
virtual bool getMsgData(const uint32_t &token, std::vector<RsGxsIdOpinion> &opinions);
|
|
|
|
virtual bool createGroup(uint32_t& token, RsGxsIdGroup &group);
|
|
|
|
virtual bool createMsg(uint32_t& token, RsGxsIdOpinion &opinion);
|
2012-06-13 20:27:28 -04:00
|
|
|
|
2012-10-17 20:28:54 -04:00
|
|
|
/**************** RsIdentity External Interface.
|
|
|
|
* Notes:
|
|
|
|
*/
|
|
|
|
|
2012-10-21 11:48:18 -04:00
|
|
|
virtual bool getNickname(const RsGxsId &id, std::string &nickname);
|
|
|
|
virtual bool getIdDetails(const RsGxsId &id, RsIdentityDetails &details);
|
|
|
|
virtual bool getOwnIds(std::list<RsGxsId> &ownIds);
|
2012-10-17 20:28:54 -04:00
|
|
|
|
|
|
|
//
|
|
|
|
virtual bool submitOpinion(uint32_t& token, RsIdOpinion &opinion);
|
|
|
|
virtual bool createIdentity(uint32_t& token, RsIdentityParameters ¶ms);
|
|
|
|
|
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
/**************** RsGixs Implementation
|
|
|
|
* Notes:
|
|
|
|
* Interface is only suggestion at the moment, will be changed as necessary.
|
|
|
|
* Results should be cached / preloaded for maximum speed.
|
|
|
|
*
|
|
|
|
*/
|
2012-10-21 11:48:18 -04:00
|
|
|
virtual bool haveKey(const RsGxsId &id);
|
|
|
|
virtual bool requestKey(const RsGxsId &id, const std::list<PeerId> &peers);
|
|
|
|
virtual int getKey(const RsGxsId &id, RsTlvSecurityKey &key);
|
2012-11-03 07:57:27 -04:00
|
|
|
|
|
|
|
virtual bool havePrivateKey(const RsGxsId &id);
|
|
|
|
virtual bool requestPrivateKey(const RsGxsId &id);
|
2012-10-21 11:48:18 -04:00
|
|
|
virtual int getPrivateKey(const RsGxsId &id, RsTlvSecurityKey &key);
|
2012-06-13 20:27:28 -04:00
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
/**************** RsGixsReputation Implementation
|
|
|
|
* Notes:
|
|
|
|
* Again should be cached if possible.
|
|
|
|
*/
|
2012-06-13 20:27:28 -04:00
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
// get Reputation.
|
2012-10-21 11:48:18 -04:00
|
|
|
virtual bool getReputation(const RsGxsId &id, const GixsReputation &rep);
|
2012-06-13 20:27:28 -04:00
|
|
|
|
2012-10-28 19:13:15 -04:00
|
|
|
|
|
|
|
protected:
|
|
|
|
|
2012-11-05 17:28:08 -05:00
|
|
|
/** Notifications **/
|
|
|
|
virtual void notifyChanges(std::vector<RsGxsNotify*>& changes);
|
|
|
|
|
|
|
|
/** Overloaded to add PgpIdHash to Group Definition **/
|
|
|
|
virtual void service_CreateGroup(RsGxsGrpItem* grpItem, RsTlvSecurityKeySet& keySet);
|
2012-10-28 19:13:15 -04:00
|
|
|
|
2012-07-06 19:14:18 -04:00
|
|
|
private:
|
2012-06-07 13:10:47 -04:00
|
|
|
|
2012-10-21 15:15:46 -04:00
|
|
|
/************************************************************************
|
|
|
|
* This is the Cache for minimising calls to the DataStore.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
int cache_tick();
|
|
|
|
|
|
|
|
bool cache_request_load(const RsGxsId &id);
|
|
|
|
bool cache_start_load();
|
|
|
|
bool cache_check_loading();
|
|
|
|
bool cache_load_for_token(uint32_t token);
|
|
|
|
|
2012-11-03 10:07:26 -04:00
|
|
|
bool cache_store(const RsGxsIdGroupItem *item);
|
2012-10-21 15:15:46 -04:00
|
|
|
|
|
|
|
time_t mCacheLoad_LastCycle;
|
|
|
|
int mCacheLoad_Status;
|
|
|
|
std::list<RsGxsId> mCacheLoad_ToCache;
|
|
|
|
std::list<uint32_t> mCacheLoad_Tokens;
|
|
|
|
|
2012-11-03 10:07:26 -04:00
|
|
|
// Switching to RsMemCache for Key Caching.
|
|
|
|
RsMemCache<RsGxsId, RsGxsIdCache> mPublicKeyCache;
|
|
|
|
RsMemCache<RsGxsId, RsGxsIdCache> mPrivateKeyCache;
|
|
|
|
|
2012-10-21 15:15:46 -04:00
|
|
|
|
2012-11-03 07:57:27 -04:00
|
|
|
/************************************************************************
|
|
|
|
* Test fns for Caching.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
bool cachetest_tick();
|
|
|
|
bool cachetest_getlist();
|
|
|
|
bool cachetest_request();
|
|
|
|
|
|
|
|
/* MUTEX PROTECTED DATA (mIdMtx - maybe should use a 2nd?) */
|
|
|
|
|
|
|
|
time_t mCacheTest_LastTs;
|
|
|
|
bool mCacheTest_Active;
|
|
|
|
uint32_t mCacheTest_Token;
|
|
|
|
|
2012-11-05 17:28:08 -05:00
|
|
|
/************************************************************************
|
|
|
|
* pgphash processing.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
bool pgphash_tick();
|
|
|
|
bool pgphash_getlist();
|
|
|
|
bool pgphash_request();
|
|
|
|
bool pgphash_process();
|
|
|
|
|
|
|
|
bool checkId(const RsGxsIdGroup &grp, PGPIdType &pgp_id);
|
|
|
|
void getPgpIdList();
|
|
|
|
/* MUTEX PROTECTED DATA (mIdMtx - maybe should use a 2nd?) */
|
|
|
|
|
|
|
|
time_t mHashPgp_LastTs;
|
|
|
|
bool mHashPgp_Active;
|
|
|
|
uint32_t mHashPgp_Token;
|
|
|
|
|
|
|
|
std::map<PGPIdType, PGPFingerprintType> mPgpFingerprintMap;
|
|
|
|
std::list<RsGxsIdGroup> mGroupsToProcess;
|
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
/************************************************************************
|
|
|
|
* Below is the background task for processing opinions => reputations
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2012-02-13 13:22:35 -05:00
|
|
|
virtual void generateDummyData();
|
|
|
|
|
|
|
|
std::string genRandomId();
|
|
|
|
|
2012-07-29 09:09:36 -04:00
|
|
|
int background_tick();
|
|
|
|
bool background_checkTokenRequest();
|
|
|
|
bool background_requestGroups();
|
|
|
|
bool background_requestNewMessages();
|
|
|
|
bool background_processNewMessages();
|
|
|
|
bool background_FullCalcRequest();
|
|
|
|
bool background_processFullCalc();
|
|
|
|
|
|
|
|
bool background_cleanup();
|
|
|
|
|
2012-02-13 13:22:35 -05:00
|
|
|
RsMutex mIdMtx;
|
|
|
|
|
|
|
|
/***** below here is locked *****/
|
2012-07-29 09:09:36 -04:00
|
|
|
bool mLastBgCheck;
|
|
|
|
bool mBgProcessing;
|
|
|
|
|
|
|
|
uint32_t mBgToken;
|
|
|
|
uint32_t mBgPhase;
|
|
|
|
|
|
|
|
std::map<std::string, RsGroupMetaData> mBgGroupMap;
|
|
|
|
std::list<std::string> mBgFullCalcGroups;
|
2012-02-13 13:22:35 -05:00
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
/************************************************************************
|
|
|
|
* Other Data that is protected by the Mutex.
|
|
|
|
*/
|
2012-02-13 13:22:35 -05:00
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
std::vector<RsGxsGroupChange*> mGroupChange;
|
|
|
|
std::vector<RsGxsMsgChange*> mMsgChange;
|
2012-02-13 13:22:35 -05:00
|
|
|
|
|
|
|
};
|
|
|
|
|
2012-10-14 14:32:33 -04:00
|
|
|
#endif // P3_IDENTITY_SERVICE_HEADER
|
|
|
|
|
|
|
|
|
|
|
|
|