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