diff --git a/autotests/knewpasswordwidgettest.h b/autotests/knewpasswordwidgettest.h --- a/autotests/knewpasswordwidgettest.h +++ b/autotests/knewpasswordwidgettest.h @@ -42,6 +42,7 @@ void testWarningColorPostMatch(); void disablingWidgetShouldUseDisabledPalette(); void disablingParentShouldUseDisabledPalette(); + void disablingRevealPasswordShouldHideVisibilityAction(); }; #endif diff --git a/autotests/knewpasswordwidgettest.cpp b/autotests/knewpasswordwidgettest.cpp --- a/autotests/knewpasswordwidgettest.cpp +++ b/autotests/knewpasswordwidgettest.cpp @@ -19,6 +19,7 @@ #include "knewpasswordwidgettest.h" +#include #include #include @@ -265,3 +266,22 @@ delete widget; } + +void KNewPasswordWidgetTest::disablingRevealPasswordShouldHideVisibilityAction() +{ + KNewPasswordWidget pwdWidget; + + auto linePassword = pwdWidget.findChild(QStringLiteral("linePassword")); + QVERIFY(linePassword); + + auto visibilityAction = linePassword->findChild(QStringLiteral("visibilityAction")); + QVERIFY(visibilityAction && !visibilityAction->isVisible()); + + linePassword->setText(QStringLiteral("1234")); + QVERIFY(visibilityAction->isVisible()); + QCOMPARE(pwdWidget.isRevealPasswordAvailable(), visibilityAction->isVisible()); + + pwdWidget.setRevealPasswordAvailable(false); + QVERIFY(!visibilityAction->isVisible()); + QCOMPARE(pwdWidget.isRevealPasswordAvailable(), visibilityAction->isVisible()); +} diff --git a/src/knewpassworddialog.h b/src/knewpassworddialog.h --- a/src/knewpassworddialog.h +++ b/src/knewpassworddialog.h @@ -202,6 +202,23 @@ QString password() const; /** + * Whether to show the visibility trailing action in the line edit. + * Default is true. This can be used to honor the lineedit_reveal_password + * kiosk key, for example: + * \code + * passwordDialog.setRevealPasswordAvailable(KAuthorized::authorize(QStringLiteral("lineedit_reveal_password"))); + * \endcode + * @since 5.31 + */ + void setRevealPasswordAvailable(bool reveal); + + /** + * Whether the visibility trailing action in the line edit is visible. + * @since 5.31 + */ + bool isRevealPasswordAvailable() const; + + /** * @internal */ void accept() Q_DECL_OVERRIDE; diff --git a/src/knewpassworddialog.cpp b/src/knewpassworddialog.cpp --- a/src/knewpassworddialog.cpp +++ b/src/knewpassworddialog.cpp @@ -242,6 +242,16 @@ return d->pass; } +void KNewPasswordDialog::setRevealPasswordAvailable(bool reveal) +{ + d->ui.pwdWidget->setRevealPasswordAvailable(reveal); +} + +bool KNewPasswordDialog::isRevealPasswordAvailable() const +{ + return d->ui.pwdWidget->isRevealPasswordAvailable(); +} + bool KNewPasswordDialog::checkPassword(const QString &) { return true; diff --git a/src/knewpasswordwidget.h b/src/knewpasswordwidget.h --- a/src/knewpasswordwidget.h +++ b/src/knewpasswordwidget.h @@ -81,6 +81,11 @@ Q_PROPERTY(int passwordStrengthWarningLevel READ passwordStrengthWarningLevel WRITE setPasswordStrengthWarningLevel) Q_PROPERTY(QColor backgroundWarningColor READ backgroundWarningColor WRITE setBackgroundWarningColor) Q_PROPERTY(bool passwordStrengthMeterVisible READ isPasswordStrengthMeterVisible WRITE setPasswordStrengthMeterVisible) + /** + * @since 5.31 + */ + Q_PROPERTY(bool revealPasswordAvailable READ isRevealPasswordAvailable WRITE setRevealPasswordAvailable) + public: @@ -152,6 +157,12 @@ bool isPasswordStrengthMeterVisible() const; /** + * Whether the visibility trailing action in the line edit is visible. + * @since 5.31 + */ + bool isRevealPasswordAvailable() const; + + /** * Returns the password entered. * @note Only returns meaningful data when passwordStatus * is either WeakPassword or StrongPassword. @@ -219,6 +230,17 @@ */ void setPasswordStrengthMeterVisible(bool visible); + /** + * Whether to show the visibility trailing action in the line edit. + * Default is true. This can be used to honor the lineedit_reveal_password + * kiosk key, for example: + * \code + * passwordWidget.setRevealPasswordAvailable(KAuthorized::authorize(QStringLiteral("lineedit_reveal_password"))); + * \endcode + * @since 5.31 + */ + void setRevealPasswordAvailable(bool reveal); + Q_SIGNALS: /** diff --git a/src/knewpasswordwidget.cpp b/src/knewpasswordwidget.cpp --- a/src/knewpasswordwidget.cpp +++ b/src/knewpasswordwidget.cpp @@ -34,6 +34,7 @@ minimumPasswordLength(0), passwordStrengthWarningLevel(1), reasonablePasswordLength(8), + revealPasswordAvailable(true), toggleEchoModeAction(nullptr) {} @@ -50,6 +51,7 @@ int minimumPasswordLength; int passwordStrengthWarningLevel; int reasonablePasswordLength; + bool revealPasswordAvailable; QAction *toggleEchoModeAction; QColor backgroundWarningColor; @@ -73,6 +75,7 @@ QIcon visibilityIcon = QIcon::fromTheme(QStringLiteral("visibility"), QIcon(QStringLiteral(":/icons/visibility.svg"))); toggleEchoModeAction = ui.linePassword->addAction(visibilityIcon, QLineEdit::TrailingPosition); + toggleEchoModeAction->setObjectName(QStringLiteral("visibilityAction")); toggleEchoModeAction->setVisible(false); toggleEchoModeAction->setToolTip(tr("Change the visibility of the password")); connect(toggleEchoModeAction, SIGNAL(triggered(bool)), q, SLOT(_k_toggleEchoMode())); @@ -138,7 +141,7 @@ void KNewPasswordWidget::KNewPasswordWidgetPrivate::_k_showToggleEchoModeAction(const QString &text) { - toggleEchoModeAction->setVisible(!text.isEmpty()); + toggleEchoModeAction->setVisible(revealPasswordAvailable && !text.isEmpty()); } int KNewPasswordWidget::KNewPasswordWidgetPrivate::effectivePasswordLength(const QString &password) @@ -261,6 +264,11 @@ return d->ui.labelStrengthMeter->isVisible() && d->ui.strengthBar->isVisible(); } +bool KNewPasswordWidget::isRevealPasswordAvailable() const +{ + return d->revealPasswordAvailable; +} + QString KNewPasswordWidget::password() const { return d->ui.linePassword->text(); @@ -312,4 +320,11 @@ d->ui.strengthBar->setVisible(visible); } +void KNewPasswordWidget::setRevealPasswordAvailable(bool reveal) +{ + d->revealPasswordAvailable = reveal; + // Force update, we might already have shown the action. + d->_k_showToggleEchoModeAction(password()); +} + #include "moc_knewpasswordwidget.cpp"