2012-02-13 13:22:35 -05:00
# ifndef RETROSHARE_IDENTITY_GUI_INTERFACE_H
# define RETROSHARE_IDENTITY_GUI_INTERFACE_H
/*
* libretroshare / src / retroshare : rsidentity . h
*
* RetroShare C + + Interface .
*
* 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 " .
*
*/
# include <inttypes.h>
# include <string>
# include <list>
2012-10-21 11:48:18 -04:00
2013-03-06 18:33:23 -05:00
# include "retroshare/rstokenservice.h"
2013-02-28 16:58:38 -05:00
# include "retroshare/rsgxsifacehelper.h"
2015-10-11 21:41:35 -04:00
# include "retroshare/rsreputations.h"
2014-03-17 16:56:06 -04:00
# include "retroshare/rsids.h"
2015-01-25 17:09:12 -05:00
# include "serialiser/rstlvimage.h"
# include "retroshare/rsgxscommon.h"
2012-06-08 09:52:32 -04:00
2012-02-13 13:22:35 -05:00
/* The Main Interface Class - for information about your Peers */
class RsIdentity ;
extern RsIdentity * rsIdentity ;
2012-11-05 17:28:08 -05:00
// GroupFlags: Only one so far:
2017-02-07 14:15:55 -05:00
// The deprecated flag overlaps the privacy flags for mGroupFlags. This is an error that should be fixed. For the sake of keeping some
// backward compatibility, we need to make the change step by step.
2017-02-07 16:04:07 -05:00
# define RSGXSID_GROUPFLAG_REALID_kept_for_compatibility 0x0001
# define RSGXSID_GROUPFLAG_REALID 0x0100
2012-11-05 17:28:08 -05:00
// THESE ARE FLAGS FOR INTERFACE.
2012-02-13 13:22:35 -05:00
# define RSID_TYPE_MASK 0xff00
# define RSID_RELATION_MASK 0x00ff
# define RSID_TYPE_REALID 0x0100
# define RSID_TYPE_PSEUDONYM 0x0200
# define RSID_RELATION_YOURSELF 0x0001
# define RSID_RELATION_FRIEND 0x0002
# define RSID_RELATION_FOF 0x0004
# define RSID_RELATION_OTHER 0x0008
# define RSID_RELATION_UNKNOWN 0x0010
2013-10-20 05:43:30 -04:00
# define RSRECOGN_MAX_TAGINFO 5
2015-05-02 03:57:59 -04:00
// Unicode symbols. NOT utf-8 bytes, because of multi byte characters
2015-04-09 15:53:01 -04:00
# define RSID_MAXIMUM_NICKNAME_SIZE 30
2016-08-06 11:15:56 -04:00
# define RSID_MINIMUM_NICKNAME_SIZE 2
2015-04-09 15:53:01 -04:00
2012-02-13 13:22:35 -05:00
std : : string rsIdTypeToString ( uint32_t idtype ) ;
2015-11-19 21:14:32 -05:00
static const uint32_t RS_IDENTITY_FLAGS_IS_A_CONTACT = 0x0001 ;
static const uint32_t RS_IDENTITY_FLAGS_PGP_LINKED = 0x0002 ;
static const uint32_t RS_IDENTITY_FLAGS_PGP_KNOWN = 0x0004 ;
static const uint32_t RS_IDENTITY_FLAGS_IS_OWN_ID = 0x0008 ;
2016-06-17 22:21:06 -04:00
static const uint32_t RS_IDENTITY_FLAGS_IS_DEPRECATED = 0x0010 ; // used to denote keys with deprecated fingerprint format.
2015-11-19 21:14:32 -05:00
2014-02-19 06:08:37 -05:00
class GxsReputation
{
public :
GxsReputation ( ) ;
bool updateIdScore ( bool pgpLinked , bool pgpKnown ) ;
bool update ( ) ; // checks ranges and calculates overall score.
int mOverallScore ;
int mIdScore ; // PGP, Known, etc.
int mOwnOpinion ;
int mPeerOpinion ;
} ;
2012-10-21 11:48:18 -04:00
class RsGxsIdGroup
2012-02-13 13:22:35 -05:00
{
public :
2016-01-01 22:36:07 -05:00
RsGxsIdGroup ( ) : mLastUsageTS ( 0 ) , mPgpKnown ( false ) , mIsAContact ( false ) { return ; }
2014-04-05 00:48:52 -04:00
~ RsGxsIdGroup ( ) { return ; }
2012-02-13 13:22:35 -05:00
2012-06-13 20:27:28 -04:00
RsGroupMetaData mMeta ;
// In GroupMetaData.
//std::string mNickname; (mGroupName)
//std::string mKeyId; (mGroupId)
2012-11-05 17:28:08 -05:00
//uint32_t mIdType; (mGroupFlags)
2012-02-13 13:22:35 -05:00
2012-10-14 14:32:33 -04:00
// SHA(KeyId + Gpg Fingerprint) -> can only be IDed if GPG known.
// The length of the input must be long enough to make brute force search implausible.
// Easy to do 1e9 SHA-1 hash computations per second on a GPU.
// We will need a minimum of 256 bits, ideally 1024 bits or 2048 bits.
2012-11-05 17:28:08 -05:00
// Actually PgpIdHash is SHA1(.mMeta.mGroupId + PGPHandler->GpgFingerprint(ownId))
// ??? 160 bits.
2012-02-13 13:22:35 -05:00
2014-04-01 04:00:20 -04:00
Sha1CheckSum mPgpIdHash ;
// Need a signature as proof - otherwise anyone could add others Hashes.
// This is a string, as the length is variable.
std : : string mPgpIdSign ;
2012-11-06 14:18:11 -05:00
2013-10-20 05:43:30 -04:00
// Recognition Strings. MAX# defined above.
std : : list < std : : string > mRecognTags ;
2015-01-25 17:09:12 -05:00
// Avatar
RsGxsImage mImage ;
2015-03-14 10:33:23 -04:00
time_t mLastUsageTS ;
2015-01-25 17:09:12 -05:00
// Not Serialised - for GUI's benefit.
2015-12-23 12:08:20 -05:00
bool mPgpKnown ;
bool mIsAContact ; // change that into flags one day
RsPgpId mPgpId ;
2015-01-25 17:09:12 -05:00
GxsReputation mReputation ;
2012-10-21 11:48:18 -04:00
} ;
2012-07-29 09:09:36 -04:00
2012-10-21 11:48:18 -04:00
std : : ostream & operator < < ( std : : ostream & out , const RsGxsIdGroup & group ) ;
2012-02-13 13:22:35 -05:00
2012-10-21 11:48:18 -04:00
// DATA TYPE FOR EXTERNAL INTERFACE.
2013-10-20 05:43:30 -04:00
class RsRecognTag
{
public :
RsRecognTag ( uint16_t tc , uint16_t tt , bool v )
: tag_class ( tc ) , tag_type ( tt ) , valid ( v ) { return ; }
uint16_t tag_class ;
uint16_t tag_type ;
bool valid ;
} ;
class RsRecognTagDetails
{
public :
RsRecognTagDetails ( )
: valid_from ( 0 ) , valid_to ( 0 ) , tag_class ( 0 ) , tag_type ( 0 ) ,
is_valid ( false ) , is_pending ( false ) { return ; }
time_t valid_from ;
time_t valid_to ;
uint16_t tag_class ;
uint16_t tag_type ;
std : : string signer ;
bool is_valid ;
bool is_pending ;
} ;
2012-10-21 11:48:18 -04:00
class RsIdOpinion
{
public :
RsGxsId id ;
int rating ;
} ;
class RsIdentityParameters
{
public :
2012-11-07 16:38:43 -05:00
RsIdentityParameters ( ) : isPgpLinked ( false ) { return ; }
bool isPgpLinked ;
2015-01-25 17:09:12 -05:00
std : : string nickname ;
RsGxsImage mImage ;
2012-10-21 11:48:18 -04:00
} ;
2017-01-02 09:58:37 -05:00
class RsIdentityUsage
{
public :
enum UsageCode { UNKNOWN_USAGE = 0x00 ,
GROUP_ADMIN_SIGNATURE_CREATION = 0x01 , // These 2 are normally not normal GXS identities, but nothing prevents it to happen either.
GROUP_ADMIN_SIGNATURE_VALIDATION = 0x02 ,
GROUP_AUTHOR_SIGNATURE_CREATION = 0x03 , // not typically used, since most services do not require group author signatures
GROUP_AUTHOR_SIGNATURE_VALIDATION = 0x04 ,
MESSAGE_AUTHOR_SIGNATURE_CREATION = 0x05 , // most common use case. Messages are signed by authors in e.g. forums.
MESSAGE_AUTHOR_SIGNATURE_VALIDATION = 0x06 ,
GROUP_AUTHOR_KEEP_ALIVE = 0x07 , // Identities are stamped regularly by crawlign the set of messages for all groups. That helps keepign the useful identities in hand.
MESSAGE_AUTHOR_KEEP_ALIVE = 0x08 , // Identities are stamped regularly by crawlign the set of messages for all groups. That helps keepign the useful identities in hand.
2017-01-02 17:53:39 -05:00
CHAT_LOBBY_MSG_VALIDATION = 0x09 , // Chat lobby msgs are signed, so each time one comes, or a chat lobby event comes, a signature verificaiton happens.
GLOBAL_ROUTER_SIGNATURE_CHECK = 0x0a , // Global router message validation
GLOBAL_ROUTER_SIGNATURE_CREATION = 0x0b , // Global router message signature
GXS_TUNNEL_DH_SIGNATURE_CHECK = 0x0c , //
2017-01-03 17:31:29 -05:00
GXS_TUNNEL_DH_SIGNATURE_CREATION = 0x0d , //
IDENTITY_DATA_UPDATE = 0x0e , // Group update on that identity data. Can be avatar, name, etc.
IDENTITY_GENERIC_SIGNATURE_CHECK = 0x0f , // Any signature verified for that identity
IDENTITY_GENERIC_SIGNATURE_CREATION = 0x10 , // Any signature made by that identity
IDENTITY_GENERIC_ENCRYPTION = 0x11 ,
IDENTITY_GENERIC_DECRYPTION = 0x12 ,
CIRCLE_MEMBERSHIP_CHECK = 0x13
2017-01-02 09:58:37 -05:00
} ;
2017-01-03 17:31:29 -05:00
explicit RsIdentityUsage ( uint16_t service , const RsIdentityUsage : : UsageCode & code , const RsGxsGroupId & gid = RsGxsGroupId ( ) , const RsGxsMessageId & mid = RsGxsMessageId ( ) , uint64_t additional_id = 0 , const std : : string & comment = std : : string ( ) ) ;
2017-01-02 09:58:37 -05:00
2017-01-05 17:07:59 -05:00
uint16_t mServiceId ; // Id of the service using that identity, as understood by rsServiceControl
2017-01-02 09:58:37 -05:00
UsageCode mUsageCode ; // Specific code to use. Will allow forming the correct translated message in the GUI if necessary.
RsGxsGroupId mGrpId ; // Group ID using the identity
RsGxsMessageId mMsgId ; // Message ID using the identity
uint64_t mAdditionalId ; // Some additional ID. Can be used for e.g. chat lobbies.
std : : string mComment ; // additional comment to be used mainly for debugging, but not GUI display
2017-01-03 17:31:29 -05:00
bool operator < ( const RsIdentityUsage & u ) const
{
return mHash < u . mHash ;
}
RsFileHash mHash ;
2017-01-02 09:58:37 -05:00
} ;
2017-01-02 17:53:39 -05:00
class RsIdentityDetails
{
public :
RsIdentityDetails ( )
: mFlags ( 0 ) , mLastUsageTS ( 0 ) { return ; }
RsGxsId mId ;
// identity details.
std : : string mNickname ;
uint32_t mFlags ;
// PGP Stuff.
RsPgpId mPgpId ;
// Recogn details.
std : : list < RsRecognTag > mRecognTags ;
// Cyril: Reputation details. At some point we might want to merge information
// between the two into a single global score. Since the old reputation system
// is not finished yet, I leave this in place. We should decide what to do with it.
RsReputations : : ReputationInfo mReputation ;
// avatar
RsGxsImage mAvatar ;
// last usage
time_t mLastUsageTS ;
std : : map < RsIdentityUsage , time_t > mUseCases ;
} ;
2017-01-02 09:58:37 -05:00
2012-10-21 11:48:18 -04:00
2013-02-28 16:58:38 -05:00
class RsIdentity : public RsGxsIfaceHelper
2012-02-13 13:22:35 -05:00
{
2012-06-13 20:27:28 -04:00
2012-10-14 14:32:33 -04:00
public :
2013-02-28 16:58:38 -05:00
RsIdentity ( RsGxsIface * gxs ) : RsGxsIfaceHelper ( gxs ) { return ; }
2012-10-14 14:32:33 -04:00
virtual ~ RsIdentity ( ) { return ; }
2016-07-03 18:59:30 -04:00
/********************************************************************************************/
/********************************************************************************************/
// For Other Services....
// It should be impossible for them to get a message which we don't have the identity.
// Its a major error if we don't have the identity.
2012-10-14 14:32:33 -04:00
2016-07-03 18:59:30 -04:00
// We cache all identities, and provide alternative (instantaneous)
// functions to extract info, rather than the standard Token system.
2012-10-14 14:32:33 -04:00
2016-07-03 18:59:30 -04:00
//virtual bool getNickname(const RsGxsId &id, std::string &nickname) = 0;
virtual bool getIdDetails ( const RsGxsId & id , RsIdentityDetails & details ) = 0 ;
2015-04-18 15:59:27 -04:00
2016-07-03 18:59:30 -04:00
// Fills up list of all own ids. Returns false if ids are not yet loaded.
virtual bool getOwnIds ( std : : list < RsGxsId > & ownIds ) = 0 ;
virtual bool isOwnId ( const RsGxsId & id ) = 0 ;
2012-10-14 14:32:33 -04:00
2016-07-03 18:59:30 -04:00
//
virtual bool submitOpinion ( uint32_t & token , const RsGxsId & id ,
bool absOpinion , int score ) = 0 ;
virtual bool createIdentity ( uint32_t & token , RsIdentityParameters & params ) = 0 ;
2012-10-14 14:32:33 -04:00
2016-07-03 18:59:30 -04:00
virtual bool updateIdentity ( uint32_t & token , RsGxsIdGroup & group ) = 0 ;
virtual bool deleteIdentity ( uint32_t & token , RsGxsIdGroup & group ) = 0 ;
2013-10-20 05:43:30 -04:00
2017-01-12 14:39:49 -05:00
virtual void setDeleteBannedNodesThreshold ( uint32_t days ) = 0 ;
virtual uint32_t deleteBannedNodesThreshold ( ) = 0 ;
2016-07-03 18:59:30 -04:00
virtual bool parseRecognTag ( const RsGxsId & id , const std : : string & nickname ,
const std : : string & tag , RsRecognTagDetails & details ) = 0 ;
virtual bool getRecognTagRequest ( const RsGxsId & id , const std : : string & comment ,
uint16_t tag_class , uint16_t tag_type , std : : string & tag ) = 0 ;
2013-10-20 05:43:30 -04:00
2015-11-19 22:58:28 -05:00
virtual bool setAsRegularContact ( const RsGxsId & id , bool is_a_contact ) = 0 ;
2015-12-25 22:37:06 -05:00
virtual bool isARegularContact ( const RsGxsId & id ) = 0 ;
2016-12-23 11:52:02 -05:00
2017-04-08 13:07:33 -04:00
virtual bool serialiseIdentityToMemory ( const RsGxsId & id , std : : string & radix_string ) = 0 ;
virtual bool deserialiseIdentityFromMemory ( const std : : string & radix_string ) = 0 ;
2016-12-23 11:52:02 -05:00
/*!
* \ brief overallReputationLevel
* Returns the overall reputation level of the supplied identity . See rsreputations . h
* \ param id
* \ return
*/
2016-07-03 18:59:30 -04:00
virtual time_t getLastUsageTS ( const RsGxsId & id ) = 0 ;
// Specific RsIdentity Functions....
/* Specific Service Data */
/* We expose these initially for testing / GUI purposes.
2012-10-21 11:48:18 -04:00
*/
2012-02-13 13:22:35 -05:00
2016-07-03 18:59:30 -04:00
virtual bool getGroupData ( const uint32_t & token , std : : vector < RsGxsIdGroup > & groups ) = 0 ;
//virtual bool getMsgData(const uint32_t &token, std::vector<RsGxsIdOpinion> &opinions) = 0;
2012-06-13 20:27:28 -04:00
2012-02-13 13:22:35 -05:00
} ;
2012-10-14 14:32:33 -04:00
# endif // RETROSHARE_IDENTITY_GUI_INTERFACE_H