mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-07-25 15:55:38 -04:00
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:
parent
698b44f71c
commit
0b54710734
18 changed files with 500 additions and 118 deletions
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue