File indexing completed on 2024-12-08 09:35:33

0001 /*
0002     SPDX-FileCopyrightText: 2009 Dario Freddi <drf@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "BackendsManager.h"
0008 
0009 #include "BackendsConfig.h"
0010 
0011 // Include fake backends
0012 #include "backends/fake/FakeBackend.h"
0013 #include "backends/fakehelper/FakeHelperProxy.h"
0014 #include "kauthdebug.h"
0015 
0016 #include <QCoreApplication>
0017 #include <QDir>
0018 #include <QPluginLoader>
0019 
0020 namespace KAuth
0021 {
0022 AuthBackend *BackendsManager::auth = nullptr;
0023 HelperProxy *BackendsManager::helper = nullptr;
0024 
0025 BackendsManager::BackendsManager()
0026 {
0027 }
0028 
0029 QList<QObject *> BackendsManager::retrieveInstancesIn(const QString &path)
0030 {
0031     QList<QObject *> retlist;
0032     QDir pluginPath(path);
0033     if (!pluginPath.exists() || path.isEmpty()) {
0034         return retlist;
0035     }
0036 
0037     const QFileInfoList entryList = pluginPath.entryInfoList(QDir::NoDotAndDotDot | QDir::Files);
0038 
0039     for (const QFileInfo &fi : entryList) {
0040         const QString filePath = fi.filePath(); // file name with path
0041         // QString fileName = fi.fileName(); // just file name
0042 
0043         if (!QLibrary::isLibrary(filePath)) {
0044             continue;
0045         }
0046 
0047         QPluginLoader loader(filePath);
0048         QObject *instance = loader.instance();
0049         if (instance) {
0050             retlist.append(instance);
0051         } else {
0052             qCWarning(KAUTH) << "Couldn't load" << filePath << "error:" << loader.errorString();
0053         }
0054     }
0055     return retlist;
0056 }
0057 
0058 void BackendsManager::init()
0059 {
0060     // Backend plugin
0061     const QList<QObject *> backends = retrieveInstancesIn(QFile::decodeName(KAUTH_BACKEND_PLUGIN_DIR));
0062 
0063     for (QObject *instance : backends) {
0064         auth = qobject_cast<KAuth::AuthBackend *>(instance);
0065         if (auth) {
0066             break;
0067         }
0068     }
0069 
0070     // Helper plugin
0071     const QList<QObject *> helpers = retrieveInstancesIn(QFile::decodeName(KAUTH_HELPER_PLUGIN_DIR));
0072 
0073     for (QObject *instance : helpers) {
0074         helper = qobject_cast<KAuth::HelperProxy *>(instance);
0075         if (helper) {
0076             break;
0077         }
0078     }
0079 
0080     if (!auth) {
0081         // Load the fake auth backend then
0082         auth = new FakeBackend;
0083 #if !KAUTH_COMPILING_FAKE_BACKEND
0084         // Spit a fat warning
0085         qCWarning(KAUTH) << "WARNING: KAuth was compiled with a working backend, but was unable to load it! Check your installation!";
0086 #endif
0087     }
0088 
0089     if (!helper) {
0090         // Load the fake helper backend then
0091         helper = new FakeHelperProxy;
0092 #if !KAUTH_COMPILING_FAKE_BACKEND
0093         // Spit a fat warning
0094         qCWarning(KAUTH) << "WARNING: KAuth was compiled with a working helper backend, but was unable to load it! "
0095                             "Check your installation!";
0096 #endif
0097     }
0098 }
0099 
0100 AuthBackend *BackendsManager::authBackend()
0101 {
0102     if (!auth) {
0103         init();
0104     }
0105 
0106     return auth;
0107 }
0108 
0109 HelperProxy *BackendsManager::helperProxy()
0110 {
0111     if (!helper) {
0112         init();
0113     }
0114 
0115     return helper;
0116 }
0117 
0118 } // namespace Auth