use of org.openecard.ws.chipgateway.ListCertificatesResponseType in project open-ecard by ecsec.
the class ChipGateway method processCertificatesRequest.
private CommandType processCertificatesRequest(final ListCertificatesRequestType certReq) throws ConnectionError, JsonProcessingException, InvalidRedirectUrlException, ChipGatewayDataError {
// check if we have been interrupted
checkProcessCancelled();
BigInteger waitSecondsBig = certReq.getMaxWaitSeconds();
long waitMillis = getWaitMillis(waitSecondsBig);
// run the actual stuff in the background, so we can wait and terminate if needed
FutureTask<ListCertificatesResponseType> action = new FutureTask<>(new Callable<ListCertificatesResponseType>() {
@Override
public ListCertificatesResponseType call() throws Exception {
ListCertificatesResponseType certResp = new ListCertificatesResponseType();
certResp.setSessionIdentifier(sessionId);
char[] pin = null;
try {
pin = getPin(certReq.getPIN());
byte[] slotHandle = certReq.getSlotHandle();
ListCertificates helper = new ListCertificates(tokenCache, slotHandle, certReq.getCertificateFilter(), pin);
List<CertificateInfoType> certInfos = helper.getCertificates();
certResp.getCertificateInfo().addAll(certInfos);
certResp.setResult(ChipGatewayStatusCodes.OK);
return certResp;
} finally {
if (pin != null) {
Arrays.fill(pin, ' ');
}
}
}
});
Thread t = new Thread(action, "CertificatesRequest-Task-" + TASK_THREAD_NUM.getAndIncrement());
t.setDaemon(true);
t.start();
ListCertificatesResponseType certResp = new ListCertificatesResponseType();
certResp.setSessionIdentifier(sessionId);
try {
// wait for thread to finish
certResp = action.get(waitMillis, TimeUnit.MILLISECONDS);
} catch (TimeoutException ex) {
LOG.info("Background task took longer than the timeout value permitted.", ex);
// cancel task
action.cancel(true);
// wait for task to finish, so the SC stack can not get confused
try {
t.join();
certResp.setResult(ChipGatewayStatusCodes.TIMEOUT);
} catch (InterruptedException ignore) {
// send stop message
certResp.setResult(ChipGatewayStatusCodes.STOPPED);
}
} catch (ExecutionException ex) {
LOG.error("Background task produced an exception.", ex);
Throwable cause = ex.getCause();
if (cause instanceof RemotePinException) {
LOG.error("Error getting encrypted PIN.", ex);
certResp.setResult(ChipGatewayStatusCodes.INCORRECT_PARAMETER);
} else if (cause instanceof ParameterInvalid) {
LOG.error("Error while processing the certificate filter parameters.", ex);
certResp.setResult(ChipGatewayStatusCodes.INCORRECT_PARAMETER);
} else if (cause instanceof SlotHandleInvalid) {
LOG.error("No token for the given slot handle found.", cause);
certResp.setResult(ChipGatewayStatusCodes.UNKNOWN_SLOT);
} else if (cause instanceof NoSuchDid) {
LOG.error("DID does not exist.", cause);
certResp.setResult(ChipGatewayStatusCodes.UNKNOWN_DID);
} else if (cause instanceof SecurityConditionUnsatisfiable) {
LOG.error("DID can not be authenticated.", cause);
certResp.setResult(ChipGatewayStatusCodes.SECURITY_NOT_SATISFIED);
} else if (cause instanceof CertificateException) {
LOG.error("Certificate could not be processed.", cause);
certResp.setResult(ChipGatewayStatusCodes.OTHER);
} else if (cause instanceof WSHelper.WSException) {
LOG.error("Unknown error.", cause);
certResp.setResult(ChipGatewayStatusCodes.OTHER);
} else if (cause instanceof ThreadTerminateException) {
LOG.error("Chipgateway process interrupted.", cause);
certResp.setResult(ChipGatewayStatusCodes.STOPPED);
} else {
LOG.error("Unknown error during list certificate operation.", cause);
certResp.setResult(ChipGatewayStatusCodes.OTHER);
}
} catch (InterruptedException ex) {
String msg = "Interrupted while waiting for background task.";
if (LOG.isDebugEnabled()) {
LOG.debug(msg, ex);
} else {
LOG.info(msg);
}
// cancel task
action.cancel(true);
// send stop message
certResp.setResult(ChipGatewayStatusCodes.STOPPED);
}
return sendMessageInterruptableAndCheckTermination(getResource(listCertsUrl), certResp);
}
Aggregations