void RFIDeasReaderUnit::serialize(boost::property_tree::ptree& parentNode) { boost::property_tree::ptree node; node.put("<xmlattr>.type", getReaderProvider()->getRPType()); d_readerUnitConfig->serialize(node); parentNode.add_child(getDefaultXmlNodeName(), node); }
void ReaderUnit::serialize(boost::property_tree::ptree& node) { node.put("<xmlattr>.type", getReaderProvider()->getRPType()); d_readerUnitConfig->serialize(node); if (getDataTransport()) { node.put("TransportType", getDataTransport()->getTransportType()); getDataTransport()->serialize(node); } else { node.put("TransportType", ""); } }
void ACSACR1222LReaderUnit::establish_background_connection() { kill_background_connection(); LLA_LOG_CTX("Setting up feedback PCSC connection for ACSACR1222L."); auto provider = std::dynamic_pointer_cast<PCSCReaderProvider>(getReaderProvider()); assert(provider); assert(getACSACR1222LConfiguration()); auto name = getACSACR1222LConfiguration()->getUserFeedbackReader(); if (name.empty()) { LOG(WARNINGS) << "Cannot fetch name for the reader unit that would be used as " << "a background connection for ACSACR1222L"; return; } try { sam_used_as_perma_connection_ = std::dynamic_pointer_cast<PCSCReaderUnit>( provider->createReaderUnit(name)); assert(sam_used_as_perma_connection_); sam_used_as_perma_connection_->setup_pcsc_connection(SC_DIRECT); } catch (const std::exception &e) { LOG(ERRORS) << "Failed to establish PCSC connection when establishing " << "background connection for ACSACR1222L: " << e.what(); sam_used_as_perma_connection_ = nullptr; return; } auto lcd = std::make_shared<ACSACR1222LLCDDisplay>(); lcd->setReaderCardAdapter( sam_used_as_perma_connection_->getDefaultReaderCardAdapter()); sam_used_as_perma_connection_->setLCDDisplay(lcd); auto ledbuzzer = std::make_shared<ACSACR1222LLEDBuzzerDisplay>(); ledbuzzer->setReaderCardAdapter( sam_used_as_perma_connection_->getDefaultReaderCardAdapter()); sam_used_as_perma_connection_->setLEDBuzzerDisplay(ledbuzzer); }
boost::shared_ptr<DeisterReaderProvider> DeisterReaderUnit::getDeisterReaderProvider() const { return boost::dynamic_pointer_cast<DeisterReaderProvider>(getReaderProvider()); }
std::shared_ptr<IdOnDemandReaderProvider> IdOnDemandReaderUnit::getIdOnDemandReaderProvider() const { return std::dynamic_pointer_cast<IdOnDemandReaderProvider>(getReaderProvider()); }
void ReaderUnit::unSerialize(boost::property_tree::ptree& node, const std::string& rootNode) { boost::property_tree::ptree parentNode = node.get_child(rootNode); BOOST_FOREACH(boost::property_tree::ptree::value_type const& v, parentNode) { if (v.first == getDefaultXmlNodeName()) { if (static_cast<std::string>(v.second.get_child("<xmlattr>.type").get_value<std::string>()) == getReaderProvider()->getRPType()) { boost::property_tree::ptree r = v.second; unSerialize(r); } } } }
std::shared_ptr<RFIDeasReaderProvider> RFIDeasReaderUnit::getRFIDeasReaderProvider() const { return std::dynamic_pointer_cast<RFIDeasReaderProvider>(getReaderProvider()); }
std::shared_ptr<NFCReaderProvider> NFCReaderUnit::getNFCReaderProvider() const { return std::dynamic_pointer_cast<NFCReaderProvider>(getReaderProvider()); }
bool ISO7816ReaderUnit::connectToReader() { if (getISO7816Configuration()->getSAMType() != "SAM_NONE" && getISO7816Configuration()->getSAMReaderName() == "" && getISO7816Configuration()->getCheckSAMReaderIsAvailable()) THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "SAM type specified without specifying SAM Reader Name"); if (getISO7816Configuration()->getSAMType() != "SAM_NONE") { if (getISO7816Configuration()->getCheckSAMReaderIsAvailable()) { if (getReaderProvider()->getReaderList().size() < 2) THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "Not Enough reader on the system to use SAM"); int i = 0; for (; i < static_cast<int>(getReaderProvider()->getReaderList().size()); ++i) { if (getReaderProvider()->getReaderList()[i]->getName() == getISO7816Configuration()->getSAMReaderName()) break; } if (i == (int)(getReaderProvider()->getReaderList().size())) THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "The SAM Reader specified has not been find."); } std::shared_ptr<ISO7816ReaderUnit> ret; if (d_sam_readerunit && (!getISO7816Configuration()->getCheckSAMReaderIsAvailable() || d_sam_readerunit->getName() == getISO7816Configuration()->getSAMReaderName())) { ret = d_sam_readerunit; } else { ret = getISO7816ReaderProvider()->createReaderUnit(getISO7816Configuration()->getSAMReaderName()); } if (getISO7816Configuration()->getAutoConnectToSAMReader()) { ret->connectToReader(); if (d_sam_client_context != "") { ret->setContext(d_sam_client_context); } } if (!ret->waitInsertion(1)) THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "No SAM detected on the reader"); ret->connect(); LOG(LogLevel::INFOS) << "Checking SAM backward..."; std::string SAMType = getISO7816Configuration()->getSAMType(); if (SAMType != "SAM_AUTO" && SAMType != ret->getSingleChip()->getCardType()) THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "SAM on the reader is not the same type as selected."); LOG(LogLevel::INFOS) << "SAM backward ended."; setSAMChip(std::dynamic_pointer_cast<SAMChip>(ret->getSingleChip())); setSAMReaderUnit(ret); LOG(LogLevel::INFOS) << "Starting SAM Security check..."; try { if (!getISO7816Configuration()->getSAMUnLockKey()) THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "The Unlock SAM key is empty."); if (ret->getSingleChip()->getCardType() == "SAM_AV1") std::dynamic_pointer_cast<SAMAV1ISO7816Commands>(getSAMChip()->getCommands())->authenticateHost(getISO7816Configuration()->getSAMUnLockKey(), getISO7816Configuration()->getSAMUnLockkeyNo()); else if (ret->getSingleChip()->getCardType() == "SAM_AV2") { try { std::dynamic_pointer_cast<SAMAV2ISO7816Commands>(getSAMChip()->getCommands())->lockUnlock(getISO7816Configuration()->getSAMUnLockKey(), logicalaccess::SAMLockUnlock::Unlock, getISO7816Configuration()->getSAMUnLockkeyNo(), 0, 0); } catch (CardException& ex) { if (ex.error_code() != CardException::WRONG_P1_P2) std::rethrow_exception(std::current_exception()); //try to lock the SAM in case it was already unlocked std::dynamic_pointer_cast<SAMAV2ISO7816Commands>(getSAMChip()->getCommands())->lockUnlock(getISO7816Configuration()->getSAMUnLockKey(), logicalaccess::SAMLockUnlock::LockWithoutSpecifyingKey, getISO7816Configuration()->getSAMUnLockkeyNo(), 0, 0); std::dynamic_pointer_cast<SAMAV2ISO7816Commands>(getSAMChip()->getCommands())->lockUnlock(getISO7816Configuration()->getSAMUnLockKey(), logicalaccess::SAMLockUnlock::Unlock, getISO7816Configuration()->getSAMUnLockkeyNo(), 0, 0); } } } catch (std::exception&) { setSAMChip(std::shared_ptr<SAMChip>()); setSAMReaderUnit(std::shared_ptr<ISO7816ReaderUnit>()); THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException, "The SAM Detected is not the SAM waited."); } //Set SAM unlock key to the SAM Reader in case of reconnect ret->getISO7816Configuration()->setSAMUnlockKey(getISO7816Configuration()->getSAMUnLockKey(), getISO7816Configuration()->getSAMUnLockkeyNo()); } return true; }
std::shared_ptr<ISO7816ReaderProvider> ISO7816ReaderUnit::getISO7816ReaderProvider() const { return std::dynamic_pointer_cast<ISO7816ReaderProvider>(getReaderProvider()); }
std::shared_ptr<OK5553ReaderProvider> OK5553ReaderUnit::getOK5553ReaderProvider() const { return std::dynamic_pointer_cast<OK5553ReaderProvider>(getReaderProvider()); }
std::shared_ptr<AxessTMC13ReaderProvider> AxessTMC13ReaderUnit::getAxessTMC13ReaderProvider() const { return std::dynamic_pointer_cast<AxessTMC13ReaderProvider>(getReaderProvider()); }