Add RO group editor

pull/1/head
Timothy Pearson 13 years ago
parent 5948ba909d
commit 68e6750572

@ -4,7 +4,7 @@ METASOURCES = AUTO
# Install this plugin in the KDE modules directory
kde_module_LTLIBRARIES = kcm_ldapmanager.la
kcm_ldapmanager_la_SOURCES = ldapmgr.cpp ldapconfigbase.ui userconfigbase.ui groupconfigbase.ui libtdeldap.cpp ldaplogindlgbase.ui ldaplogindlg.cpp ldappasswddlg.cpp userconfigdlg.cpp
kcm_ldapmanager_la_SOURCES = ldapmgr.cpp ldapconfigbase.ui userconfigbase.ui groupconfigbase.ui libtdeldap.cpp ldaplogindlgbase.ui ldaplogindlg.cpp ldappasswddlg.cpp userconfigdlg.cpp groupconfigdlg.cpp
kcm_ldapmanager_la_LIBADD = -lkio $(LIB_TDEUI) -lldap
kcm_ldapmanager_la_LDFLAGS = -avoid-version -module -no-undefined \
$(all_libraries)

@ -60,12 +60,15 @@
<string>Group ID</string>
</property>
</widget>
<widget class="KLineEdit" row="1" column="2" colspan="1">
<widget class="KIntNumInput" row="1" column="2" colspan="1">
<property name="name">
<cstring>groupID</cstring>
</property>
<property name="enabled">
<cstring>false</cstring>
<property name="minValue">
<number>1</number>
</property>
<property name="maxValue">
<number>99999</number>
</property>
</widget>
<widget class="TQLayoutWidget" row="2" column="0" colspan="3">

