File indexing completed on 2025-03-23 06:51:45
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"