5b260a96 | 2015-09-17 18:33:37 | Timothy Pearson |
Fix cryptographic card login when SAK is enabled |
||
M tdm/kfrontend/kgreeter.cpp M tdm/kfrontend/kgreeter.h M tdm/kfrontend/kgverify.cpp M tdm/kfrontend/kgverify.h M tdm/kfrontend/sakdlg.cc M tdm/kfrontend/sakdlg.h |
||
diff --git a/tdm/kfrontend/kgreeter.cpp b/tdm/kfrontend/kgreeter.cpp index d3ee07d..945110d 100644 --- a/tdm/kfrontend/kgreeter.cpp +++ b/tdm/kfrontend/kgreeter.cpp @@ -219,17 +219,6 @@ pluginList = KGVerify::init( _pluginsLogin ); } - // Initialize SmartCard readers - TDEGenericDevice *hwdevice; - TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices(); - TDEGenericHardwareList cardReaderList = hwdevices->listByDeviceClass(TDEGenericDeviceType::CryptographicCard); - for (hwdevice = cardReaderList.first(); hwdevice; hwdevice = cardReaderList.next()) { - TDECryptographicCardDevice* cdevice = static_cast<TDECryptographicCardDevice*>(hwdevice); - connect(cdevice, TQT_SIGNAL(certificateListAvailable(TDECryptographicCardDevice*)), this, TQT_SLOT(cryptographicCardInserted(TDECryptographicCardDevice*))); - connect(cdevice, TQT_SIGNAL(cardRemoved(TDECryptographicCardDevice*)), this, TQT_SLOT(cryptographicCardRemoved(TDECryptographicCardDevice*))); - cdevice->enableCardMonitoring(true); - } - mControlPipeHandlerThread = new TQEventLoopThread(); mControlPipeHandler = new ControlPipeHandlerObject(); mControlPipeHandler->mKGreeterParent = this; @@ -250,6 +239,19 @@ delete userList; delete verify; delete stsFile; +} + +void KGreeter::cryptographicCardWatcherSetup() { + // Initialize SmartCard readers + TDEGenericDevice *hwdevice; + TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices(); + TDEGenericHardwareList cardReaderList = hwdevices->listByDeviceClass(TDEGenericDeviceType::CryptographicCard); + for (hwdevice = cardReaderList.first(); hwdevice; hwdevice = cardReaderList.next()) { + TDECryptographicCardDevice* cdevice = static_cast<TDECryptographicCardDevice*>(hwdevice); + connect(cdevice, TQT_SIGNAL(certificateListAvailable(TDECryptographicCardDevice*)), this, TQT_SLOT(cryptographicCardInserted(TDECryptographicCardDevice*))); + connect(cdevice, TQT_SIGNAL(cardRemoved(TDECryptographicCardDevice*)), this, TQT_SLOT(cryptographicCardRemoved(TDECryptographicCardDevice*))); + cdevice->enableCardMonitoring(true); + } } void KGreeter::done(int r) { @@ -1047,6 +1049,8 @@ pluginSetup(); verify->start(); + + TQTimer::singleShot(0, this, SLOT(cryptographicCardWatcherSetup())); } void @@ -1194,6 +1198,8 @@ pluginSetup(); verify->start(); + + TQTimer::singleShot(0, this, SLOT(cryptographicCardWatcherSetup())); } bool diff --git a/tdm/kfrontend/kgreeter.h b/tdm/kfrontend/kgreeter.h index fa24622..793a034 100644 --- a/tdm/kfrontend/kgreeter.h +++ b/tdm/kfrontend/kgreeter.h @@ -112,6 +112,9 @@ public: TQString curUser, curWMSession, dName; + protected slots: + void cryptographicCardWatcherSetup(); + protected: void readFacesList(); void installUserList(); diff --git a/tdm/kfrontend/kgverify.cpp b/tdm/kfrontend/kgverify.cpp index a02cc1c..a25fac8 100644 --- a/tdm/kfrontend/kgverify.cpp +++ b/tdm/kfrontend/kgverify.cpp @@ -91,6 +91,7 @@ , suspended(false) , failed(false) , isClear(true) + , inGreeterPlugin(false) , abortRequested(false) { connect( &timer, TQT_SIGNAL(timeout()), TQT_SLOT(slotTimeout()) ); @@ -360,21 +361,22 @@ { // assert( !cont ); if (running) { - Debug( "%s->abort()\n", pName.data() ); + Debug("%s->abort()\n", pName.data()); greet->abort(); } handler->verifyClear(); - Debug( "%s->clear()\n", pName.data() ); + Debug("%s->clear()\n", pName.data()); greet->clear(); curUser = TQString::null; - if (!scheduleAutoLogin( initial )) { + if (!scheduleAutoLogin(initial)) { isClear = !(isClear && applyPreset()); if (running) { Debug( "%s->start()\n", pName.data() ); greet->start(); } - if (!failed) + if (!failed) { timer.stop(); + } } } @@ -388,6 +390,9 @@ KGVerify::requestAbort() { abortRequested = true; + if (inGreeterPlugin) { + greet->next(); + } } void @@ -615,7 +620,9 @@ ndelay = GRecvInt(); Debug( " ndelay = %d\n%s->textPrompt(...)\n", ndelay, pName.data() ); if (abortRequested) { + inGreeterPlugin = true; greet->textPrompt("", echo, ndelay); + inGreeterPlugin = !ndelay; abortRequested = false; } else { @@ -623,10 +630,14 @@ // Reset password entry and change text setPassPromptText(msg); greet->start(); + inGreeterPlugin = true; greet->textPrompt(msg, echo, ndelay); + inGreeterPlugin = !ndelay; } else { + inGreeterPlugin = true; greet->textPrompt(msg, echo, ndelay); + inGreeterPlugin = !ndelay; } } if (msg) { @@ -641,10 +652,11 @@ Debug( " ndelay = %d\n%s->binaryPrompt(...)\n", ndelay, pName.data() ); if (abortRequested) { gplugReturnBinary(NULL); - abortRequested = false; } else { + inGreeterPlugin = true; greet->binaryPrompt( msg, ndelay ); + inGreeterPlugin = !ndelay; } if (msg) { free(msg); @@ -679,6 +691,7 @@ Debug("%s->succeeded()\n", pName.data()); greet->succeeded(); abortRequested = false; + inGreeterPlugin = false; continue; case V_CHTOK_AUTH: Debug( " V_CHTOK_AUTH\n" ); @@ -695,6 +708,7 @@ Debug( "%s->succeeded()\n", pName.data() ); greet->succeeded(); abortRequested = false; + inGreeterPlugin = false; KGChTok chtok( parent, user, pluginList, curPlugin, nfunc, KGreeterPlugin::Login ); if (!chtok.exec()) { goto retry; @@ -706,13 +720,16 @@ Debug( " V_MSG_ERR\n" ); msg = GRecvStr(); Debug( " %s->textMessage(%\"s, true)\n", pName.data(), msg ); + inGreeterPlugin = true; if (!greet->textMessage( msg, true )) { + inGreeterPlugin = false; Debug( " message passed\n" ); if (!abortRequested) { VErrBox( parent, user, msg ); } } else { + inGreeterPlugin = false; Debug( " message swallowed\n" ); } if (msg) { @@ -723,13 +740,16 @@ Debug( " V_MSG_INFO\n" ); msg = GRecvStr(); Debug( " %s->textMessage(%\"s, false)\n", pName.data(), msg ); + inGreeterPlugin = true; if (!greet->textMessage( msg, false )) { + inGreeterPlugin = false; Debug( " message passed\n" ); if (!abortRequested) { VInfoBox(parent, user, msg); } } else { + inGreeterPlugin = false; Debug(" message swallowed\n"); } free(msg); @@ -751,6 +771,7 @@ Debug( "%s->failed()\n", pName.data() ); greet->failed(); abortRequested = false; + inGreeterPlugin = false; MsgBox( sorrybox, i18n("Authenticated user (%1) does not match requested user (%2).\n") .arg( ent ).arg( fixedEntity ) ); @@ -760,6 +781,7 @@ Debug( "%s->succeeded()\n", pName.data() ); greet->succeeded(); abortRequested = false; + inGreeterPlugin = false; handler->verifyOk(); return; } @@ -767,6 +789,7 @@ Debug( "%s->failed()\n", pName.data() ); greet->failed(); abortRequested = false; + inGreeterPlugin = false; // Reset password prompt text setPassPromptText(TQString::null, true); @@ -788,8 +811,9 @@ running = true; Debug( "%s->start()\n", pName.data() ); greet->start(); - if (!cont) + if (!cont) { return; + } user = TQString::null; } } @@ -1043,8 +1067,9 @@ delete greet; selectPlugin( id ); handler->verifyPluginChanged( id ); ** Diff limit reached (max: 250 lines) ** |