Branch: master

6f5e7b21 2015-09-18 23:01:01 Timothy Pearson
Streamline cryptographic card logon process
M kdesktop/lock/lockdlg.cc
M kdesktop/lock/lockprocess.cc
M kdesktop/lock/lockprocess.h
M tdm/kfrontend/kgreeter.cpp
M tdm/kfrontend/kgverify.cpp
M tdm/kfrontend/kgverify.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 59ad23f..3ae0efa 100644
--- a/kdesktop/lock/lockdlg.cc
+++ b/kdesktop/lock/lockdlg.cc
@@ -276,6 +276,10 @@
 		mLayoutButton->hide(); // no kxkb running
 	}
 	capsLocked();
+
+	if (static_cast< LockProcess* >(parent())->cryptographicCardDevice()) {
+		attemptCardLogin();
+	}
 }
 
 PasswordDlg::~PasswordDlg()
@@ -954,14 +958,32 @@
 	greet->setInfoMessageDisplay(false);
 
 	validUserCardInserted = true;
-	greet->start();
-	greet->next();
+	greet->setPasswordPrompt(i18n("PIN:"));
+
+	// Force relayout
+	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->setPassword(autoPIN);
+			greet->next();
+		}
+	}
 }
 
 void PasswordDlg::resetCardLogin() {
 	validUserCardInserted = false;
 	greet->abort();
 	greet->start();
+	greet->setPasswordPrompt(TQString::null);
+
+	// Force relayout
+	setFixedSize(sizeHint().width(), sizeHint().height() + 1);
+	setFixedSize(sizeHint());
 
 	// Restore information message display settings
         greet->setInfoMessageDisplay(showInfoMessages);
diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc
index 494852e..38526d6 100644
--- a/kdesktop/lock/lockprocess.cc
+++ b/kdesktop/lock/lockprocess.cc
@@ -228,6 +228,7 @@
 	m_dialogPrevX(0),
 	m_dialogPrevY(0),
 	m_notifyReadyRequested(false),
+	m_loginCardDevice(NULL),
 	m_maskWidget(NULL),
 	m_saverRootWindow(0)
 {
@@ -300,7 +301,7 @@
 	for (hwdevice = cardReaderList.first(); hwdevice; hwdevice = cardReaderList.next()) {
 		TDECryptographicCardDevice* cdevice = static_cast<TDECryptographicCardDevice*>(hwdevice);
 		// connect(cdevice, SIGNAL(pinRequested(TQString,TDECryptographicCardDevice*)), this, SLOT(cryptographicCardPinRequested(TQString,TDECryptographicCardDevice*)));
-		connect(cdevice, TQT_SIGNAL(cardInserted(TDECryptographicCardDevice*)), this, TQT_SLOT(cryptographicCardInserted(TDECryptographicCardDevice*)));
+		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);
 		// cdevice->enablePINEntryCallbacks(true);
@@ -2846,6 +2847,7 @@
 			}
 
 			// Pass login to the PAM stack...
+			m_loginCardDevice = cdevice;
 			if (dynamic_cast<SAKDlg*>(currentDialog)) {
 				dynamic_cast<SAKDlg*>(currentDialog)->closeDialogForced();
 				TQTimer::singleShot(0, this, SLOT(signalPassDlgToAttemptCardLogin()));
@@ -2867,17 +2869,18 @@
 		passDlg->resetCardLogin();
 	}
 	else {
+		m_loginCardDevice = NULL;
 		TQTimer::singleShot(0, this, SLOT(signalPassDlgToAttemptCardAbort()));
 	}
 }
 
 void LockProcess::signalPassDlgToAttemptCardLogin() {
 	PasswordDlg* passDlg = dynamic_cast<PasswordDlg*>(currentDialog);
-	if (passDlg) {
+	if (passDlg && m_loginCardDevice) {
 		passDlg->attemptCardLogin();
 	}
 	else {
-		if (currentDialog) {
+		if (currentDialog && m_loginCardDevice) {
 			// Try again later
 			TQTimer::singleShot(0, this, SLOT(signalPassDlgToAttemptCardLogin()));
 		}
@@ -2915,6 +2918,10 @@
 	}
 }
 
+TDECryptographicCardDevice* LockProcess::cryptographicCardDevice() {
+	return m_loginCardDevice;
+}
+
 void LockProcess::fullyOnline() {
 	if (!mFullyOnlineSent) {
 		if (kdesktop_pid > 0) {
diff --git a/kdesktop/lock/lockprocess.h b/kdesktop/lock/lockprocess.h
index dafd2ae..4dc2d8b 100644
--- a/kdesktop/lock/lockprocess.h
+++ b/kdesktop/lock/lockprocess.h
@@ -105,6 +105,8 @@
 		void msgBox( TQMessageBox::Icon type, const TQString &txt );
 		int execDialog( TQDialog* dlg );
 
+		TDECryptographicCardDevice* cryptographicCardDevice();
+
 	signals:
 		void terminateHelperThread();
 
@@ -232,7 +234,7 @@
 		bool        mInfoMessageDisplayed;
 		bool        mDialogControlLock;
 		bool        mForceReject;
-		TQDialog     *currentDialog;
+		TQDialog    *currentDialog;
 
 		TQTimer*    mEnsureScreenHiddenTimer;
 		TQTimer*    mForceContinualLockDisplayTimer;
@@ -250,7 +252,7 @@
 		bool        mHackActive;
 
 		TQPixmap    backingPixmap;
-		KRootPixmap  *m_rootPixmap;
+		KRootPixmap *m_rootPixmap;
 		int         mBackingStartupDelayTimer;
 		TQPixmap    mArgbTransparentBackgroundPixmap;
 
@@ -265,6 +267,7 @@
 		int m_dialogPrevY;
 
 		bool m_notifyReadyRequested;
+		TDECryptographicCardDevice* m_loginCardDevice;
 
 		TQWidget* m_maskWidget;
 		Window m_saverRootWindow;
diff --git a/tdm/kfrontend/kgreeter.cpp b/tdm/kfrontend/kgreeter.cpp
index 15b3258..e14e584 100644
--- a/tdm/kfrontend/kgreeter.cpp
+++ b/tdm/kfrontend/kgreeter.cpp
@@ -899,9 +899,16 @@
 			// pam_pkcs11 is extremely chatty with no apparent way to disable the unwanted messages
 			verify->setInfoMessageDisplay(false);
 
-			// Initiate login
+			// Set up password prompt
 			cardLoginUser = login_name;
-			verify->accept();
+			verify->setPasswordPrompt(i18n("PIN:"));
+
+			TQString autoPIN = cdevice->autoPIN(); 
+			if (autoPIN != TQString::null) {
+				// Initiate login
+				verify->setPassword(autoPIN);
+				verify->accept();
+			}
 		}
 	}
 }
@@ -910,6 +917,7 @@
 	cardLoginUser = TQString::null;
 	verify->lockUserEntry(false);
         verify->requestAbort();
+        verify->setPasswordPrompt(TQString::null);
 
 	// Restore information message display settings
         verify->setInfoMessageDisplay(showInfoMessages);
@@ -1128,8 +1136,9 @@
 	xauth_warning = themer->findNode( "xauth-warning" ); // tdm ext
 	pam_error = themer->findNode( "pam-error" );
 	timed_label = themer->findNode( "timed-label" );
-	if (pam_error && pam_error->isA( "KdmLabel" ))
+	if (pam_error && pam_error->isA( "KdmLabel" )) {
 		static_cast<KdmLabel*>(pam_error)->setText( i18n("Login Failed.") );
+	}
 
 	KdmItem *itm;
 	if ((itm = themer->findNode( "pam-message" ))) // done via msgboxes
@@ -1291,6 +1300,10 @@
 			timed_label->hide( true );
 		}
 	}
