diff options
| author | Jack Magne <jmagne@dhcp-16-206.sjc.redhat.com> | 2016-08-03 18:01:23 -0700 |
|---|---|---|
| committer | Jack Magne <jmagne@dhcp-16-206.sjc.redhat.com> | 2016-08-05 11:12:09 -0700 |
| commit | f0b1854a8f5cfe97d2d267ea16e4556d94666bb6 (patch) | |
| tree | 695a043097e9034b091bc237f4f012f30a6ff034 /base | |
| parent | 5178567bf5c65d23d3903b0956a47813bdc1fe23 (diff) | |
| download | pki-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')
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; + } } |
