diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -169,6 +169,7 @@ set(kmailprivate_sieveimapinstanceinterface_LIB_SRCS sieveimapinterface/kmailsieveimapinstanceinterface.cpp + sieveimapinterface/kmsieveimappasswordprovider.cpp ) set(kmail_common_SRCS) diff --git a/src/kmmainwidget.h b/src/kmmainwidget.h --- a/src/kmmainwidget.h +++ b/src/kmmainwidget.h @@ -84,6 +84,7 @@ namespace KSieveUi { class SieveDebugDialog; +class SieveImapPasswordProvider; class ManageSieveScriptsDialog; class VacationManager; } @@ -660,6 +661,7 @@ QTimer mCheckMailTimer; + KSieveUi::SieveImapPasswordProvider *mSievePasswordProvider; QPointer mMoveOrCopyToDialog; QPointer mSelectFromAllFoldersDialog; QAction *mServerSideSubscription; diff --git a/src/kmmainwidget.cpp b/src/kmmainwidget.cpp --- a/src/kmmainwidget.cpp +++ b/src/kmmainwidget.cpp @@ -52,6 +52,7 @@ #include "kpimtextedit/texttospeech.h" #include "job/markallmessagesasreadinfolderandsubfolderjob.h" #include "job/removeduplicatemessageinfolderandsubfolderjob.h" +#include "sieveimapinterface/kmsieveimappasswordprovider.h" #if !defined(NDEBUG) #include using KSieveUi::SieveDebugDialog; @@ -252,7 +253,8 @@ mPreferHtmlLoadExtAction = nullptr; Akonadi::ControlGui::widgetNeedsAkonadi(this); mFavoritesModel = nullptr; - mVacationManager = new KSieveUi::VacationManager(this); + mSievePasswordProvider = new KMSieveImapPasswordProvider(winId()); + mVacationManager = new KSieveUi::VacationManager(mSievePasswordProvider, this); connect(mVacationManager, SIGNAL(updateVacationScriptStatus(bool,QString)), SLOT(updateVacationScriptStatus(bool,QString))); mToolbarActionSeparator = new QAction(this); @@ -406,6 +408,7 @@ clearCurrentFolder(); delete mMoveOrCopyToDialog; delete mSelectFromAllFoldersDialog; + delete mSievePasswordProvider; disconnect(kmkernel->folderCollectionMonitor(), SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)), this, nullptr); disconnect(kmkernel->folderCollectionMonitor(), SIGNAL(itemRemoved(Akonadi::Item)), this, nullptr); @@ -1306,7 +1309,7 @@ return; } - mManageSieveDialog = new KSieveUi::ManageSieveScriptsDialog; + mManageSieveDialog = new KSieveUi::ManageSieveScriptsDialog(mSievePasswordProvider); connect(mManageSieveDialog.data(), &KSieveUi::ManageSieveScriptsDialog::finished, this, &KMMainWidget::slotCheckVacation); mManageSieveDialog->show(); } @@ -2252,7 +2255,7 @@ return; } - mSieveDebugDialog = new KSieveUi::SieveDebugDialog(this); + mSieveDebugDialog = new KSieveUi::SieveDebugDialog(mSievePasswordProvider, this); mSieveDebugDialog->exec(); delete mSieveDebugDialog; #endif diff --git a/src/sieveimapinterface/tests/sievemanagerdialog/sievemanagerdialog.cpp b/src/sieveimapinterface/kmsieveimappasswordprovider.h copy from src/sieveimapinterface/tests/sievemanagerdialog/sievemanagerdialog.cpp copy to src/sieveimapinterface/kmsieveimappasswordprovider.h --- a/src/sieveimapinterface/tests/sievemanagerdialog/sievemanagerdialog.cpp +++ b/src/sieveimapinterface/kmsieveimappasswordprovider.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2010 Volker Krause + Copyright (c) 2017 Albert Astals Cid This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by @@ -17,19 +17,25 @@ 02110-1301, USA. */ -#include -#include -#include "../../../sieveimapinterface/kmailsieveimapinstanceinterface.h" -#include +#ifndef KMSIEVEIMAPPASSWORDPROVIDER_H +#define KMSIEVEIMAPPASSWORDPROVIDER_H -int main(int argc, char **argv) +#include + +#include // for WId + +class KMSieveImapPasswordProvider : public KSieveUi::SieveImapPasswordProvider { - QApplication app(argc, argv); - QApplication::setApplicationName(QStringLiteral("managersievescriptsdialogtest")); - QApplication::setApplicationVersion(QStringLiteral("1.0")); - - KSieveUi::SieveImapInstanceInterfaceManager::self()->setSieveImapInstanceInterface(new KMailSieveImapInstanceInterface); - KSieveUi::ManageSieveScriptsDialog *dlg = new KSieveUi::ManageSieveScriptsDialog; - dlg->show(); - return app.exec(); -} +public: + KMSieveImapPasswordProvider(WId wid); + + QString password(const QString &identifier) override; + QString sieveCustomPassword(const QString &identifier) override; + +private: + QString walletPassword(const QString &identifier); + + WId m_wid; +}; + +#endif diff --git a/src/sieveimapinterface/kmsieveimappasswordprovider.cpp b/src/sieveimapinterface/kmsieveimappasswordprovider.cpp new file mode 100644 --- /dev/null +++ b/src/sieveimapinterface/kmsieveimappasswordprovider.cpp @@ -0,0 +1,55 @@ +/* + Copyright (c) 2017 Albert Astals Cid + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "kmsieveimappasswordprovider.h" + +#include + +#include + +KMSieveImapPasswordProvider::KMSieveImapPasswordProvider(WId wid) + : m_wid(wid) +{ +} + +QString KMSieveImapPasswordProvider::password(const QString &identifier) +{ + return walletPassword(identifier); +} + +QString KMSieveImapPasswordProvider::sieveCustomPassword(const QString &identifier) +{ + return walletPassword(QStringLiteral("custom_sieve_") + identifier); +} + +QString KMSieveImapPasswordProvider::walletPassword(const QString &identifier) +{ + std::unique_ptr wallet(KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), m_wid)); + if (wallet) { + if (wallet->hasFolder(QStringLiteral("imap"))) { + QString pwd; + wallet->setFolder(QStringLiteral("imap")); + wallet->readPassword(identifier + QStringLiteral("rc"), pwd); + return pwd; + } + } + + return QString(); + +} diff --git a/src/sieveimapinterface/tests/sievedebugdialog/CMakeLists.txt b/src/sieveimapinterface/tests/sievedebugdialog/CMakeLists.txt --- a/src/sieveimapinterface/tests/sievedebugdialog/CMakeLists.txt +++ b/src/sieveimapinterface/tests/sievedebugdialog/CMakeLists.txt @@ -1,8 +1,9 @@ -add_executable(sievedebugdialog sievedebugdialog.cpp ../../../sieveimapinterface/kmailsieveimapinstanceinterface.cpp) +add_executable(sievedebugdialog sievedebugdialog.cpp ../../../sieveimapinterface/kmailsieveimapinstanceinterface.cpp ../../../sieveimapinterface/kmsieveimappasswordprovider.cpp) target_link_libraries(sievedebugdialog KF5::KSieve KF5::KSieveUi KF5::AkonadiCore KF5::SyntaxHighlighting + KF5::Wallet ) diff --git a/src/sieveimapinterface/tests/sievedebugdialog/sievedebugdialog.cpp b/src/sieveimapinterface/tests/sievedebugdialog/sievedebugdialog.cpp --- a/src/sieveimapinterface/tests/sievedebugdialog/sievedebugdialog.cpp +++ b/src/sieveimapinterface/tests/sievedebugdialog/sievedebugdialog.cpp @@ -20,6 +20,7 @@ #include #include #include "../../../sieveimapinterface/kmailsieveimapinstanceinterface.h" +#include "../../../sieveimapinterface/kmsieveimappasswordprovider.h" #include @@ -31,7 +32,8 @@ QApplication::setApplicationVersion(QStringLiteral("1.0")); KSieveUi::SieveImapInstanceInterfaceManager::self()->setSieveImapInstanceInterface(new KMailSieveImapInstanceInterface); - KSieveUi::SieveDebugDialog *dlg = new KSieveUi::SieveDebugDialog; + KMSieveImapPasswordProvider provider(0); + KSieveUi::SieveDebugDialog *dlg = new KSieveUi::SieveDebugDialog(&provider); dlg->exec(); delete dlg; return 0; diff --git a/src/sieveimapinterface/tests/sievemanagerdialog/CMakeLists.txt b/src/sieveimapinterface/tests/sievemanagerdialog/CMakeLists.txt --- a/src/sieveimapinterface/tests/sievemanagerdialog/CMakeLists.txt +++ b/src/sieveimapinterface/tests/sievemanagerdialog/CMakeLists.txt @@ -1,7 +1,8 @@ -add_executable(sievemanagerdialog sievemanagerdialog.cpp ../../../sieveimapinterface/kmailsieveimapinstanceinterface.cpp) +add_executable(sievemanagerdialog sievemanagerdialog.cpp ../../../sieveimapinterface/kmailsieveimapinstanceinterface.cpp ../../../sieveimapinterface/kmsieveimappasswordprovider.cpp) target_link_libraries(sievemanagerdialog KF5::KSieve KF5::KSieveUi KF5::AkonadiCore + KF5::Wallet ) diff --git a/src/sieveimapinterface/tests/sievemanagerdialog/sievemanagerdialog.cpp b/src/sieveimapinterface/tests/sievemanagerdialog/sievemanagerdialog.cpp --- a/src/sieveimapinterface/tests/sievemanagerdialog/sievemanagerdialog.cpp +++ b/src/sieveimapinterface/tests/sievemanagerdialog/sievemanagerdialog.cpp @@ -20,6 +20,7 @@ #include #include #include "../../../sieveimapinterface/kmailsieveimapinstanceinterface.h" +#include "../../../sieveimapinterface/kmsieveimappasswordprovider.h" #include int main(int argc, char **argv) @@ -29,7 +30,8 @@ QApplication::setApplicationVersion(QStringLiteral("1.0")); KSieveUi::SieveImapInstanceInterfaceManager::self()->setSieveImapInstanceInterface(new KMailSieveImapInstanceInterface); - KSieveUi::ManageSieveScriptsDialog *dlg = new KSieveUi::ManageSieveScriptsDialog; + KMSieveImapPasswordProvider provider(0); + KSieveUi::ManageSieveScriptsDialog *dlg = new KSieveUi::ManageSieveScriptsDialog(&provider); dlg->show(); return app.exec(); } diff --git a/src/sieveimapinterface/tests/vacation/CMakeLists.txt b/src/sieveimapinterface/tests/vacation/CMakeLists.txt --- a/src/sieveimapinterface/tests/vacation/CMakeLists.txt +++ b/src/sieveimapinterface/tests/vacation/CMakeLists.txt @@ -1,8 +1,9 @@ set(vacation_multi_server_SRCS main.cpp ../../../sieveimapinterface/kmailsieveimapinstanceinterface.cpp + ../../../sieveimapinterface/kmsieveimappasswordprovider.cpp ) add_executable(vacationmultiservertest ${vacation_multi_server_SRCS} ) -target_link_libraries(vacationmultiservertest KF5::KSieveUi KF5::KSieve KF5::I18n KF5::AkonadiCore) +target_link_libraries(vacationmultiservertest KF5::KSieveUi KF5::KSieve KF5::I18n KF5::AkonadiCore KF5::Wallet) diff --git a/src/sieveimapinterface/tests/vacation/main.cpp b/src/sieveimapinterface/tests/vacation/main.cpp --- a/src/sieveimapinterface/tests/vacation/main.cpp +++ b/src/sieveimapinterface/tests/vacation/main.cpp @@ -25,6 +25,7 @@ #include #include #include "../../../sieveimapinterface/kmailsieveimapinstanceinterface.h" +#include "../../../sieveimapinterface/kmsieveimappasswordprovider.h" int main(int argc, char **argv) { QApplication app(argc, argv); @@ -45,7 +46,8 @@ app.setQuitOnLastWindowClosed(true); KSieveUi::SieveImapInstanceInterfaceManager::self()->setSieveImapInstanceInterface(new KMailSieveImapInstanceInterface); - KSieveUi::MultiImapVacationManager manager; + KMSieveImapPasswordProvider provider(0); + KSieveUi::MultiImapVacationManager manager(&provider); KSieveUi::MultiImapVacationDialog dlg(&manager); QObject::connect(&dlg, &KSieveUi::MultiImapVacationDialog::okClicked, &app, &QApplication::quit); QObject::connect(&dlg, &KSieveUi::MultiImapVacationDialog::cancelClicked, &app, &QApplication::quit);