File indexing completed on 2025-02-16 13:11:46
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"