1
0
mirror of https://github.com/altlinux/admc.git synced 2025-03-17 02:50:12 +03:00

Implement GPLinkManager global object

Removed group policy link string data contained in the organization unit
model items. Instead GPLinkManager object is used to get/update policy
link changes locally. It helps to get the policy links info without domain
database fetching and avoid GUI freezes, caused by policy widget update.
This commit is contained in:
Semyon Knyazev 2025-01-17 18:32:53 +04:00
parent 2ebf0f217e
commit 01e981d234
6 changed files with 37 additions and 34 deletions

View File

@ -36,6 +36,7 @@
#include "utils.h"
#include "managers/icon_manager.h"
#include "fsmo/fsmo_utils.h"
#include "managers/gplink_manager.h"
#include <QAction>
#include <QDebug>
@ -234,12 +235,13 @@ void PolicyImpl::on_ou_gplink_changed(const QString &ou_dn, const Gplink &gplink
QModelIndex ou_item_index = search_gpo_ou_index(console, ou_dn);
if (!ou_item_index.isValid())
return;
update_ou_gplink_data(gplink.to_string(), ou_item_index);
QModelIndex target_policy_index = get_ou_child_policy_index(console, ou_item_index, policy_dn);
if (!target_policy_index.isValid())
return;
update_ou_item_gplink_data(gplink.to_string(), ou_item_index, console);
// Case of link deletion
if (!gplink.contains(policy_dn)) {
console->delete_item(target_policy_index);
@ -267,14 +269,14 @@ void PolicyImpl::on_change_gplink_option_action(QAction *action)
bool checked = action->isChecked();
const QString gplink_string = ou_index.data(PolicyOURole_Gplink_String).toString();
const QString gplink_string = g_gplink_manager->ou_gplink(ou_dn);
Gplink gplink = Gplink(gplink_string);
gplink.set_option(gpo_dn, option, checked);
const QString updated_gplink_string = gplink.to_string();
bool success = ad.attribute_replace_string(ou_dn, ATTRIBUTE_GPLINK, updated_gplink_string);
if (success) {
update_ou_item_gplink_data(updated_gplink_string, ou_index, console);
update_ou_gplink_data(updated_gplink_string, ou_index);
set_policy_item_icon(policy_index, checked, option);
policy_results->update(policy_index);
}
@ -489,7 +491,7 @@ void console_policy_remove_link(const QList<ConsoleWidget *> &console_list, Poli
const QModelIndex ou_index = target_console->search_item(policy_root, PolicyOURole_DN, ou_dn, {ItemType_PolicyOU});
if (ou_index.isValid()) {
update_ou_item_gplink_data(gplink_new_string, ou_index, target_console);
update_ou_gplink_data(gplink_new_string, ou_index);
for (const QString &dn : dn_list) {
const QModelIndex gpo_index = get_ou_child_policy_index(target_console, ou_index, dn);
@ -778,7 +780,8 @@ void console_policy_update_policy_results(ConsoleWidget *console, PolicyResultsW
bool policy_is_enforced(QStandardItem *policy_item)
{
bool is_enforced = false;
const QString gplink_string = policy_item->parent()->data(PolicyOURole_Gplink_String).toString();
const QString ou_dn = policy_item->parent()->data(PolicyOURole_DN).toString();
const QString gplink_string = g_gplink_manager->ou_gplink(ou_dn);
const Gplink gplink = Gplink(gplink_string);
is_enforced = gplink.enforced_gpo_dn_list().contains(policy_item->data(PolicyRole_DN).toString());
@ -788,7 +791,8 @@ bool policy_is_enforced(QStandardItem *policy_item)
bool policy_is_disabled(QStandardItem *policy_item)
{
bool is_disabled = false;
const QString gplink_string = policy_item->parent()->data(PolicyOURole_Gplink_String).toString();
const QString ou_dn = policy_item->parent()->data(PolicyOURole_DN).toString();
const QString gplink_string = g_gplink_manager->ou_gplink(ou_dn);
const Gplink gplink = Gplink(gplink_string);
is_disabled = gplink.disabled_gpo_dn_list().contains(policy_item->data(PolicyRole_DN).toString());

View File

@ -34,6 +34,7 @@
#include "status.h"
#include "utils.h"
#include "managers/icon_manager.h"
#include "managers/gplink_manager.h"
#include "fsmo/fsmo_utils.h"
#include <QDebug>
@ -122,7 +123,6 @@ void PolicyOUImpl::fetch(const QModelIndex &index) {
const QString gplink_string = parent_object.get_string(ATTRIBUTE_GPLINK);
const Gplink gplink = Gplink(gplink_string);
const QList<QString> gpo_list = gplink.get_gpo_list();
console->get_item(index)->setData(gplink_string, PolicyOURole_Gplink_String);
policy_ou_impl_add_objects_from_dns(console, ad, gpo_list, index);
@ -428,7 +428,7 @@ void PolicyOUImpl::link_gpo_to_ou(const QModelIndex &ou_index, const QString &ou
if (!success)
return;
update_ou_item_gplink_data(new_gplink_string, ou_index, console);
update_ou_gplink_data(new_gplink_string, ou_index);
const QList<QString> added_gpo_list = [&]() {
QList<QString> out;
@ -543,9 +543,9 @@ QModelIndex get_ou_child_policy_index(ConsoleWidget *console, const QModelIndex
return policy_index;
}
void update_ou_item_gplink_data(const QString &gplink, const QModelIndex &ou_index, ConsoleWidget *console) {
QStandardItem *ou_item = console->get_item(ou_index);
ou_item->setData(gplink, PolicyOURole_Gplink_String);
void update_ou_gplink_data(const QString &gplink, const QModelIndex &ou_index) {
const QString ou_dn = ou_index.data(PolicyOURole_DN).toString();
g_gplink_manager->set_gplink(ou_dn, gplink);
}
QModelIndex search_gpo_ou_index(ConsoleWidget *console, const QString &ou_dn) {

View File

@ -36,7 +36,6 @@
enum PolicyOURole {
PolicyOURole_DN = MyConsoleRole_LAST + 1,
PolicyOURole_Gplink_String,
PolicyOURole_Inheritance_Block,
PolicyOURole_LAST,
@ -102,6 +101,6 @@ QModelIndex get_ou_child_policy_index(ConsoleWidget *console, const QModelIndex
//Searches OU's index with given dn under "Group policy objects" item
QModelIndex search_gpo_ou_index(ConsoleWidget *console, const QString &ou_dn);
void update_ou_item_gplink_data(const QString &gplink, const QModelIndex &ou_index, ConsoleWidget *console);
void update_ou_gplink_data(const QString &gplink, const QModelIndex &ou_index);
#endif /* POLICY_OU_IMPL_H */

View File

@ -27,6 +27,7 @@
#include "console_impls/item_type.h"
#include "gplink.h"
#include "managers/icon_manager.h"
#include "managers/gplink_manager.h"
#include "globals.h"
#include <QStandardItemModel>
@ -79,9 +80,8 @@ void InheritedPoliciesWidget::update(const QModelIndex &index)
void InheritedPoliciesWidget::hide_not_enforced_inherited_links(bool hide)
{
const Gplink gplink = Gplink(selected_scope_index.
data(PolicyOURole_Gplink_String).
toString());
const QString ou_dn = selected_scope_index.data(PolicyOURole_DN).toString();
const Gplink gplink = Gplink(g_gplink_manager->ou_gplink(ou_dn));
const QStringList gplink_strings = gplink.get_gpo_list();
for (int row = 0; row < model->rowCount(); ++row) {
if (!gplink_strings.contains(model->item(row)->data(RowRole_DN).toString()) &&
@ -96,7 +96,8 @@ void InheritedPoliciesWidget::add_enabled_policy_items(const QModelIndex &index,
if (index.data(ConsoleRole_Type) != ItemType_PolicyOU)
return;
QString gplink_string = index.data(PolicyOURole_Gplink_String).toString();
const QString ou_dn = index.data(PolicyOURole_DN).toString();
const QString gplink_string = g_gplink_manager->ou_gplink(ou_dn);
const Gplink gplink = Gplink(gplink_string);
const QStringList enforced_links = gplink.enforced_gpo_dn_list();

View File

@ -121,7 +121,7 @@ LinkedPoliciesWidget::LinkedPoliciesWidget(ConsoleWidget *console_arg, QWidget *
gplink = gplink_arg;
const QModelIndex scope_tree_ou_index = console->get_current_scope_item();
update_ou_item_gplink_data(gplink.to_string(), scope_tree_ou_index, console);
update_ou_gplink_data(gplink.to_string(), scope_tree_ou_index);
g_status->add_message(tr("Organizational unit ") + scope_tree_ou_index.data().toString() + tr("'s link orders have been succesfuly changed."),
StatusType_Success);
@ -198,7 +198,7 @@ void LinkedPoliciesWidget::on_item_changed(QStandardItem *item) {
gplink.set_option(gpo_dn, option, is_checked);
const QModelIndex scope_tree_ou_index = console->get_current_scope_item();
update_ou_item_gplink_data(gplink_string, scope_tree_ou_index, console);
update_ou_gplink_data(gplink_string, scope_tree_ou_index);
emit gplink_changed(scope_tree_ou_index);
hide_busy_indicator();
@ -330,7 +330,7 @@ void LinkedPoliciesWidget::modify_gplink(void (*modify_function)(Gplink &, const
update_link_items();
const QModelIndex scope_tree_ou_index = console->get_current_scope_item();
update_ou_item_gplink_data(gplink_string, scope_tree_ou_index, console);
update_ou_gplink_data(gplink_string, scope_tree_ou_index);
emit gplink_changed(scope_tree_ou_index);
hide_busy_indicator();

View File

@ -24,13 +24,14 @@
#include "adldap.h"
#include "console_impls/item_type.h"
#include "console_impls/policy_impl.h"
#include "console_widget/console_widget.h"
//#include "console_widget/console_widget.h"
#include "console_widget/results_view.h"
#include "globals.h"
#include "settings.h"
#include "status.h"
#include "utils.h"
#include "managers/icon_manager.h"
#include "managers/gplink_manager.h"
#include <QAction>
#include <QHeaderView>
@ -140,22 +141,17 @@ void PolicyResultsWidget::update(const QString &new_gpo) {
model->removeRows(0, model->rowCount());
const QString base = g_adconfig->domain_dn();
const SearchScope scope = SearchScope_All;
const QList<QString> attributes = {ATTRIBUTE_NAME, ATTRIBUTE_GPLINK, ATTRIBUTE_OBJECT_CATEGORY};
const QString filter = filter_CONDITION(Condition_Contains, ATTRIBUTE_GPLINK, gpo);
const QHash<QString, AdObject> results = ad.search(base, scope, filter, attributes);
const QStringList ou_linked_list = g_gplink_manager->linked_ou_list(gpo);
for (const AdObject &object : results.values()) {
for (const QString &ou_dn : ou_linked_list) {
const QList<QStandardItem *> row = make_item_row(PolicyResultsColumn_COUNT);
const QString dn = object.get_dn();
const QString name = dn_get_name(dn);
const QString name = dn_get_name(ou_dn);
row[PolicyResultsColumn_Name]->setText(name);
row[PolicyResultsColumn_Path]->setText(dn_get_parent_canonical(dn));
row[PolicyResultsColumn_Path]->setText(dn_get_parent_canonical(ou_dn));
const QString gplink_string = object.get_string(ATTRIBUTE_GPLINK);
const QString gplink_string = g_gplink_manager->ou_gplink(ou_dn);
const Gplink gplink = Gplink(gplink_string);
const Qt::CheckState enforced_checkstate = [&]() {
@ -185,9 +181,12 @@ void PolicyResultsWidget::update(const QString &new_gpo) {
item->setCheckState(checkstate);
}
row[0]->setData(dn, PolicyResultsRole_DN);
row[0]->setData(ou_dn, PolicyResultsRole_DN);
row[0]->setData(gplink_string, PolicyResultsRole_GplinkString);
const QIcon icon = g_icon_manager->get_object_icon(object);
const QString obj_category = ou_dn == g_adconfig->domain_dn() ? OBJECT_CATEGORY_DOMAIN_DNS :
OBJECT_CATEGORY_OU;
const QIcon icon = g_icon_manager->get_object_icon(obj_category);
row[0]->setIcon(icon);
model->appendRow(row);