added support for reading/writing an extended header which might be
useful later
This commit is contained in:
parent
d82492720e
commit
d39fd6a598
|
@ -135,7 +135,7 @@ void PasswordFile::load()
|
||||||
}
|
}
|
||||||
// check version and flags (used in version 0x3 only)
|
// check version and flags (used in version 0x3 only)
|
||||||
uint32 version = m_freader.readUInt32LE();
|
uint32 version = m_freader.readUInt32LE();
|
||||||
if(version != 0x0U && version != 0x1U && version != 0x2U && version != 0x3U && version != 0x4U) {
|
if(version != 0x0U && version != 0x1U && version != 0x2U && version != 0x3U && version != 0x4U && version != 0x5U) {
|
||||||
throw ParsingException("Version is unknown.");
|
throw ParsingException("Version is unknown.");
|
||||||
}
|
}
|
||||||
bool decrypterUsed;
|
bool decrypterUsed;
|
||||||
|
@ -154,7 +154,7 @@ void PasswordFile::load()
|
||||||
// skip extended header
|
// skip extended header
|
||||||
// the extended header might be used in further versions to
|
// the extended header might be used in further versions to
|
||||||
// add additional information without breaking compatibility
|
// add additional information without breaking compatibility
|
||||||
if(version == 0x4U) {
|
if(version >= 0x4U) {
|
||||||
uint16 extendedHeaderSize = m_freader.readUInt16BE();
|
uint16 extendedHeaderSize = m_freader.readUInt16BE();
|
||||||
m_extendedHeader = m_freader.readString(extendedHeaderSize);
|
m_extendedHeader = m_freader.readString(extendedHeaderSize);
|
||||||
}
|
}
|
||||||
|
@ -235,6 +235,10 @@ void PasswordFile::load()
|
||||||
buffstr.write(decbuff.data(), static_cast<streamsize>(size));
|
buffstr.write(decbuff.data(), static_cast<streamsize>(size));
|
||||||
decbuff.resize(0);
|
decbuff.resize(0);
|
||||||
buffstr.seekg(0, ios_base::beg);
|
buffstr.seekg(0, ios_base::beg);
|
||||||
|
if(version >= 0x5u) {
|
||||||
|
uint16 extendedHeaderSize = m_freader.readUInt16BE();
|
||||||
|
m_encryptedExtendedHeader = m_freader.readString(extendedHeaderSize);
|
||||||
|
}
|
||||||
m_rootEntry.reset(new NodeEntry(buffstr));
|
m_rootEntry.reset(new NodeEntry(buffstr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,7 +262,8 @@ void PasswordFile::save(bool useEncryption, bool useCompression)
|
||||||
m_file.open(m_path, ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary);
|
m_file.open(m_path, ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary);
|
||||||
// write header
|
// write header
|
||||||
m_fwriter.writeUInt32LE(0x7770616DU); // write magic number
|
m_fwriter.writeUInt32LE(0x7770616DU); // write magic number
|
||||||
m_fwriter.writeUInt32LE(m_extendedHeader.empty() ? 0x3U : 0x4U); // write version, extended header requires version 4
|
// write version, extended header requires version 4, encrypted extended header required version 5
|
||||||
|
m_fwriter.writeUInt32LE(m_extendedHeader.empty() && m_encryptedExtendedHeader.empty() ? 0x3U : (m_encryptedExtendedHeader.empty() ? 0x4U : 0x5U));
|
||||||
byte flags = 0x00;
|
byte flags = 0x00;
|
||||||
if(useEncryption) {
|
if(useEncryption) {
|
||||||
flags |= 0x80 | 0x40;
|
flags |= 0x80 | 0x40;
|
||||||
|
@ -275,6 +280,11 @@ void PasswordFile::save(bool useEncryption, bool useCompression)
|
||||||
// serialize root entry and descendants
|
// serialize root entry and descendants
|
||||||
stringstream buffstr(stringstream::in | stringstream::out | stringstream::binary);
|
stringstream buffstr(stringstream::in | stringstream::out | stringstream::binary);
|
||||||
buffstr.exceptions(ios_base::failbit | ios_base::badbit);
|
buffstr.exceptions(ios_base::failbit | ios_base::badbit);
|
||||||
|
// write encrypted extened header
|
||||||
|
if(!m_encryptedExtendedHeader.empty()) {
|
||||||
|
m_fwriter.writeUInt16BE(m_encryptedExtendedHeader.size());
|
||||||
|
m_fwriter.writeString(m_encryptedExtendedHeader);
|
||||||
|
}
|
||||||
m_rootEntry->make(buffstr);
|
m_rootEntry->make(buffstr);
|
||||||
buffstr.seekp(0, ios_base::end);
|
buffstr.seekp(0, ios_base::end);
|
||||||
stringstream::pos_type size = buffstr.tellp();
|
stringstream::pos_type size = buffstr.tellp();
|
||||||
|
@ -347,7 +357,7 @@ void PasswordFile::clearEntries()
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Closes the file if opened. Removes path, password and entries.
|
* \brief Closes the file if opened. Removes path, password and entries and additional information.
|
||||||
*/
|
*/
|
||||||
void PasswordFile::clear()
|
void PasswordFile::clear()
|
||||||
{
|
{
|
||||||
|
@ -355,6 +365,8 @@ void PasswordFile::clear()
|
||||||
clearPath();
|
clearPath();
|
||||||
clearPassword();
|
clearPassword();
|
||||||
clearEntries();
|
clearEntries();
|
||||||
|
m_extendedHeader.clear();
|
||||||
|
m_encryptedExtendedHeader.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
|
@ -47,6 +47,7 @@ private:
|
||||||
char m_password[32];
|
char m_password[32];
|
||||||
std::unique_ptr<NodeEntry> m_rootEntry;
|
std::unique_ptr<NodeEntry> m_rootEntry;
|
||||||
std::string m_extendedHeader;
|
std::string m_extendedHeader;
|
||||||
|
std::string m_encryptedExtendedHeader;
|
||||||
std::fstream m_file;
|
std::fstream m_file;
|
||||||
IoUtilities::BinaryReader m_freader;
|
IoUtilities::BinaryReader m_freader;
|
||||||
IoUtilities::BinaryWriter m_fwriter;
|
IoUtilities::BinaryWriter m_fwriter;
|
||||||
|
|
Loading…
Reference in New Issue