File indexing completed on 2024-04-28 15:31:53

0001 /*
0002     SPDX-FileCopyrightText: 2015 Elvis Angelaccio <elvis.angelaccio@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "knewpasswordwidgettest.h"
0008 
0009 #include <QAction>
0010 #include <QLineEdit>
0011 #include <QTest>
0012 
0013 #include <KPasswordLineEdit>
0014 #include <knewpasswordwidget.h>
0015 
0016 QTEST_MAIN(KNewPasswordWidgetTest)
0017 
0018 void KNewPasswordWidgetTest::testEmptyPasswordAllowed()
0019 {
0020     KNewPasswordWidget pwdWidget;
0021 
0022     QVERIFY(pwdWidget.allowEmptyPasswords());
0023     QCOMPARE(pwdWidget.minimumPasswordLength(), 0);
0024     QCOMPARE(pwdWidget.passwordStatus(), KNewPasswordWidget::WeakPassword);
0025 }
0026 
0027 void KNewPasswordWidgetTest::testEmptyPasswordNotAllowed()
0028 {
0029     KNewPasswordWidget pwdWidget;
0030 
0031     pwdWidget.setAllowEmptyPasswords(false);
0032 
0033     QVERIFY(!pwdWidget.allowEmptyPasswords());
0034     QCOMPARE(pwdWidget.minimumPasswordLength(), 1);
0035     QCOMPARE(pwdWidget.passwordStatus(), KNewPasswordWidget::EmptyPasswordNotAllowed);
0036 }
0037 
0038 void KNewPasswordWidgetTest::testPasswordTooShort()
0039 {
0040     KNewPasswordWidget pwdWidget;
0041 
0042     pwdWidget.setMinimumPasswordLength(5);
0043     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0044     auto lineVerifyPassword = pwdWidget.findChild<QLineEdit *>(QStringLiteral("lineVerifyPassword"));
0045 
0046     QVERIFY(linePassword);
0047     QVERIFY(lineVerifyPassword);
0048 
0049     const QString password = QStringLiteral("1234");
0050     // We can't use setPassword here as when we call it for security we don't allow to show password. So we need to use setText
0051     linePassword->lineEdit()->setText(password);
0052     lineVerifyPassword->setText(password);
0053 
0054     QCOMPARE(pwdWidget.passwordStatus(), KNewPasswordWidget::PasswordTooShort);
0055 }
0056 
0057 void KNewPasswordWidgetTest::testPasswordMatch()
0058 {
0059     KNewPasswordWidget pwdWidget;
0060 
0061     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0062     auto lineVerifyPassword = pwdWidget.findChild<QLineEdit *>(QStringLiteral("lineVerifyPassword"));
0063 
0064     QVERIFY(linePassword);
0065     QVERIFY(lineVerifyPassword);
0066 
0067     const QString password = QStringLiteral("1234");
0068     linePassword->lineEdit()->setText(password);
0069     lineVerifyPassword->setText(password);
0070 
0071     QVERIFY(pwdWidget.passwordStatus() != KNewPasswordWidget::PasswordNotVerified);
0072     QCOMPARE(pwdWidget.password(), password);
0073 }
0074 
0075 void KNewPasswordWidgetTest::testPasswordNotVerified()
0076 {
0077     KNewPasswordWidget pwdWidget;
0078 
0079     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0080 
0081     QVERIFY(linePassword);
0082 
0083     const QString password = QStringLiteral("1234");
0084     linePassword->lineEdit()->setText(password);
0085 
0086     QCOMPARE(pwdWidget.passwordStatus(), KNewPasswordWidget::PasswordNotVerified);
0087 }
0088 
0089 void KNewPasswordWidgetTest::testWeakPassword()
0090 {
0091     KNewPasswordWidget pwdWidget;
0092 
0093     pwdWidget.setPasswordStrengthWarningLevel(30);
0094     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0095     auto lineVerifyPassword = pwdWidget.findChild<QLineEdit *>(QStringLiteral("lineVerifyPassword"));
0096 
0097     QVERIFY(linePassword);
0098     QVERIFY(lineVerifyPassword);
0099 
0100     const QString password = QStringLiteral("1234");
0101     linePassword->lineEdit()->setText(password);
0102     lineVerifyPassword->setText(password);
0103 
0104     QCOMPARE(pwdWidget.passwordStatus(), KNewPasswordWidget::WeakPassword);
0105 }
0106 
0107 void KNewPasswordWidgetTest::testStrongPassword()
0108 {
0109     KNewPasswordWidget pwdWidget;
0110 
0111     pwdWidget.setPasswordStrengthWarningLevel(99);
0112     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0113     auto lineVerifyPassword = pwdWidget.findChild<QLineEdit *>(QStringLiteral("lineVerifyPassword"));
0114 
0115     QVERIFY(linePassword);
0116     QVERIFY(lineVerifyPassword);
0117 
0118     const auto password = QStringLiteral("DHlKOJ1GotXWVE_fnqm1"); // generated by KeePass
0119     linePassword->lineEdit()->setText(password);
0120     lineVerifyPassword->setText(password);
0121 
0122     QCOMPARE(pwdWidget.passwordStatus(), KNewPasswordWidget::StrongPassword);
0123 }
0124 
0125 void KNewPasswordWidgetTest::testReasonablePasswordLength()
0126 {
0127     KNewPasswordWidget pwdWidget;
0128 
0129     pwdWidget.setReasonablePasswordLength(10);
0130     QCOMPARE(pwdWidget.reasonablePasswordLength(), 10);
0131 
0132     pwdWidget.setReasonablePasswordLength(0);
0133     QCOMPARE(pwdWidget.reasonablePasswordLength(), 1);
0134 
0135     pwdWidget.setReasonablePasswordLength(pwdWidget.maximumPasswordLength() + 1);
0136     QCOMPARE(pwdWidget.reasonablePasswordLength(), pwdWidget.maximumPasswordLength());
0137 }
0138 
0139 void KNewPasswordWidgetTest::testPasswordStrengthWarningLevel()
0140 {
0141     KNewPasswordWidget pwdWidget;
0142 
0143     pwdWidget.setPasswordStrengthWarningLevel(40);
0144     QCOMPARE(pwdWidget.passwordStrengthWarningLevel(), 40);
0145 
0146     pwdWidget.setPasswordStrengthWarningLevel(-1);
0147     QCOMPARE(pwdWidget.passwordStrengthWarningLevel(), 0);
0148 
0149     pwdWidget.setPasswordStrengthWarningLevel(100);
0150     QCOMPARE(pwdWidget.passwordStrengthWarningLevel(), 99);
0151 }
0152 
0153 void KNewPasswordWidgetTest::testNoWarningColorBeforeMismatch()
0154 {
0155     KNewPasswordWidget pwdWidget;
0156     QColor defaultColor = pwdWidget.palette().color(QPalette::Base);
0157     QColor warningColor(Qt::red);
0158 
0159     pwdWidget.setBackgroundWarningColor(warningColor);
0160 
0161     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0162     auto lineVerifyPassword = pwdWidget.findChild<QLineEdit *>(QStringLiteral("lineVerifyPassword"));
0163 
0164     QVERIFY(linePassword);
0165     QVERIFY(lineVerifyPassword);
0166 
0167     linePassword->lineEdit()->setText(QStringLiteral("1234"));
0168     QCOMPARE(lineVerifyPassword->palette().color(QPalette::Base), defaultColor);
0169 
0170     lineVerifyPassword->setText(QStringLiteral("12"));
0171     QCOMPARE(lineVerifyPassword->palette().color(QPalette::Base), defaultColor);
0172 }
0173 
0174 void KNewPasswordWidgetTest::testWarningColorIfMismatch()
0175 {
0176     KNewPasswordWidget pwdWidget;
0177     QColor defaultColor = pwdWidget.palette().color(QPalette::Base);
0178     QColor warningColor(Qt::red);
0179 
0180     pwdWidget.setBackgroundWarningColor(warningColor);
0181 
0182     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0183     auto lineVerifyPassword = pwdWidget.findChild<QLineEdit *>(QStringLiteral("lineVerifyPassword"));
0184 
0185     QVERIFY(linePassword);
0186     QVERIFY(lineVerifyPassword);
0187 
0188     linePassword->lineEdit()->setText(QStringLiteral("1234"));
0189     QCOMPARE(lineVerifyPassword->palette().color(QPalette::Base), defaultColor);
0190 
0191     lineVerifyPassword->setText(QStringLiteral("122"));
0192     QCOMPARE(lineVerifyPassword->palette().color(QPalette::Base), warningColor);
0193 
0194     lineVerifyPassword->setText(QStringLiteral("1224"));
0195     QCOMPARE(lineVerifyPassword->palette().color(QPalette::Base), warningColor);
0196 }
0197 
0198 void KNewPasswordWidgetTest::testWarningColorPostMatch()
0199 {
0200     KNewPasswordWidget pwdWidget;
0201     QColor defaultColor = pwdWidget.palette().color(QPalette::Base);
0202     QColor warningColor(Qt::red);
0203 
0204     pwdWidget.setBackgroundWarningColor(warningColor);
0205 
0206     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0207     auto lineVerifyPassword = pwdWidget.findChild<QLineEdit *>(QStringLiteral("lineVerifyPassword"));
0208 
0209     QVERIFY(linePassword);
0210     QVERIFY(lineVerifyPassword);
0211 
0212     linePassword->lineEdit()->setText(QStringLiteral("1234"));
0213     lineVerifyPassword->setText(QStringLiteral("1234"));
0214     QCOMPARE(lineVerifyPassword->palette().color(QPalette::Base), defaultColor);
0215 
0216     lineVerifyPassword->setText(QStringLiteral("12345"));
0217     QCOMPARE(lineVerifyPassword->palette().color(QPalette::Base), warningColor);
0218 }
0219 
0220 void KNewPasswordWidgetTest::disablingWidgetShouldUseDisabledPalette()
0221 {
0222     KNewPasswordWidget pwdWidget;
0223 
0224     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0225     auto lineVerifyPassword = pwdWidget.findChild<QLineEdit *>(QStringLiteral("lineVerifyPassword"));
0226 
0227     QVERIFY(linePassword && linePassword->isEnabled());
0228     QVERIFY(lineVerifyPassword && lineVerifyPassword->isEnabled());
0229 
0230     pwdWidget.setEnabled(false);
0231 
0232     QVERIFY(!linePassword->isEnabled());
0233     QVERIFY(!lineVerifyPassword->isEnabled());
0234 
0235     QCOMPARE(linePassword->palette(), pwdWidget.palette());
0236     QCOMPARE(lineVerifyPassword->palette(), pwdWidget.palette());
0237 }
0238 
0239 void KNewPasswordWidgetTest::disablingParentShouldUseDisabledPalette()
0240 {
0241     auto widget = new QWidget();
0242     widget->setEnabled(false);
0243 
0244     auto pwdWidget = new KNewPasswordWidget(widget);
0245     QVERIFY(!pwdWidget->isEnabled());
0246 
0247     auto linePassword = pwdWidget->findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0248     auto lineVerifyPassword = pwdWidget->findChild<QLineEdit *>(QStringLiteral("lineVerifyPassword"));
0249 
0250     QVERIFY(linePassword && !linePassword->isEnabled());
0251     QVERIFY(lineVerifyPassword && !lineVerifyPassword->isEnabled());
0252 
0253     QCOMPARE(linePassword->palette(), widget->palette());
0254     QCOMPARE(lineVerifyPassword->palette(), widget->palette());
0255 
0256     delete widget;
0257 }
0258 
0259 void KNewPasswordWidgetTest::disablingRevealPasswordShouldHideVisibilityAction()
0260 {
0261     KNewPasswordWidget pwdWidget;
0262 
0263     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0264     QVERIFY(linePassword);
0265 
0266     auto visibilityAction = linePassword->findChild<QAction *>(QStringLiteral("visibilityAction"));
0267     QVERIFY(visibilityAction && !visibilityAction->isVisible());
0268 
0269     linePassword->lineEdit()->setText(QStringLiteral("1234"));
0270     QVERIFY(visibilityAction->isVisible());
0271     QCOMPARE(pwdWidget.isRevealPasswordAvailable(), visibilityAction->isVisible());
0272 
0273     pwdWidget.setRevealPasswordAvailable(false);
0274     QVERIFY(!visibilityAction->isVisible());
0275     QCOMPARE(pwdWidget.isRevealPasswordAvailable(), visibilityAction->isVisible());
0276 }
0277 
0278 void KNewPasswordWidgetTest::shouldNotHideVisibilityActionInPlaintextMode()
0279 {
0280     KNewPasswordWidget pwdWidget;
0281 
0282     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0283     QVERIFY(linePassword);
0284 
0285     auto visibilityAction = linePassword->findChild<QAction *>(QStringLiteral("visibilityAction"));
0286     QVERIFY(visibilityAction && !visibilityAction->isVisible());
0287 
0288     linePassword->lineEdit()->setText(QStringLiteral("1234"));
0289     QVERIFY(visibilityAction->isVisible());
0290 
0291     visibilityAction->trigger();
0292     linePassword->clear();
0293     QVERIFY(visibilityAction->isVisible());
0294 }
0295 
0296 void KNewPasswordWidgetTest::shouldHideVerificationLineEditInPlaintextMode()
0297 {
0298     KNewPasswordWidget pwdWidget;
0299     pwdWidget.show();
0300 
0301     auto linePassword = pwdWidget.findChild<KPasswordLineEdit *>(QStringLiteral("linePassword"));
0302     auto lineVerifyPassword = pwdWidget.findChild<QLineEdit *>(QStringLiteral("lineVerifyPassword"));
0303     QVERIFY(linePassword);
0304     QVERIFY(lineVerifyPassword && lineVerifyPassword->isVisible());
0305 
0306     auto visibilityAction = linePassword->findChild<QAction *>(QStringLiteral("visibilityAction"));
0307     QVERIFY(visibilityAction);
0308 
0309     linePassword->lineEdit()->setText(QStringLiteral("1234"));
0310     visibilityAction->trigger();
0311     QVERIFY(!lineVerifyPassword->isVisible());
0312 }
0313 
0314 #include "moc_knewpasswordwidgettest.cpp"