File indexing completed on 2024-04-28 15:32:08

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 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 63)
0128 void KNewPasswordDialog::setPixmap(const QPixmap &pixmap)
0129 {
0130     d->ui.labelIcon->setPixmap(pixmap);
0131     d->ui.labelIcon->setFixedSize(d->ui.labelIcon->sizeHint());
0132 }
0133 
0134 QPixmap KNewPasswordDialog::pixmap() const
0135 {
0136     return d->ui.labelIcon->pixmap(Qt::ReturnByValue);
0137 }
0138 #endif
0139 
0140 bool KNewPasswordDialog::checkAndGetPassword(QString *pwd)
0141 {
0142     pwd->clear();
0143 
0144     if (d->ui.pwdWidget->passwordStatus() == KNewPasswordWidget::WeakPassword) {
0145         QMessageBox::StandardButton selectedButton = QMessageBox::warning(this,
0146                                                                           tr("Low Password Strength", "@title:window"),
0147                                                                           tr("The password you have entered has a low strength. "
0148                                                                              "To improve the strength of "
0149                                                                              "the password, try:\n"
0150                                                                              " - using a longer password;\n"
0151                                                                              " - using a mixture of upper- and lower-case letters;\n"
0152                                                                              " - using numbers or symbols as well as letters.\n"
0153                                                                              "\n"
0154                                                                              "Would you like to use this password anyway?"),
0155                                                                           QMessageBox::Yes | QMessageBox::No);
0156 
0157         if (selectedButton == QMessageBox::No) {
0158             return false;
0159         }
0160     }
0161     if (!checkPassword(d->ui.pwdWidget->password())) {
0162         return false;
0163     }
0164 
0165     *pwd = d->ui.pwdWidget->password();
0166     return true;
0167 }
0168 
0169 void KNewPasswordDialog::accept()
0170 {
0171     QString pwd;
0172     if (!checkAndGetPassword(&pwd)) {
0173         return;
0174     }
0175     d->pass = pwd;
0176     Q_EMIT newPassword(d->pass);
0177     QDialog::accept();
0178 }
0179 
0180 void KNewPasswordDialog::setAllowEmptyPasswords(bool allowed)
0181 {
0182     d->ui.pwdWidget->setAllowEmptyPasswords(allowed);
0183 }
0184 
0185 bool KNewPasswordDialog::allowEmptyPasswords() const
0186 {
0187     return d->ui.pwdWidget->allowEmptyPasswords();
0188 }
0189 
0190 void KNewPasswordDialog::setMinimumPasswordLength(int minLength)
0191 {
0192     d->ui.pwdWidget->setMinimumPasswordLength(minLength);
0193 }
0194 
0195 int KNewPasswordDialog::minimumPasswordLength() const
0196 {
0197     return d->ui.pwdWidget->minimumPasswordLength();
0198 }
0199 
0200 void KNewPasswordDialog::setMaximumPasswordLength(int maxLength)
0201 {
0202     d->ui.pwdWidget->setMaximumPasswordLength(maxLength);
0203 }
0204 
0205 int KNewPasswordDialog::maximumPasswordLength() const
0206 {
0207     return d->ui.pwdWidget->maximumPasswordLength();
0208 }
0209 
0210 // reasonable password length code contributed by Steffen Mthing
0211 
0212 void KNewPasswordDialog::setReasonablePasswordLength(int reasonableLength)
0213 {
0214     d->ui.pwdWidget->setReasonablePasswordLength(reasonableLength);
0215 }
0216 
0217 int KNewPasswordDialog::reasonablePasswordLength() const
0218 {
0219     return d->ui.pwdWidget->reasonablePasswordLength();
0220 }
0221 
0222 void KNewPasswordDialog::setPasswordStrengthWarningLevel(int warningLevel)
0223 {
0224     d->ui.pwdWidget->setPasswordStrengthWarningLevel(warningLevel);
0225 }
0226 
0227 int KNewPasswordDialog::passwordStrengthWarningLevel() const
0228 {
0229     return d->ui.pwdWidget->passwordStrengthWarningLevel();
0230 }
0231 
0232 void KNewPasswordDialog::setBackgroundWarningColor(const QColor &color)
0233 {
0234     d->ui.pwdWidget->setBackgroundWarningColor(color);
0235 }
0236 
0237 QColor KNewPasswordDialog::backgroundWarningColor() const
0238 {
0239     return d->ui.pwdWidget->backgroundWarningColor();
0240 }
0241 
0242 QString KNewPasswordDialog::password() const
0243 {
0244     return d->pass;
0245 }
0246 
0247 void KNewPasswordDialog::setRevealPasswordAvailable(bool reveal)
0248 {
0249     d->ui.pwdWidget->setRevealPasswordAvailable(reveal);
0250 }
0251 
0252 bool KNewPasswordDialog::isRevealPasswordAvailable() const
0253 {
0254     return d->ui.pwdWidget->isRevealPasswordAvailable();
0255 }
0256 
0257 bool KNewPasswordDialog::checkPassword(const QString &)
0258 {
0259     return true;
0260 }
0261 
0262 #include "moc_knewpassworddialog.cpp"