1 /*
2    SPDX-FileCopyrightText: 2018-2021 Laurent Montel <montel@kde.org>
3 
4    SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "authenticationmanager.h"
8 #include "kcoreaddons_version.h"
9 #include "ruqola_debug.h"
10 #include <KPluginFactory>
11 #include <KPluginLoader>
12 #include <KPluginMetaData>
13 #include <QFileInfo>
14 
15 #include <plugins/pluginauthentication.h>
16 
AuthenticationManager(QObject * parent)17 AuthenticationManager::AuthenticationManager(QObject *parent)
18     : QObject(parent)
19 {
20     initializePluginList();
21 }
22 
23 AuthenticationManager::~AuthenticationManager() = default;
24 
self()25 AuthenticationManager *AuthenticationManager::self()
26 {
27     static AuthenticationManager s_self;
28     return &s_self;
29 }
30 
initializePluginList()31 void AuthenticationManager::initializePluginList()
32 {
33 #if KCOREADDONS_VERSION < QT_VERSION_CHECK(5, 86, 0)
34     const QVector<KPluginMetaData> plugins = KPluginLoader::findPlugins(QStringLiteral("ruqolaplugins/authentication"));
35 #else
36     const QVector<KPluginMetaData> plugins = KPluginMetaData::findPlugins(QStringLiteral("ruqolaplugins/authentication"));
37 #endif
38 
39     QVectorIterator<KPluginMetaData> i(plugins);
40     i.toBack();
41     QSet<QString> unique;
42     while (i.hasPrevious()) {
43         AuthenticationManagerInfo info;
44         const KPluginMetaData data = i.previous();
45 
46         // 1) get plugin data => name/description etc.
47         info.pluginData = createPluginMetaData(data);
48         // 2) look at if plugin is activated
49         info.data = data;
50         info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName();
51         info.metaDataFileName = data.fileName();
52         // only load plugins once, even if found multiple times!
53         if (unique.contains(info.metaDataFileNameBaseName)) {
54             continue;
55         }
56         info.plugin = nullptr;
57         mPluginList.push_back(info);
58         unique.insert(info.metaDataFileNameBaseName);
59     }
60     QVector<AuthenticationManagerInfo>::iterator end(mPluginList.end());
61     for (QVector<AuthenticationManagerInfo>::iterator it = mPluginList.begin(); it != end; ++it) {
62         loadPlugin(&(*it));
63     }
64 }
65 
loadPlugin(AuthenticationManagerInfo * item)66 void AuthenticationManager::loadPlugin(AuthenticationManagerInfo *item)
67 {
68 #if KCOREADDONS_VERSION < QT_VERSION_CHECK(5, 86, 0)
69     KPluginLoader pluginLoader(item->metaDataFileName);
70     if (pluginLoader.factory()) {
71         item->plugin = pluginLoader.factory()->create<PluginAuthentication>(this, QVariantList() << item->metaDataFileNameBaseName);
72         mPluginDataList.append(item->pluginData);
73     }
74 #else
75     if (auto plugin = KPluginFactory::instantiatePlugin<PluginAuthentication>(item->data, this, QVariantList() << item->metaDataFileNameBaseName).plugin) {
76         item->plugin = plugin;
77         mPluginDataList.append(item->pluginData);
78     }
79 #endif
80 }
81 
pluginsList() const82 QVector<PluginAuthentication *> AuthenticationManager::pluginsList() const
83 {
84     QVector<PluginAuthentication *> lst;
85     QVector<AuthenticationManagerInfo>::ConstIterator end(mPluginList.constEnd());
86     for (QVector<AuthenticationManagerInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
87         if (auto plugin = (*it).plugin) {
88             lst << plugin;
89         }
90     }
91     return lst;
92 }
93 
createPluginMetaData(const KPluginMetaData & metaData)94 PluginUtilData AuthenticationManager::createPluginMetaData(const KPluginMetaData &metaData)
95 {
96     PluginUtilData pluginData;
97     pluginData.mName = metaData.name();
98     pluginData.mIdentifier = metaData.pluginId();
99     return pluginData;
100 }
101