void DatabaseOpenWidget::openDatabase() { KeePass2Reader reader; CompositeKey masterKey = databaseKey(); if (masterKey.isEmpty()) { return; } QFile file(m_filename); if (!file.open(QIODevice::ReadOnly)) { // TODO: error message return; } if (m_db) { delete m_db; } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); m_db = reader.readDatabase(&file, masterKey); QApplication::restoreOverrideCursor(); if (m_db) { Q_EMIT editFinished(true); } else { MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n") .append(reader.errorString())); m_ui->editPassword->clear(); } }
void DatabaseOpenWidget::openDatabase() { KeePass2Reader reader; CompositeKey masterKey = databaseKey(); if (masterKey.isEmpty()) { return; } QFile file(m_filename); if (!file.open(QIODevice::ReadOnly)) { // TODO: error message return; } if (m_db) { delete m_db; } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); m_db = reader.readDatabase(&file, masterKey); QApplication::restoreOverrideCursor(); if (m_db) { Q_EMIT editFinished(true); // this is a c++11 equivalent foreach construct // if c++11 is not available another iteration loop style is needed! for (auto widget : qApp->topLevelWidgets()) { if(widget->inherits("QMainWindow")) static_cast<MainWindow*>(widget)->configuredMinimizeWindow(); } } else { MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n") .append(reader.errorString())); m_ui->editPassword->clear(); } }
void TestKeys::testCreateFileKey() { const QString dbName("testCreateFileKey database"); QBuffer keyBuffer; keyBuffer.open(QBuffer::ReadWrite); FileKey::create(&keyBuffer); keyBuffer.reset(); FileKey fileKey; QVERIFY(fileKey.load(&keyBuffer)); CompositeKey compositeKey; compositeKey.addKey(fileKey); Database* dbOrg = new Database(); dbOrg->setKey(compositeKey); dbOrg->metadata()->setName(dbName); QBuffer dbBuffer; dbBuffer.open(QBuffer::ReadWrite); KeePass2Writer writer; writer.writeDatabase(&dbBuffer, dbOrg); dbBuffer.reset(); delete dbOrg; KeePass2Reader reader; Database* dbRead = reader.readDatabase(&dbBuffer, compositeKey); QVERIFY(dbRead); QVERIFY(!reader.hasError()); QCOMPARE(dbRead->metadata()->name(), dbName); delete dbRead; }
void TestKeePass2Reader::testFormat200() { QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format200.kdbx"); CompositeKey key; key.addKey(PasswordKey("a")); KeePass2Reader reader; Database* db = reader.readDatabase(filename, key); QVERIFY(db); QVERIFY(!reader.hasError()); QCOMPARE(db->rootGroup()->name(), QString("Format200")); QVERIFY(!db->metadata()->protectTitle()); QVERIFY(db->metadata()->protectUsername()); QVERIFY(!db->metadata()->protectPassword()); QVERIFY(db->metadata()->protectUrl()); QVERIFY(!db->metadata()->protectNotes()); QCOMPARE(db->rootGroup()->entries().size(), 1); Entry* entry = db->rootGroup()->entries().at(0); QCOMPARE(entry->title(), QString("Sample Entry")); QCOMPARE(entry->username(), QString("User Name")); QCOMPARE(entry->attachments()->keys().size(), 2); QCOMPARE(entry->attachments()->value("myattach.txt"), QByteArray("abcdefghijk")); QCOMPARE(entry->attachments()->value("test.txt"), QByteArray("this is a test")); QCOMPARE(entry->historyItems().size(), 2); QCOMPARE(entry->historyItems().at(0)->attachments()->keys().size(), 0); QCOMPARE(entry->historyItems().at(1)->attachments()->keys().size(), 1); QCOMPARE(entry->historyItems().at(1)->attachments()->value("myattach.txt"), QByteArray("abcdefghijk")); delete db; }
void TestKeePass2Reader::testProtectedStrings() { QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/ProtectedStrings.kdbx"); CompositeKey key; key.addKey(PasswordKey("masterpw")); KeePass2Reader reader; Database* db = reader.readDatabase(filename, key); QVERIFY(db); QVERIFY(!reader.hasError()); QCOMPARE(db->metadata()->name(), QString("Protected Strings Test")); Entry* entry = db->rootGroup()->entries().at(0); QCOMPARE(entry->title(), QString("Sample Entry")); QCOMPARE(entry->username(), QString("Protected User Name")); QCOMPARE(entry->password(), QString("ProtectedPassword")); QCOMPARE(entry->attributes()->value("TestProtected"), QString("ABC")); QCOMPARE(entry->attributes()->value("TestUnprotected"), QString("DEF")); QVERIFY(db->metadata()->protectPassword()); QVERIFY(entry->attributes()->isProtected("TestProtected")); QVERIFY(!entry->attributes()->isProtected("TestUnprotected")); delete db; }
void TestKeePass1Reader::reopenDatabase(Database* db, const QString& password, const QString& keyfileName) { QBuffer buffer; buffer.open(QIODevice::ReadWrite); KeePass2Writer writer; writer.writeDatabase(&buffer, db); QVERIFY(!writer.hasError()); QVERIFY(buffer.seek(0)); CompositeKey key; if (!password.isNull()) { key.addKey(PasswordKey(password)); } if (!keyfileName.isEmpty()) { FileKey fileKey; QVERIFY(fileKey.load(keyfileName)); key.addKey(fileKey); } KeePass2Reader reader; Database* newDb = reader.readDatabase(&buffer, key); QVERIFY(newDb); QVERIFY(!reader.hasError()); delete newDb; }
void TestGui::checkDatabase() { CompositeKey key; key.addKey(PasswordKey("a")); KeePass2Reader reader; QScopedPointer<Database> dbSaved(reader.readDatabase(m_tmpFileName, key)); QVERIFY(dbSaved); QVERIFY(!reader.hasError()); QCOMPARE(dbSaved->metadata()->name(), m_db->metadata()->name()); }
void TestKeePass2Reader::testCompressed() { QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Compressed.kdbx"); CompositeKey key; key.addKey(PasswordKey("")); KeePass2Reader reader; Database* db = reader.readDatabase(filename, key); QVERIFY(db); QVERIFY(!reader.hasError()); QCOMPARE(db->metadata()->name(), QString("Compressed")); QCOMPARE(db->compressionAlgo(), Database::CompressionGZip); delete db; }
void TestKeePass2Reader::testNonAscii() { QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/NonAscii.kdbx"); CompositeKey key; key.addKey(PasswordKey(QString::fromUtf8("\xce\x94\xc3\xb6\xd8\xb6"))); KeePass2Reader reader; Database* db = reader.readDatabase(filename, key); QVERIFY(db); QVERIFY(!reader.hasError()); QCOMPARE(db->metadata()->name(), QString("NonAsciiTest")); QCOMPARE(db->compressionAlgo(), Database::CompressionNone); delete db; }
void TestKeePass2Reader::testBrokenHeaderHash() { // The protected stream key has been modified in the header. // Make sure the database won't open. QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/BrokenHeaderHash.kdbx"); CompositeKey key; key.addKey(PasswordKey("")); KeePass2Reader reader; Database* db = reader.readDatabase(filename, key); QVERIFY(!db); QVERIFY(reader.hasError()); delete db; }
void TestKeePass2Reader::testFormat300() { QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format300.kdbx"); CompositeKey key; key.addKey(PasswordKey("a")); KeePass2Reader reader; Database* db = reader.readDatabase(filename, key); QVERIFY(db); QVERIFY(!reader.hasError()); QCOMPARE(db->rootGroup()->name(), QString("Format300")); QCOMPARE(db->metadata()->name(), QString("Test Database Format 0x00030000")); delete db; }
/** * Open the database from a file. * Unless `readOnly` is set to false, the database will be opened in * read-write mode and fall back to read-only if that is not possible. * * @param filePath path to the file * @param key composite key for unlocking the database * @param readOnly open in read-only mode * @param error error message in case of failure * @return true on success */ bool Database::open(const QString& filePath, QSharedPointer<const CompositeKey> key, QString* error, bool readOnly) { if (isInitialized() && m_modified) { emit databaseDiscarded(); } setEmitModified(false); QFile dbFile(filePath); if (!dbFile.exists()) { if (error) { *error = tr("File %1 does not exist.").arg(filePath); } return false; } if (!readOnly && !dbFile.open(QIODevice::ReadWrite)) { readOnly = true; } if (!dbFile.isOpen() && !dbFile.open(QIODevice::ReadOnly)) { if (error) { *error = tr("Unable to open file %1.").arg(filePath); } return false; } KeePass2Reader reader; bool ok = reader.readDatabase(&dbFile, std::move(key), this); if (reader.hasError()) { if (error) { *error = tr("Error while reading the database: %1").arg(reader.errorString()); } return false; } setReadOnly(readOnly); setFilePath(filePath); dbFile.close(); setInitialized(ok); markAsClean(); setEmitModified(true); return ok; }
void DatabaseOpenWidget::openDatabase() { KeePass2Reader reader; CompositeKey masterKey = databaseKey(); if (m_db) { delete m_db; } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); m_db = reader.readDatabase(m_filename, masterKey); QApplication::restoreOverrideCursor(); if (m_db) { // signal switched focus to opened database view Q_EMIT editFinished(true); } else { MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n") .append(reader.errorString())); m_ui->editPassword->clear(); } }
void TestKeePass2Writer::initTestCase() { Crypto::init(); CompositeKey key; key.addKey(PasswordKey("test")); m_dbOrg = new Database(); m_dbOrg->setKey(key); m_dbOrg->metadata()->setName("TESTDB"); Group* group = m_dbOrg->rootGroup(); group->setUuid(Uuid::random()); group->setNotes("I'm a note!"); Entry* entry = new Entry(); entry->setPassword(QString::fromUtf8("\xc3\xa4\xa3\xb6\xc3\xbc\xe9\x9b\xbb\xe7\xb4\x85")); entry->setUuid(Uuid::random()); entry->attributes()->set("test", "protectedTest", true); QVERIFY(entry->attributes()->isProtected("test")); entry->attachments()->set("myattach.txt", QByteArray("this is an attachment")); entry->attachments()->set("aaa.txt", QByteArray("also an attachment")); entry->setGroup(group); Group* groupNew = new Group(); groupNew->setUuid(Uuid::random()); groupNew->setName("TESTGROUP"); groupNew->setNotes("I'm a sub group note!"); groupNew->setParent(group); QBuffer buffer; buffer.open(QBuffer::ReadWrite); KeePass2Writer writer; writer.writeDatabase(&buffer, m_dbOrg); QVERIFY(!writer.error()); buffer.seek(0); KeePass2Reader reader; m_dbTest = reader.readDatabase(&buffer, key); QVERIFY(!reader.hasError()); QVERIFY(m_dbTest); }
void TestKeys::testFileKey() { QFETCH(QString, type); QString name = QString("FileKey").append(type); KeePass2Reader reader; QString dbFilename = QString("%1/%2.kdbx").arg(QString(KEEPASSX_TEST_DATA_DIR), name); QString keyFilename = QString("%1/%2.key").arg(QString(KEEPASSX_TEST_DATA_DIR), name); CompositeKey compositeKey; FileKey fileKey; QVERIFY(fileKey.load(keyFilename)); QCOMPARE(fileKey.rawKey().size(), 32); compositeKey.addKey(fileKey); Database* db = reader.readDatabase(dbFilename, compositeKey); QVERIFY(db); QVERIFY(!reader.hasError()); QCOMPARE(db->metadata()->name(), QString("%1 Database").arg(name)); delete db; }