Branch: master

c714661b 2015-09-03 16:31:07 Timothy Pearson
Add certificate store attribute access method
M src/libtdeldap.cpp
M src/libtdeldap.h
diff --git a/src/libtdeldap.cpp b/src/libtdeldap.cpp
index 156c372..940a91d 100644
--- a/src/libtdeldap.cpp
+++ b/src/libtdeldap.cpp
@@ -2847,6 +2847,74 @@
 	}
 }
 
+int LDAPManager::getLdapCertificateStoreAttribute(TQString attribute, TQString* value, TQString* errstr) {
+	int retcode;
+	int returncode;
+	LDAPTDEBuiltinsInfo builtininfo;
+
+	TQString dn = TQString("cn=certificate store,o=tde,cn=tde realm data,ou=master services,ou=core,ou=realm,%1").arg(m_basedc);
+
+	if (!value) {
+		if (errstr) *errstr = i18n("Invalid string handle passed by host application");
+		return -1;
+	}
+
+	if (bind(errstr) < 0) {
+		return -1;
+	}
+	else {
+		LDAPMessage* msg;
+		retcode = ldap_search_ext_s(m_ldap, dn.ascii(), LDAP_SCOPE_SUBTREE, NULL, ldap_user_and_operational_attributes, 0, NULL, NULL, NULL, 0, &msg);
+		if (retcode != LDAP_SUCCESS) {
+			if (errstr) *errstr = i18n("<qt>LDAP search failure<p>Reason: [%3] %4</qt>").arg(retcode).arg(ldap_err2string(retcode));
+			else KMessageBox::error(0, i18n("<qt>LDAP search failure<p>Reason: [%3] %4</qt>").arg(retcode).arg(ldap_err2string(retcode)), i18n("LDAP Error"));
+			return -1;
+		}
+
+		returncode = -2;
+
+		// Iterate through the returned entries
+		LDAPMessage* entry;
+		for(entry = ldap_first_entry(m_ldap, msg); entry != NULL; entry = ldap_next_entry(m_ldap, entry)) {
+			char* attr;
+			struct berval **vals;
+			BerElement* ber;
+			int i;
+
+			LDAPTDEBuiltinsInfo builtininfo;
+
+			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)  {
+					builtininfo.informationValid = true;
+					TQString ldap_field = attr;
+					i=0;
+					if (ldap_field == attribute) {
+						*value = vals[i]->bv_val;
+						returncode = 0;
+					}
+					ldap_value_free_len(vals);
+				}
+				ldap_memfree(attr);
+			}
+			if (returncode != 0) {
+				// Resource not found
+				if (errstr) *errstr = i18n("Resource \"%s\" not found in LDAP certificate store").arg(attribute);
+			}
+
+			if (ber != NULL) {
+				ber_free(ber, 0);
+			}
+		}
+
+		// clean up
+		ldap_msgfree(msg);
+
+		return returncode;
+	}
+
+	return -1;
+}
+
 int LDAPManager::setLdapCertificateStoreAttribute(TQString attribute, TQString value, TQString* errstr) {
 	int retcode;
 	int i;
diff --git a/src/libtdeldap.h b/src/libtdeldap.h
index c14a437..83428e3 100644
--- a/src/libtdeldap.h
+++ b/src/libtdeldap.h
@@ -526,6 +526,7 @@
 
 		TQString getRealmCAMaster(TQString* errstr=0);
 		int setRealmCAMaster(TQString masterFQDN, TQString* errstr=0);
+		int getLdapCertificateStoreAttribute(TQString attribute, TQString* value, TQString* errstr=0);
 		int setLdapCertificateStoreAttribute(TQString attribute, TQString value, TQString* errstr=0);
 
 		LDAPTDEBuiltinsInfo getTDEBuiltinMappings(TQString *errstr=0);