mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-02-23 16:10:00 -05:00
CLI: Fix keyfile from/to parameter collision in merge command
Rename 'k' to 'f' because 'k' is already used to specify the key for the target database of the merge * Remove short -f option from keepassxc-cli.1 * Remove -f option from keepassxc-cli merge * Add test cases covering cli options for merge * Add functional test for merge with keys
This commit is contained in:
parent
c0796d8fb1
commit
0654ffc117
@ -117,7 +117,7 @@ Displays the program version.
|
|||||||
.IP "-d, --dry-run <path>"
|
.IP "-d, --dry-run <path>"
|
||||||
Prints the changes detected by the merge operation without making any changes to the database.
|
Prints the changes detected by the merge operation without making any changes to the database.
|
||||||
|
|
||||||
.IP "-f, --key-file-from <path>"
|
.IP "--key-file-from <path>"
|
||||||
Sets the path of the key file for the second database.
|
Sets the path of the key file for the second database.
|
||||||
|
|
||||||
.IP "--no-password-from"
|
.IP "--no-password-from"
|
||||||
|
@ -30,8 +30,7 @@ const QCommandLineOption Merge::SameCredentialsOption =
|
|||||||
QObject::tr("Use the same credentials for both database files."));
|
QObject::tr("Use the same credentials for both database files."));
|
||||||
|
|
||||||
const QCommandLineOption Merge::KeyFileFromOption =
|
const QCommandLineOption Merge::KeyFileFromOption =
|
||||||
QCommandLineOption(QStringList() << "k"
|
QCommandLineOption(QStringList() << "key-file-from",
|
||||||
<< "key-file-from",
|
|
||||||
QObject::tr("Key file of the database to merge from."),
|
QObject::tr("Key file of the database to merge from."),
|
||||||
QObject::tr("path"));
|
QObject::tr("path"));
|
||||||
|
|
||||||
|
@ -1422,6 +1422,107 @@ void TestCli::testMerge()
|
|||||||
QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
|
QCOMPARE(m_stdoutFile->readAll(), QByteArray(""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TestCli::testMergeWithKeys()
|
||||||
|
{
|
||||||
|
Create createCmd;
|
||||||
|
QVERIFY(!createCmd.name.isEmpty());
|
||||||
|
QVERIFY(createCmd.getDescriptionLine().contains(createCmd.name));
|
||||||
|
|
||||||
|
Merge mergeCmd;
|
||||||
|
QVERIFY(!mergeCmd.name.isEmpty());
|
||||||
|
QVERIFY(mergeCmd.getDescriptionLine().contains(mergeCmd.name));
|
||||||
|
|
||||||
|
Kdbx4Writer writer;
|
||||||
|
Kdbx4Reader reader;
|
||||||
|
|
||||||
|
QScopedPointer<QTemporaryDir> testDir(new QTemporaryDir());
|
||||||
|
|
||||||
|
QString sourceDatabaseFilename = testDir->path() + "/testSourceDatabase.kdbx";
|
||||||
|
QString sourceKeyfilePath = testDir->path() + "/testSourceKeyfile.txt";
|
||||||
|
|
||||||
|
QString targetDatabaseFilename = testDir->path() + "/testTargetDatabase.kdbx";
|
||||||
|
QString targetKeyfilePath = testDir->path() + "/testTargetKeyfile.txt";
|
||||||
|
|
||||||
|
qint64 pos = m_stdoutFile->pos();
|
||||||
|
|
||||||
|
Utils::Test::setNextPassword("a");
|
||||||
|
createCmd.execute({"create", sourceDatabaseFilename, "-k", sourceKeyfilePath});
|
||||||
|
|
||||||
|
Utils::Test::setNextPassword("b");
|
||||||
|
createCmd.execute({"create", targetDatabaseFilename, "-k", targetKeyfilePath});
|
||||||
|
|
||||||
|
Utils::Test::setNextPassword("a");
|
||||||
|
auto sourceDatabase = QSharedPointer<Database>(
|
||||||
|
Utils::unlockDatabase(sourceDatabaseFilename, true, sourceKeyfilePath, "", Utils::STDOUT));
|
||||||
|
QVERIFY(sourceDatabase);
|
||||||
|
|
||||||
|
Utils::Test::setNextPassword("b");
|
||||||
|
auto targetDatabase = QSharedPointer<Database>(
|
||||||
|
Utils::unlockDatabase(targetDatabaseFilename, true, targetKeyfilePath, "", Utils::STDOUT));
|
||||||
|
QVERIFY(targetDatabase);
|
||||||
|
|
||||||
|
auto* rootGroup = new Group();
|
||||||
|
rootGroup->setName("root");
|
||||||
|
rootGroup->setUuid(QUuid::createUuid());
|
||||||
|
auto* group = new Group();
|
||||||
|
group->setUuid(QUuid::createUuid());
|
||||||
|
group->setParent(rootGroup);
|
||||||
|
group->setName("Internet");
|
||||||
|
|
||||||
|
auto* entry = new Entry();
|
||||||
|
entry->setUuid(QUuid::createUuid());
|
||||||
|
entry->setTitle("Some Website");
|
||||||
|
entry->setPassword("secretsecretsecret");
|
||||||
|
group->addEntry(entry);
|
||||||
|
|
||||||
|
sourceDatabase->setRootGroup(rootGroup);
|
||||||
|
|
||||||
|
auto* otherRootGroup = new Group();
|
||||||
|
otherRootGroup->setName("root");
|
||||||
|
otherRootGroup->setUuid(QUuid::createUuid());
|
||||||
|
auto* otherGroup = new Group();
|
||||||
|
otherGroup->setUuid(QUuid::createUuid());
|
||||||
|
otherGroup->setParent(otherRootGroup);
|
||||||
|
otherGroup->setName("Internet");
|
||||||
|
|
||||||
|
auto* otherEntry = new Entry();
|
||||||
|
otherEntry->setUuid(QUuid::createUuid());
|
||||||
|
otherEntry->setTitle("Some Website 2");
|
||||||
|
otherEntry->setPassword("secretsecretsecret 2");
|
||||||
|
otherGroup->addEntry(otherEntry);
|
||||||
|
|
||||||
|
targetDatabase->setRootGroup(otherRootGroup);
|
||||||
|
|
||||||
|
QFile sourceDatabaseFile(sourceDatabaseFilename);
|
||||||
|
sourceDatabaseFile.open(QIODevice::WriteOnly);
|
||||||
|
QVERIFY(writer.writeDatabase(&sourceDatabaseFile, sourceDatabase.data()));
|
||||||
|
sourceDatabaseFile.flush();
|
||||||
|
sourceDatabaseFile.close();
|
||||||
|
|
||||||
|
QFile targetDatabaseFile(targetDatabaseFilename);
|
||||||
|
targetDatabaseFile.open(QIODevice::WriteOnly);
|
||||||
|
QVERIFY(writer.writeDatabase(&targetDatabaseFile, targetDatabase.data()));
|
||||||
|
targetDatabaseFile.flush();
|
||||||
|
targetDatabaseFile.close();
|
||||||
|
|
||||||
|
pos = m_stdoutFile->pos();
|
||||||
|
Utils::Test::setNextPassword("b");
|
||||||
|
Utils::Test::setNextPassword("a");
|
||||||
|
mergeCmd.execute({"merge",
|
||||||
|
"-k",
|
||||||
|
targetKeyfilePath,
|
||||||
|
"--key-file-from",
|
||||||
|
sourceKeyfilePath,
|
||||||
|
targetDatabaseFile.fileName(),
|
||||||
|
sourceDatabaseFile.fileName()});
|
||||||
|
|
||||||
|
m_stdoutFile->seek(pos);
|
||||||
|
QList<QByteArray> lines = m_stdoutFile->readAll().split('\n');
|
||||||
|
QVERIFY(lines.contains(QString("Successfully merged %1 into %2.")
|
||||||
|
.arg(sourceDatabaseFile.fileName(), targetDatabaseFile.fileName())
|
||||||
|
.toUtf8()));
|
||||||
|
}
|
||||||
|
|
||||||
void TestCli::testMove()
|
void TestCli::testMove()
|
||||||
{
|
{
|
||||||
Move moveCmd;
|
Move moveCmd;
|
||||||
|
@ -66,6 +66,7 @@ private slots:
|
|||||||
void testList();
|
void testList();
|
||||||
void testLocate();
|
void testLocate();
|
||||||
void testMerge();
|
void testMerge();
|
||||||
|
void testMergeWithKeys();
|
||||||
void testMove();
|
void testMove();
|
||||||
void testOpen();
|
void testOpen();
|
||||||
void testRemove();
|
void testRemove();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user