Search in sources :

Example 1 with MwSlot

use of org.openecard.mdlw.sal.MwSlot in project open-ecard by ecsec.

the class MwEventRunner method run.

@Override
public void run() {
    LOG.debug("Start event loop.");
    while (true) {
        try {
            LOG.debug("Waiting for Middleware event.");
            long slotId;
            if (supportsBlockingWait) {
                slotId = mwModule.waitForSlotEvent(0);
            } else if (supportsNonBlockingWait) {
                // TODO: this polling causes to flood logs in case debug is enabled for the wait call
                slotId = mwModule.waitForSlotEvent(1);
                if (slotId == -1) {
                    // nothing changed
                    try {
                        Thread.sleep(1000);
                        continue;
                    } catch (InterruptedException ex) {
                        LOG.debug("Middleware Event Runner interrupted.");
                        return;
                    }
                }
            } else {
                throw new IllegalStateException("This point should never be reached");
            }
            LOG.debug("Middleware event detected.");
            // Flag to check if Terminal was removed
            boolean isProcessed = false;
            // find actual slot object
            for (MwSlot slot : this.mwModule.getSlotList(false)) {
                if (isHwSlot(slot) && slot.getSlotInfo().getSlotID() == slotId) {
                    isProcessed = true;
                    String ifdName = slot.getSlotInfo().getSlotDescription();
                    LOG.debug("Slot event recognized, slotId={}, ifdName={}.", slotId, ifdName);
                    try {
                        slot.getTokenInfo().getLabel();
                        // send card inserted
                        this.sendCardInserted(slot);
                        // send recognized
                        this.sendCardRecognized(slot);
                    } catch (TokenException | SessionException ex) {
                        LOG.debug("Error requesting token information.", ex);
                        this.sendCardRemoved(slot);
                    }
                }
            }
            if (!isProcessed) {
                this.sendTerminalRemoved(slotId);
            }
        } catch (CryptokiException ex) {
            // handle downgrade of the wait method
            if (ex.getErrorCode() == CryptokiLibrary.CKR_FUNCTION_NOT_SUPPORTED) {
                if (supportsBlockingWait) {
                    LOG.info("Blocking wait is not supported. Falling back to non-blocking wait.");
                    supportsBlockingWait = false;
                    continue;
                } else if (supportsNonBlockingWait) {
                    LOG.info("Non-blocking wait is not supported. Terminating event thread.");
                    supportsNonBlockingWait = false;
                    return;
                }
            }
            LOG.error("Unrecoverable error during operation on the token list.", ex);
            try {
                Thread.sleep(10000);
            } catch (InterruptedException ex1) {
                LOG.debug("Middleware Event Runner interrupted.");
                return;
            }
        } catch (RuntimeException ex) {
            LOG.error("Unexpected exception occurred in Middleware Event Runner.", ex);
            throw ex;
        }
    }
}
Also used : MwSlot(org.openecard.mdlw.sal.MwSlot) CryptokiException(org.openecard.mdlw.sal.exceptions.CryptokiException) TokenException(org.openecard.mdlw.sal.exceptions.TokenException) SessionException(org.openecard.mdlw.sal.exceptions.SessionException)

Example 2 with MwSlot

use of org.openecard.mdlw.sal.MwSlot in project open-ecard by ecsec.

the class MwStateCallback method addEntry.

public boolean addEntry(MwEventObject o) {
    try {
        ConnectionHandleType handle = o.getHandle();
        MwSlot slot = o.getMwSlot();
        MwToken token = slot.getTokenInfo();
        String cardType = null;
        String type = String.format("%s_%s", token.getManufacturerID(), token.getModel());
        for (MiddlewareConfig mwConfig : mwConfigs) {
            cardType = mwConfig.mapMiddlewareType(type);
            if (cardType != null) {
                break;
            }
        }
        CardInfoType cif = null;
        if (cardType != null) {
            cif = env.getCIFProvider().getCardInfo(handle, cardType);
        }
        if (cif == null) {
            LOG.warn("Unknown card recognized by Middleware.");
            return false;
        }
        // create new entry in card states
        CardStateEntry entry = new CardStateEntry(handle, cif, null);
        states.addEntry(entry);
        return true;
    } catch (CryptokiException ex) {
        LOG.info("Cryptoki Token invalid.", ex);
    } catch (RuntimeException ex) {
        LOG.error("Error in CIF augmentation process.", ex);
    }
    return false;
}
Also used : ConnectionHandleType(iso.std.iso_iec._24727.tech.schema.ConnectionHandleType) MwSlot(org.openecard.mdlw.sal.MwSlot) CardStateEntry(org.openecard.common.sal.state.CardStateEntry) CardInfoType(iso.std.iso_iec._24727.tech.schema.CardInfoType) CryptokiException(org.openecard.mdlw.sal.exceptions.CryptokiException) MiddlewareConfig(org.openecard.mdlw.sal.config.MiddlewareConfig) MwToken(org.openecard.mdlw.sal.MwToken)

Example 3 with MwSlot

use of org.openecard.mdlw.sal.MwSlot in project open-ecard by ecsec.

the class MwEventRunner method initRunner.

void initRunner() throws CryptokiException {
    for (MwSlot slot : this.mwModule.getSlotList(TokenState.NotPresent)) {
        if (isHwSlot(slot)) {
            this.sendTerminalAdded(slot);
            String ifdName = slot.getSlotInfo().getSlotDescription();
            try {
                slot.getTokenInfo().getLabel();
                this.sendCardInserted(slot);
                // send recognized
                this.sendCardRecognized(slot);
            } catch (TokenException | SessionException e) {
                LOG.debug("Error getting token information, no card present in the requested slot.", e);
            }
        }
    }
}
Also used : MwSlot(org.openecard.mdlw.sal.MwSlot) TokenException(org.openecard.mdlw.sal.exceptions.TokenException) SessionException(org.openecard.mdlw.sal.exceptions.SessionException)

Aggregations

MwSlot (org.openecard.mdlw.sal.MwSlot)3 CryptokiException (org.openecard.mdlw.sal.exceptions.CryptokiException)2 SessionException (org.openecard.mdlw.sal.exceptions.SessionException)2 TokenException (org.openecard.mdlw.sal.exceptions.TokenException)2 CardInfoType (iso.std.iso_iec._24727.tech.schema.CardInfoType)1 ConnectionHandleType (iso.std.iso_iec._24727.tech.schema.ConnectionHandleType)1 CardStateEntry (org.openecard.common.sal.state.CardStateEntry)1 MwToken (org.openecard.mdlw.sal.MwToken)1 MiddlewareConfig (org.openecard.mdlw.sal.config.MiddlewareConfig)1