use of oasis.names.tc.dss._1_0.core.schema.Result in project open-ecard by ecsec.
the class IFD method disconnect.
@Override
public synchronized DisconnectResponse disconnect(Disconnect parameters) {
try {
DisconnectResponse response;
if (!hasContext()) {
String msg = "Context not initialized.";
Result r = WSHelper.makeResultError(ECardConstants.Minor.IFD.INVALID_SLOT_HANDLE, msg);
response = WSHelper.makeResponse(DisconnectResponse.class, r);
return response;
}
try {
byte[] handle = parameters.getSlotHandle();
SingleThreadChannel ch = cm.getSlaveChannel(handle);
cm.closeSlaveChannel(handle);
// process actions
SCIOCard card = ch.getChannel().getCard();
ActionType action = parameters.getAction();
if (ActionType.RESET == action) {
String ifdName = card.getTerminal().getName();
SingleThreadChannel master = cm.getMasterChannel(ifdName);
HandlerBuilder builder = HandlerBuilder.create();
ConnectionHandleType cHandleIn = builder.setCardType(ECardConstants.UNKNOWN_CARD).setCardIdentifier(card.getATR().getBytes()).setContextHandle(ctxHandle).setIfdName(ifdName).setSlotIdx(BigInteger.ZERO).buildConnectionHandle();
builder = HandlerBuilder.create();
ConnectionHandleType cHandleRm = builder.setContextHandle(ctxHandle).setIfdName(ifdName).setSlotIdx(BigInteger.ZERO).buildConnectionHandle();
try {
master.reconnect();
evManager.resetCard(cHandleRm, cHandleIn, card.getProtocol().toUri());
} catch (IllegalStateException ex) {
LOG.warn("Card reconnect failed, trying to establish new card connection.", ex);
cm.closeMasterChannel(ifdName);
LOG.debug("Master channel closed successfully.");
try {
cm.getMasterChannel(ifdName);
LOG.debug("New card connection established successfully.");
evManager.resetCard(cHandleRm, cHandleIn, card.getProtocol().toUri());
} catch (NoSuchTerminal ex2) {
LOG.error("No terminal present anymore.", ex);
}
}
}
// TODO: take care of other actions (probably over ControlIFD)
// the default is to not disconnect the card, because all existing connections would be broken
response = WSHelper.makeResponse(DisconnectResponse.class, WSHelper.makeResultOK());
return response;
} catch (NoSuchChannel ex) {
String msg = "No card available in the requested terminal.";
Result r = WSHelper.makeResultError(ECardConstants.Minor.IFD.INVALID_SLOT_HANDLE, msg);
response = WSHelper.makeResponse(DisconnectResponse.class, r);
LOG.warn(msg, ex);
return response;
} catch (SCIOException ex) {
String msg = "Unknown error in the underlying SCIO implementation.";
Result r = WSHelper.makeResultUnknownError(msg);
response = WSHelper.makeResponse(DisconnectResponse.class, r);
LOG.warn(msg, ex);
return response;
}
} catch (Exception ex) {
LOG.warn(ex.getMessage(), ex);
throwThreadKillException(ex);
return WSHelper.makeResponse(DisconnectResponse.class, WSHelper.makeResult(ex));
}
}
use of oasis.names.tc.dss._1_0.core.schema.Result in project open-ecard by ecsec.
the class IFD method releaseContext.
@Override
public synchronized ReleaseContextResponse releaseContext(ReleaseContext parameters) {
ReleaseContextResponse response;
if (ByteUtils.compare(ctxHandle, parameters.getContextHandle())) {
if (numClients.decrementAndGet() == 0) {
// last client detaches
env.removeIFDCtx(ctxHandle);
ctxHandle = null;
numClients = null;
// terminate thread pool
// wait for threads to die and block new requests
threadPool.shutdownNow();
// just assume it worked ... and don't wait
threadPool = null;
asyncWaitThreads = null;
}
evManager.terminate();
response = WSHelper.makeResponse(ReleaseContextResponse.class, WSHelper.makeResultOK());
return response;
} else {
String msg = "Invalid context handle specified.";
Result r = WSHelper.makeResultError(ECardConstants.Minor.IFD.INVALID_CONTEXT_HANDLE, msg);
response = WSHelper.makeResponse(ReleaseContextResponse.class, r);
return response;
}
}
use of oasis.names.tc.dss._1_0.core.schema.Result in project open-ecard by ecsec.
the class IFD method endTransaction.
@Override
public EndTransactionResponse endTransaction(EndTransaction parameters) {
try {
EndTransactionResponse response;
if (!hasContext()) {
String msg = "Context not initialized.";
Result r = WSHelper.makeResultError(ECardConstants.Minor.IFD.INVALID_SLOT_HANDLE, msg);
response = WSHelper.makeResponse(EndTransactionResponse.class, r);
return response;
}
try {
byte[] handle = parameters.getSlotHandle();
SingleThreadChannel ch = cm.getSlaveChannel(handle);
ch.endExclusive();
} catch (NoSuchChannel | IllegalStateException ex) {
String msg = "No card with transaction available in the requested terminal.";
Result r = WSHelper.makeResultError(ECardConstants.Minor.IFD.INVALID_SLOT_HANDLE, msg);
response = WSHelper.makeResponse(EndTransactionResponse.class, r);
LOG.warn(msg, ex);
return response;
} catch (SCIOException ex) {
String msg = "Unknown error in the underlying SCIO implementation.";
Result r = WSHelper.makeResultUnknownError(msg);
response = WSHelper.makeResponse(EndTransactionResponse.class, r);
LOG.warn(msg, ex);
return response;
}
response = WSHelper.makeResponse(EndTransactionResponse.class, WSHelper.makeResultOK());
return response;
} catch (Exception ex) {
LOG.warn(ex.getMessage(), ex);
throwThreadKillException(ex);
return WSHelper.makeResponse(EndTransactionResponse.class, WSHelper.makeResult(ex));
}
}
use of oasis.names.tc.dss._1_0.core.schema.Result in project open-ecard by ecsec.
the class MiddlewareSAL method didUpdate.
@Override
public DIDUpdateResponse didUpdate(DIDUpdate request) {
DIDUpdateResponse response = WSHelper.makeResponse(DIDUpdateResponse.class, WSHelper.makeResultOK());
try {
ConnectionHandleType connectionHandle = SALUtils.getConnectionHandle(request);
CardStateEntry cardStateEntry = SALUtils.getCardStateEntry(states, connectionHandle, false);
byte[] application = cardStateEntry.getImplicitlySelectedApplicationIdentifier();
DIDUpdateDataType didUpdateData = request.getDIDUpdateData();
Assert.assertIncorrectParameter(didUpdateData, "The parameter DIDUpdateData is empty.");
String didName = SALUtils.getDIDName(request);
DIDStructureType didStruct = cardStateEntry.getDIDStructure(didName, application);
if (didStruct == null) {
String msg = String.format("DID %s does not exist.", didName);
throw new NamedEntityNotFoundException(msg);
}
Result updateResult;
String protocolURI = didUpdateData.getProtocol();
if ("urn:oid:1.3.162.15480.3.0.9".equals(protocolURI)) {
updateResult = updatePin(didUpdateData, cardStateEntry, didStruct);
} else {
String msg = String.format("Protocol %s is not supported by this SAL.", protocolURI);
throw new UnknownProtocolException(msg);
}
// create did authenticate response
response.setResult(updateResult);
} catch (ECardException e) {
response.setResult(e.getResult());
} catch (Exception e) {
LOG.error(e.getMessage(), e);
throwThreadKillException(e);
response.setResult(WSHelper.makeResult(e));
}
return response;
}
use of oasis.names.tc.dss._1_0.core.schema.Result in project open-ecard by ecsec.
the class TinyManagement method initializeFramework.
@Publish
@Override
public InitializeFrameworkResponse initializeFramework(InitializeFramework arg0) {
InitializeFrameworkResponse initializeFrameworkResponse = new InitializeFrameworkResponse();
Version version = new Version();
version.setMajor(ECardConstants.ECARD_API_VERSION_MAJOR);
version.setMinor(ECardConstants.ECARD_API_VERSION_MINOR);
version.setSubMinor(ECardConstants.ECARD_API_VERSION_SUBMINOR);
initializeFrameworkResponse.setVersion(version);
Result r = new Result();
r.setResultMajor(ECardConstants.Major.OK);
initializeFrameworkResponse.setResult(r);
return initializeFrameworkResponse;
}
Aggregations