mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-25 07:29:33 -05:00
Completed Basic configuration storage:
* Added read/writetofile() fns to BinMemInterface * Added SignData() fns to AuthXPGP. * Added Certificate saving to AuthXPGP. * added Signatures to Configuration. * now discards messages if Hash is wrong (p3msgservice) git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@341 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
08d3634d28
commit
3e1b155f1a
@ -82,7 +82,7 @@ xpgpcert::xpgpcert(XPGP *xpgp, std::string pid)
|
|||||||
|
|
||||||
|
|
||||||
AuthXPGP::AuthXPGP()
|
AuthXPGP::AuthXPGP()
|
||||||
:init(0), sslctx(NULL), pkey(NULL)
|
:init(0), sslctx(NULL), pkey(NULL), mToSaveCerts(false), mConfigSaveActive(true)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -679,6 +679,9 @@ bool AuthXPGP::TrustCertificate(std::string id, bool totrust)
|
|||||||
/* reevaluate the auth of the xpgp */
|
/* reevaluate the auth of the xpgp */
|
||||||
cert->trustLvl = XPGP_auth_certificate(pgp_keyring, cert->certificate);
|
cert->trustLvl = XPGP_auth_certificate(pgp_keyring, cert->certificate);
|
||||||
valid = true;
|
valid = true;
|
||||||
|
|
||||||
|
/* resave if changed trust setting */
|
||||||
|
mToSaveCerts = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
xpgpMtx.unlock(); /**** UNLOCK ****/
|
xpgpMtx.unlock(); /**** UNLOCK ****/
|
||||||
@ -755,9 +758,63 @@ bool AuthXPGP::AuthCertificate(std::string id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Sign / Encrypt / Verify Data (TODO) */
|
/* Sign / Encrypt / Verify Data (TODO) */
|
||||||
|
|
||||||
|
bool AuthXPGP::SignData(std::string input, std::string &sign)
|
||||||
|
{
|
||||||
|
return SignData(input.c_str(), input.length(), sign);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AuthXPGP::SignData(const void *data, const uint32_t len, std::string &sign)
|
||||||
|
{
|
||||||
|
|
||||||
|
RsStackMutex stack(xpgpMtx); /***** STACK LOCK MUTEX *****/
|
||||||
|
|
||||||
|
EVP_MD_CTX *mdctx = EVP_MD_CTX_create();
|
||||||
|
unsigned int signlen = EVP_PKEY_size(pkey);
|
||||||
|
unsigned char signature[signlen];
|
||||||
|
|
||||||
|
if (0 == EVP_SignInit(mdctx, EVP_sha1()))
|
||||||
|
{
|
||||||
|
std::cerr << "EVP_SignInit Failure!" << std::endl;
|
||||||
|
|
||||||
|
EVP_MD_CTX_destroy(mdctx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == EVP_SignUpdate(mdctx, data, len))
|
||||||
|
{
|
||||||
|
std::cerr << "EVP_SignUpdate Failure!" << std::endl;
|
||||||
|
|
||||||
|
EVP_MD_CTX_destroy(mdctx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == EVP_SignFinal(mdctx, signature, &signlen, pkey))
|
||||||
|
{
|
||||||
|
std::cerr << "EVP_SignFinal Failure!" << std::endl;
|
||||||
|
|
||||||
|
EVP_MD_CTX_destroy(mdctx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
EVP_MD_CTX_destroy(mdctx);
|
||||||
|
|
||||||
|
sign.clear();
|
||||||
|
std::ostringstream out;
|
||||||
|
out << std::hex;
|
||||||
|
for(uint32_t i = 0; i < signlen; i++)
|
||||||
|
{
|
||||||
|
out << std::setw(2) << std::setfill('0');
|
||||||
|
out << (uint32_t) (signature[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
sign = out.str();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**** NEW functions we've added ****/
|
/**** NEW functions we've added ****/
|
||||||
|
|
||||||
@ -1119,6 +1176,8 @@ bool AuthXPGP::ProcessXPGP(XPGP *xpgp, std::string &id)
|
|||||||
|
|
||||||
cert->signers = getXPGPsigners(xpgp);
|
cert->signers = getXPGPsigners(xpgp);
|
||||||
|
|
||||||
|
/* resave if new certificate */
|
||||||
|
mToSaveCerts = true;
|
||||||
xpgpMtx.unlock(); /**** UNLOCK ****/
|
xpgpMtx.unlock(); /**** UNLOCK ****/
|
||||||
|
|
||||||
id = xpgpid;
|
id = xpgpid;
|
||||||
@ -1592,6 +1651,33 @@ int printSSLError(SSL *ssl, int retval, int err, unsigned long err2,
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
bool AuthXPGP::FinalSaveCertificates()
|
||||||
|
{
|
||||||
|
CheckSaveCertificates();
|
||||||
|
|
||||||
|
RsStackMutex stack(xpgpMtx); /***** LOCK *****/
|
||||||
|
mConfigSaveActive = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AuthXPGP::CheckSaveCertificates()
|
||||||
|
{
|
||||||
|
xpgpMtx.lock(); /***** LOCK *****/
|
||||||
|
|
||||||
|
if ((mConfigSaveActive) && (mToSaveCerts))
|
||||||
|
{
|
||||||
|
mToSaveCerts = false;
|
||||||
|
xpgpMtx.unlock(); /**** UNLOCK ****/
|
||||||
|
|
||||||
|
saveCertificates();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
xpgpMtx.unlock(); /**** UNLOCK ****/
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool AuthXPGP::saveCertificates()
|
bool AuthXPGP::saveCertificates()
|
||||||
{
|
{
|
||||||
// construct file name.
|
// construct file name.
|
||||||
@ -1605,6 +1691,12 @@ bool AuthXPGP::saveCertificates()
|
|||||||
|
|
||||||
xpgpMtx.unlock(); /**** UNLOCK ****/
|
xpgpMtx.unlock(); /**** UNLOCK ****/
|
||||||
|
|
||||||
|
/* add on the slash */
|
||||||
|
if (neighdir != "")
|
||||||
|
{
|
||||||
|
neighdir += "/";
|
||||||
|
}
|
||||||
|
|
||||||
std::map<std::string, std::string>::iterator mit;
|
std::map<std::string, std::string>::iterator mit;
|
||||||
|
|
||||||
std::string conftxt;
|
std::string conftxt;
|
||||||
@ -1989,6 +2081,7 @@ bool AuthXPGP::loadCertificates(bool &oldFormat, std::map<std::string, std::s
|
|||||||
oldFormat = true;
|
oldFormat = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mToSaveCerts = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,6 +103,8 @@ virtual std::string getName(std::string id);
|
|||||||
virtual bool getDetails(std::string id, pqiAuthDetails &details);
|
virtual bool getDetails(std::string id, pqiAuthDetails &details);
|
||||||
|
|
||||||
/* High Level Load/Save Configuration */
|
/* High Level Load/Save Configuration */
|
||||||
|
virtual bool FinalSaveCertificates();
|
||||||
|
virtual bool CheckSaveCertificates();
|
||||||
virtual bool saveCertificates();
|
virtual bool saveCertificates();
|
||||||
virtual bool loadCertificates();
|
virtual bool loadCertificates();
|
||||||
|
|
||||||
@ -123,7 +125,8 @@ virtual bool RevokeCertificate(std::string id);
|
|||||||
virtual bool TrustCertificate(std::string id, bool trust);
|
virtual bool TrustCertificate(std::string id, bool trust);
|
||||||
|
|
||||||
/* Sign / Encrypt / Verify Data (TODO) */
|
/* Sign / Encrypt / Verify Data (TODO) */
|
||||||
|
virtual bool SignData(std::string input, std::string &sign);
|
||||||
|
virtual bool SignData(const void *data, const uint32_t len, std::string &sign);
|
||||||
|
|
||||||
/*********** Overloaded Functions from p3AuthMgr **********/
|
/*********** Overloaded Functions from p3AuthMgr **********/
|
||||||
|
|
||||||
@ -169,6 +172,8 @@ bool locked_FindCert(std::string id, xpgpcert **cert);
|
|||||||
xpgpcert *mOwnCert;
|
xpgpcert *mOwnCert;
|
||||||
EVP_PKEY *pkey;
|
EVP_PKEY *pkey;
|
||||||
|
|
||||||
|
bool mToSaveCerts;
|
||||||
|
bool mConfigSaveActive;
|
||||||
std::map<std::string, xpgpcert *> mCerts;
|
std::map<std::string, xpgpcert *> mCerts;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -187,6 +187,16 @@ bool p3DummyAuthMgr::getDetails(std::string id, pqiAuthDetails &details)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool p3DummyAuthMgr::FinalSaveCertificates()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool p3DummyAuthMgr::CheckSaveCertificates()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool p3DummyAuthMgr::saveCertificates()
|
bool p3DummyAuthMgr::saveCertificates()
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -248,3 +258,14 @@ bool p3DummyAuthMgr::TrustCertificate(std::string id, bool trust)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool p3DummyAuthMgr::SignData(std::string input, std::string &sign)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool p3DummyAuthMgr::SignData(const void *data, const uint32_t len, std::string &sign)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,6 +96,8 @@ virtual std::string getName(std::string id) = 0;
|
|||||||
virtual bool getDetails(std::string id, pqiAuthDetails &details) = 0;
|
virtual bool getDetails(std::string id, pqiAuthDetails &details) = 0;
|
||||||
|
|
||||||
/* High Level Load/Save Configuration */
|
/* High Level Load/Save Configuration */
|
||||||
|
virtual bool FinalSaveCertificates() = 0;
|
||||||
|
virtual bool CheckSaveCertificates() = 0;
|
||||||
virtual bool saveCertificates() = 0;
|
virtual bool saveCertificates() = 0;
|
||||||
virtual bool loadCertificates() = 0;
|
virtual bool loadCertificates() = 0;
|
||||||
|
|
||||||
@ -119,10 +121,11 @@ virtual bool RevokeCertificate(std::string id) = 0;
|
|||||||
virtual bool TrustCertificate(std::string id, bool trust) = 0;
|
virtual bool TrustCertificate(std::string id, bool trust) = 0;
|
||||||
|
|
||||||
/* Sign / Encrypt / Verify Data (TODO) */
|
/* Sign / Encrypt / Verify Data (TODO) */
|
||||||
|
virtual bool SignData(std::string input, std::string &sign) = 0;
|
||||||
|
virtual bool SignData(const void *data, const uint32_t len, std::string &sign) = 0;
|
||||||
|
|
||||||
//virtual bool encryptData(std::string recipientId, std::string plaindata, std::string &result);
|
//virtual bool encryptData(std::string recipientId, std::string plaindata, std::string &result);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -155,6 +158,8 @@ virtual std::string getName(std::string id);
|
|||||||
virtual bool getDetails(std::string id, pqiAuthDetails &details);
|
virtual bool getDetails(std::string id, pqiAuthDetails &details);
|
||||||
|
|
||||||
/* High Level Load/Save Configuration */
|
/* High Level Load/Save Configuration */
|
||||||
|
virtual bool FinalSaveCertificates();
|
||||||
|
virtual bool CheckSaveCertificates();
|
||||||
virtual bool saveCertificates();
|
virtual bool saveCertificates();
|
||||||
virtual bool loadCertificates();
|
virtual bool loadCertificates();
|
||||||
|
|
||||||
@ -173,6 +178,8 @@ virtual bool SignCertificate(std::string id);
|
|||||||
virtual bool RevokeCertificate(std::string id);
|
virtual bool RevokeCertificate(std::string id);
|
||||||
virtual bool TrustCertificate(std::string id, bool trust);
|
virtual bool TrustCertificate(std::string id, bool trust);
|
||||||
|
|
||||||
|
virtual bool SignData(std::string input, std::string &sign);
|
||||||
|
virtual bool SignData(const void *data, const uint32_t len, std::string &sign);
|
||||||
|
|
||||||
std::string mOwnId;
|
std::string mOwnId;
|
||||||
std::map<std::string, pqiAuthDetails> mPeerList;
|
std::map<std::string, pqiAuthDetails> mPeerList;
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "pqi/p3cfgmgr.h"
|
#include "pqi/p3cfgmgr.h"
|
||||||
|
#include "pqi/p3authmgr.h"
|
||||||
#include "pqi/pqibin.h"
|
#include "pqi/pqibin.h"
|
||||||
#include "pqi/pqistreamer.h"
|
#include "pqi/pqistreamer.h"
|
||||||
|
|
||||||
@ -32,8 +33,8 @@
|
|||||||
|
|
||||||
#define CONFIG_DEBUG 1
|
#define CONFIG_DEBUG 1
|
||||||
|
|
||||||
p3ConfigMgr::p3ConfigMgr(std::string dir, std::string fname, std::string signame)
|
p3ConfigMgr::p3ConfigMgr(p3AuthMgr *am, std::string dir, std::string fname, std::string signame)
|
||||||
:basedir(dir), metafname(fname), metasigfname(signame),
|
:mAuthMgr(am), basedir(dir), metafname(fname), metasigfname(signame),
|
||||||
mConfigSaveActive(true)
|
mConfigSaveActive(true)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -108,6 +109,12 @@ void p3ConfigMgr::saveConfiguration()
|
|||||||
std::cerr << it->first << " Hash: " << it->second->Hash();
|
std::cerr << it->first << " Hash: " << it->second->Hash();
|
||||||
std::cerr << std::endl;
|
std::cerr << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
if (it->second->Hash() == "")
|
||||||
|
{
|
||||||
|
/* skip if no hash */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
RsTlvKeyValue kv;
|
RsTlvKeyValue kv;
|
||||||
{
|
{
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
@ -126,23 +133,47 @@ void p3ConfigMgr::saveConfiguration()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Write the data to a stream */
|
/* Write the data to a stream */
|
||||||
uint32_t bioflags = BIN_FLAGS_HASH_DATA | BIN_FLAGS_WRITEABLE;
|
uint32_t bioflags = BIN_FLAGS_WRITEABLE;
|
||||||
BinInterface *bio = new BinFileInterface(metafname.c_str(), bioflags);
|
BinMemInterface *membio = new BinMemInterface(1000, bioflags);
|
||||||
RsSerialiser *rss = new RsSerialiser();
|
RsSerialiser *rss = new RsSerialiser();
|
||||||
rss->addSerialType(new RsGeneralConfigSerialiser());
|
rss->addSerialType(new RsGeneralConfigSerialiser());
|
||||||
pqistreamer stream(rss, "CONFIG", bio, 0);
|
pqistreamer stream(rss, "CONFIG", membio, 0);
|
||||||
|
|
||||||
stream.SendItem(item);
|
stream.SendItem(item);
|
||||||
stream.tick();
|
stream.tick();
|
||||||
stream.tick();
|
stream.tick();
|
||||||
|
|
||||||
/* get hash */
|
/* sign data */
|
||||||
std::string totalhash = bio->gethash();
|
std::string signature;
|
||||||
|
mAuthMgr->SignData(membio->memptr(), membio->memsize(), signature);
|
||||||
|
|
||||||
/* sign the hash of the data */
|
#ifdef CONFIG_DEBUG
|
||||||
|
std::cerr << "p3ConfigMgr::saveConfiguration() MetaFile Signature:";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
std::cerr << signature;
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!membio->writetofile(metafname.c_str()))
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
std::cerr << "p3ConfigMgr::saveConfiguration() Failed to Write MetaFile";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* write signature to configuration */
|
/* write signature to configuration */
|
||||||
|
BinMemInterface *signbio = new BinMemInterface(signature.c_str(),
|
||||||
|
signature.length(), BIN_FLAGS_READABLE);
|
||||||
|
|
||||||
|
if (!signbio->writetofile(metasigfname.c_str()))
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
std::cerr << "p3ConfigMgr::saveConfiguration() Failed to Write MetaSignFile";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -156,13 +187,63 @@ void p3ConfigMgr::loadConfiguration()
|
|||||||
std::cerr << std::endl;
|
std::cerr << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Write the data to a stream */
|
/* write signature to configuration */
|
||||||
uint32_t bioflags = BIN_FLAGS_HASH_DATA | BIN_FLAGS_READABLE;
|
BinMemInterface *signbio = new BinMemInterface(1000, BIN_FLAGS_READABLE);
|
||||||
BinInterface *bio = new BinFileInterface(metafname.c_str(), bioflags);
|
|
||||||
|
if (!signbio->readfromfile(metasigfname.c_str()))
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
std::cerr << "p3ConfigMgr::loadConfiguration() Failed to Load MetaSignFile";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string oldsignature((char *) signbio->memptr(), signbio->memsize());
|
||||||
|
delete signbio;
|
||||||
|
|
||||||
|
BinMemInterface *membio = new BinMemInterface(1000, BIN_FLAGS_READABLE);
|
||||||
|
|
||||||
|
if (!membio->readfromfile(metafname.c_str()))
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
std::cerr << "p3ConfigMgr::loadConfiguration() Failed to Load MetaFile";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
delete membio;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get signature */
|
||||||
|
std::string signature;
|
||||||
|
mAuthMgr->SignData(membio->memptr(), membio->memsize(), signature);
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
std::cerr << "p3ConfigMgr::loadConfiguration() New MetaFile Signature:";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
std::cerr << signature;
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
std::cerr << "p3ConfigMgr::loadConfiguration() Orig MetaFile Signature:";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
std::cerr << oldsignature;
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (signature != oldsignature)
|
||||||
|
{
|
||||||
|
/* Failed */
|
||||||
|
#ifdef CONFIG_DEBUG
|
||||||
|
std::cerr << "p3ConfigMgr::loadConfiguration() Signature Check Failed";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
membio->fseek(0); /* go to start */
|
||||||
RsSerialiser *rss = new RsSerialiser();
|
RsSerialiser *rss = new RsSerialiser();
|
||||||
rss->addSerialType(new RsGeneralConfigSerialiser());
|
rss->addSerialType(new RsGeneralConfigSerialiser());
|
||||||
pqistreamer stream(rss, "CONFIG", bio, 0);
|
pqistreamer stream(rss, "CONFIG", membio, 0);
|
||||||
|
|
||||||
|
|
||||||
stream.tick();
|
stream.tick();
|
||||||
stream.tick();
|
stream.tick();
|
||||||
@ -182,12 +263,6 @@ void p3ConfigMgr::loadConfiguration()
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::string totalhash = bio->gethash();
|
|
||||||
|
|
||||||
/* check it TODO */
|
|
||||||
/* sign the hash of the data */
|
|
||||||
/* check signature with configuration */
|
|
||||||
|
|
||||||
/* extract info from KeyValueSet */
|
/* extract info from KeyValueSet */
|
||||||
std::list<RsTlvKeyValue>::iterator it;
|
std::list<RsTlvKeyValue>::iterator it;
|
||||||
for(it = item->tlvkvs.pairs.begin(); it != item->tlvkvs.pairs.end(); it++)
|
for(it = item->tlvkvs.pairs.begin(); it != item->tlvkvs.pairs.end(); it++)
|
||||||
@ -300,6 +375,8 @@ bool p3Config::loadConfiguration(std::string &loadHash)
|
|||||||
{
|
{
|
||||||
delete (*it);
|
delete (*it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setHash("");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ const uint32_t CONFIG_TYPE_FSERVER = 0x0003;
|
|||||||
const uint32_t CONFIG_TYPE_MSGS = 0x0004;
|
const uint32_t CONFIG_TYPE_MSGS = 0x0004;
|
||||||
|
|
||||||
class p3ConfigMgr;
|
class p3ConfigMgr;
|
||||||
|
class p3AuthMgr;
|
||||||
|
|
||||||
class pqiConfig
|
class pqiConfig
|
||||||
{
|
{
|
||||||
@ -111,7 +112,7 @@ bool HasConfigChanged(uint16_t idx);
|
|||||||
class p3ConfigMgr
|
class p3ConfigMgr
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
p3ConfigMgr(std::string bdir, std::string fname, std::string signame);
|
p3ConfigMgr(p3AuthMgr *am, std::string bdir, std::string fname, std::string signame);
|
||||||
|
|
||||||
void tick();
|
void tick();
|
||||||
void saveConfiguration();
|
void saveConfiguration();
|
||||||
@ -127,6 +128,8 @@ void completeConfiguration();
|
|||||||
|
|
||||||
|
|
||||||
/* these are constants - so shouldn't need mutex */
|
/* these are constants - so shouldn't need mutex */
|
||||||
|
p3AuthMgr *mAuthMgr;
|
||||||
|
|
||||||
const std::string basedir;
|
const std::string basedir;
|
||||||
const std::string metafname;
|
const std::string metafname;
|
||||||
const std::string metasigfname;
|
const std::string metasigfname;
|
||||||
|
@ -35,23 +35,23 @@ BinFileInterface::BinFileInterface(const char *fname, int flags)
|
|||||||
if ((bin_flags & BIN_FLAGS_READABLE) &&
|
if ((bin_flags & BIN_FLAGS_READABLE) &&
|
||||||
(bin_flags & BIN_FLAGS_WRITEABLE))
|
(bin_flags & BIN_FLAGS_WRITEABLE))
|
||||||
{
|
{
|
||||||
buf = fopen(fname, "r+");
|
buf = fopen(fname, "rb+");
|
||||||
/* if the file don't exist */
|
/* if the file don't exist */
|
||||||
if (!buf)
|
if (!buf)
|
||||||
{
|
{
|
||||||
buf = fopen(fname, "w+");
|
buf = fopen(fname, "wb+");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (bin_flags & BIN_FLAGS_READABLE)
|
else if (bin_flags & BIN_FLAGS_READABLE)
|
||||||
{
|
{
|
||||||
buf = fopen(fname, "r");
|
buf = fopen(fname, "rb");
|
||||||
}
|
}
|
||||||
else if (bin_flags & BIN_FLAGS_WRITEABLE)
|
else if (bin_flags & BIN_FLAGS_WRITEABLE)
|
||||||
{
|
{
|
||||||
// This is enough to remove old file in Linux...
|
// This is enough to remove old file in Linux...
|
||||||
// but not in windows.... (what to do)
|
// but not in windows.... (what to do)
|
||||||
buf = fopen(fname, "w");
|
buf = fopen(fname, "wb");
|
||||||
fflush(buf); /* this might help windows! */
|
fflush(buf); /* this might help windows! */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -155,6 +155,23 @@ BinMemInterface::BinMemInterface(int defsize, int flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BinMemInterface::BinMemInterface(const void *data, const int defsize, int flags)
|
||||||
|
:bin_flags(flags), buf(NULL), size(defsize),
|
||||||
|
recvsize(0), readloc(0), hash(NULL), bcount(0)
|
||||||
|
{
|
||||||
|
buf = malloc(defsize);
|
||||||
|
if (bin_flags & BIN_FLAGS_HASH_DATA)
|
||||||
|
{
|
||||||
|
hash = new pqihash();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* just remove the const
|
||||||
|
* *BAD* but senddata don't change it anyway
|
||||||
|
*/
|
||||||
|
senddata((void *) data, defsize);
|
||||||
|
}
|
||||||
|
|
||||||
BinMemInterface::~BinMemInterface()
|
BinMemInterface::~BinMemInterface()
|
||||||
{
|
{
|
||||||
if (buf)
|
if (buf)
|
||||||
@ -174,7 +191,7 @@ int BinMemInterface::fseek(int loc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int BinMemInterface::senddata(void *data, int len)
|
int BinMemInterface::senddata(void *data, const int len)
|
||||||
{
|
{
|
||||||
if(recvsize + len > size)
|
if(recvsize + len > size)
|
||||||
{
|
{
|
||||||
@ -231,6 +248,64 @@ uint64_t BinMemInterface::bytecount()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BinMemInterface::writetofile(const char *fname)
|
||||||
|
{
|
||||||
|
FILE *fd = fopen(fname, "wb");
|
||||||
|
if (!fd)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (1 != fwrite(buf, recvsize, 1, fd))
|
||||||
|
{
|
||||||
|
fclose(fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BinMemInterface::readfromfile(const char *fname)
|
||||||
|
{
|
||||||
|
FILE *fd = fopen(fname, "rb");
|
||||||
|
if (!fd)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get size */
|
||||||
|
::fseek(fd, 0L, SEEK_END);
|
||||||
|
int fsize = ftell(fd);
|
||||||
|
|
||||||
|
if (fsize > size)
|
||||||
|
{
|
||||||
|
/* not enough room */
|
||||||
|
std::cerr << "BinMemInterface::readfromfile() not enough room";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
|
||||||
|
fclose(fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
::fseek(fd, 0L, SEEK_SET);
|
||||||
|
if (1 != fread(buf, fsize, 1, fd))
|
||||||
|
{
|
||||||
|
/* not enough room */
|
||||||
|
std::cerr << "BinMemInterface::readfromfile() failed fread";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
|
||||||
|
fclose(fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
recvsize = fsize;
|
||||||
|
readloc = 0;
|
||||||
|
fclose(fd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@ -448,4 +523,3 @@ std::string NetBinDummy::gethash()
|
|||||||
return std::string("");
|
return std::string("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,12 +76,18 @@ class BinMemInterface: public BinInterface
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BinMemInterface(int defsize, int flags);
|
BinMemInterface(int defsize, int flags);
|
||||||
|
BinMemInterface(const void *data, const int size, int flags);
|
||||||
virtual ~BinMemInterface();
|
virtual ~BinMemInterface();
|
||||||
|
|
||||||
|
/* Extra Interfaces */
|
||||||
int fseek(int loc);
|
int fseek(int loc);
|
||||||
int memsize() { return recvsize; }
|
int memsize() { return recvsize; }
|
||||||
void *memptr() { return buf; }
|
void *memptr() { return buf; }
|
||||||
|
|
||||||
|
/* file interface */
|
||||||
|
bool writetofile(const char *fname);
|
||||||
|
bool readfromfile(const char *fname);
|
||||||
|
|
||||||
virtual int tick() { return 1; }
|
virtual int tick() { return 1; }
|
||||||
|
|
||||||
virtual int senddata(void *data, int len);
|
virtual int senddata(void *data, int len);
|
||||||
|
@ -335,6 +335,8 @@ void RsServer::ConfigFinalSave()
|
|||||||
{
|
{
|
||||||
/* force saving of transfers */
|
/* force saving of transfers */
|
||||||
server->saveFileTransferStatus();
|
server->saveFileTransferStatus();
|
||||||
|
|
||||||
|
mAuthMgr->FinalSaveCertificates();
|
||||||
mConfigMgr->completeConfiguration();
|
mConfigMgr->completeConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,6 +243,9 @@ void RsServer::run()
|
|||||||
/* force saving FileTransferStatus */
|
/* force saving FileTransferStatus */
|
||||||
server->saveFileTransferStatus();
|
server->saveFileTransferStatus();
|
||||||
|
|
||||||
|
/* see if we need to resave certs */
|
||||||
|
mAuthMgr->CheckSaveCertificates();
|
||||||
|
|
||||||
/* hour loop */
|
/* hour loop */
|
||||||
if (++min >= 60)
|
if (++min >= 60)
|
||||||
{
|
{
|
||||||
|
@ -498,7 +498,7 @@ int RsServer::StartupRetroShare(RsInit *config)
|
|||||||
server->setSaveDir(config->homePath.c_str()); /* Default Save Dir - config will overwrite */
|
server->setSaveDir(config->homePath.c_str()); /* Default Save Dir - config will overwrite */
|
||||||
server->setSearchInterface(pqih, mAuthMgr, mConnMgr);
|
server->setSearchInterface(pqih, mAuthMgr, mConnMgr);
|
||||||
|
|
||||||
mConfigMgr = new p3ConfigMgr(config->basedir, "rs-v0.4.cfg", "rs-v0.4.sgn");
|
mConfigMgr = new p3ConfigMgr(mAuthMgr, config->basedir, "rs-v0.4.cfg", "rs-v0.4.sgn");
|
||||||
mGeneralConfig = new p3GeneralConfig();
|
mGeneralConfig = new p3GeneralConfig();
|
||||||
|
|
||||||
|
|
||||||
@ -551,6 +551,8 @@ int RsServer::StartupRetroShare(RsInit *config)
|
|||||||
|
|
||||||
if (oldFormat)
|
if (oldFormat)
|
||||||
{
|
{
|
||||||
|
std::cerr << "Startup() Loaded Old Certificate Format" << std::endl;
|
||||||
|
|
||||||
/* transfer all authenticated peers to friend list */
|
/* transfer all authenticated peers to friend list */
|
||||||
std::list<std::string> authIds;
|
std::list<std::string> authIds;
|
||||||
mAuthMgr->getAuthenticatedList(authIds);
|
mAuthMgr->getAuthenticatedList(authIds);
|
||||||
|
@ -328,20 +328,41 @@ bool p3MsgService::loadConfiguration(std::string &loadHash)
|
|||||||
|
|
||||||
std::string hashin = in->gethash();
|
std::string hashin = in->gethash();
|
||||||
|
|
||||||
|
delete pa_in;
|
||||||
|
|
||||||
if (hashin != loadHash)
|
if (hashin != loadHash)
|
||||||
{
|
{
|
||||||
/* big error message! */
|
/* big error message! */
|
||||||
std::cerr << "p3MsgService::loadConfiguration() FAILED!" << std::endl;
|
std::cerr << "p3MsgService::loadConfiguration() FAILED! Msgs Tampered" << std::endl;
|
||||||
std::cerr << "p3MsgService::loadConfiguration() FAILED!" << std::endl;
|
std::string msgfileold = msgfile + ".failed";
|
||||||
std::cerr << "p3MsgService::loadConfiguration() FAILED!" << std::endl;
|
|
||||||
std::cerr << "p3MsgService::loadConfiguration() FAILED!" << std::endl;
|
rename(msgfile.c_str(), msgfileold.c_str());
|
||||||
std::cerr << "p3MsgService::loadConfiguration() FAILED!" << std::endl;
|
|
||||||
|
std::cerr << "Moving Old file to: " << msgfileold << std::endl;
|
||||||
|
std::cerr << "removing dodgey msgs" << std::endl;
|
||||||
|
|
||||||
|
RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/
|
||||||
|
|
||||||
|
|
||||||
|
std::map<uint32_t, RsMsgItem *>::iterator mit;
|
||||||
|
for(mit = imsg.begin(); mit != imsg.end(); mit++)
|
||||||
|
{
|
||||||
|
delete (mit->second);
|
||||||
|
}
|
||||||
|
imsg.clear();
|
||||||
|
|
||||||
|
for(mit = msgOutgoing.begin(); mit != msgOutgoing.end(); mit++)
|
||||||
|
{
|
||||||
|
delete (mit->second);
|
||||||
|
}
|
||||||
|
msgOutgoing.clear();
|
||||||
|
setHash("");
|
||||||
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setHash(hashin);
|
setHash(hashin);
|
||||||
|
|
||||||
delete pa_in;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user