1 /*
2  * SPDX-FileCopyrightText: 2020-2021 Laurent Montel <montel@kde.org>
3  *
4  * SPDX-License-Identifier: LGPL-2.0-or-later
5  */
6 
7 #include "ldapclientsearchconfigreadconfigjob.h"
8 #include "ldapclient_debug.h"
9 
10 #include <KConfig>
11 #include <KLocalizedString>
12 #include <kldap/ldapdn.h>
13 #include <qt5keychain/keychain.h>
14 using namespace QKeychain;
15 
16 using namespace KLDAP;
LdapClientSearchConfigReadConfigJob(QObject * parent)17 LdapClientSearchConfigReadConfigJob::LdapClientSearchConfigReadConfigJob(QObject *parent)
18     : QObject(parent)
19 {
20 }
21 
~LdapClientSearchConfigReadConfigJob()22 LdapClientSearchConfigReadConfigJob::~LdapClientSearchConfigReadConfigJob()
23 {
24 }
25 
canStart() const26 bool LdapClientSearchConfigReadConfigJob::canStart() const
27 {
28     return mServerIndex != -1 && mConfig.isValid();
29 }
30 
readLdapClientConfigFinished()31 void LdapClientSearchConfigReadConfigJob::readLdapClientConfigFinished()
32 {
33     Q_EMIT configLoaded(mServer);
34     deleteLater();
35 }
36 
start()37 void LdapClientSearchConfigReadConfigJob::start()
38 {
39     if (!canStart()) {
40         // Failed !
41         readLdapClientConfigFinished();
42         return;
43     }
44     readConfig();
45 }
46 
active() const47 bool LdapClientSearchConfigReadConfigJob::active() const
48 {
49     return mActive;
50 }
51 
setActive(bool newActive)52 void LdapClientSearchConfigReadConfigJob::setActive(bool newActive)
53 {
54     mActive = newActive;
55 }
56 
serverIndex() const57 int LdapClientSearchConfigReadConfigJob::serverIndex() const
58 {
59     return mServerIndex;
60 }
61 
setServerIndex(int newServerIndex)62 void LdapClientSearchConfigReadConfigJob::setServerIndex(int newServerIndex)
63 {
64     mServerIndex = newServerIndex;
65 }
66 
config() const67 KConfigGroup LdapClientSearchConfigReadConfigJob::config() const
68 {
69     return mConfig;
70 }
71 
setConfig(const KConfigGroup & newConfig)72 void LdapClientSearchConfigReadConfigJob::setConfig(const KConfigGroup &newConfig)
73 {
74     mConfig = newConfig;
75 }
76 
readConfig()77 void LdapClientSearchConfigReadConfigJob::readConfig()
78 {
79     QString prefix;
80     if (mActive) {
81         prefix = QStringLiteral("Selected");
82     }
83 
84     const QString host = mConfig.readEntry(prefix + QStringLiteral("Host%1").arg(mServerIndex), QString()).trimmed();
85     if (!host.isEmpty()) {
86         mServer.setHost(host);
87     }
88 
89     const int port = mConfig.readEntry(prefix + QStringLiteral("Port%1").arg(mServerIndex), 389);
90     mServer.setPort(port);
91 
92     const QString base = mConfig.readEntry(prefix + QStringLiteral("Base%1").arg(mServerIndex), QString()).trimmed();
93     if (!base.isEmpty()) {
94         mServer.setBaseDn(KLDAP::LdapDN(base));
95     }
96 
97     const QString user = mConfig.readEntry(prefix + QStringLiteral("User%1").arg(mServerIndex), QString()).trimmed();
98     if (!user.isEmpty()) {
99         mServer.setUser(user);
100     }
101 
102     const QString bindDN = mConfig.readEntry(prefix + QStringLiteral("Bind%1").arg(mServerIndex), QString()).trimmed();
103     if (!bindDN.isEmpty()) {
104         mServer.setBindDn(bindDN);
105     }
106 #if 0 // Port
107     const QString pwdBindBNEntry = prefix + QStringLiteral("PwdBind%1").arg(mServerIndex);
108     QString pwdBindDN = mConfig.readEntry(pwdBindBNEntry, QString());
109     if (!pwdBindDN.isEmpty()) {
110         if (d->askWallet && KMessageBox::Yes == KMessageBox::questionYesNo(nullptr, i18n("LDAP password is stored as clear text, do you want to store it in kwallet?"),
111                                                                            i18n("Store clear text password in Wallet"),
112                                                                            KStandardGuiItem::yes(),
113                                                                            KStandardGuiItem::no(),
114                                                                            QStringLiteral("DoAskToStoreToWallet"))) {
115             d->wallet = KWallet::Wallet::openWallet(KWallet::Wallet::LocalWallet(), 0);
116             if (d->wallet) {
117                 connect(d->wallet, &KWallet::Wallet::walletClosed, this, &LdapClientSearchConfig::slotWalletClosed);
118                 d->useWallet = true;
119                 if (!d->wallet->hasFolder(QStringLiteral("ldapclient"))) {
120                     d->wallet->createFolder(QStringLiteral("ldapclient"));
121                 }
122                 d->wallet->setFolder(QStringLiteral("ldapclient"));
123                 d->wallet->writePassword(pwdBindBNEntry, pwdBindDN);
124                 mConfig.deleteEntry(pwdBindBNEntry);
125                 mConfig.sync();
126             }
127         }
128         mServer.setPassword(pwdBindDN);
129     } else if (d->askWallet) { //Look at in Wallet
130         //Move as async here.
131         d->wallet = KWallet::Wallet::openWallet(KWallet::Wallet::LocalWallet(), 0);
132         if (d->wallet) {
133             d->useWallet = true;
134             if (!d->wallet->setFolder(QStringLiteral("ldapclient"))) {
135                 d->wallet->createFolder(QStringLiteral("ldapclient"));
136                 d->wallet->setFolder(QStringLiteral("ldapclient"));
137             }
138             d->wallet->readPassword(pwdBindBNEntry, pwdBindDN);
139             if (!pwdBindDN.isEmpty()) {
140                 mServer.setPassword(pwdBindDN);
141             }
142         } else {
143             d->useWallet = false;
144         }
145     }
146 #endif
147     mServer.setTimeLimit(mConfig.readEntry(prefix + QStringLiteral("TimeLimit%1").arg(mServerIndex), 0));
148     mServer.setSizeLimit(mConfig.readEntry(prefix + QStringLiteral("SizeLimit%1").arg(mServerIndex), 0));
149     mServer.setPageSize(mConfig.readEntry(prefix + QStringLiteral("PageSize%1").arg(mServerIndex), 0));
150     mServer.setVersion(mConfig.readEntry(prefix + QStringLiteral("Version%1").arg(mServerIndex), 3));
151 
152     QString tmp = mConfig.readEntry(prefix + QStringLiteral("Security%1").arg(mServerIndex), QStringLiteral("None"));
153     mServer.setSecurity(KLDAP::LdapServer::None);
154     if (tmp == QLatin1String("SSL")) {
155         mServer.setSecurity(KLDAP::LdapServer::SSL);
156     } else if (tmp == QLatin1String("TLS")) {
157         mServer.setSecurity(KLDAP::LdapServer::TLS);
158     }
159 
160     tmp = mConfig.readEntry(prefix + QStringLiteral("Auth%1").arg(mServerIndex), QStringLiteral("Anonymous"));
161     mServer.setAuth(KLDAP::LdapServer::Anonymous);
162     if (tmp == QLatin1String("Simple")) {
163         mServer.setAuth(KLDAP::LdapServer::Simple);
164     } else if (tmp == QLatin1String("SASL")) {
165         mServer.setAuth(KLDAP::LdapServer::SASL);
166     }
167 
168     mServer.setMech(mConfig.readEntry(prefix + QStringLiteral("Mech%1").arg(mServerIndex), QString()));
169     mServer.setFilter(mConfig.readEntry(prefix + QStringLiteral("UserFilter%1").arg(mServerIndex), QString()));
170     mServer.setCompletionWeight(mConfig.readEntry(prefix + QStringLiteral("CompletionWeight%1").arg(mServerIndex), -1));
171 
172     const QString pwdBindBNEntry = prefix + QStringLiteral("PwdBind%1").arg(mServerIndex);
173 
174     auto readJob = new ReadPasswordJob(QStringLiteral("ldapclient"), this);
175     connect(readJob, &Job::finished, this, &LdapClientSearchConfigReadConfigJob::readLdapPasswordFinished);
176     readJob->setKey(pwdBindBNEntry);
177     readJob->start();
178 }
179 
readLdapPasswordFinished(QKeychain::Job * baseJob)180 void LdapClientSearchConfigReadConfigJob::readLdapPasswordFinished(QKeychain::Job *baseJob)
181 {
182     auto job = qobject_cast<ReadPasswordJob *>(baseJob);
183     Q_ASSERT(job);
184     if (!job->error()) {
185         mServer.setPassword(job->textData());
186     } else {
187         qCWarning(LDAPCLIENT_LOG) << "We have an error during reading password " << job->errorString();
188     }
189     readLdapClientConfigFinished();
190 }
191