summaryrefslogtreecommitdiffstats
path: root/base/tps
diff options
context:
space:
mode:
Diffstat (limited to 'base/tps')
-rw-r--r--base/tps/src/org/dogtagpki/server/tps/TPSTokendb.java93
-rw-r--r--base/tps/src/org/dogtagpki/server/tps/dbs/TokenCertStatus.java43
-rw-r--r--base/tps/src/org/dogtagpki/server/tps/main/ExternalRegAttrs.java35
-rw-r--r--base/tps/src/org/dogtagpki/server/tps/main/ExternalRegCertToRecover.java27
-rw-r--r--base/tps/src/org/dogtagpki/server/tps/processor/EnrolledCertsInfo.java24
-rw-r--r--base/tps/src/org/dogtagpki/server/tps/processor/TPSEnrollProcessor.java114
-rw-r--r--base/tps/src/org/dogtagpki/server/tps/processor/TPSProcessor.java7
7 files changed, 158 insertions, 185 deletions
diff --git a/base/tps/src/org/dogtagpki/server/tps/TPSTokendb.java b/base/tps/src/org/dogtagpki/server/tps/TPSTokendb.java
index 729e81e07..ca0a409a7 100644
--- a/base/tps/src/org/dogtagpki/server/tps/TPSTokendb.java
+++ b/base/tps/src/org/dogtagpki/server/tps/TPSTokendb.java
@@ -25,15 +25,12 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
-import netscape.security.x509.RevocationReason;
-
import org.dogtagpki.server.tps.cms.CARemoteRequestHandler;
import org.dogtagpki.server.tps.cms.CARevokeCertResponse;
import org.dogtagpki.server.tps.dbs.ActivityDatabase;
import org.dogtagpki.server.tps.dbs.TPSCertRecord;
+import org.dogtagpki.server.tps.dbs.TokenCertStatus;
import org.dogtagpki.server.tps.dbs.TokenRecord;
-import org.dogtagpki.server.tps.main.ExternalRegAttrs;
-import org.dogtagpki.server.tps.main.ExternalRegCertToRecover;
import org.dogtagpki.tps.main.TPSException;
import org.dogtagpki.tps.msg.EndOpMsg.TPSStatus;
@@ -43,6 +40,8 @@ import com.netscape.certsrv.base.IConfigStore;
import com.netscape.certsrv.dbs.EDBRecordNotFoundException;
import com.netscape.certsrv.tps.token.TokenStatus;
+import netscape.security.x509.RevocationReason;
+
/*
* TPSTokendb class offers a collection of tokendb management convenience routines
*/
@@ -217,64 +216,24 @@ public class TPSTokendb {
tps.tokenDatabase.updateRecord(id, tokenRecord);
}
- /*
- * tdbAddCertificatesForCUID adds certificates issued for the token CUID
- * - this instance pre-process the cert records to update the cert statuses
- * @param cuid the cuid of the token
- * @param certs an ArrayList of TPSCertRecord
- * @param erAttrs the ExternalRegAttrs collection
- */
- public void tdbAddCertificatesForCUID(String cuid, ArrayList<TPSCertRecord> certs, ExternalRegAttrs erAttrs)
- throws TPSException {
- String method = "TPSTokendb.tdbAddCertificatesForCUID (with erAttrs): ";
- String logMsg = "";
- CMS.debug(method + "begins");
- if (cuid == null || certs== null || certs.isEmpty() || erAttrs == null) {
- logMsg = "params cuid, certs and erAttrs cannot be null or empty";
- CMS.debug(method + logMsg);
- throw new TPSException(method + logMsg, TPSStatus.STATUS_ERROR_CONTACT_ADMIN);
- }
- CMS.debug("TPSTokendb.tdbAddCertificatesForCUID: number of certs to update:"+ certs.size());
-
- // update cert status first
- for (TPSCertRecord cert : certs) {
- ExternalRegCertToRecover.CertStatus status = ExternalRegCertToRecover.CertStatus.UNINITIALIZED;
- status = erAttrs.getCertStatus(cert.getSerialNumber());
- if (status == ExternalRegCertToRecover.CertStatus.UNINITIALIZED) {
- //cert not found in ExternalReg; don't reset status; don't report
- continue;
- }
-
- //cert is one of the ExternalReg recovered certs, update the status
- CMS.debug(method + "found and set status for:" + cert.getSerialNumber());
- cert.setStatus(status.toString());
-
- }
-
- tdbAddCertificatesForCUID(cuid, certs);
- CMS.debug(method + "ends");
-
-
- }
-
public void tdbAddCertificatesForCUID(String cuid, ArrayList<TPSCertRecord> certs)
throws TPSException {
String method = "TPSTokendb.tdbAddCertificatesForCUID: ";
CMS.debug(method + "begins");
boolean tokenExist = isTokenPresent(cuid);
- if (!tokenExist){
- CMS.debug("TPSTokendb.tdbAddCertificatesForCUID: token not found: "+ cuid);
- throw new TPSException("TPSTokendb:tdbUpdateCertificates: token "+ cuid + " does not exist");
+ if (!tokenExist) {
+ CMS.debug(method + " token not found: " + cuid);
+ throw new TPSException(method + " token " + cuid + " does not exist");
}
- CMS.debug("TPSTokendb.tdbAddCertificatesForCUID: found token "+ cuid);
- CMS.debug("TPSTokendb.tdbAddCertificatesForCUID: number of certs to update:"+ certs.size());
+ CMS.debug(method + " found token " + cuid);
+ CMS.debug(method + " number of certs to update:" + certs.size());
try {
- for (TPSCertRecord cert: certs) {
- // cert.setOrigin(cuid);
+ for (TPSCertRecord cert : certs) {
+ // cert.setOrigin(cuid);
try {
- tps.certDatabase.addRecord(cert.getId(), cert);
+ tps.certDatabase.addRecord(cert.getId(), cert);
} catch (Exception e) {
//If this is due to a dup, try to update the record.
@@ -282,7 +241,7 @@ public class TPSTokendb {
}
}
} catch (Exception e) {
- CMS.debug("TPSTokendb.tdbAddCertificatesForCUID: "+ e);
+ CMS.debug(method + e);
// TODO: what if it throws in the middle of the cert list -- some cert records already updated?
throw new TPSException(e.getMessage());
}
@@ -312,11 +271,12 @@ public class TPSTokendb {
public ArrayList<TPSCertRecord> tdbGetCertRecordsByCert(String serial, String issuer)
throws TPSException {
+ String method = "TPSTokendb.tdbGetCertRecordsByCert:";
if (serial == null)
- throw new TPSException("TPSTokendb.tdbGetCertificatesBySerial: serial null");
+ throw new TPSException(method + " serial null");
if (issuer == null) {
- throw new TPSException("TPSTokendb.tdbGetCertificatesBySerial: issuer null");
+ throw new TPSException(method + " issuer null");
}
Map<String, String> attributes = new HashMap<String, String>();
@@ -328,7 +288,7 @@ public class TPSTokendb {
try {
records = tps.certDatabase.findRecords(null, attributes).iterator();
} catch (Exception e) {
- CMS.debug("TPSTokendb.tdbGetCertificatesByCUID:" + e);
+ CMS.debug(method + e);
throw new TPSException(e.getMessage());
}
@@ -393,7 +353,7 @@ public class TPSTokendb {
if (cert.getTokenID().equals(cuid))
continue;
- if (cert.getStatus().equals("active"))
+ if (cert.getStatus().equals(TokenCertStatus.ACTIVE.toString()))
return false;
}
@@ -444,9 +404,11 @@ public class TPSTokendb {
// update certificate status
if (revokeReason == RevocationReason.CERTIFICATE_HOLD) {
- updateCertsStatus(cert.getSerialNumber(), cert.getIssuedBy(), "revoked_on_hold");
+ updateCertsStatus(cert.getSerialNumber(), cert.getIssuedBy(),
+ TokenCertStatus.ONHOLD.toString());
} else {
- updateCertsStatus(cert.getSerialNumber(), cert.getIssuedBy(), "revoked");
+ updateCertsStatus(cert.getSerialNumber(), cert.getIssuedBy(),
+ TokenCertStatus.REVOKED.toString());
}
logMsg = "certificate revoked: " + cert.getSerialNumber();
@@ -484,7 +446,7 @@ public class TPSTokendb {
logMsg = "called to unrevoke";
CMS.debug(method + ": " + logMsg);
- if (!cert.getStatus().equalsIgnoreCase("revoked_on_hold")) {
+ if (!cert.getStatus().equalsIgnoreCase(TokenCertStatus.ONHOLD.toString())) {
logMsg = "certificate record current status is not revoked_on_hold; cannot unrevoke";
CMS.debug(method + ": " + logMsg);
return; // TODO: continue or bail?
@@ -501,7 +463,8 @@ public class TPSTokendb {
CMS.debug(method + ": response status: " + response.getStatus());
// update certificate status
- updateCertsStatus(cert.getSerialNumber(), cert.getIssuedBy(), "active");
+ updateCertsStatus(cert.getSerialNumber(), cert.getIssuedBy(),
+ TokenCertStatus.ACTIVE.toString());
logMsg = "certificate unrevoked: " + cert.getSerialNumber();
CMS.debug(method + ": " + logMsg);
@@ -523,11 +486,17 @@ public class TPSTokendb {
private void checkShouldRevoke(TokenRecord tokenRecord, TPSCertRecord cert, String tokenReason,
String ipAddress, String remoteUser) throws Exception {
+ String method = "TPSTokendb.checkShouldRevoke:";
IConfigStore configStore = CMS.getConfigStore();
if (cert == null) {
throw new TPSException("Missing token certificate");
}
+ if (cert.getStatus().equalsIgnoreCase(TokenCertStatus.REVOKED.toString())) {
+ throw new TPSException(
+ method + "certificate " + cert.getSerialNumber() +
+ " already revoked.");
+ }
String tokenType = cert.getType();
String keyType = cert.getKeyType();
@@ -606,8 +575,6 @@ public class TPSTokendb {
}
}
- IConfigStore configStore = CMS.getConfigStore();
-
for (TPSCertRecord cert : certRecords) {
if (isRevoke) {
revokeCert(tokenRecord, cert, tokenReason, ipAddress, remoteUser);
diff --git a/base/tps/src/org/dogtagpki/server/tps/dbs/TokenCertStatus.java b/base/tps/src/org/dogtagpki/server/tps/dbs/TokenCertStatus.java
new file mode 100644
index 000000000..853740c9a
--- /dev/null
+++ b/base/tps/src/org/dogtagpki/server/tps/dbs/TokenCertStatus.java
@@ -0,0 +1,43 @@
+// --- BEGIN COPYRIGHT BLOCK ---
+// 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; version 2 of the License.
+//
+// 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.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// (C) 2014 Red Hat, Inc.
+// All rights reserved.
+// --- END COPYRIGHT BLOCK ---
+package org.dogtagpki.server.tps.dbs;
+
+/*
+ * TokenCertStatus - certificate statuses in the tokendb
+ *
+ * @author cfu
+ */
+public enum TokenCertStatus {
+ UNINITIALIZED("uninitialized"),
+ ACTIVE("active"),
+ REVOKED("revoked"),
+ ONHOLD("revoked_on_hold"),
+ EXPIRED("expired")
+ ;
+
+ private final String certStatusString;
+
+ private TokenCertStatus(final String status) {
+ this.certStatusString = status;
+ }
+
+ @Override
+ public String toString() {
+ return certStatusString;
+ }
+}
diff --git a/base/tps/src/org/dogtagpki/server/tps/main/ExternalRegAttrs.java b/base/tps/src/org/dogtagpki/server/tps/main/ExternalRegAttrs.java
index b90888839..2cb2e5029 100644
--- a/base/tps/src/org/dogtagpki/server/tps/main/ExternalRegAttrs.java
+++ b/base/tps/src/org/dogtagpki/server/tps/main/ExternalRegAttrs.java
@@ -1,11 +1,8 @@
package org.dogtagpki.server.tps.main;
-import java.math.BigInteger;
import java.util.ArrayList;
import org.dogtagpki.server.tps.engine.TPSEngine;
-import org.dogtagpki.tps.main.TPSException;
-import org.dogtagpki.tps.msg.EndOpMsg.TPSStatus;
import com.netscape.certsrv.apps.CMS;
import com.netscape.certsrv.base.EBaseException;
@@ -110,36 +107,4 @@ public class ExternalRegAttrs {
return isDelegation;
}
- /*
- *
- * @param serialString serial number in hex
- */
- public ExternalRegCertToRecover.CertStatus getCertStatus(String serialString) throws TPSException {
- String method = "ExternalRegAttrs.getCertStatus:";
- String logMsg = "";
- CMS.debug(method + "begins. getCertsToRecoverCount=" + getCertsToRecoverCount());
- if (serialString == null) {
- logMsg = "parameter serialString cannnot be null";
- CMS.debug(method + logMsg);
- throw new TPSException(method + logMsg, TPSStatus.STATUS_ERROR_CONTACT_ADMIN);
- } else
- CMS.debug(method + "searching for serialString =" + serialString);
- if (serialString.startsWith("0x")) {
- serialString = serialString.substring(2);
- }
- BigInteger serial = new BigInteger(serialString, 16);
- CMS.debug(method + "searching for serial=" + serial);
- for (ExternalRegCertToRecover cert: certsToRecover) {
- CMS.debug(method + "cert.getSerial()=" + cert.getSerial());
- if (serial.compareTo(cert.getSerial()) == 0) {
- CMS.debug(method + " cert found... returning status: " + cert.getCertStatus().toString());
- return cert.getCertStatus();
- }
- }
- logMsg = "cert not found in ExternalReg, status not reset";
- CMS.debug(method + logMsg);
- // no match means cert was not one of the ExternalReg recovered certs; so don't reset
- // use UNINITIALIZED to mean not found, as all certs in externalReg must have been set by now
- return ExternalRegCertToRecover.CertStatus.UNINITIALIZED;
- }
}
diff --git a/base/tps/src/org/dogtagpki/server/tps/main/ExternalRegCertToRecover.java b/base/tps/src/org/dogtagpki/server/tps/main/ExternalRegCertToRecover.java
index a445012eb..5fc8de52a 100644
--- a/base/tps/src/org/dogtagpki/server/tps/main/ExternalRegCertToRecover.java
+++ b/base/tps/src/org/dogtagpki/server/tps/main/ExternalRegCertToRecover.java
@@ -9,7 +9,6 @@ public class ExternalRegCertToRecover {
String caConn;
String kraConn;
boolean isRetainable;
- CertStatus certStatus = CertStatus.UNINITIALIZED;
public ExternalRegCertToRecover() {
isRetainable = false;
@@ -54,32 +53,6 @@ public class ExternalRegCertToRecover {
public boolean getIsRetainable() {
return isRetainable;
}
-
- public void setCertStatus(CertStatus status) {
- this.certStatus = status;
- }
-
- public CertStatus getCertStatus() {
- return certStatus;
- }
-
- public enum CertStatus {
- UNINITIALIZED("uninitialized"),
- ACTIVE("active"),
- REVOKED("revoked"),
- EXPIRED("expired")
- ;
-
- private final String certStatusString;
- private CertStatus(final String status) {
- this.certStatusString = status;
- }
-
- @Override
- public String toString() {
- return certStatusString;
- }
- }
}
diff --git a/base/tps/src/org/dogtagpki/server/tps/processor/EnrolledCertsInfo.java b/base/tps/src/org/dogtagpki/server/tps/processor/EnrolledCertsInfo.java
index ae9919ddb..35793c71f 100644
--- a/base/tps/src/org/dogtagpki/server/tps/processor/EnrolledCertsInfo.java
+++ b/base/tps/src/org/dogtagpki/server/tps/processor/EnrolledCertsInfo.java
@@ -21,9 +21,8 @@ import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
-import netscape.security.x509.X509CertImpl;
-
import org.dogtagpki.server.tps.dbs.TPSCertRecord;
+import org.dogtagpki.server.tps.dbs.TokenCertStatus;
import org.dogtagpki.server.tps.main.PKCS11Obj;
import org.dogtagpki.tps.main.TPSBuffer;
import org.dogtagpki.tps.main.Util;
@@ -31,10 +30,13 @@ import org.dogtagpki.tps.main.Util;
import com.netscape.certsrv.apps.CMS;
import com.netscape.certsrv.base.EBaseException;
+import netscape.security.x509.X509CertImpl;
+
public class EnrolledCertsInfo {
EnrolledCertsInfo() {
certificates = new ArrayList<X509CertImpl>();
+ certStatuses = new ArrayList<TokenCertStatus>();
ktypes = new ArrayList<String>();
origins = new ArrayList<String>();
tokenTypes = new ArrayList<String>();
@@ -57,6 +59,7 @@ public class EnrolledCertsInfo {
private ArrayList<String> ktypes;
private ArrayList<String> tokenTypes;
private ArrayList<X509CertImpl> certificates;
+ private ArrayList<TokenCertStatus> certStatuses;
private ArrayList<CertEnrollInfo> externalRegRecoveryEnrollList;
@@ -156,6 +159,10 @@ public class EnrolledCertsInfo {
certificates.remove(x509Cert);
}
+ public void addCertStatus(TokenCertStatus status) {
+ certStatuses.add(status);
+ }
+
public void setStartProgress(int startP) {
startProgress = startP;
@@ -220,6 +227,16 @@ public class EnrolledCertsInfo {
//certRecord.setType("");
}
+ //cert status
+ if ((!certStatuses.isEmpty()) && index < certStatuses.size() && certStatuses.get(index) != null) {
+ CMS.debug("EnrolledCertsInfo.toTPSCertRecords: cert status=" + certStatuses.get(index));
+ certRecord.setStatus(certStatuses.get(index).toString());
+ } else {
+ CMS.debug("EnrolledCertsInfo.toTPSCertRecords: certStatus not found for index:" + index
+ + "; set to default active");
+ certRecord.setStatus(TokenCertStatus.ACTIVE.toString());
+ }
+
//Issuer
String issuedBy = cert.getIssuerDN().toString();
certRecord.setIssuedBy(issuedBy);
@@ -238,9 +255,6 @@ public class EnrolledCertsInfo {
certRecord.setValidNotAfter(cert.getNotAfter());
CMS.debug("EnrolledCertsInfo.toTPSCertRecords: notAfter ="+ cert.getNotAfter().toString());
- //status
- certRecord.setStatus("active");
-
/* certificate
byte[] certBytes = null;
try {
diff --git a/base/tps/src/org/dogtagpki/server/tps/processor/TPSEnrollProcessor.java b/base/tps/src/org/dogtagpki/server/tps/processor/TPSEnrollProcessor.java
index 31d3eedad..af3e92e08 100644
--- a/base/tps/src/org/dogtagpki/server/tps/processor/TPSEnrollProcessor.java
+++ b/base/tps/src/org/dogtagpki/server/tps/processor/TPSEnrollProcessor.java
@@ -15,11 +15,6 @@ import java.util.Map;
import java.util.Random;
import java.util.zip.DataFormatException;
-import netscape.security.provider.RSAPublicKey;
-//import org.mozilla.jss.pkcs11.PK11ECPublicKey;
-import netscape.security.util.BigInt;
-import netscape.security.x509.X509CertImpl;
-
import org.dogtagpki.server.tps.TPSSession;
import org.dogtagpki.server.tps.TPSSubsystem;
import org.dogtagpki.server.tps.TPSTokenPolicy;
@@ -35,13 +30,13 @@ import org.dogtagpki.server.tps.cms.KRARecoverKeyResponse;
import org.dogtagpki.server.tps.cms.KRAServerSideKeyGenResponse;
import org.dogtagpki.server.tps.dbs.ActivityDatabase;
import org.dogtagpki.server.tps.dbs.TPSCertRecord;
+import org.dogtagpki.server.tps.dbs.TokenCertStatus;
import org.dogtagpki.server.tps.dbs.TokenRecord;
import org.dogtagpki.server.tps.engine.TPSEngine;
import org.dogtagpki.server.tps.engine.TPSEngine.ENROLL_MODES;
import org.dogtagpki.server.tps.main.AttributeSpec;
import org.dogtagpki.server.tps.main.ExternalRegAttrs;
import org.dogtagpki.server.tps.main.ExternalRegCertToRecover;
-import org.dogtagpki.server.tps.main.ExternalRegCertToRecover.CertStatus;
import org.dogtagpki.server.tps.main.ObjectSpec;
import org.dogtagpki.server.tps.main.PKCS11Obj;
import org.dogtagpki.server.tps.mapping.BaseMappingResolver;
@@ -58,8 +53,6 @@ import org.mozilla.jss.pkcs11.PK11PubKey;
import org.mozilla.jss.pkcs11.PK11RSAPublicKey;
import org.mozilla.jss.pkix.primitive.SubjectPublicKeyInfo;
-import sun.security.pkcs11.wrapper.PKCS11Constants;
-
import com.netscape.certsrv.apps.CMS;
import com.netscape.certsrv.base.EBaseException;
import com.netscape.certsrv.base.EPropertyNotFound;
@@ -67,6 +60,13 @@ import com.netscape.certsrv.base.IConfigStore;
import com.netscape.certsrv.tps.token.TokenStatus;
import com.netscape.cmsutil.util.Utils;
+import netscape.security.provider.RSAPublicKey;
+//import org.mozilla.jss.pkcs11.PK11ECPublicKey;
+import netscape.security.util.BigInt;
+import netscape.security.x509.RevocationReason;
+import netscape.security.x509.X509CertImpl;
+import sun.security.pkcs11.wrapper.PKCS11Constants;
+
public class TPSEnrollProcessor extends TPSProcessor {
public TPSEnrollProcessor(TPSSession session) {
@@ -543,6 +543,7 @@ public class TPSEnrollProcessor extends TPSProcessor {
statusUpdate(99, "PROGRESS_SET_LIFECYCLE");
channel.setLifeycleState((byte) 0x0f);
+
//update the tokendb with new certs
CMS.debug(method + " updating tokendb with certs.");
try {
@@ -555,10 +556,7 @@ public class TPSEnrollProcessor extends TPSProcessor {
}
CMS.debug(method + " adding certs to token with tdbAddCertificatesForCUID...");
ArrayList<TPSCertRecord> certRecords = certsInfo.toTPSCertRecords(tokenRecord.getId(), tokenRecord.getUserID());
- if (isExternalReg)
- tps.tdb.tdbAddCertificatesForCUID(tokenRecord.getId(), certRecords, erAttrs);
- else
- tps.tdb.tdbAddCertificatesForCUID(tokenRecord.getId(), certRecords);
+ tps.tdb.tdbAddCertificatesForCUID(tokenRecord.getId(), certRecords);
CMS.debug(method + " tokendb updated with certs to the cuid so that it reflects what's on the token");
logMsg = "appletVersion=" + lastObjVer + "; tokenType =" + selectedTokenType + "; userid =" + userid;
@@ -1250,27 +1248,16 @@ public class TPSEnrollProcessor extends TPSProcessor {
return TPSStatus.STATUS_ERROR_RECOVERY_FAILED;
}
- if (certResp.isCertRevoked()) {
- CMS.debug(method + " cert revoked");
- if (!allowRecoverInvalidCert()) {
- logMsg = "revoked cert not allowed on token per policy;";
- CMS.debug(method + logMsg);
- return TPSStatus.STATUS_ERROR_RECOVERY_FAILED;
- }
- erCert.setCertStatus(CertStatus.REVOKED);
- CMS.debug(method + " erCert status =" + erCert.getCertStatus());
- } else {
- CMS.debug(method + " cert not revoked ");
- erCert.setCertStatus(CertStatus.ACTIVE);
-
- // check if expired or not yet valid
- if (!certResp.isCertValid()) {
- logMsg = "cert expired or not yet valid";
- CMS.debug(logMsg);
- erCert.setCertStatus(CertStatus.EXPIRED); // it could be not yet valid
- }
+ TokenCertStatus recoveredCertStatus = getRetrievedCertStatus(certResp);
+ if ((recoveredCertStatus != TokenCertStatus.ACTIVE) &&
+ !allowRecoverInvalidCert()) {
+ logMsg = "invalid cert not allowed on token per policy; serial=" + serial.toString() + "; cert status=" + recoveredCertStatus.toString();
+ CMS.debug(method + logMsg);
+ return TPSStatus.STATUS_ERROR_RECOVERY_FAILED;
}
+ certsInfo.addCertStatus(recoveredCertStatus);
+
// default: externalReg.recover.byKeyID=false
String b64cert = null;
if (getExternalRegRecoverByKeyID() == false) {
@@ -1364,8 +1351,6 @@ public class TPSEnrollProcessor extends TPSProcessor {
int newCertId = pkcs11obj.getNextFreeCertIdNumber();
certsInfo.setCurrentCertIndex(i);
- //certsInfo.setCurrentCertIndex(i);
-
CMS.debug(method + "before calling generateCertificate, certsInfo.getCurrentCertIndex() ="
+ certsInfo.getCurrentCertIndex());
generateCertificate(certsInfo, channel, appletInfo,
@@ -1946,7 +1931,7 @@ public class TPSEnrollProcessor extends TPSProcessor {
actualCertIndex, cEnrollInfo);
// unrevoke cert if needed
- if (certToRecover.getStatus().equalsIgnoreCase("revoked_on_hold")) {
+ if (certToRecover.getStatus().equalsIgnoreCase(TokenCertStatus.ONHOLD.toString())) {
logMsg = "unrevoking cert...";
CMS.debug(method + ":" + logMsg);
@@ -1961,7 +1946,8 @@ public class TPSEnrollProcessor extends TPSProcessor {
CMS.debug(method + ": response status =" + response.getStatus());
auditRevoke(certToRecover.getTokenID(), false /*off-hold*/, -1 /*na*/,
String.valueOf(response.getStatus()), serialToRecover, caConnId, null);
-
+ // successful unrevoke should mark the cert "active"
+ certsInfo.addCertStatus(TokenCertStatus.ACTIVE);
} catch (EBaseException e) {
logMsg = "failed getting CARemoteRequestHandler";
CMS.debug(method + ":" + logMsg);
@@ -1970,17 +1956,6 @@ public class TPSEnrollProcessor extends TPSProcessor {
throw new TPSException(method + ":" + logMsg, TPSStatus.STATUS_ERROR_RECOVERY_FAILED);
}
}
-
- try {
- // set cert status to active
- tps.tdb.updateCertsStatus(certToRecover.getSerialNumber(),
- certToRecover.getIssuedBy(),
- "active");
- } catch (Exception e) {
- logMsg = "failed tdbUpdateCertEntry";
- CMS.debug(method + ":" + logMsg);
- throw new TPSException(method + ":" + logMsg, TPSStatus.STATUS_ERROR_RECOVERY_FAILED);
- }
} else {
}
@@ -2020,7 +1995,7 @@ public class TPSEnrollProcessor extends TPSProcessor {
certsInfo.setNumCertsToEnroll(keyTypeNum);
- CMS.debug("TPSEnrollProcessor.generateCertificate: Number of certs to enroll: " + keyTypeNum);
+ CMS.debug("TPSEnrollProcessor.generateCertificates: Number of certs to enroll: " + keyTypeNum);
for (int i = 0; i < keyTypeNum; i++) {
String keyType = getConfiguredKeyType(i);
@@ -2477,6 +2452,7 @@ public class TPSEnrollProcessor extends TPSProcessor {
// enrollment/recovery begins
CMS.debug("TPSEnrollProcessor.enrollOneCertificate:: enrollment begins");
X509CertImpl x509Cert = null;
+ TokenCertStatus certStatus = TokenCertStatus.ACTIVE; // track cert status
byte[] cert_bytes = null;
try {
@@ -2613,14 +2589,14 @@ public class TPSEnrollProcessor extends TPSProcessor {
cert_bytes = Utils.base64decode(retCertB64);
- TPSBuffer cert_bytes_buf = new TPSBuffer(cert_bytes);
+ //TPSBuffer cert_bytes_buf = new TPSBuffer(cert_bytes);
//CMS.debug("TPSEnrollProcessor.enrollOneCertificate: retCertB64: " + cert_bytes_buf.toHexString());
CMS.debug("TPSEnrollProcessor.enrollOneCertificate: retCertB64 base64decode done");
x509Cert = caEnrollResp.getCert();
- if (x509Cert != null)
+ if (x509Cert != null) {
CMS.debug("TPSEnrollProcessor.enrollOneCertificate:: new cert retrieved");
- else {
+ } else {
CMS.debug("TPSEnrollProcessor.enrollOneCertificate:: new cert not found");
throw new TPSException("TPSEnrollProcessor.enrollOneCertificate: new cert not found",
TPSStatus.STATUS_ERROR_MAC_ENROLL_PDU);
@@ -2660,14 +2636,16 @@ public class TPSEnrollProcessor extends TPSProcessor {
CMS.debug("TPSEnrollProcessor.enrollOneCertificate: recovering: retCertB64 retrieved from certResp");
cert_bytes = Utils.base64decode(retCertB64);
- TPSBuffer cert_bytes_buf = new TPSBuffer(cert_bytes);
CMS.debug("TPSEnrollProcessor.enrollOneCertificate: recovering: retCertB64 base64decode done");
+ //TPSBuffer cert_bytes_buf = new TPSBuffer(cert_bytes);
//CMS.debug("TPSEnrollProcessor.enrollOneCertificate: recovering: retCertB64: "
// + cert_bytes_buf.toHexString());
x509Cert = certResp.getCert();
if (x509Cert != null) {
CMS.debug("TPSEnrollProcessor.enrollOneCertificate:: recovering new cert retrieved");
+ // recovered cert might have different status
+ certStatus = getRetrievedCertStatus(certResp);
auditEnrollment(userid, "retrieval", aInfo, "success",
channel.getKeyInfoData().toHexStringPlain(), x509Cert.getSerialNumber(),
certResp.getConnID(), null);
@@ -2713,8 +2691,8 @@ public class TPSEnrollProcessor extends TPSProcessor {
}
cert_bytes = Utils.base64decode(retCertB64);
- TPSBuffer cert_bytes_buf = new TPSBuffer(cert_bytes);
CMS.debug("TPSEnrollProcessor.enrollOneCertificate: renewing: retCertB64 base64decode done");
+ //TPSBuffer cert_bytes_buf = new TPSBuffer(cert_bytes);
//CMS.debug("TPSEnrollProcessor.enrollOneCertificate: renewing: retCertB64: "
// + cert_bytes_buf.toHexString());
@@ -2758,6 +2736,7 @@ public class TPSEnrollProcessor extends TPSProcessor {
certsInfo.addOrigin(aInfo.getCUIDhexStringPlain());
}
+ certsInfo.addCertStatus(certStatus);
certsInfo.addTokenType(selectedTokenType);
SubjectPublicKeyInfo publicKeyInfo = null;
@@ -2892,6 +2871,37 @@ public class TPSEnrollProcessor extends TPSProcessor {
}
+ /*
+ * getRetrievedCertStatus
+ * @returns TokenCertStatus certificate status of the cert retrieved in certResponse
+ */
+ TokenCertStatus getRetrievedCertStatus(CARetrieveCertResponse certResponse)
+ throws TPSException {
+ String method = "TPSEnrollProcessor.getRetrievedCertStatus";
+ CMS.debug(method + " begins");
+ if (certResponse == null) {
+ throw new TPSException(
+ "TPSEnrollProcessor.getRetrievedCertStatus: invalid input data! certResponse cannot be null",
+ TPSStatus.STATUS_ERROR_MAC_ENROLL_PDU);
+ }
+ TokenCertStatus ret = TokenCertStatus.ACTIVE;
+ if (!certResponse.isCertValid()) {
+ CMS.debug(method + ": cert expired");
+ ret = TokenCertStatus.EXPIRED;
+ }
+ //This would overwrite the "EXPIRED" status,
+ //but "REVOKED" would be a more serious invalid status
+ if (certResponse.isCertRevoked()) {
+ String revReason = certResponse.getRevocationReason();
+ CMS.debug(method + ": cert revoked; reason=" + revReason);
+ if (RevocationReason.fromInt(Integer.parseInt(revReason)) == RevocationReason.CERTIFICATE_HOLD)
+ ret = TokenCertStatus.ONHOLD;
+ else
+ ret = TokenCertStatus.REVOKED;
+ }
+ return ret;
+ }
+
private void importPrivateKeyPKCS8(KRARecoverKeyResponse keyResp, CertEnrollInfo cEnrollInfo,
SecureChannel channel,
boolean isECC) throws TPSException, IOException {
diff --git a/base/tps/src/org/dogtagpki/server/tps/processor/TPSProcessor.java b/base/tps/src/org/dogtagpki/server/tps/processor/TPSProcessor.java
index 582e3f90c..2b42dc613 100644
--- a/base/tps/src/org/dogtagpki/server/tps/processor/TPSProcessor.java
+++ b/base/tps/src/org/dogtagpki/server/tps/processor/TPSProcessor.java
@@ -33,8 +33,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import netscape.security.x509.RevocationReason;
-
import org.dogtagpki.server.tps.TPSSession;
import org.dogtagpki.server.tps.TPSSubsystem;
import org.dogtagpki.server.tps.authentication.AuthUIParameter;
@@ -50,6 +48,7 @@ import org.dogtagpki.server.tps.cms.TKSRemoteRequestHandler;
import org.dogtagpki.server.tps.config.ProfileDatabase;
import org.dogtagpki.server.tps.dbs.ActivityDatabase;
import org.dogtagpki.server.tps.dbs.TPSCertRecord;
+import org.dogtagpki.server.tps.dbs.TokenCertStatus;
import org.dogtagpki.server.tps.dbs.TokenRecord;
import org.dogtagpki.server.tps.engine.TPSEngine;
import org.dogtagpki.server.tps.main.ExternalRegAttrs;
@@ -98,6 +97,8 @@ import com.netscape.certsrv.tps.token.TokenStatus;
import com.netscape.cms.servlet.tks.SecureChannelProtocol;
import com.netscape.symkey.SessionKey;
+import netscape.security.x509.RevocationReason;
+
public class TPSProcessor {
public static final int RESULT_NO_ERROR = 0;
@@ -1563,7 +1564,7 @@ public class TPSProcessor {
* if the certificates are revoked_on_hold, don't do anything because the certificates may
* be referenced by more than one token.
*/
- if (cert.getStatus().equals("revoked_on_hold")) {
+ if (cert.getStatus().equals(TokenCertStatus.ONHOLD.toString())) {
CMS.debug(method + ": cert " + cert.getSerialNumber()
+ " has status revoked_on_hold; remove from tokendb and move on");
try {