summaryrefslogtreecommitdiffstats
path: root/src/libtdeldap.cpp
diff options
context:
space:
mode:
authorTimothy Pearson <[email protected]>2012-05-29 23:16:59 -0500
committerTimothy Pearson <[email protected]>2012-05-29 23:16:59 -0500
commita890828d5269f6535567dcb3498eba62d5335ee1 (patch)
tree6ebcb734c94463ced7f6cb04daf05656ff267ad2 /src/libtdeldap.cpp
parenta6d06dfe2ab0aadb6b0987fb7f96e8f3c9841846 (diff)
downloadkcmldapmanager-a890828d5269f6535567dcb3498eba62d5335ee1.tar.gz
kcmldapmanager-a890828d5269f6535567dcb3498eba62d5335ee1.zip
Can now add and delete groups
Diffstat (limited to 'src/libtdeldap.cpp')
-rw-r--r--src/libtdeldap.cpp171
1 files changed, 170 insertions, 1 deletions
diff --git a/src/libtdeldap.cpp b/src/libtdeldap.cpp
index b8ce094..b9ffdf4 100644
--- a/src/libtdeldap.cpp
+++ b/src/libtdeldap.cpp
@@ -47,6 +47,10 @@ LDAPManager::~LDAPManager() {
unbind(true);
}
+TQString LDAPManager::basedn() {
+ return m_basedc;
+}
+
TQString LDAPManager::realm() {
return m_realm;
}
@@ -505,6 +509,30 @@ LDAPGroupInfo LDAPManager::getGroupByDistinguishedName(TQString dn) {
return LDAPGroupInfo();
}
+void create_single_attribute_operation(LDAPMod **mods, int *i, TQString attr, TQString value) {
+ char **values = (char**)malloc(2*sizeof(char*));
+ values[0] = strdup(value.ascii());
+ values[1] = NULL;
+ mods[*i]->mod_op = LDAP_MOD_ADD;
+ mods[*i]->mod_type = strdup(attr.ascii());
+ mods[*i]->mod_values = values;
+ (*i)++;
+}
+
+void create_multiple_attributes_operation(LDAPMod **mods, int *i, TQString attr, TQStringList strings) {
+ int j=0;
+ char **values = (char**)malloc((strings.count()+1)*sizeof(char*));
+ for ( TQStringList::Iterator it = strings.begin(); it != strings.end(); ++it ) {
+ values[j] = strdup((*it).ascii());
+ j++;
+ }
+ values[j] = NULL;
+ mods[*i]->mod_op = LDAP_MOD_ADD;
+ mods[*i]->mod_type = strdup(attr.ascii());
+ mods[*i]->mod_values = values;
+ (*i)++;
+}
+
void add_single_attribute_operation(LDAPMod **mods, int *i, TQString attr, TQString value) {
mods[*i]->mod_op = LDAP_MOD_DELETE;
mods[*i]->mod_type = strdup(attr.ascii());
@@ -539,6 +567,62 @@ void add_multiple_attributes_operation(LDAPMod **mods, int *i, TQString attr, TQ
(*i)++;
}
+int LDAPManager::updateUserInfo(LDAPUserInfo user) {
+ int retcode;
+ int i;
+ LDAPUserInfo userinfo;
+
+ if (bind() < 0) {
+ return -1;
+ }
+ else {
+ // Assemble the LDAPMod structure
+ // We will replace attributes by first deleting them, then adding them back with their new values
+ int number_of_parameters = 43; // 43 primary attributes
+ number_of_parameters = (number_of_parameters * 2); // MODIFY/DELETE
+ LDAPMod *mods[number_of_parameters+1];
+ for (i=0;i<number_of_parameters;i++) {
+ mods[i] = new LDAPMod;
+ mods[i]->mod_type = NULL;
+ mods[i]->mod_values = NULL;
+ }
+ mods[number_of_parameters] = NULL;
+
+ // Load LDAP modification requests from provided data structure
+ i=0;
+ add_single_attribute_operation(mods, &i, "uidNumber", TQString("%1").arg(user.uid));
+ // RAJA FIXME
+ // Add the other 42 primary attributes!
+
+ // Perform LDAP update
+ retcode = ldap_modify_ext_s(m_ldap, user.distinguishedName.ascii(), mods, NULL, NULL);
+
+ // Clean up
+ for (i=0;i<number_of_parameters;i++) {
+ if (mods[i]->mod_type != NULL) {
+ free(mods[i]->mod_type);
+ }
+ if (mods[i]->mod_values != NULL) {
+ int j = 0;
+ while (mods[i]->mod_values[j] != NULL) {
+ free(mods[i]->mod_values[j]);
+ j++;
+ }
+ free(mods[i]->mod_values);
+ }
+ delete mods[i];
+ }
+
+ if (retcode != LDAP_SUCCESS) {
+ KMessageBox::error(0, i18n("<qt>LDAP modification failure<p>Reason: [%3] %4</qt>").arg(retcode).arg(ldap_err2string(retcode)), i18n("LDAP Error"));
+ return -2;
+ }
+ else {
+ return 0;
+ }
+ }
+}
+
int LDAPManager::updateGroupInfo(LDAPGroupInfo group) {
int retcode;
int i;
@@ -563,7 +647,12 @@ int LDAPManager::updateGroupInfo(LDAPGroupInfo group) {
// Load LDAP modification requests from provided data structure
i=0;
add_single_attribute_operation(mods, &i, "gidNumber", TQString("%1").arg(group.gid));
- add_multiple_attributes_operation(mods, &i, "member", group.userlist);
+ TQStringList completeGroupList = group.userlist;
+ TQString placeholderGroup = "cn=placeholder," + m_basedc;
+ if (!completeGroupList.contains(placeholderGroup)) {
+ completeGroupList.prepend(placeholderGroup);
+ }
+ add_multiple_attributes_operation(mods, &i, "member", completeGroupList);
// Perform LDAP update
retcode = ldap_modify_ext_s(m_ldap, group.distinguishedName.ascii(), mods, NULL, NULL);
@@ -594,6 +683,86 @@ int LDAPManager::updateGroupInfo(LDAPGroupInfo group) {
}
}
+int LDAPManager::addGroupInfo(LDAPGroupInfo group) {
+ int retcode;
+ int i;
+ LDAPGroupInfo groupinfo;
+
+ if (bind() < 0) {
+ return -1;
+ }
+ else {
+ // Create the base DN entry
+ int number_of_parameters = 6; // 3 primary attributes
+ LDAPMod *mods[number_of_parameters+1];
+ for (i=0;i<number_of_parameters;i++) {
+ mods[i] = new LDAPMod;
+ mods[i]->mod_type = NULL;
+ mods[i]->mod_values = NULL;
+ }
+ mods[number_of_parameters] = NULL;
+
+ TQString placeholderGroup = "cn=placeholder," + m_basedc;
+
+ // Load initial required LDAP object attributes
+ i=0;
+ create_single_attribute_operation(mods, &i, "gidNumber", TQString("%1").arg(group.gid));
+ create_multiple_attributes_operation(mods, &i, "objectClass", TQStringList::split(" ", "emsGroup groupOfNames posixGroup"));
+ create_single_attribute_operation(mods, &i, "cn", group.name);
+ create_multiple_attributes_operation(mods, &i, "member", TQStringList(placeholderGroup));
+ // Zivios specific
+ create_single_attribute_operation(mods, &i, "emsdescription", "None");
+ create_single_attribute_operation(mods, &i, "emstype", "GroupEntry");
+
+ // Add new object
+ retcode = ldap_add_ext_s(m_ldap, group.distinguishedName.ascii(), mods, NULL, NULL);
+
+ // Clean up
+ for (i=0;i<number_of_parameters;i++) {
+ if (mods[i]->mod_type != NULL) {
+ free(mods[i]->mod_type);
+ }
+ if (mods[i]->mod_values != NULL) {
+ int j = 0;
+ while (mods[i]->mod_values[j] != NULL) {
+ free(mods[i]->mod_values[j]);
+ j++;
+ }
+ free(mods[i]->mod_values);
+ }
+ delete mods[i];
+ }
+
+ if (retcode != LDAP_SUCCESS) {
+ KMessageBox::error(0, i18n("<qt>LDAP addition failure<p>Reason: [%3] %4</qt>").arg(retcode).arg(ldap_err2string(retcode)), i18n("LDAP Error"));
+ return -2;
+ }
+ else {
+ return updateGroupInfo(group);
+ }
+ }
+}
+
+int LDAPManager::deleteGroupInfo(LDAPGroupInfo group) {
+ int retcode;
+ LDAPGroupInfo groupinfo;
+
+ if (bind() < 0) {
+ return -1;
+ }
+ else {
+ // Delete the base DN entry
+ retcode = ldap_delete_ext_s(m_ldap, group.distinguishedName.ascii(), NULL, NULL);
+ if (retcode != LDAP_SUCCESS) {
+ KMessageBox::error(0, i18n("<qt>LDAP deletion failure<p>Reason: [%3] %4</qt>").arg(retcode).arg(ldap_err2string(retcode)), i18n("LDAP Error"));
+ return -2;
+ }
+ else {
+ return 0;
+ }
+ }
+}
+
LDAPGroupInfo LDAPManager::parseLDAPGroupRecord(LDAPMessage* entry) {
char* dn = NULL;
char* attr;