CLI: Cleanup create options (#4313)
* Add ability to create database with an empty password * Add password repeat check * Standardize process between `db-create` and `import` commands * Improve db-create tests with new password repeat Co-authored-by: Jonathan White <support@dmapps.us>
This commit is contained in:
@@ -36,12 +36,24 @@ const QCommandLineOption Create::DecryptionTimeOption =
|
||||
QObject::tr("Target decryption time in MS for the database."),
|
||||
QObject::tr("time"));
|
||||
|
||||
const QCommandLineOption Create::SetKeyFileOption =
|
||||
QCommandLineOption(QStringList() << "k"
|
||||
<< "set-key-file",
|
||||
QObject::tr("Set the key file for the database."),
|
||||
QObject::tr("path"));
|
||||
|
||||
const QCommandLineOption Create::SetPasswordOption =
|
||||
QCommandLineOption(QStringList() << "p"
|
||||
<< "set-password",
|
||||
QObject::tr("Set a password for the database."));
|
||||
|
||||
Create::Create()
|
||||
{
|
||||
name = QString("db-create");
|
||||
description = QObject::tr("Create a new database.");
|
||||
positionalArguments.append({QString("database"), QObject::tr("Path of the database."), QString("")});
|
||||
options.append(Command::KeyFileOption);
|
||||
options.append(Create::SetKeyFileOption);
|
||||
options.append(Create::SetPasswordOption);
|
||||
options.append(Create::DecryptionTimeOption);
|
||||
}
|
||||
|
||||
@@ -97,21 +109,26 @@ int Create::execute(const QStringList& arguments)
|
||||
|
||||
auto key = QSharedPointer<CompositeKey>::create();
|
||||
|
||||
auto password = Utils::getPasswordFromStdin();
|
||||
if (!password.isNull()) {
|
||||
key->addKey(password);
|
||||
if (parser->isSet(Create::SetPasswordOption)) {
|
||||
auto passwordKey = Utils::getPasswordFromStdin();
|
||||
if (passwordKey.isNull()) {
|
||||
err << QObject::tr("Failed to set database password.") << endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
key->addKey(passwordKey);
|
||||
}
|
||||
|
||||
QSharedPointer<FileKey> fileKey;
|
||||
if (parser->isSet(Command::KeyFileOption)) {
|
||||
if (!loadFileKey(parser->value(Command::KeyFileOption), fileKey)) {
|
||||
if (parser->isSet(Create::SetKeyFileOption)) {
|
||||
QSharedPointer<FileKey> fileKey;
|
||||
|
||||
if (!loadFileKey(parser->value(Create::SetKeyFileOption), fileKey)) {
|
||||
err << QObject::tr("Loading the key file failed") << endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!fileKey.isNull()) {
|
||||
key->addKey(fileKey);
|
||||
if (!fileKey.isNull()) {
|
||||
key->addKey(fileKey);
|
||||
}
|
||||
}
|
||||
|
||||
if (key->isEmpty()) {
|
||||
|
||||
@@ -28,6 +28,8 @@ public:
|
||||
Create();
|
||||
int execute(const QStringList& arguments) override;
|
||||
|
||||
static const QCommandLineOption SetKeyFileOption;
|
||||
static const QCommandLineOption SetPasswordOption;
|
||||
static const QCommandLineOption DecryptionTimeOption;
|
||||
|
||||
private:
|
||||
|
||||
@@ -70,10 +70,12 @@ int Import::execute(const QStringList& arguments)
|
||||
|
||||
auto key = QSharedPointer<CompositeKey>::create();
|
||||
|
||||
auto password = Utils::getPasswordFromStdin();
|
||||
if (!password.isNull()) {
|
||||
key->addKey(password);
|
||||
auto passwordKey = Utils::getPasswordFromStdin();
|
||||
if (passwordKey.isNull()) {
|
||||
errorTextStream << QObject::tr("Failed to set database password.") << endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
key->addKey(passwordKey);
|
||||
|
||||
if (key->isEmpty()) {
|
||||
errorTextStream << QObject::tr("No key is set. Aborting database creation.") << endl;
|
||||
|
||||
@@ -93,9 +93,12 @@ namespace Utils
|
||||
*
|
||||
* @param password password to return next
|
||||
*/
|
||||
void setNextPassword(const QString& password)
|
||||
void setNextPassword(const QString& password, bool repeat)
|
||||
{
|
||||
nextPasswords.append(password);
|
||||
if (repeat) {
|
||||
nextPasswords.append(password);
|
||||
}
|
||||
}
|
||||
} // namespace Test
|
||||
|
||||
@@ -232,10 +235,31 @@ namespace Utils
|
||||
|
||||
out << QObject::tr("Enter password to encrypt database (optional): ");
|
||||
out.flush();
|
||||
QString password = Utils::getPassword();
|
||||
auto password = Utils::getPassword();
|
||||
|
||||
if (!password.isEmpty()) {
|
||||
passwordKey = QSharedPointer<PasswordKey>(new PasswordKey(password));
|
||||
if (password.isEmpty()) {
|
||||
out << QObject::tr("Do you want to create a database with an empty password? [y/N]: ");
|
||||
out.flush();
|
||||
TextStream ts(STDIN, QIODevice::ReadOnly);
|
||||
if (!ts.device()->isSequential()) {
|
||||
// This is required for testing on macOS
|
||||
ts.seek(0);
|
||||
}
|
||||
auto ans = ts.readLine();
|
||||
if (ans.toLower().startsWith("y")) {
|
||||
passwordKey = QSharedPointer<PasswordKey>::create("");
|
||||
}
|
||||
out << endl;
|
||||
} else {
|
||||
out << QObject::tr("Repeat password: ");
|
||||
out.flush();
|
||||
auto repeat = Utils::getPassword();
|
||||
|
||||
if (password == repeat) {
|
||||
passwordKey = QSharedPointer<PasswordKey>::create(password);
|
||||
} else {
|
||||
out << QObject::tr("Error: Passwords do not match.") << endl;
|
||||
}
|
||||
}
|
||||
|
||||
return passwordKey;
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace Utils
|
||||
|
||||
namespace Test
|
||||
{
|
||||
void setNextPassword(const QString& password);
|
||||
void setNextPassword(const QString& password, bool repeat = false);
|
||||
}
|
||||
}; // namespace Utils
|
||||
|
||||
|
||||
Reference in New Issue
Block a user