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:
louib
2020-03-18 21:51:36 -04:00
committed by GitHub
parent b045160e4f
commit e6c2c7ed93
8 changed files with 171 additions and 54 deletions

View File

@@ -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()) {

View File

@@ -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:

View File

@@ -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;

View File

@@ -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;

View File

@@ -62,7 +62,7 @@ namespace Utils
namespace Test
{
void setNextPassword(const QString& password);
void setNextPassword(const QString& password, bool repeat = false);
}
}; // namespace Utils