1 /*
2     SPDX-FileCopyrightText: 2010-2021 Laurent Montel <montel@kde.org>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "restoreldapsettingsjob.h"
8 #include <KConfig>
9 #include <KLDAP/LdapClientSearchConfig>
10 #include <KLDAP/LdapClientSearchConfigReadConfigJob>
11 #include <KLDAP/LdapClientSearchConfigWriteConfigJob>
12 #include <QDebug>
13 
RestoreLdapSettingsJob(QObject * parent)14 RestoreLdapSettingsJob::RestoreLdapSettingsJob(QObject *parent)
15     : QObject(parent)
16 {
17 }
18 
~RestoreLdapSettingsJob()19 RestoreLdapSettingsJob::~RestoreLdapSettingsJob()
20 {
21 }
22 
start()23 void RestoreLdapSettingsJob::start()
24 {
25     if (!canStart()) {
26         deleteLater();
27         qWarning() << "Impossible to start RestoreLdapSettingsJob";
28         Q_EMIT restoreDone();
29         return;
30     }
31     restore();
32 }
33 
slotConfigSelectedHostLoaded(const KLDAP::LdapServer & server)34 void RestoreLdapSettingsJob::slotConfigSelectedHostLoaded(const KLDAP::LdapServer &server)
35 {
36     mSelHosts.append(server);
37     mCurrentIndex++;
38     loadNextSelectHostSettings();
39 }
40 
loadNextSelectHostSettings()41 void RestoreLdapSettingsJob::loadNextSelectHostSettings()
42 {
43     if (mCurrentIndex < mNumSelHosts) {
44         if (mCurrentIndex != mEntry) {
45             auto job = new KLDAP::LdapClientSearchConfigReadConfigJob(this);
46             connect(job, &KLDAP::LdapClientSearchConfigReadConfigJob::configLoaded, this, &RestoreLdapSettingsJob::slotConfigSelectedHostLoaded);
47             job->setActive(true);
48             job->setConfig(mCurrentGroup);
49             job->setServerIndex(mCurrentIndex);
50             job->start();
51         } else {
52             mCurrentIndex++;
53             loadNextSelectHostSettings();
54         }
55     } else {
56         // Reset index;
57         mCurrentIndex = 0;
58         loadNextHostSettings();
59     }
60 }
61 
slotConfigHostLoaded(const KLDAP::LdapServer & server)62 void RestoreLdapSettingsJob::slotConfigHostLoaded(const KLDAP::LdapServer &server)
63 {
64     mHosts.append(server);
65     mCurrentIndex++;
66     loadNextHostSettings();
67 }
68 
loadNextHostSettings()69 void RestoreLdapSettingsJob::loadNextHostSettings()
70 {
71     if (mCurrentIndex < mNumHosts) {
72         auto job = new KLDAP::LdapClientSearchConfigReadConfigJob(this);
73         connect(job, &KLDAP::LdapClientSearchConfigReadConfigJob::configLoaded, this, &RestoreLdapSettingsJob::slotConfigHostLoaded);
74         job->setActive(false);
75         job->setConfig(mCurrentGroup);
76         job->setServerIndex(mCurrentIndex);
77         job->start();
78     } else {
79         saveLdapSettings();
80     }
81 }
82 
restore()83 void RestoreLdapSettingsJob::restore()
84 {
85     if (mEntry >= 0) {
86         mCurrentGroup = mConfig->group(QStringLiteral("LDAP"));
87         mNumSelHosts = mCurrentGroup.readEntry(QStringLiteral("NumSelectedHosts"), 0);
88         mNumHosts = mCurrentGroup.readEntry(QStringLiteral("NumHosts"), 0);
89         loadNextSelectHostSettings();
90     } else {
91         restoreSettingsDone();
92     }
93 }
94 
restoreSettingsDone()95 void RestoreLdapSettingsJob::restoreSettingsDone()
96 {
97     Q_EMIT restoreDone();
98     deleteLater();
99 }
100 
saveNextSelectHostSettings()101 void RestoreLdapSettingsJob::saveNextSelectHostSettings()
102 {
103     if (mCurrentIndex < mNumSelHosts - 1) {
104         auto job = new KLDAP::LdapClientSearchConfigWriteConfigJob(this);
105         connect(job, &KLDAP::LdapClientSearchConfigWriteConfigJob::configSaved, this, &RestoreLdapSettingsJob::saveNextSelectHostSettings);
106         job->setActive(true);
107         job->setConfig(mCurrentGroup);
108         job->setServer(mSelHosts.at(mCurrentIndex));
109         job->setServerIndex(mCurrentIndex);
110         job->start();
111     } else {
112         mCurrentIndex = 0;
113         saveNextHostSettings();
114     }
115 }
116 
saveNextHostSettings()117 void RestoreLdapSettingsJob::saveNextHostSettings()
118 {
119     if (mCurrentIndex < mNumHosts) {
120         auto job = new KLDAP::LdapClientSearchConfigWriteConfigJob(this);
121         connect(job, &KLDAP::LdapClientSearchConfigWriteConfigJob::configSaved, this, &RestoreLdapSettingsJob::saveNextHostSettings);
122         job->setActive(false);
123         job->setConfig(mCurrentGroup);
124         job->setServer(mHosts.at(mCurrentIndex));
125         job->setServerIndex(mCurrentIndex);
126         job->start();
127     } else {
128         mCurrentGroup.writeEntry(QStringLiteral("NumSelectedHosts"), mNumSelHosts - 1);
129         mCurrentGroup.writeEntry(QStringLiteral("NumHosts"), mNumHosts);
130         mConfig->sync();
131         restoreSettingsDone();
132     }
133 }
134 
saveLdapSettings()135 void RestoreLdapSettingsJob::saveLdapSettings()
136 {
137     mConfig->deleteGroup(QStringLiteral("LDAP"));
138     mCurrentGroup = KConfigGroup(mConfig, QStringLiteral("LDAP"));
139 
140     mCurrentIndex = 0;
141     saveNextSelectHostSettings();
142 }
143 
entry() const144 int RestoreLdapSettingsJob::entry() const
145 {
146     return mEntry;
147 }
148 
setEntry(int entry)149 void RestoreLdapSettingsJob::setEntry(int entry)
150 {
151     mEntry = entry;
152 }
153 
config() const154 KConfig *RestoreLdapSettingsJob::config() const
155 {
156     return mConfig;
157 }
158 
setConfig(KConfig * config)159 void RestoreLdapSettingsJob::setConfig(KConfig *config)
160 {
161     mConfig = config;
162 }
163 
canStart() const164 bool RestoreLdapSettingsJob::canStart() const
165 {
166     return (mConfig != nullptr) && (mEntry != -1);
167 }
168