diff --git a/src/kmanagesieve/sessionthread_p.h b/src/kmanagesieve/sessionthread_p.h index 172a8d9..c54dbb6 100644 --- a/src/kmanagesieve/sessionthread_p.h +++ b/src/kmanagesieve/sessionthread_p.h @@ -1,106 +1,106 @@ /* Copyright (c) 2015 Daniel Vrátil 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. */ #ifndef KMANAGESIEVE_SESSIONTHREAD_P_H #define KMANAGESIEVE_SESSIONTHREAD_P_H #include #include #include #include #include -#include +#include #include "sasl-common.h" #include "response.h" class QTimer; namespace KManageSieve { class Session; class SessionThread : public QObject { Q_OBJECT public: explicit SessionThread(Session *session, QObject *parent = nullptr); ~SessionThread(); void connectToHost(const QUrl &url); void disconnectFromHost(bool sendLogout); void sendData(const QByteArray &data); void startAuthentication(); void continueAuthentication(const Response &response, const QByteArray &data); void startSsl(); Q_SIGNALS: void responseReceived(const KManageSieve::Response &response, const QByteArray &data); void error(int errorCode, const QString &error); void authenticationDone(); void sslDone(); void sslError(const KSslErrorUiData &data); void socketConnected(); void socketDisconnected(); private Q_SLOTS: void doInit(); void doDestroy(); void doConnectToHost(const QUrl &url); void doDisconnectFromHost(bool sendLogout); void doSendData(const QByteArray &data); void doStartAuthentication(); void doContinueAuthentication(const KManageSieve::Response &response, const QByteArray &data); void doStartSsl(); void slotDataReceived(); void slotSocketError(); void slotSslTimeout(); void slotEncryptedDone(); private: bool saslInteract(void *in); bool saslClientStep(const QByteArray &challenge); void sslResult(bool encrypted); void handleSaslAuthError(); private: Q_DISABLE_COPY(SessionThread) Session *m_session = nullptr; std::unique_ptr m_socket; QUrl m_url; sasl_conn_t *m_sasl_conn = nullptr; sasl_interact_t *m_sasl_client_interact = nullptr; QByteArray m_data; Response m_lastResponse; qint64 m_pendingQuantity; QTimer *m_sslCheck = nullptr; }; } // namespace KManageSieve #endif // KMANAGESIEVE_SESSIONTHREAD_P_H diff --git a/src/ksieveui/editor/webengine/findbar/findbarbase.cpp b/src/ksieveui/editor/webengine/findbar/findbarbase.cpp index 4661de4..10cef1d 100644 --- a/src/ksieveui/editor/webengine/findbar/findbarbase.cpp +++ b/src/ksieveui/editor/webengine/findbar/findbarbase.cpp @@ -1,269 +1,269 @@ /* Copyright (C) 2010 Torgny Nyblom * Copyright (C) 2010-2019 Laurent Montel * * 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 "findbarbase.h" #include #include #include -#include +#include #include #include #include #include #include #include #include #include #include using namespace KSieveUi; FindBarBase::FindBarBase(QWidget *parent) : QWidget(parent) { QHBoxLayout *lay = new QHBoxLayout(this); lay->setContentsMargins(2, 2, 2, 2); QToolButton *closeBtn = new QToolButton(this); closeBtn->setIcon(QIcon::fromTheme(QStringLiteral("dialog-close"))); closeBtn->setObjectName(QStringLiteral("close")); closeBtn->setIconSize(QSize(16, 16)); closeBtn->setToolTip(i18n("Close")); #ifndef QT_NO_ACCESSIBILITY closeBtn->setAccessibleName(i18n("Close")); #endif closeBtn->setAutoRaise(true); lay->addWidget(closeBtn); QLabel *label = new QLabel(i18nc("Find text", "F&ind:"), this); lay->addWidget(label); mSearch = new PimCommon::LineEditWithCompleterNg(this); mSearch->setObjectName(QStringLiteral("searchline")); mSearch->setToolTip(i18n("Text to search for")); mSearch->setClearButtonEnabled(true); label->setBuddy(mSearch); lay->addWidget(mSearch); mFindNextBtn = new QPushButton(QIcon::fromTheme(QStringLiteral("go-down-search")), i18nc("Find and go to the next search match", "Next"), this); mFindNextBtn->setToolTip(i18n("Jump to next match")); mFindNextBtn->setObjectName(QStringLiteral("findnext")); lay->addWidget(mFindNextBtn); mFindNextBtn->setEnabled(false); mFindPrevBtn = new QPushButton(QIcon::fromTheme(QStringLiteral("go-up-search")), i18nc("Find and go to the previous search match", "Previous"), this); mFindPrevBtn->setToolTip(i18n("Jump to previous match")); mFindPrevBtn->setObjectName(QStringLiteral("findprevious")); lay->addWidget(mFindPrevBtn); mFindPrevBtn->setEnabled(false); QPushButton *optionsBtn = new QPushButton(this); optionsBtn->setText(i18n("Options")); optionsBtn->setToolTip(i18n("Modify search behavior")); mOptionsMenu = new QMenu(optionsBtn); mCaseSensitiveAct = mOptionsMenu->addAction(i18n("Case sensitive")); mCaseSensitiveAct->setCheckable(true); optionsBtn->setMenu(mOptionsMenu); lay->addWidget(optionsBtn); connect(closeBtn, &QToolButton::clicked, this, &FindBarBase::closeBar); connect(mFindNextBtn, &QPushButton::clicked, this, &FindBarBase::findNext); connect(mFindPrevBtn, &QPushButton::clicked, this, &FindBarBase::findPrev); connect(mCaseSensitiveAct, &QAction::toggled, this, &FindBarBase::caseSensitivityChanged); connect(mSearch, &QLineEdit::textChanged, this, &FindBarBase::autoSearch); mStatus = new QLabel(this); mStatus->setObjectName(QStringLiteral("status")); mStatus->setTextFormat(Qt::PlainText); QFontMetrics fm(mStatus->font()); mNotFoundString = i18n("Phrase not found"); mStatus->setFixedWidth(fm.boundingRect(mNotFoundString).width()); lay->addWidget(mStatus); setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); //lay->addStretch(); hide(); } FindBarBase::~FindBarBase() { } QMenu *FindBarBase::optionsMenu() { return mOptionsMenu; } QString FindBarBase::text() const { return mSearch->text(); } void FindBarBase::setText(const QString &text) { mSearch->setText(text); } void FindBarBase::focusAndSetCursor() { setFocus(); mStatus->clear(); mSearch->selectAll(); mSearch->setFocus(); } void FindBarBase::autoSearch(const QString &str) { const bool isNotEmpty = (!str.isEmpty()); mFindPrevBtn->setEnabled(isNotEmpty); mFindNextBtn->setEnabled(isNotEmpty); if (isNotEmpty) { QTimer::singleShot(0, this, [this]() { slotSearchText(); }); } else { clearSelections(); } } void FindBarBase::slotSearchText(bool backward, bool isAutoSearch) { searchText(backward, isAutoSearch); } void FindBarBase::setFoundMatch(bool match) { #ifndef QT_NO_STYLE_STYLESHEET QString styleSheet; if (!mSearch->text().isEmpty()) { if (mNegativeBackground.isEmpty()) { KStatefulBrush bgBrush(KColorScheme::View, KColorScheme::PositiveBackground); mPositiveBackground = QStringLiteral("QLineEdit{ background-color:%1 }").arg(bgBrush.brush(mSearch).color().name()); bgBrush = KStatefulBrush(KColorScheme::View, KColorScheme::NegativeBackground); mNegativeBackground = QStringLiteral("QLineEdit{ background-color:%1 }").arg(bgBrush.brush(mSearch).color().name()); } if (match) { styleSheet = mPositiveBackground; mStatus->clear(); } else { styleSheet = mNegativeBackground; mStatus->setText(mNotFoundString); } } mSearch->setStyleSheet(styleSheet); #endif } void FindBarBase::searchText(bool backward, bool isAutoSearch) { Q_UNUSED(backward); Q_UNUSED(isAutoSearch); } void FindBarBase::addToCompletion(const QString &text) { mSearch->addCompletionItem(text); } void FindBarBase::findNext() { searchText(false, false); addToCompletion(mLastSearchStr); } void FindBarBase::findPrev() { searchText(true, false); addToCompletion(mLastSearchStr); } void FindBarBase::caseSensitivityChanged(bool b) { updateSensitivity(b); } void FindBarBase::updateSensitivity(bool) { } void FindBarBase::slotHighlightAllChanged(bool b) { updateHighLight(b); } void FindBarBase::updateHighLight(bool) { } void FindBarBase::clearSelections() { setFoundMatch(false); } void FindBarBase::closeBar() { // Make sure that all old searches are cleared mSearch->clear(); clearSelections(); mSearch->clearFocus(); Q_EMIT hideFindBar(); } bool FindBarBase::event(QEvent *e) { // Close the bar when pressing Escape. // Not using a QShortcut for this because it could conflict with // window-global actions (e.g. Emil Sedgh binds Esc to "close tab"). // With a shortcut override we can catch this before it gets to kactions. const bool shortCutOverride = (e->type() == QEvent::ShortcutOverride); if (shortCutOverride || e->type() == QEvent::KeyPress) { QKeyEvent *kev = static_cast(e); if (kev->key() == Qt::Key_Escape) { if (shortCutOverride) { e->accept(); return true; } e->accept(); closeBar(); return true; } else if (kev->key() == Qt::Key_Enter || kev->key() == Qt::Key_Return) { e->accept(); if (shortCutOverride) { return true; } if (mSearch->text().isEmpty()) { return true; } if (kev->modifiers() & Qt::ShiftModifier) { findPrev(); } else if (kev->modifiers() == Qt::NoModifier) { findNext(); } return true; } } return QWidget::event(e); } diff --git a/src/ksieveui/managesievescriptsdialog.cpp b/src/ksieveui/managesievescriptsdialog.cpp index 621ceed..2a2593a 100644 --- a/src/ksieveui/managesievescriptsdialog.cpp +++ b/src/ksieveui/managesievescriptsdialog.cpp @@ -1,286 +1,286 @@ /* Copyright (C) 2013-2019 Laurent Montel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "managesievescriptsdialog.h" #include "widgets/custommanagesievewidget.h" #include "widgets/managesievetreeview.h" #include "editor/sievetextedit.h" #include "editor/sieveeditor.h" #include "widgets/sievetreewidgetitem.h" #include "managescriptsjob/checkscriptjob.h" #include "util/sieveimapaccountsettings.h" #include #include -#include +#include #include #include #include "libksieve_debug.h" #include #include #include #include #include #include #include using namespace KSieveUi; class KSieveUi::ManageSieveScriptsDialogPrivate { public: ManageSieveScriptsDialogPrivate() : mSieveEditor(nullptr) , mNewScript(nullptr) , mEditScript(nullptr) , mDeleteScript(nullptr) , mDeactivateScript(nullptr) , mIsNewScript(false) , mWasActive(false) { } CustomManageSieveWidget *mTreeView = nullptr; SieveEditor *mSieveEditor = nullptr; QUrl mCurrentURL; QStringList mCurrentCapabilities; QStringList mListOfIncludeFile; KSieveUi::SieveImapAccountSettings mSieveImapAccountSettings; QPushButton *mNewScript = nullptr; QPushButton *mEditScript = nullptr; QPushButton *mDeleteScript = nullptr; QPushButton *mDeactivateScript = nullptr; bool mIsNewScript : 1; bool mWasActive : 1; }; ManageSieveScriptsDialog::ManageSieveScriptsDialog(SieveImapPasswordProvider *passwordProvider, QWidget *parent) : QDialog(parent) , d(new KSieveUi::ManageSieveScriptsDialogPrivate) { setWindowTitle(i18n("Manage Sieve Scripts")); setModal(false); setAttribute(Qt::WA_GroupLeader); setAttribute(Qt::WA_DeleteOnClose); QVBoxLayout *mainLayout = new QVBoxLayout(this); QFrame *frame = new QFrame; mainLayout->addWidget(frame); QVBoxLayout *vlay = new QVBoxLayout(frame); vlay->setSpacing(0); vlay->setContentsMargins(0, 0, 0, 0); d->mTreeView = new CustomManageSieveWidget(passwordProvider, frame); connect(d->mTreeView, &CustomManageSieveWidget::editScript, this, &ManageSieveScriptsDialog::slotEditScript); connect(d->mTreeView, &CustomManageSieveWidget::newScript, this, &ManageSieveScriptsDialog::slotNewScript); connect(d->mTreeView, &CustomManageSieveWidget::updateButtons, this, &ManageSieveScriptsDialog::slotUpdateButtons); vlay->addWidget(d->mTreeView); QHBoxLayout *buttonLayout = new QHBoxLayout; vlay->addLayout(buttonLayout); d->mNewScript = new QPushButton(i18nc("create a new sieve script", "New...")); connect(d->mNewScript, &QPushButton::clicked, d->mTreeView, &CustomManageSieveWidget::slotNewScript); buttonLayout->addWidget(d->mNewScript); d->mEditScript = new QPushButton(i18n("Edit...")); connect(d->mEditScript, &QPushButton::clicked, d->mTreeView, &CustomManageSieveWidget::slotEditScript); buttonLayout->addWidget(d->mEditScript); d->mDeleteScript = new QPushButton(i18n("Delete")); connect(d->mDeleteScript, &QPushButton::clicked, d->mTreeView, &CustomManageSieveWidget::slotDeleteScript); buttonLayout->addWidget(d->mDeleteScript); d->mDeactivateScript = new QPushButton(i18n("Deactivate")); connect(d->mDeactivateScript, &QPushButton::clicked, d->mTreeView, &CustomManageSieveWidget::slotDeactivateScript); buttonLayout->addWidget(d->mDeactivateScript); QPushButton *close = new QPushButton; KGuiItem::assign(close, KStandardGuiItem::close()); connect(close, &QPushButton::clicked, this, &ManageSieveScriptsDialog::accept); buttonLayout->addWidget(close); KConfigGroup group(KSharedConfig::openConfig(), "ManageSieveScriptsDialog"); const QSize size = group.readEntry("Size", QSize()); if (size.isValid()) { resize(size); } else { resize(sizeHint().width(), sizeHint().height()); } d->mTreeView->slotRefresh(); } ManageSieveScriptsDialog::~ManageSieveScriptsDialog() { KConfigGroup group(KSharedConfig::openConfig(), "ManageSieveScriptsDialog"); group.writeEntry("Size", size()); // prevent QTreeWidget signals triggered by it's destructor from calling our slots d->mTreeView->disconnect(this); delete d; } void ManageSieveScriptsDialog::hideEvent(QHideEvent *event) { if (!event->spontaneous()) { Q_EMIT finished(); } } void ManageSieveScriptsDialog::slotUpdateButtons(QTreeWidgetItem *item) { Q_UNUSED(item); bool newScriptAction; bool editScriptAction; bool deleteScriptAction; bool desactivateScriptAction; d->mTreeView->enableDisableActions(newScriptAction, editScriptAction, deleteScriptAction, desactivateScriptAction); d->mNewScript->setEnabled(newScriptAction); d->mEditScript->setEnabled(editScriptAction); d->mDeleteScript->setEnabled(deleteScriptAction); d->mDeactivateScript->setEnabled(desactivateScriptAction); } void ManageSieveScriptsDialog::slotEditScript(const ManageSieveWidget::ScriptInfo &info) { d->mCurrentURL = info.currentUrl; d->mCurrentCapabilities = info.currentCapabilities; d->mListOfIncludeFile = info.scriptList; d->mIsNewScript = false; d->mSieveImapAccountSettings = info.sieveImapAccountSettings; KManageSieve::SieveJob *job = KManageSieve::SieveJob::get(info.currentUrl); connect(job, &KManageSieve::SieveJob::result, this, &ManageSieveScriptsDialog::slotGetResult); } void ManageSieveScriptsDialog::slotNewScript(const ManageSieveWidget::ScriptInfo &info) { d->mCurrentCapabilities = info.currentCapabilities; d->mSieveImapAccountSettings = info.sieveImapAccountSettings; d->mCurrentURL = info.currentUrl; d->mListOfIncludeFile = info.scriptList; d->mIsNewScript = true; slotGetResult(nullptr, true, QString(), false); } void ManageSieveScriptsDialog::slotGetResult(KManageSieve::SieveJob *job, bool success, const QString &script, bool isActive) { if (!success) { KMessageBox::error(this, i18n("Retrieving the script failed.\n" "The server responded:\n%1", job->errorString()), i18n("Sieve Error")); return; } if (d->mSieveEditor) { return; } disableManagerScriptsDialog(true); d->mSieveEditor = new SieveEditor; d->mSieveEditor->show(); d->mSieveEditor->setScriptName(d->mCurrentURL.fileName()); d->mSieveEditor->setSieveCapabilities(d->mCurrentCapabilities); d->mSieveEditor->setScript(script, true); /*clear undo/redo*/ d->mSieveEditor->setSieveImapAccountSettings(d->mSieveImapAccountSettings); d->mSieveEditor->setListOfIncludeFile(d->mListOfIncludeFile); connect(d->mSieveEditor, &SieveEditor::okClicked, this, &ManageSieveScriptsDialog::slotSieveEditorOkClicked); connect(d->mSieveEditor, &SieveEditor::cancelClicked, this, &ManageSieveScriptsDialog::slotSieveEditorCancelClicked); connect(d->mSieveEditor, &SieveEditor::checkSyntax, this, &ManageSieveScriptsDialog::slotSieveEditorCheckSyntaxClicked); d->mWasActive = isActive; d->mSieveEditor->setModified(false); } void ManageSieveScriptsDialog::slotSieveEditorCheckSyntaxClicked() { if (!d->mSieveEditor) { return; } const QString script = d->mSieveEditor->script(); if (script.isEmpty()) { return; } d->mSieveEditor->addNormalMessage(i18n("Uploading script to server for checking it, please wait...")); KSieveUi::CheckScriptJob *checkScriptJob = new KSieveUi::CheckScriptJob(this); connect(checkScriptJob, &CheckScriptJob::finished, this, &ManageSieveScriptsDialog::slotCheckScriptFinished); checkScriptJob->setIsActive(d->mWasActive); checkScriptJob->setOriginalScript(d->mSieveEditor->originalScript()); checkScriptJob->setCurrentScript(script); checkScriptJob->setUrl(d->mCurrentURL); checkScriptJob->start(); } void ManageSieveScriptsDialog::slotSieveEditorOkClicked() { disableManagerScriptsDialog(false); if (!d->mSieveEditor) { return; } KManageSieve::SieveJob *job = KManageSieve::SieveJob::put(d->mCurrentURL, d->mSieveEditor->script(), d->mWasActive, d->mWasActive); connect(job, &KManageSieve::SieveJob::result, this, &ManageSieveScriptsDialog::slotPutResult); } void ManageSieveScriptsDialog::slotSieveEditorCancelClicked() { disableManagerScriptsDialog(false); if (d->mSieveEditor) { d->mSieveEditor->deleteLater(); d->mSieveEditor = nullptr; } d->mCurrentURL = QUrl(); if (d->mIsNewScript) { d->mTreeView->slotRefresh(); } } void ManageSieveScriptsDialog::slotCheckScriptFinished(const QString &errorMsg, bool success) { if (success) { d->mSieveEditor->addOkMessage(errorMsg); } else { d->mSieveEditor->addFailedMessage(errorMsg); } d->mSieveEditor->resultDone(); } void ManageSieveScriptsDialog::slotPutResult(KManageSieve::SieveJob *job, bool success) { if (success) { KMessageBox::information(this, i18n("The Sieve script was successfully uploaded."), i18n("Sieve Script Upload")); d->mSieveEditor->deleteLater(); d->mSieveEditor = nullptr; d->mCurrentURL = QUrl(); } else { //Don't add parent otherwise when there is an error it will parent to ManageSieveScriptsDialog and not editor KMessageBox::error(nullptr, i18n("Uploading the Sieve script failed.\n" "The server responded:\n%1", job->errorString()), i18n("Sieve Error")); if (d->mSieveEditor) { d->mSieveEditor->show(); } } } void ManageSieveScriptsDialog::disableManagerScriptsDialog(bool disable) { setDisabled(disable); } diff --git a/src/ksieveui/vacation/vacationcheckjob.cpp b/src/ksieveui/vacation/vacationcheckjob.cpp index 3692bdf..315ef14 100644 --- a/src/ksieveui/vacation/vacationcheckjob.cpp +++ b/src/ksieveui/vacation/vacationcheckjob.cpp @@ -1,225 +1,225 @@ /* Copyright (C) 2013-2019 Laurent Montel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "vacationcheckjob.h" #include "vacationutils.h" #include "managescriptsjob/parseuserscriptjob.h" #include "util/util_p.h" #include #include -#include +#include #include "libksieve_debug.h" using namespace KSieveUi; VacationCheckJob::VacationCheckJob(const QUrl &url, const QString &serverName, QObject *parent) : QObject(parent) , mServerName(serverName) , mUrl(url) { } VacationCheckJob::~VacationCheckJob() { kill(); } void VacationCheckJob::kill() { if (mSieveJob) { mSieveJob->kill(); } mSieveJob = nullptr; if (mParseJob) { mParseJob->kill(); } mParseJob = nullptr; } void VacationCheckJob::setKep14Support(bool kep14Support) { mKep14Support = kep14Support; } void VacationCheckJob::start() { if (mKep14Support) { QUrl url = mUrl; url = url.adjusted(QUrl::RemoveFilename); url.setPath(url.path() + QLatin1Char('/') + QLatin1String("USER")); mParseJob = new ParseUserScriptJob(url, this); connect(mParseJob, &ParseUserScriptJob::finished, this, &VacationCheckJob::slotGotActiveScripts); mParseJob->start(); } else { mSieveJob = KManageSieve::SieveJob::get(mUrl); connect(mSieveJob, &KManageSieve::SieveJob::gotScript, this, &VacationCheckJob::slotGetResult); } } void VacationCheckJob::slotGetResult(KManageSieve::SieveJob *job, bool success, const QString &script, bool active) { Q_ASSERT(job == mSieveJob); mScript = script; mSieveCapabilities = mSieveJob->sieveCapabilities(); mSieveJob = nullptr; if (mKep14Support) { VacationUtils::Vacation vacation = VacationUtils::parseScript(script); if (vacation.isValid()) { if (mAvailableScripts.isEmpty()) { Q_EMIT vacationScriptActive(this, QString(), false); } else { const QString &scriptName = mAvailableScripts[mScriptPos - 1]; bool hasVacationActive = mActiveScripts.contains(scriptName) && vacation.active; if (hasVacationActive && vacation.startDate.isValid() && vacation.endDate.isValid()) { hasVacationActive = (vacation.startDate <= QDate::currentDate() && vacation.endDate >= QDate::currentDate()); } Q_EMIT vacationScriptActive(this, scriptName, hasVacationActive); qCDebug(LIBKSIEVE_LOG) << "vacation script found :)"; } } else if (isLastScript()) { mNoScriptFound = true; Q_EMIT vacationScriptActive(this, QString(), false); qCDebug(LIBKSIEVE_LOG) << "no vacation script found :("; } else { getNextScript(); } } else { if (!success || !active) { if (!success) { mNoScriptFound = true; } Q_EMIT vacationScriptActive(this, mUrl.fileName(), false); return; } bool hasVacationActive = active; VacationUtils::Vacation vacation = VacationUtils::parseScript(script); if (vacation.isValid()) { hasVacationActive = vacation.active; if (hasVacationActive && vacation.startDate.isValid() && vacation.endDate.isValid()) { hasVacationActive = (vacation.startDate <= QDate::currentDate() && vacation.endDate >= QDate::currentDate()); } } if (hasVacationActive) { mActiveScripts << mUrl.fileName(); } Q_EMIT vacationScriptActive(this, mUrl.fileName(), hasVacationActive); } } void VacationCheckJob::slotGotActiveScripts(ParseUserScriptJob *job) { Q_ASSERT(job == mParseJob); mParseJob = nullptr; const QString jobError = job->error(); if (!jobError.isEmpty()) { emitError(i18n("ParseUserScriptJob failed: %1", jobError)); return; } mActiveScripts = job->activeScriptList(); mSieveJob = KManageSieve::SieveJob::list(job->scriptUrl()); connect(mSieveJob, &KManageSieve::SieveJob::gotList, this, &VacationCheckJob::slotGotList); } void VacationCheckJob::slotGotList(KManageSieve::SieveJob *job, bool success, const QStringList &availableScripts, const QString &activeScript) { Q_UNUSED(activeScript) Q_ASSERT(job == mSieveJob); mSieveJob = nullptr; if (!success) { emitError(i18n("Failed to get the list of Sieve scripts.\n" "The server responded:\n%1", job->errorString())); return; } mAvailableScripts = availableScripts; searchVacationScript(); } void VacationCheckJob::emitError(const QString &errorMessage) { qCWarning(LIBKSIEVE_LOG) << errorMessage; Q_EMIT error(errorMessage); } void VacationCheckJob::searchVacationScript() { QStringList scriptList = mActiveScripts; // Reorder script list for (const QString &script : qAsConst(mAvailableScripts)) { if (!scriptList.contains(script)) { scriptList.append(script); } } mAvailableScripts = scriptList; mScriptPos = 0; getNextScript(); } void VacationCheckJob::getNextScript() { if (isLastScript()) { //TODO: no script found mNoScriptFound = true; Q_EMIT vacationScriptActive(this, QString(), false); qCDebug(LIBKSIEVE_LOG) << "no vacation script found :("; return; } QUrl url = mUrl; url = url.adjusted(QUrl::RemoveFilename); url.setPath(url.path() + QLatin1Char('/') + mAvailableScripts[mScriptPos]); mScriptPos += 1; if (Util::isKep14ProtectedName(url.fileName())) { getNextScript(); } mSieveJob = KManageSieve::SieveJob::get(url); connect(mSieveJob, &KManageSieve::SieveJob::gotScript, this, &VacationCheckJob::slotGetResult); } bool VacationCheckJob::isLastScript() const { return mScriptPos >= mAvailableScripts.count(); } bool VacationCheckJob::noScriptFound() const { return mNoScriptFound; } QString VacationCheckJob::serverName() const { return mServerName; } QString VacationCheckJob::script() const { return mScript; } QStringList VacationCheckJob::sieveCapabilities() const { return mSieveCapabilities; }