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

adtool: Use C++ adldap

This commit is contained in:
Игорь Чудов 2020-06-04 11:21:11 +04:00
parent f805997666
commit b810c0ffca
Signed by untrusted user: nir
GPG Key ID: 0F3883600CAE7AAC
2 changed files with 37 additions and 206 deletions

View File

@ -21,6 +21,8 @@
#include "config.h"
#include "active_directory.h"
#include "Application.h"
#include "ad_connection.h"
#include <QSet>
@ -56,192 +58,6 @@ QString extract_parent_dn_from_dn(const QString &dn) {
AdInterface ad_interface;
QMap<QString, QList<QString>> fake_children;
QMap<QString, QMap<QString, QList<QString>>> fake_attributes_map;
QSet<QString> fake_attributes_loaded;
void fake_ad_init() {
fake_children[HEAD_DN] = {
QString("CN=Users,") + HEAD_DN,
QString("CN=Computers,") + HEAD_DN,
QString("CN=A,") + HEAD_DN,
QString("CN=B,") + HEAD_DN,
QString("CN=C,") + HEAD_DN,
QString("CN=D,") + HEAD_DN,
};
fake_attributes_map[HEAD_DN] = {
{"name", {"domain"}},
{"objectClass", {"container"}},
{"objectCategory", {"CN=Container,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
};
fake_attributes_map[QString("CN=Users,") + HEAD_DN] = {
{"name", {"Users"}},
{"objectClass", {"container"}},
{"objectCategory", {"CN=Container,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
{"description", {"Users's description"}},
};
fake_attributes_map[QString("CN=Computers,") + HEAD_DN] = {
{"name", {"Computers"}},
{"objectClass", {"container"}},
{"objectCategory", {"CN=Container,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
{"description", {"Computers's description"}},
};
fake_attributes_map[QString("CN=A,") + HEAD_DN] = {
{"name", {"A"}},
{"objectClass", {"container"}},
{"objectCategory", {"CN=Container,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
{"description", {"A's description"}},
};
fake_attributes_map[QString("CN=B,") + HEAD_DN] = {
{"name", {"B"}},
{"objectClass", {"container"}},
{"objectCategory", {"CN=Container,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
{"description", {"B's description"}},
};
fake_attributes_map[QString("CN=C,") + HEAD_DN] = {
{"name", {"C"}},
{"objectClass", {"person"}},
{"objectCategory", {"CN=Person,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
};
fake_attributes_map[QString("CN=D,") + HEAD_DN] = {
{"name", {"D"}},
{"objectClass", {"person"}},
{"objectCategory", {"CN=Person,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"TRUE"}},
};
fake_children[QString("CN=B,") + HEAD_DN] = {
QString("CN=B's child,CN=B,") + HEAD_DN
};
fake_attributes_map[QString("CN=B's child,CN=B,") + HEAD_DN] = {
{"name", {"B's child"}},
{"objectClass", {"person"}},
{"objectCategory", {"CN=Person,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
};
}
QList<QString> fake_load_children(const QString &dn) {
if (!fake_children.contains(dn)) {
// NOTE: ok to have empty children for leaves
fake_children[dn] = QList<QString>();
}
return fake_children[dn];
}
// NOTE: this is just for fake_create() functions
void fake_create_add_child(const QString &dn, const QString &parent) {
if (!fake_children.contains(parent)) {
fake_children[parent] = QList<QString>();
}
fake_children[parent].push_back(dn);
}
void fake_create_user(const QString &name, const QString &dn) {
QString parent_dn = extract_parent_dn_from_dn(dn);
fake_create_add_child(dn, parent_dn);
fake_attributes_map[dn] = {
{"name", {name}},
{"objectClass", {"user"}},
{"objectCategory", {"CN=User,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
};
}
void fake_create_computer(const QString &name, const QString &dn) {
QString parent_dn = extract_parent_dn_from_dn(dn);
fake_create_add_child(dn, parent_dn);
fake_attributes_map[dn] = {
{"name", {name}},
{"objectClass", {"computer"}},
{"objectCategory", {"CN=Computer,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
};
}
void fake_create_ou(const QString &name, const QString &dn) {
QString parent_dn = extract_parent_dn_from_dn(dn);
fake_create_add_child(dn, parent_dn);
fake_attributes_map[dn] = {
{"name", {name}},
{"objectClass", {"Organizational Unit"}},
{"objectClass", {"container"}},
{"objectCategory", {"CN=Organizational-Unit,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
};
}
void fake_create_group(const QString &name, const QString &dn) {
QString parent_dn = extract_parent_dn_from_dn(dn);
fake_create_add_child(dn, parent_dn);
fake_attributes_map[dn] = {
{"name", {name}},
{"objectClass", {"group"}},
{"objectClass", {"container"}},
{"objectCategory", {"CN=Group,CN=Schema,CN=Configuration"}},
{"showInAdvancedViewOnly", {"FALSE"}},
};
}
void fake_object_delete_recurse(const QString &dn) {
if (fake_children.contains(dn)) {
QList<QString> children = fake_children[dn];
for (auto child : children) {
fake_object_delete_recurse(child);
}
fake_children.remove(dn);
}
fake_attributes_map.remove(dn);
}
void fake_object_delete(const QString &dn) {
fake_object_delete_recurse(dn);
// Remove original deleted entry from parent's children list
for (auto key : fake_children.keys()) {
QList<QString> *children = &fake_children[key];
if (children->contains(dn)) {
int i = children->indexOf(dn);
children->removeAt(i);
}
}
}
void fake_move_user(const QString &user_dn, const QString &container_dn) {
QString user_name = extract_name_from_dn(user_dn);
QString new_dn = "CN=" + user_name + "," + container_dn;
// TODO: does this work ok?
fake_attributes_map[new_dn] = fake_attributes_map[user_dn];
fake_object_delete(user_dn);
fake_children[container_dn].push_back(user_dn);
}
// -----------------------------------------------------------------
// REAL STUFF
@ -251,17 +67,16 @@ QMap<QString, QMap<QString, QList<QString>>> attributes_map;
QSet<QString> attributes_loaded;
bool ad_interface_login() {
LDAP* ldap_connection = ad_login(HEAD_DN);
if (ldap_connection == NULL) {
printf("ad_login error: %s\n", ad_get_error());
return false;
} else {
return true;
}
ADMC* app = qobject_cast<ADMC*>(qApp);
adldap::AdConnection* conn = app->get_connection();
conn->connect(SEARCH_BASE, HEAD_DN);
return conn->is_connected();
}
QString get_error_str() {
return QString(ad_get_error());
ADMC* app = qobject_cast<ADMC*>(qApp);
adldap::AdConnection* conn = app->get_connection();
return QString(conn->get_errstr());
}
// TODO: confirm that this encoding is ok
@ -383,6 +198,8 @@ bool attribute_value_exists(const QString &dn, const QString &attribute, const Q
bool set_attribute(const QString &dn, const QString &attribute, const QString &value) {
int result = AD_INVALID_DN;
ADMC* app = qobject_cast<ADMC*>(qApp);
adldap::AdConnection* adconn = app->get_connection();
const QString old_value = get_attribute(dn, attribute);
@ -395,7 +212,7 @@ bool set_attribute(const QString &dn, const QString &attribute, const QString &v
const QByteArray value_array = value.toLatin1();
const char *value_cstr = value_array.constData();
result = ad_mod_replace(dn_cstr, attribute_cstr, value_cstr, HEAD_DN);
result = adconn->mod_replace(dn_cstr, attribute_cstr, value_cstr);
if (result == AD_SUCCESS) {
// Reload attributes to get new value
@ -414,6 +231,8 @@ bool set_attribute(const QString &dn, const QString &attribute, const QString &v
// TODO: can probably make a create_anything() function with enum parameter
bool create_entry(const QString &name, const QString &dn, NewEntryType type) {
int result = AD_INVALID_DN;
ADMC* app = qobject_cast<ADMC*>(qApp);
adldap::AdConnection* adconn = app->get_connection();
const QByteArray name_array = name.toLatin1();
const char *name_cstr = name_array.constData();
@ -423,19 +242,19 @@ bool create_entry(const QString &name, const QString &dn, NewEntryType type) {
switch (type) {
case User: {
result = ad_create_user(name_cstr, dn_cstr, HEAD_DN);
result = adconn->create_user(name_cstr, dn_cstr);
break;
}
case Computer: {
result = ad_create_computer(name_cstr, dn_cstr, HEAD_DN);
result = adconn->create_computer(name_cstr, dn_cstr);
break;
}
case OU: {
result = ad_ou_create(name_cstr, dn_cstr, HEAD_DN);
result = adconn->ou_create(name_cstr, dn_cstr);
break;
}
case Group: {
result = ad_group_create(name_cstr, dn_cstr, HEAD_DN);
result = adconn->group_create(name_cstr, dn_cstr);
break;
}
case COUNT: break;
@ -446,7 +265,7 @@ bool create_entry(const QString &name, const QString &dn, NewEntryType type) {
return true;
} else {
emit ad_interface.create_entry_failed(dn, type, get_error_str());
emit ad_interface.create_entry_failed(dn, type, adconn->get_errstr());
return false;
}
@ -466,11 +285,13 @@ void reload_attributes_of_entry_groups(const QString &dn) {
void delete_entry(const QString &dn) {
int result = AD_INVALID_DN;
ADMC* app = qobject_cast<ADMC*>(qApp);
adldap::AdConnection* adconn = app->get_connection();
const QByteArray dn_array = dn.toLatin1();
const char *dn_cstr = dn_array.constData();
result = ad_object_delete(dn_cstr, HEAD_DN);
result = adconn->object_delete(dn_cstr);
if (result == AD_SUCCESS) {
reload_attributes_of_entry_groups(dn);
@ -480,12 +301,14 @@ void delete_entry(const QString &dn) {
emit ad_interface.delete_entry_complete(dn);
} else {
emit ad_interface.delete_entry_failed(dn, get_error_str());
emit ad_interface.delete_entry_failed(dn, adconn->get_errstr());
}
}
void move_user(const QString &user_dn, const QString &container_dn) {
int result = AD_INVALID_DN;
ADMC* app = qobject_cast<ADMC*>(qApp);
adldap::AdConnection* adconn = app->get_connection();
QString user_name = extract_name_from_dn(user_dn);
QString new_dn = "CN=" + user_name + "," + container_dn;
@ -496,7 +319,7 @@ void move_user(const QString &user_dn, const QString &container_dn) {
const QByteArray container_dn_array = container_dn.toLatin1();
const char *container_dn_cstr = container_dn_array.constData();
result = ad_move_user(user_dn_cstr, container_dn_cstr, HEAD_DN);
result = adconn->move_user(user_dn_cstr, container_dn_cstr);
if (result == AD_SUCCESS) {
// Unload attributes at old dn
@ -508,13 +331,15 @@ void move_user(const QString &user_dn, const QString &container_dn) {
emit ad_interface.move_user_complete(user_dn, container_dn, new_dn);
} else {
emit ad_interface.move_user_failed(user_dn, container_dn, new_dn, get_error_str());
emit ad_interface.move_user_failed(user_dn, container_dn, new_dn, adconn->get_errstr());
}
}
void add_user_to_group(const QString &group_dn, const QString &user_dn) {
// TODO: currently getting object class violation error
int result = AD_INVALID_DN;
ADMC* app = qobject_cast<ADMC*>(qApp);
adldap::AdConnection* adconn = app->get_connection();
const QByteArray group_dn_array = group_dn.toLatin1();
const char *group_dn_cstr = group_dn_array.constData();
@ -522,7 +347,7 @@ void add_user_to_group(const QString &group_dn, const QString &user_dn) {
const QByteArray user_dn_array = user_dn.toLatin1();
const char *user_dn_cstr = user_dn_array.constData();
result = ad_group_add_user(group_dn_cstr, user_dn_cstr, HEAD_DN);
result = adconn->group_add_user(group_dn_cstr, user_dn_cstr);
if (result == AD_SUCCESS) {
// Reload attributes of group and user because group
@ -532,6 +357,6 @@ void add_user_to_group(const QString &group_dn, const QString &user_dn) {
emit ad_interface.add_user_to_group_complete(group_dn, user_dn);
} else {
emit ad_interface.add_user_to_group_failed(group_dn, user_dn, get_error_str());
emit ad_interface.add_user_to_group_failed(group_dn, user_dn, adconn->get_errstr());
}
}

View File

@ -17,6 +17,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ad_connection.h"
#include "config.h"
#include "Application.h"
#include "main_window.h"
#include "containers_widget.h"
@ -41,6 +44,9 @@
MainWindow::MainWindow()
: QMainWindow()
{
/*ADMC* app = qobject_cast<ADMC*>(qApp);
adldap::AdConnection* conn = app->get_connection();
conn->connect(HEAD_DN, SEARCH_BASE);*/
ad_interface_login();
//
// Setup widgets