diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2012-05-29 18:23:12 -0500 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2012-05-29 18:23:12 -0500 |
commit | a6d06dfe2ab0aadb6b0987fb7f96e8f3c9841846 (patch) | |
tree | cbc45950449b5942277b8a3490b87bfecf8df023 | |
parent | 68e675057219723d6c657db4fd930c5b49ff583c (diff) | |
download | kcmldapmanager-a6d06dfe2ab0aadb6b0987fb7f96e8f3c9841846.tar.gz kcmldapmanager-a6d06dfe2ab0aadb6b0987fb7f96e8f3c9841846.zip |
RW support for groups now in place
-rw-r--r-- | src/groupconfigdlg.cpp | 13 | ||||
-rw-r--r-- | src/groupconfigdlg.h | 2 | ||||
-rw-r--r-- | src/ldapmgr.cpp | 26 | ||||
-rw-r--r-- | src/ldapmgr.h | 2 | ||||
-rw-r--r-- | src/libtdeldap.cpp | 89 | ||||
-rw-r--r-- | src/libtdeldap.h | 1 | ||||
-rw-r--r-- | src/userconfigdlg.cpp | 3 | ||||
-rw-r--r-- | src/userconfigdlg.h | 2 |
8 files changed, 136 insertions, 2 deletions
diff --git a/src/groupconfigdlg.cpp b/src/groupconfigdlg.cpp index 8f7593e..94b70e4 100644 --- a/src/groupconfigdlg.cpp +++ b/src/groupconfigdlg.cpp @@ -72,6 +72,19 @@ GroupConfigDialog::GroupConfigDialog(LDAPGroupInfo group, LDAPConfig* parent, co } void GroupConfigDialog::slotOk() { + int i; + + // Update data + m_group.gid = m_base->groupID->value(); + TQStringList userlist; + for (i=0;i<m_base->selectedAccounts->count();i++) { + TQListBoxText* itm = dynamic_cast<TQListBoxText*>(m_base->selectedAccounts->item(i)); + if (itm) { + userlist.append(m_ldapconfig->findUserInfoByName(itm->text()).distinguishedName); + } + } + m_group.userlist = userlist; + accept(); } diff --git a/src/groupconfigdlg.h b/src/groupconfigdlg.h index f85a2a2..dc51337 100644 --- a/src/groupconfigdlg.h +++ b/src/groupconfigdlg.h @@ -44,9 +44,9 @@ private slots: public: LDAPGroupConfigBase *m_base; + LDAPGroupInfo m_group; private: - LDAPGroupInfo m_group; LDAPConfig* m_ldapconfig; }; diff --git a/src/ldapmgr.cpp b/src/ldapmgr.cpp index 5f2433c..ba45fd1 100644 --- a/src/ldapmgr.cpp +++ b/src/ldapmgr.cpp @@ -201,6 +201,30 @@ void LDAPConfig::updateGroupsList() { processLockouts(); } +LDAPUserInfo LDAPConfig::findUserInfoByName(TQString name) { + // Figure out which user is selected + LDAPUserInfoList::Iterator it; + for (it = m_userInfoList.begin(); it != m_userInfoList.end(); ++it) { + LDAPUserInfo user = *it; + if (user.name == name) { + return user; + } + } + return LDAPUserInfo(); +} + +LDAPGroupInfo LDAPConfig::findGroupInfoByName(TQString name) { + // Figure out which group is selected + LDAPGroupInfoList::Iterator it; + for (it = m_groupInfoList.begin(); it != m_groupInfoList.end(); ++it) { + LDAPGroupInfo group = *it; + if (group.name == name) { + return group; + } + } + return LDAPGroupInfo(); +} + LDAPUserInfo LDAPConfig::findUserInfoByNameAndUID(TQString name, TQString uid) { // Figure out which user is selected LDAPUserInfoList::Iterator it; @@ -345,6 +369,8 @@ void LDAPConfig::modifySelectedGroup() { group = m_ldapmanager->getGroupByDistinguishedName(group.distinguishedName); GroupConfigDialog groupconfigdlg(group, this); if (groupconfigdlg.exec() == TQDialog::Accepted) { + group = groupconfigdlg.m_group; + m_ldapmanager->updateGroupInfo(group); // RAJA FIXME } updateAllInformation(); diff --git a/src/ldapmgr.h b/src/ldapmgr.h index eed2b3e..8c7e594 100644 --- a/src/ldapmgr.h +++ b/src/ldapmgr.h @@ -64,6 +64,8 @@ class LDAPConfig: public KCModule void updateAllInformation(); public: + LDAPUserInfo findUserInfoByName(TQString name); + LDAPGroupInfo findGroupInfoByName(TQString name); LDAPUserInfo findUserInfoByNameAndUID(TQString name, TQString uid); LDAPGroupInfo findGroupInfoByNameAndGID(TQString name, TQString gid); LDAPGroupInfo findGroupInfoByGID(TQString gid); diff --git a/src/libtdeldap.cpp b/src/libtdeldap.cpp index 973e9ee..b8ce094 100644 --- a/src/libtdeldap.cpp +++ b/src/libtdeldap.cpp @@ -505,6 +505,95 @@ LDAPGroupInfo LDAPManager::getGroupByDistinguishedName(TQString dn) { return LDAPGroupInfo(); } +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()); + mods[*i]->mod_values = NULL; + (*i)++; + + 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 add_multiple_attributes_operation(LDAPMod **mods, int *i, TQString attr, TQStringList strings) { + mods[*i]->mod_op = LDAP_MOD_DELETE; + mods[*i]->mod_type = strdup(attr.ascii()); + mods[*i]->mod_values = NULL; + (*i)++; + + 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)++; +} + +int LDAPManager::updateGroupInfo(LDAPGroupInfo group) { + int retcode; + int i; + LDAPGroupInfo groupinfo; + + 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 = 2; // 2 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, "gidNumber", TQString("%1").arg(group.gid)); + add_multiple_attributes_operation(mods, &i, "member", group.userlist); + + // Perform LDAP update + retcode = ldap_modify_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 modification 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; diff --git a/src/libtdeldap.h b/src/libtdeldap.h index ee62b0e..7e7ae5d 100644 --- a/src/libtdeldap.h +++ b/src/libtdeldap.h @@ -175,6 +175,7 @@ class LDAPManager : public TQObject { LDAPGroupInfoList groups(); LDAPUserInfo getUserByDistinguishedName(TQString dn); LDAPGroupInfo getGroupByDistinguishedName(TQString dn); + int updateGroupInfo(LDAPGroupInfo group); private: LDAPUserInfo parseLDAPUserRecord(LDAPMessage* entry); diff --git a/src/userconfigdlg.cpp b/src/userconfigdlg.cpp index 48724fa..a2ad641 100644 --- a/src/userconfigdlg.cpp +++ b/src/userconfigdlg.cpp @@ -110,6 +110,9 @@ UserConfigDialog::UserConfigDialog(LDAPUserInfo user, LDAPConfig* parent, const } void UserConfigDialog::slotOk() { + // Update data + // RAJA FIXME + accept(); } diff --git a/src/userconfigdlg.h b/src/userconfigdlg.h index 909dd16..a900c0e 100644 --- a/src/userconfigdlg.h +++ b/src/userconfigdlg.h @@ -42,9 +42,9 @@ public slots: public: LDAPUserConfigBase *m_base; + LDAPUserInfo m_user; private: - LDAPUserInfo m_user; LDAPConfig* m_ldapconfig; TQString m_prevPrimaryGroup; }; |