Branch: master

9ea67803 2015-09-18 15:54:06 Timothy Pearson
Stabilize cryptographic card login
Fix some coding style issues
M kdesktop/lock/lockdlg.cc
M kdesktop/lock/lockdlg.h
M kdesktop/lockeng.cc
M kdesktop/lockeng.h
M tdm/backend/dpylist.c
M tdm/backend/server.c
M tdm/backend/util.c
M tdm/kfrontend/kgapp.cpp
M tdm/kfrontend/kgreeter.cpp
M tdm/kfrontend/kgreeter.h
M tdm/kfrontend/kgverify.cpp
M tdm/kfrontend/kgverify.h
M tdmlib/dmctl.h
M tdmlib/kgreet_classic.cpp
M tdmlib/kgreet_classic.h
M tdmlib/kgreet_pam.cpp
M tdmlib/kgreet_pam.h
M tdmlib/kgreet_winbind.cpp
M tdmlib/kgreet_winbind.h
M tdmlib/kgreeterplugin.h
diff --git a/kdesktop/lock/lockdlg.cc b/kdesktop/lock/lockdlg.cc
index 827495c..59ad23f 100644
--- a/kdesktop/lock/lockdlg.cc
+++ b/kdesktop/lock/lockdlg.cc
@@ -43,6 +43,7 @@
 #include <tqlistview.h>
 #include <tqheader.h>
 #include <tqcheckbox.h>
+#include <tqfile.h>
 
 #include <ctype.h>
 #include <unistd.h>
@@ -79,7 +80,9 @@
 	: TQDialog(parent, "password dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))),
 	mPlugin( plugin ),
 	mCapsLocked(-1),
-	mUnlockingFailed(false)
+	mUnlockingFailed(false),
+	validUserCardInserted(false),
+	showInfoMessages(true)
 {
 	init(plugin);
 }
@@ -92,7 +95,8 @@
 	: TQDialog(parent, "password dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))),
 	mPlugin( plugin ),
 	mCapsLocked(-1),
-	mUnlockingFailed(false)
+	mUnlockingFailed(false),
+	showInfoMessages(true)
 {
 	m_lockStartDT = lockStartDateTime;
 	init(plugin);
@@ -243,6 +247,7 @@
 	mTimeoutTimerId = startTimer(PASSDLG_HIDE_TIMEOUT);
 	connect(tqApp, TQT_SIGNAL(activity()), TQT_SLOT(slotActivity()) );
 
+	greet->setInfoMessageDisplay(showInfoMessages);
 	greet->start();
 
 	DCOPRef kxkb("kxkb", "kxkb");
@@ -463,9 +468,27 @@
 		if (WIFEXITED(status)) {
 			switch (WEXITSTATUS(status)) {
 			case AuthOk:
-				greet->succeeded();
-				accept();
-				return;
+				{
+					KUser userinfo;
+					TQString fileName = userinfo.homeDir() + "/.tde_card_login_state";
+					TQFile flagFile(fileName);
+					if (validUserCardInserted) {
+						// Card was likely used to log in
+						if (flagFile.open(IO_WriteOnly)) {
+							flagFile.writeBlock("1\n", 2);
+							flagFile.close();
+						}
+					}
+					else {
+						// Card was not used to log in
+						flagFile.remove();
+					}
+
+					// Signal success
+					greet->succeeded();
+					accept();
+					return;
+				}
 			case AuthBad:
 				greet->failed();
 				mUnlockingFailed = true;
@@ -926,13 +949,22 @@
 }
 
 void PasswordDlg::attemptCardLogin() {
+	// FIXME
+	// pam_pkcs11 is extremely chatty with no apparent way to disable the unwanted messages
+	greet->setInfoMessageDisplay(false);
+
+	validUserCardInserted = true;
 	greet->start();
 	greet->next();
 }
 
 void PasswordDlg::resetCardLogin() {
+	validUserCardInserted = false;
 	greet->abort();
 	greet->start();
+
+	// Restore information message display settings
+        greet->setInfoMessageDisplay(showInfoMessages);
 }
 
 #include "lockdlg.moc"
diff --git a/kdesktop/lock/lockdlg.h b/kdesktop/lock/lockdlg.h
index 1bcb756..fb28d53 100644
--- a/kdesktop/lock/lockdlg.h
+++ b/kdesktop/lock/lockdlg.h
@@ -94,6 +94,8 @@
 		int         mTimeoutTimerId;
 		int         mCapsLocked;
 		bool        mUnlockingFailed;
+		bool        validUserCardInserted;
+		bool        showInfoMessages;
 		TQStringList layoutsList;
 		TQStringList::iterator currLayout;
 		int         sPid, sFd;
diff --git a/kdesktop/lockeng.cc b/kdesktop/lockeng.cc
index ceffd73..5173916 100644
--- a/kdesktop/lockeng.cc
+++ b/kdesktop/lockeng.cc
@@ -176,6 +176,19 @@
 		cdevice->enableCardMonitoring(true);
 	}
 
+	// Check card login status
+	KUser userinfo;
+	TQString fileName = userinfo.homeDir() + "/.tde_card_login_state";
+	TQFile flagFile(fileName);
+	if (flagFile.open(IO_ReadOnly)) {
+		TQTextStream stream(&flagFile);
+		if (stream.readLine().startsWith("1")) {
+			// Card was likely used to log in
+			TQTimer::singleShot(5000, this, SLOT(cardStartupTimeout()));
+		}
+		flagFile.close();
+	}
+
 	dBusConnect();
 }
 
@@ -204,6 +217,16 @@
 	delete m_helperThread;
 }
 
+void SaverEngine::cardStartupTimeout() {
+	if (!mValidCryptoCardInserted) {
+		// Restore saver timeout
+		configure();
+
+		// Force lock
+		lockScreen();
+	}
+}
+
 void SaverEngine::cryptographicCardInserted(TDECryptographicCardDevice* cdevice) {
 	TQString login_name = TQString::null;
 	X509CertificatePtrList certList = cdevice->cardX509Certificates();
@@ -224,7 +247,7 @@
 		KUser user;
 		if (login_name == user.loginName()) {
 			mValidCryptoCardInserted = true;
-			// Disable saver
+			// Disable saver startup
 			enable(false);
 		}
 	}
diff --git a/kdesktop/lockeng.h b/kdesktop/lockeng.h
index 5eebaa4..11f751d 100644
--- a/kdesktop/lockeng.h
+++ b/kdesktop/lockeng.h
@@ -143,6 +143,7 @@
 	 */
 	void enableExports();
 	void recoverFromHackingAttempt();
+	void cardStartupTimeout();
 
 	bool dBusReconnect();
 
diff --git a/tdm/backend/dpylist.c b/tdm/backend/dpylist.c
index b512293..0119c12 100644
--- a/tdm/backend/dpylist.c
+++ b/tdm/backend/dpylist.c
@@ -64,12 +64,12 @@
 
 	for (d = displays; d; d = d->next)
 		switch (d->status) {
-		case notRunning:
-		case textMode:
-		case reserve:
-			break;
-		default:
-			return 1;
+			case notRunning:
+			case textMode:
+			case reserve:
+				break;
+			default:
+				return 1;
 		}
 	return 0;
 }
