1 /*
2    SPDX-FileCopyrightText: 2005 Till Adam <adam@kde.org>
3 
4    SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "util.h"
8 #include "akonadiimapsettinginterface.h"
9 #include "imapresourcesettings.h"
10 #include "libksieve_debug.h"
11 #include "sieve-vacation.h"
12 #include "sieveimapinstance/sieveimapinstance.h"
13 #include "sieveimapinstance/sieveimapinstanceinterfacemanager.h"
14 #include "sieveimappasswordprovider.h"
15 #include "util_p.h"
16 #include <PimCommon/PimUtil>
17 
18 #include <KMime/KMimeMessage>
19 #include <MailTransport/Transport>
20 
21 using namespace KSieveUi;
22 
sieveImapResourceNames()23 QStringList KSieveUi::Util::sieveImapResourceNames()
24 {
25     const QVector<KSieveUi::SieveImapInstance> lst = KSieveUi::Util::sieveImapInstances();
26     QStringList resourceNames;
27     resourceNames.reserve(lst.count());
28     for (const KSieveUi::SieveImapInstance &type : lst) {
29         resourceNames << type.identifier();
30     }
31     return resourceNames;
32 }
33 
sieveImapInstances()34 QVector<KSieveUi::SieveImapInstance> KSieveUi::Util::sieveImapInstances()
35 {
36     const QVector<KSieveUi::SieveImapInstance> allInstances = KSieveUi::SieveImapInstanceInterfaceManager::self()->sieveImapInstanceList();
37     QVector<KSieveUi::SieveImapInstance> relevantInstances;
38     for (const KSieveUi::SieveImapInstance &instance : allInstances) {
39         if (instance.mimeTypes().contains(KMime::Message::mimeType()) && instance.capabilities().contains(QLatin1String("Resource"))
40             && !instance.capabilities().contains(QLatin1String("Virtual"))) {
41             if (PimCommon::Util::isImapResource(instance.identifier())) {
42                 relevantInstances << instance;
43             }
44         }
45     }
46     return relevantInstances;
47 }
48 
checkOutOfOfficeOnStartup()49 bool KSieveUi::Util::checkOutOfOfficeOnStartup()
50 {
51     return VacationSettings::self()->checkOutOfOfficeOnStartup();
52 }
53 
allowOutOfOfficeSettings()54 bool KSieveUi::Util::allowOutOfOfficeSettings()
55 {
56     return VacationSettings::self()->allowOutOfOfficeSettings();
57 }
58 
hasKep14CapabilitySupport(const QStringList & sieveCapabilities)59 bool Util::hasKep14CapabilitySupport(const QStringList &sieveCapabilities)
60 {
61     const bool hasIncludeCapability = sieveCapabilities.contains(QLatin1String("include"));
62     return hasIncludeCapability;
63 }
64 
hasKep14Support(const QStringList & sieveCapabilities,const QStringList & availableScripts,const QString & activeScript)65 bool Util::hasKep14Support(const QStringList &sieveCapabilities, const QStringList &availableScripts, const QString &activeScript)
66 {
67     const bool hasIncludeCapability = Util::hasKep14CapabilitySupport(sieveCapabilities);
68     if (!hasIncludeCapability) {
69         return false;
70     }
71 
72     bool masterIsActive = !activeScript.isEmpty();
73     if (masterIsActive) {
74         const QString scriptName = activeScript.split(QLatin1Char('.')).first().toLower();
75         masterIsActive = (scriptName == QLatin1String("master") || scriptName == QLatin1String("user"));
76     }
77     if (!masterIsActive) {
78         return false;
79     }
80 
81     bool hasUserScript = false;
82     for (const QString &script : availableScripts) {
83         if (script.isEmpty()) {
84             continue;
85         }
86         const QString name = script.split(QLatin1Char('.')).first().toLower();
87         if (name == QLatin1String("user")) {
88             hasUserScript = true;
89             break;
90         }
91     }
92 
93     return hasIncludeCapability && masterIsActive && hasUserScript;
94 }
95 
isKep14ProtectedName(const QString & name)96 bool Util::isKep14ProtectedName(const QString &name)
97 {
98     const QString n = name.split(QLatin1Char('.')).first().toLower();
99     if (n == QLatin1String("master") || n == QLatin1String("user") || n == QLatin1String("management")) {
100         return true;
101     }
102     return false;
103 }
104 
operator <<(QDebug d,const Util::AccountInfo & info)105 QDebug Util::operator<<(QDebug d, const Util::AccountInfo &info)
106 {
107     d << "sieveImapAccountSettings " << info.sieveImapAccountSettings;
108     d << "url " << info.sieveUrl.toString();
109     return d;
110 }
111 
operator ==(const Util::AccountInfo & other) const112 bool Util::AccountInfo::operator==(const Util::AccountInfo &other) const
113 {
114     const bool result = (other.sieveImapAccountSettings == sieveImapAccountSettings) && (other.sieveUrl == sieveUrl);
115     if (!result) {
116         qCDebug(LIBKSIEVE_LOG) << "actual :" << *this << "\n other :" << other;
117     }
118     return result;
119 }
120