Introduced missing CustomData on Group and Entry

Introduce missing CustomData-attributes of KDBX4 format to allow
storing of plugin data for groups and entries - adopt Metadata to use
the same storage mechanism
Add simple view for CustomData as part of EditWidgetProperties
Tracking of CustomData-Modification using SIGNAL-SLOT update-mechanism
This commit is contained in:
Christian Kieschnick 2018-02-06 16:37:06 +01:00 committed by Janek Bevendorff
parent 698b44f71c
commit 0b54710734
18 changed files with 500 additions and 118 deletions

View file

@ -295,7 +295,7 @@ void KdbxXmlReader::parseMeta()
} else if (m_xml.name() == "Binaries") {
parseBinaries();
} else if (m_xml.name() == "CustomData") {
parseCustomData();
parseCustomData(m_meta->customData());
} else if (m_xml.name() == "SettingsChanged") {
m_meta->setSettingsChanged(readDateTime());
} else {
@ -397,20 +397,20 @@ void KdbxXmlReader::parseBinaries()
}
}
void KdbxXmlReader::parseCustomData()
void KdbxXmlReader::parseCustomData(CustomData *customData)
{
Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomData");
while (!m_xml.hasError() && m_xml.readNextStartElement()) {
if (m_xml.name() == "Item") {
parseCustomDataItem();
parseCustomDataItem(customData);
continue;
}
skipCurrentElement();
}
}
void KdbxXmlReader::parseCustomDataItem()
void KdbxXmlReader::parseCustomDataItem(CustomData *customData)
{
Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Item");
@ -432,7 +432,7 @@ void KdbxXmlReader::parseCustomDataItem()
}
if (keySet && valueSet) {
m_meta->addCustomField(key, value);
customData->set(key, value);
return;
}
@ -583,6 +583,10 @@ Group* KdbxXmlReader::parseGroup()
}
continue;
}
if (m_xml.name() == "CustomData") {
parseCustomData(group->customData());
continue;
}
skipCurrentElement();
}
@ -744,7 +748,10 @@ Entry* KdbxXmlReader::parseEntry(bool history)
}
continue;
}
if (m_xml.name() == "CustomData" ){
parseCustomData(entry->customData());
continue;
}
skipCurrentElement();
}

View file

@ -66,8 +66,8 @@ protected:
virtual void parseCustomIcons();
virtual void parseIcon();
virtual void parseBinaries();
virtual void parseCustomData();
virtual void parseCustomDataItem();
virtual void parseCustomData(CustomData *customData);
virtual void parseCustomDataItem(CustomData *customData);
virtual bool parseRoot();
virtual Group* parseGroup();
virtual void parseDeletedObjects();

View file

@ -129,7 +129,7 @@ void KdbxXmlWriter::writeMetadata()
if (m_kdbxVersion < KeePass2::FILE_VERSION_4) {
writeBinaries();
}
writeCustomData();
writeCustomData(m_meta->customData());
m_xml.writeEndElement();
}
@ -218,14 +218,13 @@ void KdbxXmlWriter::writeBinaries()
m_xml.writeEndElement();
}
void KdbxXmlWriter::writeCustomData()
void KdbxXmlWriter::writeCustomData(const CustomData *customData)
{
m_xml.writeStartElement("CustomData");
QHash<QString, QString> customFields = m_meta->customFields();
const QList<QString> keyList = customFields.keys();
const QList<QString> keyList = customData->keys();
for (const QString& key : keyList) {
writeCustomDataItem(key, customFields.value(key));
writeCustomDataItem(key, customData->value(key));
}
m_xml.writeEndElement();
@ -277,6 +276,10 @@ void KdbxXmlWriter::writeGroup(const Group* group)
writeUuid("LastTopVisibleEntry", group->lastTopVisibleEntry());
if (!group->customData()->isEmpty()){
writeCustomData(group->customData());
}
const QList<Entry*>& entryList = group->entries();
for (const Entry* entry : entryList) {
writeEntry(entry);
@ -401,6 +404,11 @@ void KdbxXmlWriter::writeEntry(const Entry* entry)
}
writeAutoType(entry);
if (!entry->customData()->isEmpty()){
writeCustomData(entry->customData());
}
// write history only for entries that are not history items
if (entry->parent()) {
writeEntryHistory(entry);

View file

@ -51,7 +51,7 @@ private:
void writeCustomIcons();
void writeIcon(const Uuid& uuid, const QImage& icon);
void writeBinaries();
void writeCustomData();
void writeCustomData(const CustomData *customData);
void writeCustomDataItem(const QString& key, const QString& value);
void writeRoot();
void writeGroup(const Group* group);