@@ -79,9 +79,11 @@
 {
 	struct display *d;
 
-	for (d = displays; d; d = d->next)
-		if ((d->displayType & d_lifetime) == dReserve)
+	for (d = displays; d; d = d->next) {
+		if ((d->displayType & d_lifetime) == dReserve) {
 			return 1;
+		}
+	}
 	return 0;
 }
 
@@ -91,9 +93,11 @@
 	struct display *d;
 	int cnt = 0;
 
-	for (d = displays; d; d = d->next)
-		if (d->status == reserve)
+	for (d = displays; d; d = d->next) {
+		if (d->status == reserve) {
 			cnt++;
+		}
+	}
 	return cnt;
 }
 
@@ -102,9 +106,11 @@
 {
 	struct display *d, *rd;
 
-	for (rd = 0, d = displays; d; d = d->next)
-		if (d->status == reserve)
+	for (rd = 0, d = displays; d; d = d->next) {
+		if (d->status == reserve) {
 			rd = d;
+		}
+	}
 	if (rd) {
 		rd->idleTimeout = lt;
 		rd->status = notRunning;
@@ -129,8 +135,9 @@
 _forEachDisplayRev( struct display *d, void (*f)( struct display * ) )
 {
 	if (d) {
-		if (d->next)
-			_forEachDisplayRev( d->next, f );
+		if (d->next) {
+			_forEachDisplayRev(d->next, f);
+		}
 		(*f)( d );
 	}
 }
@@ -147,9 +154,11 @@
 {
 	struct display *d;
 ** Diff limit reached (max: 250 lines) **