diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 67f39b73a..2fe208909 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -20,7 +20,8 @@ #include #include -#include "Metadata.h" +#include "core/Group.h" +#include "core/Metadata.h" #include "crypto/Random.h" #include "format/KeePass2.h" @@ -46,7 +47,10 @@ const Group* Database::rootGroup() const void Database::setRootGroup(Group* group) { - Q_ASSERT(group == 0 || group->database() == this); + if (group != 0) { + group->setParent(this); + } + m_rootGroup = group; } diff --git a/src/core/Database.h b/src/core/Database.h index 78c132ee8..8876b8382 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -18,13 +18,15 @@ #ifndef KEEPASSX_DATABASE_H #define KEEPASSX_DATABASE_H -#include "Group.h" - +#include #include #include +#include "core/Uuid.h" #include "keys/CompositeKey.h" +class Entry; +class Group; class Metadata; struct DeletedObject @@ -48,7 +50,12 @@ public: Database(); Group* rootGroup(); const Group* rootGroup() const; + + /** + * Sets group as the root group and takes ownership of it. + */ void setRootGroup(Group* group); + Metadata* metadata(); const Metadata* metadata() const; Entry* resolveEntry(const Uuid& uuid); @@ -66,6 +73,10 @@ public: void setCompressionAlgo(Database::CompressionAlgorithm algo); void setTransformRounds(quint64 rounds); void setKey(const CompositeKey& key, const QByteArray& transformSeed); + + /** + * Sets the database key and generates a random transform seed. + */ void setKey(const CompositeKey& key); Q_SIGNALS: diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 17b0f5b7a..ff6938932 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -55,6 +55,7 @@ QIcon Entry::icon() const return DatabaseIcons::icon(m_iconNumber); } else { + // TODO check if m_db is 0 return m_db->metadata()->customIcon(m_customIcon); } } diff --git a/src/core/Entry.h b/src/core/Entry.h index 303f12da8..b4a06051e 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -98,6 +98,9 @@ public: static bool isDefaultAttributue(const QString& key); Q_SIGNALS: + /** + * Emitted when a default attribute has been changed. + */ void dataChanged(Entry* entry); private: diff --git a/src/core/Group.cpp b/src/core/Group.cpp index c83d38e9b..4e893caca 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -20,7 +20,6 @@ #include "Group.h" -#include "Database.h" #include "DatabaseIcons.h" #include "Metadata.h" @@ -238,8 +237,6 @@ void Group::setParent(Database* db) recSetDatabase(db); QObject::setParent(db); - - db->setRootGroup(this); } const Database* Group::database() const diff --git a/src/core/Group.h b/src/core/Group.h index ac37e9e39..4b49563d0 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -20,12 +20,11 @@ #include +#include "Database.h" #include "Entry.h" #include "TimeInfo.h" #include "Uuid.h" -class Database; - class Group : public QObject { Q_OBJECT @@ -63,15 +62,12 @@ public: Group* parentGroup(); const Group* parentGroup() const; void setParent(Group* parent, int index = -1); - void setParent(Database* db); const Database* database() const; QList children(); const QList& children() const; QList entries(); const QList& entries() const; - void addEntry(Entry* entry); - void removeEntry(Entry* entry); Q_SIGNALS: void dataChanged(Group* group); @@ -89,6 +85,10 @@ Q_SIGNALS: void entryDataChanged(Entry* entry); private: + void addEntry(Entry* entry); + void removeEntry(Entry* entry); + void setParent(Database* db); + void recSetDatabase(Database* db); Database* m_db; @@ -107,6 +107,9 @@ private: QList m_entries; Group* m_parent; + + friend void Database::setRootGroup(Group* group); + friend void Entry::setGroup(Group *group); }; #endif // KEEPASSX_GROUP_H diff --git a/src/format/KeePass2XmlReader.cpp b/src/format/KeePass2XmlReader.cpp index ba4877bec..aa2549218 100644 --- a/src/format/KeePass2XmlReader.cpp +++ b/src/format/KeePass2XmlReader.cpp @@ -21,6 +21,7 @@ #include "core/Database.h" #include "core/DatabaseIcons.h" +#include "core/Group.h" #include "core/Metadata.h" #include "format/KeePass2RandomStream.h" @@ -40,7 +41,7 @@ void KeePass2XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Ra m_randomStream = randomStream; m_tmpParent = new Group(); - m_tmpParent->setParent(m_db); + m_db->setRootGroup(m_tmpParent); if (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "KeePassFile") { @@ -276,7 +277,7 @@ void KeePass2XmlReader::parseRoot() if (m_xml.name() == "Group") { Group* rootGroup = parseGroup(); if (rootGroup) { - rootGroup->setParent(m_db); + m_db->setRootGroup(rootGroup); } } else if (m_xml.name() == "DeletedObjects") { diff --git a/src/format/KeePass2XmlWriter.h b/src/format/KeePass2XmlWriter.h index bd21ed0a8..34e699b26 100644 --- a/src/format/KeePass2XmlWriter.h +++ b/src/format/KeePass2XmlWriter.h @@ -25,6 +25,7 @@ #include "core/Database.h" #include "core/Entry.h" +#include "core/Group.h" #include "core/TimeInfo.h" #include "core/Uuid.h" diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp index 2a54d5f00..a5c0225f8 100644 --- a/tests/TestGroup.cpp +++ b/tests/TestGroup.cpp @@ -22,6 +22,7 @@ #include #include "core/Database.h" +#include "core/Group.h" void TestGroup::initTestCase() { @@ -46,7 +47,7 @@ void TestGroup::testParenting() g2->setParent(g1); g4->setParent(g3); g3->setParent(g1); - g1->setParent(db); + db->setRootGroup(g1); QVERIFY(g1->parent() == db); QVERIFY(g2->parent() == g1); @@ -91,7 +92,7 @@ void TestGroup::testSignals() { Database* db = new Database(); QPointer root = new Group(); - root->setParent(db); + db->setRootGroup(root); Group* g1 = new Group(); Group* g2 = new Group(); diff --git a/tests/TestGroupModel.cpp b/tests/TestGroupModel.cpp index 51c181f2b..96e2317fd 100644 --- a/tests/TestGroupModel.cpp +++ b/tests/TestGroupModel.cpp @@ -35,7 +35,7 @@ void TestGroupModel::test() Database* db = new Database(); Group* groupRoot = new Group(); - groupRoot->setParent(db); + db->setRootGroup(groupRoot); groupRoot->setName("groupRoot"); Group* group1 = new Group(); diff --git a/tests/TestKeePass2Reader.cpp b/tests/TestKeePass2Reader.cpp index a35a84d22..c41d42f34 100644 --- a/tests/TestKeePass2Reader.cpp +++ b/tests/TestKeePass2Reader.cpp @@ -21,6 +21,7 @@ #include "config-keepassx-tests.h" #include "core/Database.h" +#include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" #include "format/KeePass2Reader.h" diff --git a/tests/TestKeePass2Writer.cpp b/tests/TestKeePass2Writer.cpp index 72a351831..ba097d454 100644 --- a/tests/TestKeePass2Writer.cpp +++ b/tests/TestKeePass2Writer.cpp @@ -21,13 +21,13 @@ #include #include "core/Database.h" +#include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" #include "format/KeePass2Reader.h" #include "format/KeePass2Writer.h" #include "keys/PasswordKey.h" -#include "format/KeePass2XmlWriter.h" void TestKeePass2Writer::initTestCase() { Crypto::init(); @@ -40,13 +40,12 @@ void TestKeePass2Writer::initTestCase() m_dbOrg->metadata()->setName("TESTDB"); Group* group = new Group(); group->setUuid(Uuid::random()); - group->setParent(m_dbOrg); m_dbOrg->setRootGroup(group); Entry* entry = new Entry(); entry->setUuid(Uuid::random()); entry->addAttribute("test", "protectedTest", true); QVERIFY(entry->isAttributeProtected("test")); - group->addEntry(entry); + entry->setGroup(group); QBuffer buffer; buffer.open(QBuffer::ReadWrite); diff --git a/tests/TestKeePass2XmlReader.cpp b/tests/TestKeePass2XmlReader.cpp index c2dda9cf5..2678a464d 100644 --- a/tests/TestKeePass2XmlReader.cpp +++ b/tests/TestKeePass2XmlReader.cpp @@ -20,6 +20,7 @@ #include #include "core/Database.h" +#include "core/Group.h" #include "core/Metadata.h" #include "format/KeePass2XmlReader.h" #include "config-keepassx-tests.h"