summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorJack Magne <jmagne@dhcp-16-206.sjc.redhat.com>2016-08-03 18:01:23 -0700
committerJack Magne <jmagne@dhcp-16-206.sjc.redhat.com>2016-08-05 11:12:09 -0700
commitf0b1854a8f5cfe97d2d267ea16e4556d94666bb6 (patch)
tree695a043097e9034b091bc237f4f012f30a6ff034 /base
parent5178567bf5c65d23d3903b0956a47813bdc1fe23 (diff)
downloadpki-f0b1854a8f5cfe97d2d267ea16e4556d94666bb6.tar.gz
pki-f0b1854a8f5cfe97d2d267ea16e4556d94666bb6.tar.xz
pki-f0b1854a8f5cfe97d2d267ea16e4556d94666bb6.zip
Fix to sort the output of a cert search by serialno.
Diffstat (limited to 'base')
-rw-r--r--base/common/src/com/netscape/certsrv/dbs/IDBSSession.java35
-rw-r--r--base/common/src/com/netscape/certsrv/dbs/certdb/ICertificateRepository.java27
-rw-r--r--base/server/cms/src/com/netscape/cms/servlet/cert/SrchCerts.java4
-rw-r--r--base/server/cmscore/src/com/netscape/cmscore/dbs/CertificateRepository.java37
-rw-r--r--base/server/cmscore/src/com/netscape/cmscore/dbs/DBSSession.java97
-rw-r--r--base/server/test/com/netscape/cmscore/dbs/DBSSessionDefaultStub.java15
6 files changed, 197 insertions, 18 deletions
diff --git a/base/common/src/com/netscape/certsrv/dbs/IDBSSession.java b/base/common/src/com/netscape/certsrv/dbs/IDBSSession.java
index 656950570..9ab2fde6d 100644
--- a/base/common/src/com/netscape/certsrv/dbs/IDBSSession.java
+++ b/base/common/src/com/netscape/certsrv/dbs/IDBSSession.java
@@ -17,11 +17,11 @@
// --- END COPYRIGHT BLOCK ---
package com.netscape.certsrv.dbs;
+import netscape.ldap.LDAPSearchResults;
+
import com.netscape.certsrv.base.EBaseException;
import com.netscape.certsrv.base.ISubsystem;
-import netscape.ldap.LDAPSearchResults;
-
/**
* An interface represents the database session. Operations
* can be performed with a session.
@@ -132,6 +132,21 @@ public interface IDBSSession extends AutoCloseable {
* @param base starting point of the search
* @param filter search filter
* @param maxSize max number of entries
+ * @param sortAttribute Field to sort the records on
+ * @return search results
+ * @exception EBaseException failed to search
+ */
+ public IDBSearchResults search(String base, String filter, int maxSize,String sortAttribute)
+ throws EBaseException;
+
+
+ /**
+ * Searchs for a list of objects that match the
+ * filter.
+ *
+ * @param base starting point of the search
+ * @param filter search filter
+ * @param maxSize max number of entries
* @param timeLimit timeout limit
* @return search results
* @exception EBaseException failed to search
@@ -140,6 +155,22 @@ public interface IDBSSession extends AutoCloseable {
int timeLimit) throws EBaseException;
/**
+ * Searchs for a list of objects that match the
+ * filter.
+ *
+ * @param base starting point of the search
+ * @param filter search filter
+ * @param maxSize max number of entries
+ * @param timeLimit timeout limit
+ * @param sortAttribute Field to sort the records on
+ * @return search results
+ * @exception EBaseException failed to search
+ */
+ public IDBSearchResults search(String base, String filter, int maxSize,
+ int timeLimit, String sortAttribute) throws EBaseException;
+
+
+ /**
* Retrieves a list of object that satifies the given
* filter.
*
diff --git a/base/common/src/com/netscape/certsrv/dbs/certdb/ICertificateRepository.java b/base/common/src/com/netscape/certsrv/dbs/certdb/ICertificateRepository.java
index f113ea03e..2efb023cc 100644
--- a/base/common/src/com/netscape/certsrv/dbs/certdb/ICertificateRepository.java
+++ b/base/common/src/com/netscape/certsrv/dbs/certdb/ICertificateRepository.java
@@ -239,6 +239,33 @@ public interface ICertificateRepository extends IRepository {
* the filter.
*
* @param filter search filter
+ * @param maxSize max size to return
+ * @param timeLimit timeout value
+ * @param sortAttribute Attribute of ICertRecord to sort the results
+ * @return a list of certificates
+ * @exception EBaseException failed to search
+ */
+ public Enumeration<ICertRecord> searchCertificates(String filter, int maxSize,
+ int timeLimit,String sortAttribute) throws EBaseException;
+
+ /**
+ * Finds a list of certificate records that satisifies
+ * the filter.
+ *
+ * @param filter search filter
+ * @param maxSize max size to return
+ * @param sortAttribute Attribute of ICertRecord to sort the results
+ * @return a list of certificates
+ * @exception EBaseException failed to search
+ */
+ public Enumeration<Object> searchCertificates(String filter, int maxSize,
+ String sortAttribute) throws EBaseException;
+
+ /**
+ * Finds a list of certificate records that satisifies
+ * the filter.
+ *
+ * @param filter search filter
* @param attrs selected attribute
* @param pageSize page size
* @return a list of certificates
diff --git a/base/server/cms/src/com/netscape/cms/servlet/cert/SrchCerts.java b/base/server/cms/src/com/netscape/cms/servlet/cert/SrchCerts.java
index 508a8df70..c55dfea18 100644
--- a/base/server/cms/src/com/netscape/cms/servlet/cert/SrchCerts.java
+++ b/base/server/cms/src/com/netscape/cms/servlet/cert/SrchCerts.java
@@ -608,7 +608,9 @@ public class SrchCerts extends CMSServlet {
}
CMS.debug("Start searching ... "
+ "filter=" + filter + " maxreturns=" + maxResults + " timelimit=" + timeLimit);
- Enumeration<ICertRecord> e = mCertDB.searchCertificates(filter, maxResults, timeLimit);
+
+ // Do the search with the optional sortAtribute field, giving an assured list of certs sorted by serialno
+ Enumeration<ICertRecord> e = mCertDB.searchCertificates(filter, maxResults, timeLimit, "serialno");
int count = 0;
diff --git a/base/server/cmscore/src/com/netscape/cmscore/dbs/CertificateRepository.java b/base/server/cmscore/src/com/netscape/cmscore/dbs/CertificateRepository.java
index d0a604ec2..8406f367b 100644
--- a/base/server/cmscore/src/com/netscape/cmscore/dbs/CertificateRepository.java
+++ b/base/server/cmscore/src/com/netscape/cmscore/dbs/CertificateRepository.java
@@ -1124,7 +1124,7 @@ public class CertificateRepository extends Repository
ModificationSet mods = new ModificationSet();
if (isAlreadyOnHold) {
mods.add(CertRecord.ATTR_REVO_INFO, Modification.MOD_REPLACE, info);
- } else {
+ } else {
mods.add(CertRecord.ATTR_REVO_INFO, Modification.MOD_ADD, info);
}
SessionContext ctx = SessionContext.getContext();
@@ -1190,6 +1190,21 @@ public class CertificateRepository extends Repository
modifyCertificateRecord(id, mods);
}
+ public Enumeration<Object> searchCertificates(String filter, int maxSize,String sortAttribute)
+ throws EBaseException {
+ IDBSSession s = mDBService.createSession();
+ Enumeration<Object> e = null;
+
+ CMS.debug("searchCertificates filter " + filter + " maxSize " + maxSize);
+ try {
+ e = s.search(getDN(), filter, maxSize,sortAttribute);
+ } finally {
+ if (s != null)
+ s.close();
+ }
+ return e;
+ }
+
public Enumeration<Object> searchCertificates(String filter, int maxSize)
throws EBaseException {
IDBSSession s = mDBService.createSession();
@@ -1223,6 +1238,26 @@ public class CertificateRepository extends Repository
return v.elements();
}
+ public Enumeration<ICertRecord> searchCertificates(String filter, int maxSize,
+ int timeLimit,String sortAttribute) throws EBaseException {
+ IDBSSession s = mDBService.createSession();
+ Vector<ICertRecord> v = new Vector<ICertRecord>();
+
+ CMS.debug("searchCertificateswith time limit filter " + filter);
+ try {
+ IDBSearchResults sr = s.search(getDN(), filter, maxSize, timeLimit,sortAttribute);
+ while (sr.hasMoreElements()) {
+ v.add((ICertRecord) sr.nextElement());
+ }
+ } finally {
+ if (s != null)
+ s.close();
+ }
+ return v.elements();
+
+ }
+
+
/**
* Returns a list of X509CertImp that satisfies the filter.
*
diff --git a/base/server/cmscore/src/com/netscape/cmscore/dbs/DBSSession.java b/base/server/cmscore/src/com/netscape/cmscore/dbs/DBSSession.java
index 2bfd5f2da..853dfe41a 100644
--- a/base/server/cmscore/src/com/netscape/cmscore/dbs/DBSSession.java
+++ b/base/server/cmscore/src/com/netscape/cmscore/dbs/DBSSession.java
@@ -19,6 +19,20 @@ package com.netscape.cmscore.dbs;
import java.util.Enumeration;
+import netscape.ldap.LDAPAttribute;
+import netscape.ldap.LDAPAttributeSet;
+import netscape.ldap.LDAPConnection;
+import netscape.ldap.LDAPEntry;
+import netscape.ldap.LDAPException;
+import netscape.ldap.LDAPModification;
+import netscape.ldap.LDAPModificationSet;
+import netscape.ldap.LDAPSearchConstraints;
+import netscape.ldap.LDAPSearchResults;
+import netscape.ldap.LDAPSortKey;
+import netscape.ldap.LDAPv2;
+import netscape.ldap.controls.LDAPPersistSearchControl;
+import netscape.ldap.controls.LDAPSortControl;
+
import com.netscape.certsrv.apps.CMS;
import com.netscape.certsrv.base.EBaseException;
import com.netscape.certsrv.base.ISubsystem;
@@ -34,18 +48,6 @@ import com.netscape.certsrv.dbs.Modification;
import com.netscape.certsrv.dbs.ModificationSet;
import com.netscape.certsrv.logging.ILogger;
-import netscape.ldap.LDAPAttribute;
-import netscape.ldap.LDAPAttributeSet;
-import netscape.ldap.LDAPConnection;
-import netscape.ldap.LDAPEntry;
-import netscape.ldap.LDAPException;
-import netscape.ldap.LDAPModification;
-import netscape.ldap.LDAPModificationSet;
-import netscape.ldap.LDAPSearchConstraints;
-import netscape.ldap.LDAPSearchResults;
-import netscape.ldap.LDAPv2;
-import netscape.ldap.controls.LDAPPersistSearchControl;
-
/**
* A class represents the database session. Operations
* can be performed with a session.
@@ -295,6 +297,40 @@ public class DBSSession implements IDBSSession {
}
@SuppressWarnings("unchecked")
+ public IDBSearchResults search(String base, String filter, int maxSize,String sortAttribute)
+ throws EBaseException {
+ try {
+ String ldapattrs[] = null;
+ String ldapfilter =
+ mDBSystem.getRegistry().getFilter(filter);
+
+ LDAPSearchConstraints cons = new LDAPSearchConstraints();
+
+ cons.setMaxResults(maxSize);
+
+ if(sortAttribute != null) {
+ LDAPSortKey sortOrder = new LDAPSortKey( sortAttribute );
+ LDAPSortControl sortCtrl = new LDAPSortControl(sortOrder,true);
+ cons.setServerControls( sortCtrl );
+ }
+
+ LDAPSearchResults res = mConn.search(base,
+ LDAPv2.SCOPE_ONE, ldapfilter, ldapattrs, false, cons);
+
+ return new DBSearchResults(mDBSystem.getRegistry(),
+ res);
+ } catch (LDAPException e) {
+ if (e.getLDAPResultCode() == LDAPException.UNAVAILABLE)
+ throw new EDBNotAvailException(
+ CMS.getUserMessage("CMS_DBS_INTERNAL_DIR_UNAVAILABLE"));
+ // XXX error handling, should not raise exception if
+ // entry not found
+ throw new EDBException(CMS.getUserMessage("CMS_DBS_LDAP_OP_FAILURE",
+ e.toString()));
+ }
+ }
+
+ @SuppressWarnings("unchecked")
public IDBSearchResults search(String base, String filter, int maxSize, int timeLimit)
throws EBaseException {
try {
@@ -323,6 +359,43 @@ public class DBSSession implements IDBSSession {
}
}
+ @SuppressWarnings("unchecked")
+ public IDBSearchResults search(String base, String filter, int maxSize,
+ int timeLimit, String sortAttribute) throws EBaseException {
+
+ try {
+ String ldapattrs[] = null;
+ String ldapfilter =
+ mDBSystem.getRegistry().getFilter(filter);
+
+ LDAPSearchConstraints cons = new LDAPSearchConstraints();
+
+ cons.setMaxResults(maxSize);
+ cons.setServerTimeLimit(timeLimit);
+
+ if(sortAttribute != null) {
+ LDAPSortKey sortOrder = new LDAPSortKey( sortAttribute );
+ LDAPSortControl sortCtrl = new LDAPSortControl(sortOrder,true);
+ cons.setServerControls( sortCtrl );
+ }
+
+ LDAPSearchResults res = mConn.search(base,
+ LDAPv2.SCOPE_ONE, ldapfilter, ldapattrs, false, cons);
+
+ return new DBSearchResults(mDBSystem.getRegistry(),
+ res);
+ } catch (LDAPException e) {
+ if (e.getLDAPResultCode() == LDAPException.UNAVAILABLE)
+ throw new EDBNotAvailException(
+ CMS.getUserMessage("CMS_DBS_INTERNAL_DIR_UNAVAILABLE"));
+ // XXX error handling, should not raise exception if
+ // entry not found
+ throw new EDBException(CMS.getUserMessage("CMS_DBS_LDAP_OP_FAILURE",
+ e.toString()));
+ }
+
+ }
+
/**
* Retrieves a list of object that satifies the given
* filter.
diff --git a/base/server/test/com/netscape/cmscore/dbs/DBSSessionDefaultStub.java b/base/server/test/com/netscape/cmscore/dbs/DBSSessionDefaultStub.java
index e4e715724..8d7bbc047 100644
--- a/base/server/test/com/netscape/cmscore/dbs/DBSSessionDefaultStub.java
+++ b/base/server/test/com/netscape/cmscore/dbs/DBSSessionDefaultStub.java
@@ -1,5 +1,7 @@
package com.netscape.cmscore.dbs;
+import netscape.ldap.LDAPSearchResults;
+
import com.netscape.certsrv.base.EBaseException;
import com.netscape.certsrv.base.ISubsystem;
import com.netscape.certsrv.dbs.EDBException;
@@ -9,8 +11,6 @@ import com.netscape.certsrv.dbs.IDBSearchResults;
import com.netscape.certsrv.dbs.IDBVirtualList;
import com.netscape.certsrv.dbs.ModificationSet;
-import netscape.ldap.LDAPSearchResults;
-
/**
* A default stub ojbect for tests to extend.
*/
@@ -81,4 +81,15 @@ public class DBSSessionDefaultStub implements IDBSSession {
String sortKey, int pageSize) throws EBaseException {
return null;
}
+
+ @Override
+ public IDBSearchResults search(String base, String filter, int maxSize, int timeLimit, String sortAttribute)
+ throws EBaseException {
+ return null;
+ }
+
+ @Override
+ public IDBSearchResults search(String base, String filter, int maxSize, String sortAttribute) throws EBaseException {
+ return null;
+ }
}