@ -0,0 +1,106 @@
/***************************************************************************
* Copyright (C) 2012 by Timothy Pearson *
* kb9vqf@pearsoncomputing.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <klocale.h>
#include <klineedit.h>
#include <ktextedit.h>
#include <knuminput.h>
#include <kactionselector.h>
#include <tqlistbox.h>
#include <kpushbutton.h>
#include <tqpixmap.h>
#include <tqiconset.h>
#include <tqlabel.h>
#include <kurlrequester.h>
#include <kcombobox.h>
#include <tqradiobutton.h>
#include <tqcheckbox.h>
#include <kdatetimewidget.h>
#include "ldapmgr.h"
#include "groupconfigdlg.h"
GroupConfigDialog::GroupConfigDialog(LDAPGroupInfo group, LDAPConfig* parent, const char* name)
: KDialogBase(parent, name, true, i18n("LDAP Group Properties"), Ok|Cancel, Ok, true), m_group(group), m_ldapconfig(parent)
{
m_base = new LDAPGroupConfigBase(this);
setMainWidget(m_base);
m_base->addToGroup->setText(i18n("-->"));
m_base->removeFromGroup->setText(i18n("<--"));
m_base->groupName->setEnabled(false);
connect(m_base->addToGroup, TQT_SIGNAL(clicked()), this, TQT_SLOT(addSelectedUserToGroup()));
connect(m_base->removeFromGroup, TQT_SIGNAL(clicked()), this, TQT_SLOT(removeSelectedUserFromGroup()));
// Update fields
m_base->groupName->setText(m_group.name);
m_base->groupID->setValue(m_group.gid);
LDAPUserInfoList userList = m_ldapconfig->userList();
LDAPUserInfoList::Iterator it;
for (it = userList.begin(); it != userList.end(); ++it) {
LDAPUserInfo user = *it;
if (group.userlist.contains(user.distinguishedName)) {
(void)new TQListBoxText(m_base->selectedAccounts, user.name);
}
else {
(void)new TQListBoxText(m_base->availableAccounts, user.name);
}
}
m_base->availableAccounts->sort(true);
m_base->selectedAccounts->sort(true);
processLockouts();
}
void GroupConfigDialog::slotOk() {
accept();
}
void GroupConfigDialog::processLockouts() {
//
}
void GroupConfigDialog::addSelectedUserToGroup() {
TQListBoxText* itm = dynamic_cast<TQListBoxText*>(m_base->availableAccounts->selectedItem());
if (itm) {
(void)new TQListBoxText(m_base->selectedAccounts, itm->text());
delete itm;
}
m_base->availableAccounts->sort(true);
m_base->selectedAccounts->sort(true);
}
void GroupConfigDialog::removeSelectedUserFromGroup() {
TQListBoxText* itm = dynamic_cast<TQListBoxText*>(m_base->selectedAccounts->selectedItem());
if (itm) {
(void)new TQListBoxText(m_base->availableAccounts, itm->text());
delete itm;
}
m_base->availableAccounts->sort(true);
m_base->selectedAccounts->sort(true);
}
LDAPGroupInfo GroupConfigDialog::groupProperties() {
return m_group;
}
#include "groupconfigdlg.moc"

@ -0,0 +1,53 @@
/***************************************************************************
* Copyright (C) 2012 by Timothy Pearson *
* kb9vqf@pearsoncomputing.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef _GROUPCONFIGDIALOG_H_
#define _GROUPCONFIGDIALOG_H_
#include <kdialogbase.h>
#include "libtdeldap.h"
#include "groupconfigbase.h"
class GroupConfigDialog : public KDialogBase
{
Q_OBJECT
public:
GroupConfigDialog(LDAPGroupInfo group, LDAPConfig* parent = 0, const char* name = 0);
LDAPGroupInfo groupProperties();
public slots:
void slotOk();
void processLockouts();
private slots:
void addSelectedUserToGroup();
void removeSelectedUserFromGroup();
public:
LDAPGroupConfigBase *m_base;
private:
LDAPGroupInfo m_group;
LDAPConfig* m_ldapconfig;
};
#endif // _GROUPCONFIGDIALOG_H_

@ -43,6 +43,7 @@
#include "libtdeldap.h"
#include "ldappasswddlg.h"
#include "userconfigdlg.h"
#include "groupconfigdlg.h"
// FIXME
// Connect this to CMake/Automake
@ -84,6 +85,7 @@ LDAPConfig::LDAPConfig(TQWidget *parent, const char *name, const TQStringList&)
connect(base->group_list, TQT_SIGNAL(selectionChanged()), this, TQT_SLOT(groupHighlighted()));
connect(base->user_buttonModify, TQT_SIGNAL(clicked()), this, TQT_SLOT(modifySelectedUser()));
connect(base->group_buttonModify, TQT_SIGNAL(clicked()), this, TQT_SLOT(modifySelectedGroup()));
load();
@ -156,6 +158,10 @@ void LDAPConfig::connectToRealm(const TQString& realm) {
TQString host = m_systemconfig->readEntry("admin_server");
m_ldapmanager = new LDAPManager(realm, host);
updateAllInformation();
}
void LDAPConfig::updateAllInformation() {
populateUsers();
populateGroups();
// RAJA FIXME
@ -322,11 +328,26 @@ void LDAPConfig::modifySelectedUser() {
// Launch a dialog to edit the user
LDAPUserInfo user = selectedUser();
// RAJA FIXME
// Reload user data from LDAP before launching dialog!!!! Otherwise people who leave the LDAP manager open for days at a time (admins) will end up inserting stale data into the LDAP database!!!
// Reload user data from LDAP before launching dialog
user = m_ldapmanager->getUserByDistinguishedName(user.distinguishedName);
UserConfigDialog userconfigdlg(user, this);
if (userconfigdlg.exec() == TQDialog::Accepted) {
// RAJA FIXME
}
updateAllInformation();
}
void LDAPConfig::modifySelectedGroup() {
// Launch a dialog to edit the user
LDAPGroupInfo group = selectedGroup();
// Reload group data from LDAP before launching dialog
group = m_ldapmanager->getGroupByDistinguishedName(group.distinguishedName);
GroupConfigDialog groupconfigdlg(group, this);
if (groupconfigdlg.exec() == TQDialog::Accepted) {
// RAJA FIXME
}
updateAllInformation();
}
int LDAPConfig::buttons() {

@ -60,6 +60,8 @@ class LDAPConfig: public KCModule
void userHighlighted();
void groupHighlighted();
void modifySelectedUser();
void modifySelectedGroup();
void updateAllInformation();
public:
LDAPUserInfo findUserInfoByNameAndUID(TQString name, TQString uid);

@ -52,6 +52,7 @@ TQString LDAPManager::realm() {
}
int LDAPManager::bind() {
printf("[RAJA DEBUG 600.0] In LDAPManager::bind()\n\r"); fflush(stdout);
if (m_ldap) {
return 0;
}
@ -164,6 +165,7 @@ int LDAPManager::bind() {
}
int LDAPManager::unbind(bool force) {
printf("[RAJA DEBUG 600.1] In LDAPManager::unbind()\n\r"); fflush(stdout);
if (!m_ldap) {
return 0;
}
@ -179,6 +181,228 @@ int LDAPManager::unbind(bool force) {
return retcode;
}
LDAPUserInfo LDAPManager::parseLDAPUserRecord(LDAPMessage* entry) {
int i;
char* dn = NULL;
char* attr;
struct berval **vals;
BerElement* ber;
LDAPUserInfo userinfo;
if((dn = ldap_get_dn(m_ldap, entry)) != NULL) {
printf("Returned dn: %s\n", dn);
userinfo.distinguishedName = dn;
TQStringList dnParts = TQStringList::split(",", dn);
TQString id = dnParts[0];
if (id.startsWith("uid=")) {
id = id.remove(0, 4);
userinfo.name = id;
}
ldap_memfree(dn);
}
for( attr = ldap_first_attribute(m_ldap, entry, &ber); attr != NULL; attr = ldap_next_attribute(m_ldap, entry, ber)) {
if ((vals = ldap_get_values_len(m_ldap, entry, attr)) != NULL) {
printf("[RAJA DEBUG 100.3] %s: %s\n\r", attr, vals[i]->bv_val);
userinfo.informationValid = true;
TQString ldap_field = attr;
i=0;
if (ldap_field == "uidNumber") {
userinfo.uid = atoi(vals[i]->bv_val);
}
else if (ldap_field == "loginShell") {
userinfo.shell = vals[i]->bv_val;
}
else if (ldap_field == "homeDirectory") {
userinfo.homedir = vals[i]->bv_val;
}
else if (ldap_field == "gidNumber") {
userinfo.primary_gid = atoi(vals[i]->bv_val);
}
else if (ldap_field == "krb5KDCFlags") {
userinfo.status = (LDAPKRB5Flags)(atoi(vals[i]->bv_val));
}
else if (ldap_field == "createTimestamp") { // YYYYMMDD000000Z
TQString formattedDate = vals[i]->bv_val;
formattedDate.insert(4,"-");
formattedDate.insert(7,"-");
formattedDate.insert(10,"T");
formattedDate.insert(13,":");
formattedDate.insert(16,":");
formattedDate.remove(19, 1);
userinfo.account_created = TQDateTime::fromString(formattedDate, TQt::ISODate);
}
else if (ldap_field == "modifyTimestamp") { // YYYYMMDD000000Z
TQString formattedDate = vals[i]->bv_val;
formattedDate.insert(4,"-");
formattedDate.insert(7,"-");
formattedDate.insert(10,"T");
formattedDate.insert(13,":");
formattedDate.insert(16,":");
formattedDate.remove(19, 1);
userinfo.account_modified = TQDateTime::fromString(formattedDate, TQt::ISODate);
}
// FIXME
// These two attributes do not seem to be available with a Heimdal KDC
// userinfo.password_last_changed = vals[i]->bv_val;
// userinfo.password_expires = vals[i]->bv_val;
else if (ldap_field == "krb5PasswordEnd") { // YYYYMMDD000000Z
TQString formattedDate = vals[i]->bv_val;
formattedDate.insert(4,"-");
formattedDate.insert(7,"-");
formattedDate.insert(10,"T");
formattedDate.insert(13,":");
formattedDate.insert(16,":");
formattedDate.remove(19, 1);
userinfo.password_expiration = TQDateTime::fromString(formattedDate, TQt::ISODate);
}
// FIXME
// These six(!) attributes do not seem to be available with a Heimdal KDC
// userinfo.password_ages = vals[i]->bv_val;
// userinfo.new_password_interval = vals[i]->bv_val;
// userinfo.new_password_warn_interval = vals[i]->bv_val;
// userinfo.new_password_lockout_delay = vals[i]->bv_val;
// userinfo.password_has_minimum_age = vals[i]->bv_val;
// userinfo.password_minimum_age = vals[i]->bv_val;
else if (ldap_field == "krb5MaxLife") { // units: hours
userinfo.maximum_ticket_lifetime = atoi(vals[i]->bv_val);
}
else if (ldap_field == "cn") {
userinfo.commonName = vals[i]->bv_val;
}
else if (ldap_field == "givenName") {
userinfo.givenName = vals[i]->bv_val;
}
else if (ldap_field == "sn") {
userinfo.surName = vals[i]->bv_val;
}
else if (ldap_field == "initials") {
userinfo.initials = vals[i]->bv_val;
}
else if (ldap_field == "title") {
userinfo.title = vals[i]->bv_val;
}
else if (ldap_field == "mail") {
userinfo.email = vals[i]->bv_val;
}
else if (ldap_field == "description") {
userinfo.description = vals[i]->bv_val;
}
else if (ldap_field == "l") {
userinfo.locality = vals[i]->bv_val;
}
else if (ldap_field == "telephoneNumber") {
userinfo.telephoneNumber = vals[i]->bv_val;
}
else if (ldap_field == "facsimileTelephoneNumber") {
userinfo.faxNumber = vals[i]->bv_val;
}
else if (ldap_field == "homePhone") {
userinfo.homePhone = vals[i]->bv_val;
}
else if (ldap_field == "mobile") {
userinfo.mobilePhone = vals[i]->bv_val;
}
else if (ldap_field == "pager") {
userinfo.pagerNumber = vals[i]->bv_val;
}
// FIXME
// This attribute is not present in my current LDAP schema
// userinfo.website = vals[i]->bv_val;
else if (ldap_field == "postOfficeBox") {
userinfo.poBox = vals[i]->bv_val;
}
else if (ldap_field == "street") {
userinfo.street = vals[i]->bv_val;
}
else if (ldap_field == "postalAddress") {
userinfo.address = vals[i]->bv_val;
}
else if (ldap_field == "st") {
userinfo.state = vals[i]->bv_val;
}
else if (ldap_field == "postalCode") {
userinfo.postcode = vals[i]->bv_val;
}
else if (ldap_field == "registeredAddress") {
userinfo.registeredAddress = vals[i]->bv_val;
}
else if (ldap_field == "homePostalAddress") {
userinfo.homeAddress = vals[i]->bv_val;
}
else if (ldap_field == "seeAlso") {
userinfo.seeAlso = vals[i]->bv_val;
}
else if (ldap_field == "physicalDeliveryOfficeName") {
userinfo.deliveryOffice = vals[i]->bv_val;
}
else if (ldap_field == "departmentNumber") {
userinfo.department = vals[i]->bv_val;
}
else if (ldap_field == "roomNumber") {
userinfo.roomNumber = vals[i]->bv_val;
}
else if (ldap_field == "employeeType") {
userinfo.employeeType = vals[i]->bv_val;
}
else if (ldap_field == "employeeNumber") {
userinfo.employeeNumber = vals[i]->bv_val;
}
// FIXME
// These two attributes are not present in my current LDAP schema
// userinfo.manager = vals[i]->bv_val;
// userinfo.secretary = vals[i]->bv_val;
else if (ldap_field == "internationaliSDNNumber") {
userinfo.isdnNumber = vals[i]->bv_val;
}
// FIXME
// This attribute is not present in my current LDAP schema
// userinfo.teletexID = vals[i]->bv_val;
else if (ldap_field == "telexNumber") {
userinfo.telexNumber = vals[i]->bv_val;
}
// FIXME
// This attribute is not present in my current LDAP schema
// userinfo.preferredDelivery = vals[i]->bv_val;
else if (ldap_field == "destinationIndicator") {
userinfo.destinationIndicator = vals[i]->bv_val;
}
else if (ldap_field == "x121Address") {
userinfo.x121Address = vals[i]->bv_val;
}
else if (ldap_field == "displayName") {
userinfo.displayName = vals[i]->bv_val;
}
else if (ldap_field == "preferredLanguage") {
userinfo.preferredLanguage = vals[i]->bv_val;
}
// FIXME
// This attribute is not present in my current LDAP schema
// userinfo.uniqueIdentifier = vals[i]->bv_val;
else if (ldap_field == "preferredLanguage") {
userinfo.businessCategory = vals[i]->bv_val;
}
else if (ldap_field == "carLicense") {
userinfo.carLicense = vals[i]->bv_val;
}
// FIXME
// This attribute is not present in my current LDAP schema
// userinfo.notes = vals[i]->bv_val;
ldap_value_free_len(vals);
}
ldap_memfree(attr);
}
if (ber != NULL) {
ber_free(ber, 0);
}
printf("\n\r");
return userinfo;
}
LDAPUserInfoList LDAPManager::users() {
int retcode;
LDAPUserInfoList users;
@ -203,235 +427,139 @@ printf("[RAJA DEBUG 100.1] In LDAPManager::users() bind was OK\n\r"); fflush(std
printf("[RAJA DEBUG 100.2] The number of entries returned was %d\n\n", ldap_count_entries(m_ldap, msg));
// Iterate through the returned entries
char* dn = NULL;
char* attr;
struct berval **vals;
BerElement* ber;
LDAPMessage* entry;
int i;
for(entry = ldap_first_entry(m_ldap, msg); entry != NULL; entry = ldap_next_entry(m_ldap, entry)) {
LDAPUserInfo userinfo;
if((dn = ldap_get_dn(m_ldap, entry)) != NULL) {
printf("Returned dn: %s\n", dn);
userinfo.distinguishedName = dn;
TQStringList dnParts = TQStringList::split(",", dn);
TQString id = dnParts[0];
if (id.startsWith("uid=")) {
id = id.remove(0, 4);
userinfo.name = id;
}
ldap_memfree(dn);
}
users.append(parseLDAPUserRecord(entry));
}
for( attr = ldap_first_attribute(m_ldap, entry, &ber); attr != NULL; attr = ldap_next_attribute(m_ldap, entry, ber)) {
if ((vals = ldap_get_values_len(m_ldap, entry, attr)) != NULL) {
printf("[RAJA DEBUG 100.3] %s: %s\n\r", attr, vals[i]->bv_val);
userinfo.informationValid = true;
TQString ldap_field = attr;
i=0;
if (ldap_field == "uidNumber") {
userinfo.uid = atoi(vals[i]->bv_val);
}
else if (ldap_field == "loginShell") {
userinfo.shell = vals[i]->bv_val;
}
else if (ldap_field == "homeDirectory") {
userinfo.homedir = vals[i]->bv_val;
}
else if (ldap_field == "gidNumber") {
userinfo.primary_gid = atoi(vals[i]->bv_val);
}
else if (ldap_field == "krb5KDCFlags") {
userinfo.status = (LDAPKRB5Flags)(atoi(vals[i]->bv_val));
}
else if (ldap_field == "createTimestamp") { // YYYYMMDD000000Z
TQString formattedDate = vals[i]->bv_val;
formattedDate.insert(4,"-");
formattedDate.insert(7,"-");
formattedDate.insert(10,"T");
formattedDate.insert(13,":");
formattedDate.insert(16,":");
formattedDate.remove(19, 1);
userinfo.account_created = TQDateTime::fromString(formattedDate, TQt::ISODate);
}
else if (ldap_field == "modifyTimestamp") { // YYYYMMDD000000Z
TQString formattedDate = vals[i]->bv_val;
formattedDate.insert(4,"-");
formattedDate.insert(7,"-");
formattedDate.insert(10,"T");
formattedDate.insert(13,":");
formattedDate.insert(16,":");
formattedDate.remove(19, 1);
userinfo.account_modified = TQDateTime::fromString(formattedDate, TQt::ISODate);
}
// FIXME
// These two attributes do not seem to be available with a Heimdal KDC
// userinfo.password_last_changed = vals[i]->bv_val;
// userinfo.password_expires = vals[i]->bv_val;
else if (ldap_field == "krb5PasswordEnd") { // YYYYMMDD000000Z
TQString formattedDate = vals[i]->bv_val;
formattedDate.insert(4,"-");
formattedDate.insert(7,"-");
formattedDate.insert(10,"T");
formattedDate.insert(13,":");
formattedDate.insert(16,":");
formattedDate.remove(19, 1);
userinfo.password_expiration = TQDateTime::fromString(formattedDate, TQt::ISODate);
}
// FIXME
// These six(!) attributes do not seem to be available with a Heimdal KDC
// userinfo.password_ages = vals[i]->bv_val;
// userinfo.new_password_interval = vals[i]->bv_val;
// userinfo.new_password_warn_interval = vals[i]->bv_val;
// userinfo.new_password_lockout_delay = vals[i]->bv_val;
// userinfo.password_has_minimum_age = vals[i]->bv_val;
// userinfo.password_minimum_age = vals[i]->bv_val;
else if (ldap_field == "krb5MaxLife") { // units: hours
userinfo.maximum_ticket_lifetime = atoi(vals[i]->bv_val);
}
else if (ldap_field == "cn") {
userinfo.commonName = vals[i]->bv_val;
}
else if (ldap_field == "givenName") {
userinfo.givenName = vals[i]->bv_val;
}
else if (ldap_field == "sn") {
userinfo.surName = vals[i]->bv_val;
}
else if (ldap_field == "initials") {
userinfo.initials = vals[i]->bv_val;
}
else if (ldap_field == "title") {
userinfo.title = vals[i]->bv_val;
}
else if (ldap_field == "mail") {
userinfo.email = vals[i]->bv_val;
}
else if (ldap_field == "description") {
userinfo.description = vals[i]->bv_val;
}
else if (ldap_field == "l") {
userinfo.locality = vals[i]->bv_val;
}
else if (ldap_field == "telephoneNumber") {
userinfo.telephoneNumber = vals[i]->bv_val;
}
else if (ldap_field == "facsimileTelephoneNumber") {
userinfo.faxNumber = vals[i]->bv_val;
}
else if (ldap_field == "homePhone") {
userinfo.homePhone = vals[i]->bv_val;
}
else if (ldap_field == "mobile") {
userinfo.mobilePhone = vals[i]->bv_val;
}
else if (ldap_field == "pager") {
userinfo.pagerNumber = vals[i]->bv_val;
}
// FIXME
// This attribute is not present in my current LDAP schema
// userinfo.website = vals[i]->bv_val;
else if (ldap_field == "postOfficeBox") {
userinfo.poBox = vals[i]->bv_val;
}
else if (ldap_field == "street") {
userinfo.street = vals[i]->bv_val;
}
else if (ldap_field == "postalAddress") {
userinfo.address = vals[i]->bv_val;
}
else if (ldap_field == "st") {
userinfo.state = vals[i]->bv_val;
}
else if (ldap_field == "postalCode") {
userinfo.postcode = vals[i]->bv_val;
}
else if (ldap_field == "registeredAddress") {
userinfo.registeredAddress = vals[i]->bv_val;
}
else if (ldap_field == "homePostalAddress") {
userinfo.homeAddress = vals[i]->bv_val;
}
else if (ldap_field == "seeAlso") {
userinfo.seeAlso = vals[i]->bv_val;
}
else if (ldap_field == "physicalDeliveryOfficeName") {
userinfo.deliveryOffice = vals[i]->bv_val;
}
else if (ldap_field == "departmentNumber") {
userinfo.department = vals[i]->bv_val;
}
else if (ldap_field == "roomNumber") {
userinfo.roomNumber = vals[i]->bv_val;
}
else if (ldap_field == "employeeType") {
userinfo.employeeType = vals[i]->bv_val;
}
else if (ldap_field == "employeeNumber") {
userinfo.employeeNumber = vals[i]->bv_val;
}
// FIXME
// These two attributes are not present in my current LDAP schema
// userinfo.manager = vals[i]->bv_val;
// userinfo.secretary = vals[i]->bv_val;
else if (ldap_field == "internationaliSDNNumber") {
userinfo.isdnNumber = vals[i]->bv_val;
}
// FIXME
// This attribute is not present in my current LDAP schema
// userinfo.teletexID = vals[i]->bv_val;
else if (ldap_field == "telexNumber") {
userinfo.telexNumber = vals[i]->bv_val;
}
// FIXME
// This attribute is not present in my current LDAP schema
// userinfo.preferredDelivery = vals[i]->bv_val;
else if (ldap_field == "destinationIndicator") {
userinfo.destinationIndicator = vals[i]->bv_val;
}
else if (ldap_field == "x121Address") {
userinfo.x121Address = vals[i]->bv_val;
}
else if (ldap_field == "displayName") {
userinfo.displayName = vals[i]->bv_val;
}
else if (ldap_field == "preferredLanguage") {
userinfo.preferredLanguage = vals[i]->bv_val;
}
// FIXME
// This attribute is not present in my current LDAP schema
// userinfo.uniqueIdentifier = vals[i]->bv_val;
else if (ldap_field == "preferredLanguage") {
userinfo.businessCategory = vals[i]->bv_val;
}
else if (ldap_field == "carLicense") {
userinfo.carLicense = vals[i]->bv_val;
}
// FIXME
// This attribute is not present in my current LDAP schema
// userinfo.notes = vals[i]->bv_val;
ldap_value_free_len(vals);
}
ldap_memfree(attr);
}
users.append(userinfo);
// clean up
ldap_msgfree(msg);
if (ber != NULL) {
ber_free(ber, 0);
}
return users;
}
return LDAPUserInfoList();
}
printf("\n\r");
LDAPUserInfo LDAPManager::getUserByDistinguishedName(TQString dn) {
int retcode;
LDAPUserInfo userinfo;
if (bind() < 0) {
return LDAPUserInfo();
}
else {
LDAPMessage* msg;
struct timeval timeout;
timeout.tv_sec = 10; // 10 second timeout
retcode = ldap_search_ext_s(m_ldap, dn.ascii(), LDAP_SCOPE_SUBTREE, NULL, ldap_user_and_operational_attributes, 0, NULL, NULL, &timeout, 0, &msg);
if (retcode != LDAP_SUCCESS) {
KMessageBox::error(0, i18n("<qt>LDAP search failure<p>Reason: [%3] %4</qt>").arg(retcode).arg(ldap_err2string(retcode)), i18n("LDAP Error"));
return LDAPUserInfo();
}
// Iterate through the returned entries
LDAPMessage* entry;
for(entry = ldap_first_entry(m_ldap, msg); entry != NULL; entry = ldap_next_entry(m_ldap, entry)) {
userinfo = parseLDAPUserRecord(entry);
}
// clean up
ldap_msgfree(msg);
// RAJA FIXME
return users;
return userinfo;
}
return LDAPUserInfoList();
return LDAPUserInfo();
}
LDAPGroupInfo LDAPManager::getGroupByDistinguishedName(TQString dn) {
int retcode;
LDAPGroupInfo groupinfo;
if (bind() < 0) {
return LDAPGroupInfo();
}
else {
LDAPMessage* msg;
struct timeval timeout;
timeout.tv_sec = 10; // 10 second timeout
retcode = ldap_search_ext_s(m_ldap, dn.ascii(), LDAP_SCOPE_SUBTREE, NULL, ldap_user_and_operational_attributes, 0, NULL, NULL, &timeout, 0, &msg);
if (retcode != LDAP_SUCCESS) {
KMessageBox::error(0, i18n("<qt>LDAP search failure<p>Reason: [%3] %4</qt>").arg(retcode).arg(ldap_err2string(retcode)), i18n("LDAP Error"));
return LDAPGroupInfo();
}
// Iterate through the returned entries
LDAPMessage* entry;
for(entry = ldap_first_entry(m_ldap, msg); entry != NULL; entry = ldap_next_entry(m_ldap, entry)) {
groupinfo = parseLDAPGroupRecord(entry);
}
// clean up
ldap_msgfree(msg);
return groupinfo;
}
return LDAPGroupInfo();
}
LDAPGroupInfo LDAPManager::parseLDAPGroupRecord(LDAPMessage* entry) {
char* dn = NULL;
char* attr;
struct berval **vals;
BerElement* ber;
int i;
LDAPGroupInfo groupinfo;
if((dn = ldap_get_dn(m_ldap, entry)) != NULL) {
printf("Returned dn: %s\n", dn);
groupinfo.distinguishedName = dn;
TQStringList dnParts = TQStringList::split(",", dn);
TQString id = dnParts[0];
if (id.startsWith("cn=")) {
id = id.remove(0, 3);
groupinfo.name = id;
}
ldap_memfree(dn);
}
for( attr = ldap_first_attribute(m_ldap, entry, &ber); attr != NULL; attr = ldap_next_attribute(m_ldap, entry, ber)) {
if ((vals = ldap_get_values_len(m_ldap, entry, attr)) != NULL) {
for(i = 0; vals[i] != NULL; i++) {
printf("[RAJA DEBUG 110.3] %s: %s\n\r", attr, vals[i]->bv_val);
}
groupinfo.informationValid = true;
TQString ldap_field = attr;
i=0;
if (ldap_field == "member") {
TQStringList members;
for(i = 0; vals[i] != NULL; i++) {
TQString userdn = vals[i]->bv_val;
if (userdn.startsWith("cn=placeholder,dc=")) {
continue;
}
members.append(userdn);
}
groupinfo.userlist = members;
}
else if (ldap_field == "gidNumber") {
groupinfo.gid = atoi(vals[i]->bv_val);
}
ldap_value_free_len(vals);
}
ldap_memfree(attr);
}
if (ber != NULL) {
ber_free(ber, 0);
}
printf("\n\r");
return groupinfo;
}
LDAPGroupInfoList LDAPManager::groups() {
@ -458,69 +586,15 @@ printf("[RAJA DEBUG 110.1] In LDAPManager::groups() bind was OK\n\r"); fflush(st
printf("[RAJA DEBUG 110.2] The number of entries returned was %d\n\n", ldap_count_entries(m_ldap, msg));
// Iterate through the returned entries
char* dn = NULL;
char* attr;
struct berval **vals;
BerElement* ber;
LDAPMessage* entry;
int i;
for(entry = ldap_first_entry(m_ldap, msg); entry != NULL; entry = ldap_next_entry(m_ldap, entry)) {
LDAPGroupInfo groupinfo;
if((dn = ldap_get_dn(m_ldap, entry)) != NULL) {
printf("Returned dn: %s\n", dn);
groupinfo.distinguishedName = dn;
TQStringList dnParts = TQStringList::split(",", dn);
TQString id = dnParts[0];
if (id.startsWith("cn=")) {
id = id.remove(0, 3);
groupinfo.name = id;
}
else {
continue;
}
ldap_memfree(dn);
}
for( attr = ldap_first_attribute(m_ldap, entry, &ber); attr != NULL; attr = ldap_next_attribute(m_ldap, entry, ber)) {
if ((vals = ldap_get_values_len(m_ldap, entry, attr)) != NULL) {
for(i = 0; vals[i] != NULL; i++) {
printf("[RAJA DEBUG 110.3] %s: %s\n\r", attr, vals[i]->bv_val);
}
groupinfo.informationValid = true;
TQString ldap_field = attr;
i=0;
if (ldap_field == "member") {
TQStringList members;
for(i = 0; vals[i] != NULL; i++) {
TQString userdn = vals[i]->bv_val;
if (userdn.startsWith("cn=placeholder,dc=")) {
continue;
}
members.append(userdn);
}
groupinfo.userlist = members;
}
else if (ldap_field == "gidNumber") {
groupinfo.gid = atoi(vals[i]->bv_val);
}
ldap_value_free_len(vals);
}
ldap_memfree(attr);
}
groups.append(groupinfo);
if (ber != NULL) {
ber_free(ber, 0);
}
printf("\n\r");
// RAJA
groups.append(parseLDAPGroupRecord(entry));
}
// clean up
ldap_msgfree(msg);
// RAJA FIXME
return groups;
}

@ -173,6 +173,12 @@ class LDAPManager : public TQObject {
int unbind(bool force);
LDAPUserInfoList users();
LDAPGroupInfoList groups();
LDAPUserInfo getUserByDistinguishedName(TQString dn);
LDAPGroupInfo getGroupByDistinguishedName(TQString dn);
private:
LDAPUserInfo parseLDAPUserRecord(LDAPMessage* entry);
LDAPGroupInfo parseLDAPGroupRecord(LDAPMessage* entry);
private:
TQString m_realm;

Loading…
Cancel
Save