Branch: master

37b6d0d8 2015-10-02 19:58:14 Timothy Pearson
Fix cryptographic card login process
M kdesktop/lock/lockdlg.cc
M tdm/kfrontend/kgreeter.cpp
M tdm/kfrontend/kgverify.cpp
M tdm/kfrontend/kgverify.h
M tdmlib/kgreet_classic.cpp
diff --git a/kdesktop/lock/lockdlg.cc b/kdesktop/lock/lockdlg.cc
index 677b412..8202a7f 100644
--- a/kdesktop/lock/lockdlg.cc
+++ b/kdesktop/lock/lockdlg.cc
@@ -546,9 +546,24 @@
 				// Reset password entry and change text
 				greet->start();
 				greet->textPrompt( arr, false, false );
+
 				// Force relayout
 				setFixedSize( sizeHint().width(), sizeHint().height() + 1 );
 				setFixedSize( sizeHint() );
+
+				// Check if cryptographic card login is being used
+				if (mCardLoginInProgress) {
+					// Attempt authentication if configured
+					TDECryptographicCardDevice* cdevice = static_cast<LockProcess*>(parent())->cryptographicCardDevice();
+					if (cdevice) {
+						TQString autoPIN = cdevice->autoPIN();
+						if (autoPIN != TQString::null) {
+							greet->setPassword(autoPIN);
+							TQTimer::singleShot(0, this, SLOT(slotOK()));
+						}
+					}
+					mCardLoginInProgress = false;
+				}
 			}
 			else {
 				greet->textPrompt( arr, false, false );
@@ -971,21 +986,17 @@
 	setFixedSize(sizeHint().width(), sizeHint().height() + 1);
 	setFixedSize(sizeHint());
 
-	// Attempt authentication if configured
-	TDECryptographicCardDevice* cdevice = static_cast<LockProcess*>(parent())->cryptographicCardDevice();
-	if (cdevice) {
-		TQString autoPIN = cdevice->autoPIN();
-		if (autoPIN != TQString::null) {
-			greet->start();
-			greet->setPassword(autoPIN);
-			TQTimer::singleShot(0, this, SLOT(slotOK()));
-		}
-	}
+	// Bypass initial password prompt
+	greet->start();
+	greet->setPassword("");
+	TQTimer::singleShot(0, this, SLOT(slotOK()));
 }
 
 void PasswordDlg::resetCardLogin() {
 	validUserCardInserted = false;
 	greet->abort();
+	greet->clear();
+	greet->revive();
 	greet->start();
 	greet->setPasswordPrompt(TQString::null);
 
diff --git a/tdm/kfrontend/kgreeter.cpp b/tdm/kfrontend/kgreeter.cpp
index e14e584..3fdbc60 100644
--- a/tdm/kfrontend/kgreeter.cpp
+++ b/tdm/kfrontend/kgreeter.cpp
@@ -869,6 +869,12 @@
 	}
 
 	if (login_name != "") {
+		if (verify->cardLoginInProgress) {
+			return;
+		}
+		verify->cardLoginInProgress = true;
+		verify->cardLoginDevice = cdevice;
+
 		DM dm;
 		SessList sess;
 		bool vt_active = false;
@@ -903,12 +909,10 @@
 			cardLoginUser = login_name;
 			verify->setPasswordPrompt(i18n("PIN:"));
 
-			TQString autoPIN = cdevice->autoPIN(); 
-			if (autoPIN != TQString::null) {
-				// Initiate login
-				verify->setPassword(autoPIN);
-				verify->accept();
-			}
+			// Bypass initial password prompt
+			verify->start();
+			verify->setPassword("");
+			verify->accept();
 		}
 	}
 }
@@ -921,6 +925,9 @@
 
 	// Restore information message display settings
         verify->setInfoMessageDisplay(showInfoMessages);
+
+	verify->cardLoginInProgress = false;
+	verify->cardLoginDevice = NULL;
 }
 
 KStdGreeter::KStdGreeter()
diff --git a/tdm/kfrontend/kgverify.cpp b/tdm/kfrontend/kgverify.cpp
index 6e6b685..a3464a5 100644
--- a/tdm/kfrontend/kgverify.cpp
+++ b/tdm/kfrontend/kgverify.cpp
@@ -32,6 +32,11 @@
 #include "themer/tdmitem.h"
 #include "themer/tdmlabel.h"
 
+#include <ksslcertificate.h>
+
+#include <tdehardwaredevices.h>
+#include <tdecryptographiccarddevice.h>
+
 #include <tdeapplication.h>
 #include <tdelocale.h>
 #include <klibloader.h>
@@ -93,6 +98,8 @@
 	, isClear(true)
 	, inGreeterPlugin(false)
 	, abortRequested(false)
+	, cardLoginInProgress(false)
+	, cardLoginDevice(NULL)
 {
 	connect( &timer, TQT_SIGNAL(timeout()), TQT_SLOT(slotTimeout()) );
 	connect( kapp, TQT_SIGNAL(activity()), TQT_SLOT(slotActivity()) );
@@ -654,6 +661,16 @@
 					inGreeterPlugin = true;
 					greet->textPrompt(msg, echo, ndelay);
 					inGreeterPlugin = !ndelay;
+
+					if (cardLoginInProgress) {
+						TQString autoPIN = cardLoginDevice->autoPIN(); 
+						if (autoPIN != TQString::null) {
+							// Initiate login
+							setPassword(autoPIN);
+							accept();
+						}
+						cardLoginInProgress = false;
+					}
 				}
 				else {
 					inGreeterPlugin = true;
diff --git a/tdm/kfrontend/kgverify.h b/tdm/kfrontend/kgverify.h
index 2ab3ff3..9935459 100644
--- a/tdm/kfrontend/kgverify.h
+++ b/tdm/kfrontend/kgverify.h
@@ -77,6 +77,7 @@
 class TQTimer;
 class KPushButton;
 class KLibrary;
+class TDECryptographicCardDevice;
 
 struct GreeterPluginHandle {
 	KLibrary *library;
@@ -180,6 +181,9 @@
 	virtual void gplugMsgBox( TQMessageBox::Icon type, const TQString &text );
 
 	static TQVariant getConf( void *ctx, const char *key, const TQVariant &dflt );
+
+	bool cardLoginInProgress;
+	TDECryptographicCardDevice* cardLoginDevice;
 };
 
 class KGStdVerify : public KGVerify {
diff --git a/tdmlib/kgreet_classic.cpp b/tdmlib/kgreet_classic.cpp
index 24fe32e..bb968d4 100644
--- a/tdmlib/kgreet_classic.cpp
+++ b/tdmlib/kgreet_classic.cpp
@@ -307,7 +307,7 @@
 		return true;
 	}
 	if ((!err && ((TQString(text).lower().find("smartcard") >= 0) || (TQString(text).lower().find("smart card") >= 0)))
-		||(err && (TQString(text).lower().find(" 2306:") >= 0))) {
+		|| (err && (TQString(text).lower().find(" 2306:") >= 0)) || (err && (TQString(text).lower().find("PKINIT") >= 0))) {
 		// FIXME
 		// pam_pkcs11 is extremely chatty, even with no card inserted,
 		// and there is no apparent way to disable the unwanted messages!