+
+	if (cardLoginUser != TQString::null) {
+		verify->setPasswordPrompt(i18n("PIN:"));
+	}
 }
 
 void
diff --git a/tdm/kfrontend/kgverify.cpp b/tdm/kfrontend/kgverify.cpp
index cc20d54..6e6b685 100644
--- a/tdm/kfrontend/kgverify.cpp
+++ b/tdm/kfrontend/kgverify.cpp
@@ -295,6 +295,18 @@
 }
 
 void
+KGVerify::setPasswordPrompt(const TQString &prompt)
+{
+	greet->setPasswordPrompt(prompt);
+	if (prompt != TQString::null) {
+		setPassPromptText(prompt, false);
+	}
+	else {
+		setPassPromptText(TQString::null, true);
+	}
+}
+
+void
 KGVerify::start()
 {
 	authTok = (func == KGreeterPlugin::ChAuthTok);
diff --git a/tdm/kfrontend/kgverify.h b/tdm/kfrontend/kgverify.h
index 278cc0d..2ab3ff3 100644
--- a/tdm/kfrontend/kgverify.h
+++ b/tdm/kfrontend/kgverify.h
@@ -103,6 +103,7 @@
 	void lockUserEntry( const bool lock );
 	void setPassword( const TQString &pass );
 	void setInfoMessageDisplay( bool on );
+	void setPasswordPrompt(const TQString &prompt);
 	/* virtual */ void selectPlugin( int id );
 	bool entitiesLocal() const;
 	bool entitiesFielded() const;
diff --git a/tdmlib/kgreet_classic.cpp b/tdmlib/kgreet_classic.cpp
index 7eb9835..f99acfb 100644
--- a/tdmlib/kgreet_classic.cpp
+++ b/tdmlib/kgreet_classic.cpp
@@ -67,6 +67,7 @@
 	exp( -1 ),
 	pExp( -1 ),
 	running( false ),
+	userEntryLocked(false),
 	suppressInfoMsg(false)
 {
 	KdmItem *user_entry = 0, *pw_entry = 0;
 ** Diff limit reached (max: 250 lines) **