Branch: master

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) **