1
0
mirror of https://github.com/altlinux/admc.git synced 2024-10-26 17:25:38 +03:00

add "create and link gpo" action

for OU's in policy tree
This commit is contained in:
kevl 2022-05-19 13:02:38 +04:00
parent ccfa2a052b
commit a940292c66
4 changed files with 119 additions and 16 deletions

View File

@ -24,6 +24,7 @@
#include "console_impls/item_type.h"
#include "console_impls/object_impl.h"
#include "console_impls/policy_impl.h"
#include "console_impls/policy_root_impl.h"
#include "console_widget/results_view.h"
#include "create_policy_dialog.h"
#include "globals.h"
@ -42,6 +43,8 @@
#include <QProcess>
#include <QStandardItem>
void all_policies_folder_impl_add_objects(ConsoleWidget *console, const QList<AdObject> &object_list, const QModelIndex &parent);
AllPoliciesFolderImpl::AllPoliciesFolderImpl(ConsoleWidget *console_arg)
: ConsoleImpl(console_arg) {
set_results_view(new ResultsView(console_arg));
@ -67,9 +70,7 @@ void AllPoliciesFolderImpl::fetch(const QModelIndex &index) {
const QList<QString> attributes = console_policy_search_attributes();
const QHash<QString, AdObject> results = ad.search(base, scope, filter, attributes);
for (const AdObject &object : results.values()) {
create_policy_in_console(object, index);
}
all_policies_folder_impl_add_objects(console, results.values(), index);
}
void AllPoliciesFolderImpl::refresh(const QList<QModelIndex> &index_list) {
@ -144,20 +145,49 @@ void AllPoliciesFolderImpl::create_policy() {
}
const QString dn = dialog->get_created_dn();
const SearchScope scope = SearchScope_Object;
const QString filter = QString();
const QList<QString> attributes = console_policy_search_attributes();
const QHash<QString, AdObject> results = ad2.search(dn, scope, filter, attributes);
const AdObject object = results[dn];
create_policy_in_console(object, parent_index);
all_policies_folder_impl_add_objects_from_dns(console, ad2, {dn}, parent_index);
});
}
void AllPoliciesFolderImpl::create_policy_in_console(const AdObject &object, const QModelIndex &parent_index) {
QModelIndex get_all_policies_folder_index(ConsoleWidget *console) {
const QModelIndex policy_tree_root = get_policy_tree_root(console);
const QList<QModelIndex> index_list = console->search_items(policy_tree_root, {ItemType_AllPoliciesFolder});
const QList<QStandardItem *> row = console->add_scope_item(ItemType_Policy, parent_index);
console_policy_load(row, object);
if (!index_list.isEmpty()) {
return index_list[0];
} else {
return QModelIndex();
}
}
void all_policies_folder_impl_add_objects_from_dns(ConsoleWidget *console, AdInterface &ad, const QList<QString> &dn_list, const QModelIndex &parent) {
const QList<AdObject> object_list = [&]() {
QList<AdObject> out;
for (const QString &dn : dn_list) {
const AdObject object = ad.search_object(dn);
out.append(object);
}
return out;
}();
all_policies_folder_impl_add_objects(console, object_list, parent);
}
void all_policies_folder_impl_add_objects(ConsoleWidget *console, const QList<AdObject> &object_list, const QModelIndex &parent) {
if (!parent.isValid()) {
return;
}
const bool parent_was_fetched = console_item_get_was_fetched(parent);
if (!parent_was_fetched) {
return;
}
for (const AdObject &object : object_list) {
const QList<QStandardItem *> row = console->add_scope_item(ItemType_Policy, parent);
console_policy_load(row, object);
}
}

View File

@ -25,6 +25,7 @@
#include "console_widget/console_widget.h"
class AdObject;
class AdInterface;
class AllPoliciesFolderImpl final : public ConsoleImpl {
Q_OBJECT
@ -46,7 +47,9 @@ private:
QAction *create_policy_action;
void create_policy();
void create_policy_in_console(const AdObject &object, const QModelIndex &parent_index);
};
QModelIndex get_all_policies_folder_index(ConsoleWidget *console);
void all_policies_folder_impl_add_objects_from_dns(ConsoleWidget *console, AdInterface &ad, const QList<QString> &dn_list, const QModelIndex &parent);
#endif /* ALL_POLICIES_FOLDER_IMPL_H */

View File

@ -56,11 +56,15 @@ PolicyOUImpl::PolicyOUImpl(ConsoleWidget *console_arg)
set_results_view(new ResultsView(console_arg));
create_ou_action = new QAction(tr("Create OU"), this);
create_and_link_gpo_action = new QAction(tr("Create a GPO and link to this OU"), this);
link_gpo_action = new QAction(tr("Link existing GPO"), this);
connect(
create_ou_action, &QAction::triggered,
this, &PolicyOUImpl::create_ou);
connect(
create_and_link_gpo_action, &QAction::triggered,
this, &PolicyOUImpl::create_and_link_gpo);
connect(
link_gpo_action, &QAction::triggered,
this, &PolicyOUImpl::link_gpo);
@ -130,6 +134,7 @@ QList<QAction *> PolicyOUImpl::get_all_custom_actions() const {
QList<QAction *> out;
out.append(create_ou_action);
out.append(create_and_link_gpo_action);
out.append(link_gpo_action);
return out;
@ -142,6 +147,7 @@ QSet<QAction *> PolicyOUImpl::get_custom_actions(const QModelIndex &index, const
if (single_selection) {
out.insert(create_ou_action);
out.insert(create_and_link_gpo_action);
out.insert(link_gpo_action);
}
@ -180,6 +186,68 @@ void PolicyOUImpl::create_ou() {
console_object_create(console, nullptr, CLASS_OU, parent_dn);
}
void PolicyOUImpl::create_and_link_gpo() {
AdInterface ad;
if (ad_failed(ad, console)) {
return;
}
const QList<QModelIndex> selected_list = console->get_selected_items(ItemType_PolicyOU);
if (selected_list.isEmpty()) {
return;
}
const QModelIndex target_index = selected_list[0];
const QString target_dn = target_index.data(ObjectRole_DN).toString();
auto dialog = new CreatePolicyDialog(ad, console);
dialog->open();
connect(
dialog, &QDialog::accepted,
this,
[this, dialog, target_index, target_dn]() {
// Link OU and GPO
AdInterface ad2;
if (ad_failed(ad2, console)) {
return;
}
const QString gpo_dn = dialog->get_created_dn();
// TODO: duplicating code in link_gpo()
const Gplink original_gplink = [&]() {
const AdObject target_object = ad2.search_object(target_dn);
const QString gplink_string = target_object.get_string(ATTRIBUTE_GPLINK);
const Gplink out = Gplink(gplink_string);
return out;
}();
const Gplink new_gplink = [&]() {
Gplink out = original_gplink;
out.add(gpo_dn);
return out;
}();
const QString new_gplink_string = new_gplink.to_string();
ad2.attribute_replace_string(target_dn, ATTRIBUTE_GPLINK, new_gplink_string);
g_status->display_ad_messages(ad2, console);
// Add GPO as child to linked OU in policy tree
policy_ou_impl_add_objects_from_dns(console, ad2, {gpo_dn}, target_index);
// Also add GPO to "All Policies" folder
const QModelIndex all_policies_folder_index = get_all_policies_folder_index(console);
all_policies_folder_impl_add_objects_from_dns(console, ad2, {gpo_dn}, all_policies_folder_index);
});
}
void PolicyOUImpl::link_gpo() {
AdInterface ad;
if (ad_failed(ad, console)) {

View File

@ -50,9 +50,11 @@ public:
private:
QAction *create_ou_action;
QAction *create_and_link_gpo_action;
QAction *link_gpo_action;
void create_ou();
void create_and_link_gpo();
void link_gpo();
};