File indexing completed on 2024-04-28 03:59:09

0001 // vi: ts=8 sts=4 sw=4
0002 /*
0003     This file is part of the KDE libraries
0004     SPDX-FileCopyrightText: 1998 Pietro Iglio <iglio@fub.it>
0005     SPDX-FileCopyrightText: 1999, 2000 Geert Jansen <jansen@kde.org>
0006     SPDX-FileCopyrightText: 2004, 2005 Andrew Coles <andrew_coles@yahoo.co.uk>
0007     SPDX-FileCopyrightText: 2007 Michaƫl Larouche <larouche@kde.org>
0008 
0009     SPDX-License-Identifier: LGPL-2.0-only
0010 */
0011 #include "knewpassworddialog.h"
0012 
0013 #include <QMessageBox>
0014 #include <QPushButton>
0015 #include <QString>
0016 #include <QStyleOption>
0017 
0018 #include <ktitlewidget.h>
0019 
0020 #include "ui_knewpassworddialog.h"
0021 
0022 class KNewPasswordDialogPrivate
0023 {
0024     Q_DECLARE_TR_FUNCTIONS(KNewPasswordDialog)
0025 
0026 public:
0027     KNewPasswordDialogPrivate(KNewPasswordDialog *parent)
0028         : q(parent)
0029     {
0030     }
0031 
0032     void init();
0033     void passwordStatusChanged();
0034     void showMessageWidget(const QString &message, KMessageWidget::MessageType type);
0035 
0036     KNewPasswordDialog *const q;
0037 
0038     QString pass;
0039     QIcon icon;
0040 
0041     Ui::KNewPasswordDialog ui;
0042 };
0043 
0044 void KNewPasswordDialogPrivate::init()
0045 {
0046     ui.setupUi(q);
0047     q->setIcon(QIcon::fromTheme(QStringLiteral("dialog-password")));
0048 
0049     ui.statusMsgWidget->hide();
0050 
0051     QObject::connect(ui.pwdWidget, &KNewPasswordWidget::passwordStatusChanged, q, [this]() {
0052         passwordStatusChanged();
0053     });
0054 }
0055 
0056 void KNewPasswordDialogPrivate::passwordStatusChanged()
0057 {
0058     switch (ui.pwdWidget->passwordStatus()) {
0059     case KNewPasswordWidget::PasswordTooShort:
0060         ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
0061         //~ singular Password must be at least %n character long
0062         //~ plural Password must be at least %n characters long
0063         showMessageWidget(tr("Password must be at least %n character(s) long.", "@info", ui.pwdWidget->minimumPasswordLength()), KMessageWidget::Error);
0064         break;
0065     case KNewPasswordWidget::EmptyPasswordNotAllowed:
0066         ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
0067         showMessageWidget(tr("Password is empty.", "@info"), KMessageWidget::Warning);
0068         break;
0069     case KNewPasswordWidget::PasswordNotVerified:
0070         ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
0071         showMessageWidget(tr("Passwords do not match.", "@info"), KMessageWidget::Warning);
0072         break;
0073     case KNewPasswordWidget::WeakPassword:
0074     case KNewPasswordWidget::StrongPassword:
0075         ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
0076         showMessageWidget(tr("Passwords match.", "@info"), KMessageWidget::Positive);
0077         break;
0078     }
0079 }
0080 
0081 void KNewPasswordDialogPrivate::showMessageWidget(const QString &message, KMessageWidget::MessageType type)
0082 {
0083     ui.statusMsgWidget->setText(message);
0084     ui.statusMsgWidget->setMessageType(type);
0085     ui.statusMsgWidget->animatedShow();
0086 }
0087 
0088 /*
0089  * Password dialog.
0090  */
0091 
0092 KNewPasswordDialog::KNewPasswordDialog(QWidget *parent)
0093     : QDialog(parent)
0094     , d(new KNewPasswordDialogPrivate(this))
0095 {
0096     d->init();
0097 }
0098 
0099 KNewPasswordDialog::~KNewPasswordDialog() = default;
0100 
0101 void KNewPasswordDialog::setPrompt(const QString &prompt)
0102 {
0103     d->ui.labelPrompt->setText(prompt);
0104     d->ui.labelPrompt->setMinimumSize(d->ui.labelPrompt->sizeHint());
0105 }
0106 
0107 QString KNewPasswordDialog::prompt() const
0108 {
0109     return d->ui.labelPrompt->text();
0110 }
0111 
0112 void KNewPasswordDialog::setIcon(const QIcon &icon)
0113 {
0114     d->icon = icon;
0115     QStyleOption option;
0116     option.initFrom(this);
0117     const int iconSize = style()->pixelMetric(QStyle::PM_MessageBoxIconSize, &option, this);
0118     d->ui.labelIcon->setPixmap(icon.pixmap(iconSize, iconSize));
0119     d->ui.labelIcon->setFixedSize(d->ui.labelIcon->sizeHint());
0120 }
0121 
0122 QIcon KNewPasswordDialog::icon() const
0123 {
0124     return d->icon;
0125 }
0126 
0127 bool KNewPasswordDialog::checkAndGetPassword(QString *pwd)
0128 {
0129     pwd->clear();
0130 
0131     if (d->ui.pwdWidget->passwordStatus() == KNewPasswordWidget::WeakPassword) {
0132         QMessageBox::StandardButton selectedButton = QMessageBox::warning(this,
0133                                                                           tr("Low Password Strength", "@title:window"),
0134                                                                           tr("The password you have entered has a low strength. "
0135                                                                              "To improve the strength of "
0136                                                                              "the password, try:\n"
0137                                                                              " - using a longer password;\n"
0138                                                                              " - using a mixture of upper- and lower-case letters;\n"
0139                                                                              " - using numbers or symbols as well as letters.\n"
0140                                                                              "\n"
0141                                                                              "Would you like to use this password anyway?"),
0142                                                                           QMessageBox::Yes | QMessageBox::No);
0143 
0144         if (selectedButton == QMessageBox::No) {
0145             return false;
0146         }
0147     }
0148     if (!checkPassword(d->ui.pwdWidget->password())) {
0149         return false;
0150     }
0151 
0152     *pwd = d->ui.pwdWidget->password();
0153     return true;
0154 }
0155 
0156 void KNewPasswordDialog::accept()
0157 {
0158     QString pwd;
0159     if (!checkAndGetPassword(&pwd)) {
0160         return;
0161     }
0162     d->pass = pwd;
0163     Q_EMIT newPassword(d->pass);
0164     QDialog::accept();
0165 }
0166 
0167 void KNewPasswordDialog::setAllowEmptyPasswords(bool allowed)
0168 {
0169     d->ui.pwdWidget->setAllowEmptyPasswords(allowed);
0170 }
0171 
0172 bool KNewPasswordDialog::allowEmptyPasswords() const
0173 {
0174     return d->ui.pwdWidget->allowEmptyPasswords();
0175 }
0176 
0177 void KNewPasswordDialog::setMinimumPasswordLength(int minLength)
0178 {
0179     d->ui.pwdWidget->setMinimumPasswordLength(minLength);
0180 }
0181 
0182 int KNewPasswordDialog::minimumPasswordLength() const
0183 {
0184     return d->ui.pwdWidget->minimumPasswordLength();
0185 }
0186 
0187 void KNewPasswordDialog::setMaximumPasswordLength(int maxLength)
0188 {
0189     d->ui.pwdWidget->setMaximumPasswordLength(maxLength);
0190 }
0191 
0192 int KNewPasswordDialog::maximumPasswordLength() const
0193 {
0194     return d->ui.pwdWidget->maximumPasswordLength();
0195 }
0196 
0197 // reasonable password length code contributed by Steffen Mthing
0198 
0199 void KNewPasswordDialog::setReasonablePasswordLength(int reasonableLength)
0200 {
0201     d->ui.pwdWidget->setReasonablePasswordLength(reasonableLength);
0202 }
0203 
0204 int KNewPasswordDialog::reasonablePasswordLength() const
0205 {
0206     return d->ui.pwdWidget->reasonablePasswordLength();
0207 }
0208 
0209 void KNewPasswordDialog::setPasswordStrengthWarningLevel(int warningLevel)
0210 {
0211     d->ui.pwdWidget->setPasswordStrengthWarningLevel(warningLevel);
0212 }
0213 
0214 int KNewPasswordDialog::passwordStrengthWarningLevel() const
0215 {
0216     return d->ui.pwdWidget->passwordStrengthWarningLevel();
0217 }
0218 
0219 void KNewPasswordDialog::setBackgroundWarningColor(const QColor &color)
0220 {
0221     d->ui.pwdWidget->setBackgroundWarningColor(color);
0222 }
0223 
0224 QColor KNewPasswordDialog::backgroundWarningColor() const
0225 {
0226     return d->ui.pwdWidget->backgroundWarningColor();
0227 }
0228 
0229 QString KNewPasswordDialog::password() const
0230 {
0231     return d->pass;
0232 }
0233 
0234 #if KWIDGETSADDONS_ENABLE_DEPRECATED_SINCE(6, 0)
0235 #pragma GCC diagnostic push
0236 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
0237 void KNewPasswordDialog::setRevealPasswordAvailable(bool reveal)
0238 {
0239     d->ui.pwdWidget->setRevealPasswordAvailable(reveal);
0240 }
0241 
0242 bool KNewPasswordDialog::isRevealPasswordAvailable() const
0243 {
0244     return d->ui.pwdWidget->isRevealPasswordAvailable();
0245 }
0246 #pragma GCC diagnostic pop
0247 #endif
0248 
0249 KPassword::RevealMode KNewPasswordDialog::revealPasswordMode() const
0250 {
0251     return d->ui.pwdWidget->revealPasswordMode();
0252 }
0253 
0254 void KNewPasswordDialog::setRevealPasswordMode(KPassword::RevealMode revealPasswordMode)
0255 {
0256     d->ui.pwdWidget->setRevealPasswordMode(revealPasswordMode);
0257 }
0258 
0259 bool KNewPasswordDialog::checkPassword(const QString &)
0260 {
0261     return true;
0262 }
0263 
0264 #include "moc_knewpassworddialog.cpp"