1
0
mirror of https://github.com/altlinux/admc.git synced 2025-03-06 16:58:21 +03:00

add update_cache()

replaces update_related_entries()
This commit is contained in:
Dmitry Degtyarev 2020-06-13 09:08:05 +04:00
parent 640e60f2ad
commit c9947f8909
2 changed files with 41 additions and 35 deletions

@ -257,28 +257,6 @@ bool AdInterface::create_entry(const QString &name, const QString &dn, NewEntryT
}
}
// Update all entries that are related to this one through
// membership
void AdInterface::update_related_entries(const QString &dn) {
// Update all groups that have this entry as member
QList<QString> groups = get_attribute_multi(dn, "memberOf");
for (auto group : groups) {
// Only reload if loaded already
if (attributes_map.contains(group)) {
load_attributes(group);
}
}
// Update all entries that are members of this group
QList<QString> members = get_attribute_multi(dn, "member");
for (auto member : members) {
// Only reload if loaded already
if (attributes_map.contains(member)) {
load_attributes(member);
}
}
}
void AdInterface::delete_entry(const QString &dn) {
int result = AD_INVALID_DN;
@ -288,10 +266,7 @@ void AdInterface::delete_entry(const QString &dn) {
result = connection->object_delete(dn_cstr);
if (result == AD_SUCCESS) {
update_related_entries(dn);
attributes_map.remove(dn);
attributes_loaded.remove(dn);
update_cache(dn, "");
emit delete_entry_complete(dn);
} else {
@ -327,12 +302,7 @@ void AdInterface::move(const QString &dn, const QString &new_container) {
}
if (result == AD_SUCCESS) {
// Unload attributes at old dn
attributes_map.remove(dn);
attributes_loaded.remove(dn);
load_attributes(new_dn);
update_related_entries(new_dn);
update_cache(dn, "");
emit move_complete(dn, new_container, new_dn);
} else {
@ -391,8 +361,7 @@ void AdInterface::rename(const QString &dn, const QString &new_name) {
}
if (result == AD_SUCCESS) {
load_attributes(new_dn);
update_related_entries(new_dn);
update_cache(dn, "");
emit rename_complete(dn, new_name, new_dn);
} else {
@ -493,6 +462,43 @@ void AdInterface::drop_entry(const QString &dn, const QString &target_dn) {
}
}
// Update cache for entry and all related entries after a DN change
// LDAP database does this internally so need to replicate it
// NOTE: if entry was deleted, new_dn should be ""
void AdInterface::update_cache(const QString &old_dn, const QString &new_dn) {
const bool deleted = (old_dn != "" && new_dn == "");
const bool changed = (old_dn != "" && new_dn != "" && old_dn != new_dn);
// Update entry's attributes
if (attributes_loaded.contains(old_dn)) {
if (deleted || changed) {
// Unload old attributes
attributes_map.remove(old_dn);
attributes_loaded.remove(old_dn);
}
if (changed) {
load_attributes(new_dn);
}
}
// Update attributes of entries related to this entry
for (const QString &dn : attributes_map.keys()) {
for (auto &values : attributes_map[dn]) {
const int old_dn_i = values.indexOf(old_dn);
if (old_dn_i != -1) {
if (deleted) {
values.removeAt(old_dn_i);
} else if (changed) {
values.replace(old_dn_i, new_dn);
}
}
}
}
}
AdInterface *AD() {
ADMC *app = qobject_cast<ADMC *>(qApp);
AdInterface *ad = app->ad_interface();

@ -123,7 +123,7 @@ private:
QSet<QString> attributes_loaded;
void load_attributes(const QString &dn);
void update_related_entries(const QString &dn);
void update_cache(const QString &old_dn, const QString &new_dn);
};