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:
parent
ccfa2a052b
commit
a940292c66
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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)) {
|
||||
|
@ -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();
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user