Passwords are now saved in a password manager.
The password manager uses strong encryption using a key derived from the passphrase using scrypt key strengthening algorithm. This ensures encryption is performed using a strong key and that brute forcing the passphrase is time consuming. If the user loses his passphrase no recovery is possible.
This commit is contained in:
parent
2230a4bd61
commit
e36924c087
27 changed files with 605 additions and 346 deletions
|
|
@ -5,66 +5,96 @@
|
|||
#include <QLabel>
|
||||
#include <QLayout>
|
||||
#include <QLineEdit>
|
||||
#include <QPushButton>
|
||||
|
||||
PasswordPromptDialog::PasswordPromptDialog(QWidget *parent)
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(PasswordPromptDialog::Flags)
|
||||
|
||||
PasswordPromptDialog::PasswordPromptDialog(Flags flags, QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_Flags(flags)
|
||||
{
|
||||
m_connectionLabel = new QLabel(this);
|
||||
auto dialog_buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this);
|
||||
|
||||
m_passwordLabel = new QLabel(this);
|
||||
m_passwordInput = new QLineEdit(this);
|
||||
m_passwordInput->setEchoMode(QLineEdit::Password);
|
||||
|
||||
m_saveCheck = new QCheckBox(this);
|
||||
m_DialogButtons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this);
|
||||
|
||||
const size_t inputFieldCount = flags.testFlag(ConfirmPassword) ? 2 : 1;
|
||||
|
||||
auto mainLayout = new QGridLayout;
|
||||
int row = 0;
|
||||
mainLayout->addWidget(m_connectionLabel, row, 0, 1, 2);
|
||||
++row;
|
||||
mainLayout->addWidget(m_passwordLabel, row, 0);
|
||||
mainLayout->addWidget(m_passwordInput, row, 1);
|
||||
++row;
|
||||
mainLayout->addWidget(m_saveCheck, row, 1);
|
||||
++row;
|
||||
mainLayout->addWidget(dialog_buttons, row, 0, 1 ,2);
|
||||
for (size_t idx = 0; idx < inputFieldCount; ++idx) {
|
||||
auto lbl = new QLabel(this);
|
||||
auto input = new QLineEdit(this);
|
||||
input->setEchoMode(QLineEdit::Password);
|
||||
mainLayout->addWidget(lbl, row, 0);
|
||||
mainLayout->addWidget(input, row, 1);
|
||||
m_passwordLabel[idx] = lbl;
|
||||
m_passwordInput[idx] = input;
|
||||
++row;
|
||||
}
|
||||
if (m_Flags.testFlag(SaveOption)) {
|
||||
m_saveCheck = new QCheckBox(this);
|
||||
mainLayout->addWidget(m_saveCheck, row, 1);
|
||||
++row;
|
||||
}
|
||||
mainLayout->addWidget(m_DialogButtons, row, 0, 1 ,2);
|
||||
setLayout(mainLayout);
|
||||
|
||||
m_passwordInput->setFocus();
|
||||
m_passwordInput[0]->setFocus();
|
||||
retranslateUi();
|
||||
|
||||
// QMetaObject::connectSlotsByName(BackupDialog);
|
||||
connect(dialog_buttons, &QDialogButtonBox::accepted, this, &PasswordPromptDialog::accept);
|
||||
connect(dialog_buttons, &QDialogButtonBox::rejected, this, &PasswordPromptDialog::reject);
|
||||
connect(m_DialogButtons, &QDialogButtonBox::accepted, this, &PasswordPromptDialog::accept);
|
||||
connect(m_DialogButtons, &QDialogButtonBox::rejected, this, &PasswordPromptDialog::reject);
|
||||
connect(m_passwordInput[0], &QLineEdit::textChanged, this, &PasswordPromptDialog::passwordChanged);
|
||||
if (m_passwordInput[1])
|
||||
connect(m_passwordInput[1], &QLineEdit::textChanged, this, &PasswordPromptDialog::passwordChanged);
|
||||
}
|
||||
|
||||
void PasswordPromptDialog::retranslateUi()
|
||||
{
|
||||
const char * context = "PasswordPromptDialog";
|
||||
setWindowTitle(QApplication::translate(context, "Connection password", nullptr));
|
||||
m_passwordLabel->setText(QApplication::translate(context, "Password", nullptr));
|
||||
m_passwordInput->setPlaceholderText(QApplication::translate(context, "Enter password", nullptr));
|
||||
m_saveCheck->setText(QApplication::translate(context, "Save password", nullptr));
|
||||
m_passwordLabel[0]->setText(QApplication::translate(context, "Password", nullptr));
|
||||
m_passwordInput[0]->setPlaceholderText(QApplication::translate(context, "Enter password", nullptr));
|
||||
if (m_passwordLabel[1])
|
||||
m_passwordLabel[1]->setText(QApplication::translate(context, "Confirm password", nullptr));
|
||||
if (m_passwordInput[1])
|
||||
m_passwordInput[1]->setPlaceholderText(QApplication::translate(context, "Reenter same password for confirmation", nullptr));
|
||||
if (m_saveCheck)
|
||||
m_saveCheck->setText(QApplication::translate(context, "Save password", nullptr));
|
||||
}
|
||||
|
||||
void PasswordPromptDialog::setConnectionDescription(const QString &description)
|
||||
void PasswordPromptDialog::updateOkEnabled()
|
||||
{
|
||||
m_connectionLabel->setText(QString(tr("Please provide password for connection %1")).arg(description));
|
||||
bool enabled = true;
|
||||
if (m_passwordInput[1])
|
||||
enabled = m_passwordInput[0]->text() == m_passwordInput[1]->text();
|
||||
|
||||
auto btn = m_DialogButtons->button(QDialogButtonBox::Ok);
|
||||
btn->setEnabled(enabled);
|
||||
}
|
||||
|
||||
void PasswordPromptDialog::passwordChanged(const QString &)
|
||||
{
|
||||
updateOkEnabled();
|
||||
}
|
||||
|
||||
void PasswordPromptDialog::setDescription(const QString &description)
|
||||
{
|
||||
m_connectionLabel->setText(QString("%1").arg(description));
|
||||
|
||||
}
|
||||
|
||||
QString PasswordPromptDialog::password() const
|
||||
{
|
||||
return m_passwordInput->text();
|
||||
return m_passwordInput[0]->text();
|
||||
}
|
||||
|
||||
//void PasswordPromptDialog::accept()
|
||||
//{
|
||||
bool PasswordPromptDialog::saveChecked() const
|
||||
{
|
||||
if (m_saveCheck)
|
||||
return m_saveCheck->checkState() == Qt::Checked;
|
||||
|
||||
//}
|
||||
|
||||
//void PasswordPromptDialog::reject()
|
||||
//{
|
||||
|
||||
//}
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue