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; }
CompositeKey DatabaseOpenWidget::databaseKey() { CompositeKey masterKey; if (m_ui->checkPassword->isChecked()) { masterKey.addKey(PasswordKey(m_ui->editPassword->text())); } QHash<QString, QVariant> lastKeyFiles = config()->get("LastKeyFiles").toHash(); if (m_ui->checkKeyFile->isChecked()) { FileKey key; QString keyFilename = m_ui->comboKeyFile->currentText(); QString errorMsg; if (!key.load(keyFilename, &errorMsg)) { MessageBox::warning(this, tr("Error"), tr("Can't open key file").append(":\n").append(errorMsg)); return CompositeKey(); } masterKey.addKey(key); lastKeyFiles[m_filename] = keyFilename; } else { lastKeyFiles.remove(m_filename); } if (config()->get("RememberLastKeyFiles").toBool()) { config()->set("LastKeyFiles", lastKeyFiles); } return masterKey; }
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 DatabaseRepairWidget::openDatabase() { CompositeKey masterKey; if (m_ui->checkPassword->isChecked()) { masterKey.addKey(PasswordKey(m_ui->editPassword->text())); } if (m_ui->checkKeyFile->isChecked()) { FileKey key; QString keyFilename = m_ui->comboKeyFile->currentText(); QString errorMsg; if (!key.load(keyFilename, &errorMsg)) { MessageBox::warning(this, tr("Error"), tr("Can't open key file").append(":\n").append(errorMsg)); Q_EMIT editFinished(false); } masterKey.addKey(key); } KeePass2Repair repair; QFile file(m_filename); if (!file.open(QIODevice::ReadOnly)) { // TODO: error message Q_EMIT editFinished(false); return; } if (m_db) { delete m_db; } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); KeePass2Repair::RepairResult repairResult = repair.repairDatabase(&file, masterKey); QApplication::restoreOverrideCursor(); switch (repairResult) { case KeePass2Repair::NothingTodo: MessageBox::information(this, tr("Error"), tr("Database opened fine. Nothing to do.")); Q_EMIT editFinished(false); return; case KeePass2Repair::UnableToOpen: MessageBox::warning(this, tr("Error"), tr("Unable to open the database.").append("\n") .append(repair.errorString())); Q_EMIT editFinished(false); return; case KeePass2Repair::RepairSuccess: m_db = repair.database(); MessageBox::warning(this, tr("Success"), tr("The database has been successfully repaired\nYou can now save it.")); Q_EMIT editFinished(true); return; case KeePass2Repair::RepairFailed: MessageBox::warning(this, tr("Error"), tr("Unable to repair the database.")); Q_EMIT editFinished(false); return; } }
void TestKeys::testFileKeyError() { bool result; QString errorMsg; const QString fileName(QString(KEEPASSX_TEST_DATA_DIR).append("/does/not/exist")); FileKey fileKey; result = fileKey.load(fileName, &errorMsg); QVERIFY(!result); QVERIFY(!errorMsg.isEmpty()); errorMsg = ""; result = FileKey::create(fileName, &errorMsg); QVERIFY(!result); QVERIFY(!errorMsg.isEmpty()); errorMsg = ""; }
void ChangeMasterKeyWidget::generateKey() { m_key.clear(); if (m_ui->passwordGroup->isChecked()) { if (m_ui->enterPasswordEdit->text() == m_ui->repeatPasswordEdit->text()) { if (m_ui->enterPasswordEdit->text().isEmpty()) { if (MessageBox::question(this, tr("Question"), tr("Do you really want to use an empty string as password?"), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { return; } } m_key.addKey(PasswordKey(m_ui->enterPasswordEdit->text())); } else { MessageBox::warning(this, tr("Error"), tr("Different passwords supplied.")); m_ui->enterPasswordEdit->setText(""); m_ui->repeatPasswordEdit->setText(""); return; } } if (m_ui->keyFileGroup->isChecked()) { FileKey fileKey; QString errorMsg; if (!fileKey.load(m_ui->keyFileCombo->currentText(), &errorMsg)) { MessageBox::critical(this, tr("Failed to set key file"), tr("Failed to set %1 as the Key file:\n%2") .arg(m_ui->keyFileCombo->currentText(), errorMsg)); return; } m_key.addKey(fileKey); } if (m_ui->challengeResponseGroup->isChecked()) { int i = m_ui->challengeResponseCombo->currentIndex(); i = m_ui->challengeResponseCombo->itemData(i).toInt(); YkChallengeResponseKey key(i); m_key.addChallengeResponseKey(key); } Q_EMIT editFinished(true); }
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; }
// Match descriminator. bool operator== (const FileKey& other) const { return m_sFilename == other.filename() && m_iTrackChannel == other.trackChannel(); }