//
PCSCMonitor::PCSCMonitor(Server &server, const char* pathToCache, ServiceLevel level)
: Listener(kNotificationDomainPCSC, SecurityServer::kNotificationAllEvents),
+ MachServer::Timer(true),
server(server),
mServiceLevel(level),
- MachServer::Timer(true),
mCachePath(pathToCache),
mTokenCache(NULL)
{
// enumerate all current readers.
vector<string> names;
mSession.listReaders(names);
- secdebug("pcsc", "%ld reader(s) in system", names.size());
+ secinfo("pcsc", "%ld reader(s) in system", names.size());
// Update PCSC states array with new/removed readers.
for (vector<PCSC::ReaderState>::iterator stateIt = states.begin(); stateIt != states.end(); ) {
if (nameIt == names.end()) {
// Reader was removed from the system.
if (Reader *reader = stateIt->userData<Reader>()) {
- secdebug("pcsc", "removing reader %s", stateIt->name());
+ secinfo("pcsc", "removing reader %s", stateIt->name());
Syslog::notice("Token reader %s removed from system", stateIt->name());
reader->kill(); // prepare to die
mReaders.erase(reader->name()); // remove from reader map
{
switch (mServiceLevel) {
case forcedOff:
- secdebug("pcsc", "smartcard operation is FORCED OFF");
+ secinfo("pcsc", "smartcard operation is FORCED OFF");
break;
case externalDaemon:
- secdebug("pcsc", "using PCSC");
+ secinfo("pcsc", "using PCSC");
startSoftTokens();
// Start PCSC reader watching thread.
}
}
+//
+// Remove some types of readers
+//
+void PCSCMonitor::clearReaders(Reader::Type type)
+{
+ if (!mReaders.empty()) {
+ secinfo("pcsc", "%ld readers present - clearing type %d", mReaders.size(), type);
+ for (ReaderMap::iterator it = mReaders.begin(); it != mReaders.end(); ) {
+ ReaderMap::iterator cur = it++;
+ Reader *reader = cur->second;
+ if (reader->isType(type)) {
+ secinfo("pcsc", "removing reader %s", reader->name().c_str());
+ reader->kill(); // prepare to die
+ mReaders.erase(cur);
+ }
+ }
+ }
+}
//
// Software token support
//
void PCSCMonitor::startSoftTokens()
{
+ // clear all software readers. This will kill the respective TokenDaemons
+ clearReaders(Reader::software);
+
// scan for new ones
CodeRepository<Bundle> candidates("Security/tokend", ".tokend", "TOKENDAEMONPATH", false);
candidates.update();
reader->name(), reader->pcscState(), reader->cache);
if (tokend->state() == ServerChild::dead) { // ah well, this one's no good
- secdebug("pcsc", "softtoken %s tokend launch failed", bundleName.c_str());
+ secinfo("pcsc", "softtoken %s tokend launch failed", bundleName.c_str());
Syslog::notice("Software token %s failed to run", tokendBundle->canonicalPath().c_str());
return;
}
// probe the (single) tokend
if (!tokend->probe()) { // non comprende...
- secdebug("pcsc", "softtoken %s probe failed", bundleName.c_str());
+ secinfo("pcsc", "softtoken %s probe failed", bundleName.c_str());
Syslog::notice("Software token %s refused operation", tokendBundle->canonicalPath().c_str());
return;
}
reader->insertToken(tokend);
Syslog::notice("Software token %s activated", bundleName.c_str());
} catch (...) {
- secdebug("pcsc", "exception loading softtoken %s - continuing", tokendBundle->identifier().c_str());
+ secinfo("pcsc", "exception loading softtoken %s - continuing", tokendBundle->identifier().c_str());
}
}