diff --git a/src/admc/CMakeLists.txt b/src/admc/CMakeLists.txt index 8c09c8ac..0032d30f 100644 --- a/src/admc/CMakeLists.txt +++ b/src/admc/CMakeLists.txt @@ -198,6 +198,7 @@ set(ADMC_SOURCES console_widget/console_impl.cpp managers/icon_manager.cpp + managers/gplink_manager.cpp console_impls/object_impl.cpp console_impls/policy_impl.cpp diff --git a/src/admc/managers/gplink_manager.cpp b/src/admc/managers/gplink_manager.cpp new file mode 100644 index 00000000..77042394 --- /dev/null +++ b/src/admc/managers/gplink_manager.cpp @@ -0,0 +1,77 @@ +#include "gplink_manager.h" + +#include "search_thread.h" +#include "ad_interface.h" +#include "ad_object.h" +#include "ad_config.h" +#include "ad_filter.h" +#include "globals.h" +#include "gplink.h" +#include "utils.h" + +GPLinkManager::GPLinkManager(QObject *parent) : QObject(parent), is_updated(true) { +} + +void GPLinkManager::update() { + if (!is_updated) { + return; + } + + is_updated = false; + + const QString &filter = filter_OR({filter_CONDITION(Condition_Equals, ATTRIBUTE_OBJECT_CLASS, CLASS_OU), + filter_CONDITION(Condition_Equals, ATTRIBUTE_OBJECT_CLASS, CLASS_DOMAIN)}); + auto search_thread = new SearchThread(g_adconfig->domain_dn(), + SearchScope_All, + filter, + {ATTRIBUTE_GPLINK}); + + connect(search_thread, &SearchThread::results_ready, this, [this](const QHash &results) { + for (const QString &dn : results.keys()) { + // Make gplink trimmed because some values can contain only spaces for some reason + const QString gplink_str = results[dn].get_string(ATTRIBUTE_GPLINK).trimmed(); + if (!gplink_str.isEmpty()) { + set_gplink(dn, results[dn].get_string(ATTRIBUTE_GPLINK)); + } + } + }); + + connect(search_thread, &SearchThread::finished, this, [this, search_thread]() { + failed_to_update = search_thread->failed_to_connect(); + is_updated = true; + + search_thread->deleteLater(); + }); + + search_thread->start(); +} + +void GPLinkManager::set_gplink(const QString &ou_dn, const QString &gplink_str) { + QMutexLocker locker(&mutex); + ou_links[ou_dn] = gplink_str; +} + +QString GPLinkManager::ou_gplink(const QString &ou_dn) const { + return ou_links.value(ou_dn, QString()); +} + +bool GPLinkManager::update_failed() { + return failed_to_update; +} + +const QHash &GPLinkManager::gplinks_map() const { + QMutexLocker locker(&mutex); + return ou_links; +} + +QStringList GPLinkManager::linked_ou_list(const QString &policy_dn) const { + QStringList ou_dn_list; + for (const QString &ou_dn : ou_links.keys()) { + Gplink gplink = Gplink(ou_links[ou_dn]); + if (gplink.contains(policy_dn)) { + ou_dn_list.append(ou_dn); + } + } + + return ou_dn_list; +} diff --git a/src/admc/managers/gplink_manager.h b/src/admc/managers/gplink_manager.h new file mode 100644 index 00000000..7234e2a1 --- /dev/null +++ b/src/admc/managers/gplink_manager.h @@ -0,0 +1,30 @@ +#ifndef GPLINKMANAGER_H +#define GPLINKMANAGER_H + +#include +#include +#include +#include + +class GPLinkManager final : public QObject { + Q_OBJECT + +public: + explicit GPLinkManager(QObject *parent = nullptr); + + void update(); + void set_gplink(const QString &ou_dn, const QString &gplink_str); + QString ou_gplink(const QString &ou_dn) const; + bool update_failed(); + const QHash& gplinks_map() const; + QStringList linked_ou_list(const QString &policy_dn) const; + +private: + // OU DN - key, GPLink string - value. DN keys can contain domain dn. + QHash ou_links; + mutable QMutex mutex; + bool is_updated; + bool failed_to_update = false; +}; + +#endif // GPLINKMANAGER_H