diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 85f2132d..9cc0f030 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -59,7 +59,7 @@ macro(Test name) add_test(NAME ${name} COMMAND ${name}) set_target_properties(${name} PROPERTIES MACOSX_BUNDLE FALSE) add_dependencies(tests ${name}) - set_tests_properties(${name} PROPERTIES LABELS console) + set_tests_properties(${name} PROPERTIES LABELS "console;lib") endmacro() if(BUILD_TESTING) diff --git a/lib/pki_multi.cpp b/lib/pki_multi.cpp index f3c6332e..a8742ddd 100644 --- a/lib/pki_multi.cpp +++ b/lib/pki_multi.cpp @@ -133,6 +133,7 @@ void pki_multi::fromPEMbyteArray(const QByteArray &_ba, const QString &name) } ba.remove(0, sizeof BEGIN -1); } + pki_ign_openssl_error(); if (multi.size() == old_count) throw errorEx(tr("No known PEM encoded items found")); } diff --git a/lib/test_main.cpp b/lib/test_main.cpp index b6518a48..b69dd9ce 100644 --- a/lib/test_main.cpp +++ b/lib/test_main.cpp @@ -14,11 +14,15 @@ #include "widgets/MainWindow.h" #include "ui_MainWindow.h" +#include "widgets/ImportMulti.h" +#include "ui_ImportMulti.h" #include "widgets/NewKey.h" #include "ui_NewKey.h" #include "entropy.h" #include "pki_evp.h" +#include "pki_multi.h" #include "debug_info.h" +#include "PwDialogCore.h" char segv_data[1024]; @@ -33,6 +37,7 @@ class test_main: public QObject void initTestCase(); void cleanupTestCase(); void newKey(); + void importPEM(); }; void test_main::initTestCase() @@ -142,6 +147,140 @@ void test_main::newKey() dlg->accept(); delete dlg; } +const QString pemcert(R"PEM( +-----BEGIN CERTIFICATE----- +MIIDGzCCAgOgAwIBAgIIOvC5r9Smk3wwDQYJKoZIhvcNAQELBQAwEjEQMA4GA1UE +AxMHUm9vdCBDQTAeFw0yMzEwMjUxODU1MDBaFw0zMzA5MTgxNjQxMDBaMBUxEzAR +BgNVBAMTCkludGVyIENBIDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDJlExG3+oLO6GFuD4pa9sI5mJL/9fADcoe9bv1SAnRKu/GPtCMaruVTKBAt5x4 +mwt5My6WhyPdpYp0z6yUgSCrbkSAMvMzGlS1W5Ke4UU4GaufCRjHeXNVpx9wXEPY +y46HO5vSZZiGzl46UMmeVkV5kGeh8y2giS/M0prVqpOLdIloeJykgp8k29llkFj/ +OEa2WPiKhUnBvna5IDyrjjTKUGo5mxi9RVuArZwZ16kdJPG292WOVtQ8uTg391XQ +2uOho/nv/IoWysZLnwvHIZkcH413owvBULqM5fVda0j9qkvQEKa4GAiitx2HX0wW +YNvtUhZrXnHU/DzYkbhZrW7VAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFE5aAJMfa9ksd7718xYlNHF/YSjtMAsGA1UdDwQEAwIBBjARBglghkgB +hvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkq +hkiG9w0BAQsFAAOCAQEAbUcuBvX6jGBYDFBPn1dK9xEQuexrh7gUtNEEKumDF6vN +Bj6xHxZjjwrJsGeX8aTqS3J5BE8vsv4+xiPWaObalUtmkGrS0x/DAe6ZpzGl/aq7 +tknve6VF9s58SjnefQhf4ko18/sylX0Rp7dliMckM3fcUINe0HgzbO25MqNiTZo4 +/WPhDmvJPxbogzFoHWA/8jh1/EMyxd8JeiEG6SxZE2PL8oY0i52zHDQCFr6S8dyc +OWuGL0dQBu7Oi0f/eKBxWPf8uExTjSj44z6y0y/ioJ4+vvxVJZu9eBY6GtQ3Zjck +HcE+16987H74MazZVpmS1O23RxxT9SSJCTsqQRl58g== +-----END CERTIFICATE----- +)PEM"); +const QString pempk8(R"PEM( +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIWPH8Cg7cPigCAggA +MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBBiJstpznVPkN4zAO6Sb7jYBIIE +0P+jKWR80+EJuUpm1pOLJrDibuPJZE7HDtWrERL765MnQ8ssPXvF5Cjum5b1S38J +SJ6XCjOknUSkD1vySVZYd3Nlc1ogHWswOslGFiiQtr26tpm7eFvE5pEzAFh/ib/q +Y/hjAaSoC5//HB7jzbqHFW2q8aD6uCHOCOPgRFgLj1yzrgZNVw1WZl1RWRrUmA52 +P4gBtmiU8dSFTpejOi01P7FRPea97UFcdrqqN65Xg3EUOqhrFthY36sj8Z5R+nNP +gggIZmB8nwPbANNjJ0oRYWlYt1dCCZwWMPF4G7uPm8KtFGxLmvc7hCeoayars+oj +W/v2w2xiJMthNMPkhUiKmZdDIgyU1/2y00dlcRotwMSQ5GfBSl+WCJWvi7cSAqDA +ff1z2yrVsjHfg87xgaaJPhE04T8wIAD0AGBuiCxixBOIc5klkcvVP19XgG1k7uxG +MLzp9Q7ZUywWO23uZ/n0I/XKvJuMCda6/Wm0tGHLRjxPDw2xozBkeZuLiwoTsACq +bVUcvv5jQqSfzCyezPHw/RVsxhji3XwaVEka3A5wM9YFjRa6KlTOiQhj8ZmdF5Uu +yOM45KiPMSdupSiP2B5FATM0W8B0+Av6cgpTnIguZXTubx5hxi4zmgic3O/fvaEO +wxT0nYj3Z7AXK9ZBIOdoBG8vW9kd8DmvehWOcseLa41BGtW3ZacjQdDfh08H7bo1 +RELNIEnRLQj//+g1Qbw2wrU0Uymb/LqMDQ5YIQ35WJ0RB5UylBTDZBAHI/9A6yfa +Ospz5sNPkACd9ucEDgLHmj80iMAeou8W5RWsXbyU4exnXudTvjrFhntOSnF4P7yf ++sM1CFD65B6lEdpPtY4f4rrjQQYy2Wwv6HvyTTujI7zgPJ+JO59g/wPD9BdLBAa8 +81uujtoDQsZ0QEHLru+TINTxEk3tLbA0cnJEazG/V3Hlyrv4fxapzkcpct+2z40c +SITi8SESkF6aL2k+jhgAML9VsBuuzJmU/1psVTEtjGo/+vE1n7Cu2JWn1+yfqs2q +BNzt78qCYOivRmALzYIMQfv4vVMPnHiJqN/9+vdrqe+G1B7rrXOR75bB/4MnfXUX +t0ukYZ7nc/2HtX8LNrQWCfDbKJVkuPhGt4ivqY3WPUS9Qxh/rH2m2DKH33Y+bAtc +x+bjs9GSMJppY8o3NUlW4fROhCYpdvm0nmSILg+o68o1RLqu223Suk3mEDFIby+x +wHvlM910X2vXrMfLJ5C1Z5n6lTtuqwDHtKzTwarD5sQNckSPENZLlULKyU8IIncP +ENel06odAkhwE36tn7Vox2+AGpTCcG8N1kOaVbpiLC9WcvdWlQRGsycz57AQAHI+ +8DjkqkbkS+I7IODBv4CTjrwSdbBB+CICzpHFU8jiRRT8JqlwMKnNfSKS1GRcw32A +UI41YouOndS1WTY7bfnYorMW1Qdjb5SadV6PQh/5W7yyeMdGkUVIQ5/1cEfm98F0 +xajsjEdZhbN8DvgJX2fBJrfLzVwNuthwd5cMGYmUSDBhrGZT+hKfmzuMJe3HT7K1 +He169YVmA6yq877fuEQKpKtfVXIkekIJKtRL4l9Ne/4pCnbdB+YYARRJIiea9ofz +u/ubQSGGRgBCW4BhlWMaAJcoQoQR0EzYgzpqBqN9ErwB +-----END ENCRYPTED PRIVATE KEY----- +)PEM"); +#define TRACEE fprintf(stderr, "TRACE %s:%d\n", __func__, __LINE__); + +class pw_expect +{ + public: + bool write; + bool abort; + pass_info pi; + + Passwd pass_return; + enum open_result result; + + pw_expect(const char *p, enum open_result r) : + write(false), abort(false), pi(QString(), QString()), + pass_return(), result(r) + { + pass_return = p; + } +}; + +class PwDialogMock: public PwDialogUI_i +{ + enum open_result execute(pass_info *p, Passwd *passwd, + bool write = false, bool abort = false) + { + if (pw_expectations.size() <= expect_idx) + return open_abort; + + pw_expect *pwe = pw_expectations[expect_idx++]; + pwe->write = write; + pwe->abort = abort; + pwe->pi.setTitle(p->getTitle()); + pwe->pi.setDescription(p->getDescription()); + + qWarning() << "PwDialogMock" << p->getDescription() << expect_idx; + *passwd = pwe->pass_return; + return pwe->result; + } + public: + int expect_idx{}; + QList pw_expectations{}; + void setExpectations(const QList pwe) + { + qDeleteAll(pw_expectations); + pw_expectations = pwe; + expect_idx = 0; + } +}; + +void test_main::importPEM() +{ + try { + class PwDialogMock *pwdialog = new PwDialogMock(); + PwDialogCore::setGui(pwdialog); + xcaWarning::setGui(new xcaWarningCore()); + + ign_openssl_error(); + openDB(); + pki_multi *pem = new pki_multi(); + pem->fromPEMbyteArray(pemcert.toUtf8(), QString()); + + pwdialog->setExpectations(QList{ + new pw_expect("Title", pw_ok), + }); + QVERIFY_EXCEPTION_THROWN(pem->fromPEMbyteArray(pempk8.toUtf8(), QString()), errorEx); + + pwdialog->setExpectations(QList{ + new pw_expect("pass", pw_ok), + }); + pem->fromPEMbyteArray(pempk8.toUtf8(), QString()); + QCOMPARE(pem->failed_files.count(), 0); + ImportMulti *dlg = new ImportMulti(mainwin); + dlg->addItem(pem); + + dlg->show(); + Q_ASSERT(QTest::qWaitForWindowActive(dlg)); + delete dlg; + } catch (...) { + QVERIFY2(false, "Exception thrown"); + } +} QTEST_MAIN(test_main) #include "test_main.moc" diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index d3d8eb19..a66e0210 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -211,7 +211,7 @@ void MainWindow::loadPem() keyView->load_default(&l); } -bool MainWindow::pastePem(QString text, bool silent) +bool MainWindow::pastePem(const QString &text, bool silent) { bool success = false; QByteArray pemdata = text.toLatin1(); diff --git a/widgets/MainWindow.h b/widgets/MainWindow.h index 782374c4..81251737 100644 --- a/widgets/MainWindow.h +++ b/widgets/MainWindow.h @@ -123,7 +123,7 @@ class MainWindow: public QMainWindow, public Ui::MainWindow void default_database(); void about(); void loadPem(); - bool pastePem(QString text, bool silent=false); + bool pastePem(const QString &text, bool silent=false); void pastePem(); void changeDbPass(); void openURLs(QStringList &files);