Handle obfuscation in CLevelDBIterator
This commit is contained in:
parent
3499ce1e1a
commit
0fdf8c80ee
3 changed files with 15 additions and 8 deletions
|
@ -145,7 +145,7 @@ std::string CLevelDBWrapper::GetObfuscateKeyHex() const
|
||||||
{
|
{
|
||||||
return HexStr(obfuscate_key);
|
return HexStr(obfuscate_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
CLevelDBIterator::~CLevelDBIterator() { delete piter; }
|
CLevelDBIterator::~CLevelDBIterator() { delete piter; }
|
||||||
bool CLevelDBIterator::Valid() { return piter->Valid(); }
|
bool CLevelDBIterator::Valid() { return piter->Valid(); }
|
||||||
void CLevelDBIterator::SeekToFirst() { piter->SeekToFirst(); }
|
void CLevelDBIterator::SeekToFirst() { piter->SeekToFirst(); }
|
||||||
|
|
|
@ -73,9 +73,16 @@ class CLevelDBIterator
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
leveldb::Iterator *piter;
|
leveldb::Iterator *piter;
|
||||||
|
const std::vector<unsigned char> obfuscate_key;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CLevelDBIterator(leveldb::Iterator *piterIn) : piter(piterIn) {}
|
|
||||||
|
/**
|
||||||
|
* @param[in] piterIn The original leveldb iterator.
|
||||||
|
* @param[in] obfuscate_key If passed, XOR data with this key.
|
||||||
|
*/
|
||||||
|
CLevelDBIterator(leveldb::Iterator *piterIn, const std::vector<unsigned char>& obfuscate_key) :
|
||||||
|
piter(piterIn), obfuscate_key(obfuscate_key) { };
|
||||||
~CLevelDBIterator();
|
~CLevelDBIterator();
|
||||||
|
|
||||||
bool Valid();
|
bool Valid();
|
||||||
|
@ -113,7 +120,7 @@ public:
|
||||||
leveldb::Slice slValue = piter->value();
|
leveldb::Slice slValue = piter->value();
|
||||||
try {
|
try {
|
||||||
CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION);
|
CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION);
|
||||||
ssValue.Xor(db.GetObfuscateKey());
|
ssValue.Xor(obfuscate_key);
|
||||||
ssValue >> value;
|
ssValue >> value;
|
||||||
} catch(std::exception &e) {
|
} catch(std::exception &e) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -251,8 +258,8 @@ public:
|
||||||
|
|
||||||
CLevelDBIterator *NewIterator()
|
CLevelDBIterator *NewIterator()
|
||||||
{
|
{
|
||||||
return new CLevelDBIterator(pdb->NewIterator(iteroptions));
|
return new CLevelDBIterator(pdb->NewIterator(iteroptions), obfuscate_key);
|
||||||
{
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if the database managed by this class contains no entries.
|
* Return true if the database managed by this class contains no entries.
|
||||||
|
|
|
@ -98,7 +98,7 @@ bool CCoinsViewDB::GetStats(CCoinsStats &stats) const {
|
||||||
/* It seems that there are no "const iterators" for LevelDB. Since we
|
/* It seems that there are no "const iterators" for LevelDB. Since we
|
||||||
only need read operations on it, use a const-cast to get around
|
only need read operations on it, use a const-cast to get around
|
||||||
that restriction. */
|
that restriction. */
|
||||||
boost::scoped_ptr<CLevelDBWrapper> pcursor(const_cast<CLevelDBWrapper*>(&db)->NewIterator());
|
boost::scoped_ptr<CLevelDBIterator> pcursor(const_cast<CLevelDBWrapper*>(&db)->NewIterator());
|
||||||
pcursor->Seek('c');
|
pcursor->Seek('c');
|
||||||
|
|
||||||
CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION);
|
CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION);
|
||||||
|
@ -177,9 +177,9 @@ bool CBlockTreeDB::ReadFlag(const std::string &name, bool &fValue) {
|
||||||
|
|
||||||
bool CBlockTreeDB::LoadBlockIndexGuts()
|
bool CBlockTreeDB::LoadBlockIndexGuts()
|
||||||
{
|
{
|
||||||
boost::scoped_ptr<leveldb::Iterator> pcursor(NewIterator());
|
boost::scoped_ptr<CLevelDBIterator> pcursor(NewIterator());
|
||||||
|
|
||||||
pcursor->Seek(make_pair('b', uint256(0)));
|
pcursor->Seek(make_pair('b', uint256()));
|
||||||
|
|
||||||
// Load mapBlockIndex
|
// Load mapBlockIndex
|
||||||
while (pcursor->Valid()) {
|
while (pcursor->Valid()) {
|
||||||
|
|
Loading…
Reference in a new issue