From a09c5ab8dfb62eec33fb6954e2506c4633c17daa Mon Sep 17 00:00:00 2001
From: tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>
Date: Thu, 8 Apr 2010 07:27:32 +0000
Subject: Added remaining kdesktop lock prompts to allow for interactive
 two-factor authentication with a SmartCard or fingerprint reader via a
 background (root) process

git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1112439 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
---
 kdesktop/lock/Makefile.am    |  4 +--
 kdesktop/lock/infodlg.cc     | 15 ++++++++++
 kdesktop/lock/infodlg.h      |  3 ++
 kdesktop/lock/lockprocess.cc | 66 ++++++++++++++++++++++++++++++++++----------
 kdesktop/lock/lockprocess.h  |  4 +++
 5 files changed, 76 insertions(+), 16 deletions(-)

diff --git a/kdesktop/lock/Makefile.am b/kdesktop/lock/Makefile.am
index e9963ffab..42c1b770a 100644
--- a/kdesktop/lock/Makefile.am
+++ b/kdesktop/lock/Makefile.am
@@ -8,9 +8,9 @@ kdesktop_lock_LDADD    = ../libkdesktopsettings.la ../../kdmlib/libdmctl.la $(LI
 
 bin_PROGRAMS = kdesktop_lock
 
-kdesktop_lock_SOURCES = lockprocess.cc lockdlg.cc infodlg.cc autologout.cc main.cc
+kdesktop_lock_SOURCES = lockprocess.cc lockdlg.cc infodlg.cc querydlg.cc autologout.cc main.cc
 
-noinst_HEADERS = lockprocess.h lockdlg.h infodlg.h autologout.h main.h
+noinst_HEADERS = lockprocess.h lockdlg.h infodlg.h querydlg.cc autologout.h main.h
 
 METASOURCES = AUTO
 
diff --git a/kdesktop/lock/infodlg.cc b/kdesktop/lock/infodlg.cc
index 86351dd7b..66b54c0bc 100644
--- a/kdesktop/lock/infodlg.cc
+++ b/kdesktop/lock/infodlg.cc
@@ -103,11 +103,26 @@ void InfoDlg::setUnlockIcon()
     mpixLabel->setPixmap(DesktopIcon("unlock"));
 }
 
+void InfoDlg::setKDEIcon()
+{
+    mpixLabel->setPixmap(DesktopIcon("about_kde"));
+}
+
+void InfoDlg::setInfoIcon()
+{
+    mpixLabel->setPixmap(DesktopIcon("messagebox_info"));
+}
+
 void InfoDlg::setWarningIcon()
 {
     mpixLabel->setPixmap(DesktopIcon("messagebox_warning"));
 }
 
+void InfoDlg::setErrorIcon()
+{
+    mpixLabel->setPixmap(DesktopIcon("messagebox_critical"));
+}
+
 void InfoDlg::show()
 {
     QDialog::show();
diff --git a/kdesktop/lock/infodlg.h b/kdesktop/lock/infodlg.h
index 2eedf6269..ffe8364c2 100644
--- a/kdesktop/lock/infodlg.h
+++ b/kdesktop/lock/infodlg.h
@@ -33,7 +33,10 @@ public:
 
     void updateLabel( QString &txt );
     void setUnlockIcon();
+    void setKDEIcon();
+    void setInfoIcon();
     void setWarningIcon();
+    void setErrorIcon();
 
 private:
     QFrame      *frame;
diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc
index f0f53ae1e..2664c1c24 100644
--- a/kdesktop/lock/lockprocess.cc
+++ b/kdesktop/lock/lockprocess.cc
@@ -20,6 +20,7 @@
 #include "lockprocess.h"
 #include "lockdlg.h"
 #include "infodlg.h"
+#include "querydlg.h"
 #include "autologout.h"
 #include "kdesktopsettings.h"
 
@@ -121,6 +122,7 @@ LockProcess::LockProcess(bool child, bool useBlankOnly)
       mForbidden(false),
       mAutoLogout(false),
       mPipeOpen(false),
+      mPipeOpen_out(false),
       mInfoMessageDisplayed(false),
       mForceReject(false)
 {
@@ -208,7 +210,7 @@ LockProcess::~LockProcess()
     }
 
     mPipeOpen = false;
-    //close(mPipe_fd);
+    mPipeOpen_out = false;
 }
 
 static int signal_pipe[2];
@@ -237,16 +239,24 @@ void LockProcess::timerEvent(QTimerEvent *ev)
 
 void LockProcess::setupPipe()
 {
-    /* Create the FIFO if it does not exist */
+    /* Create the FIFOs if they do not exist */
     umask(0);
-    unlink(FIFO_DIR);
-    mkdir(FIFO_DIR,0600);
-    mknod(FIFO_FILE, S_IFIFO|0600, 0);
+    mkdir(FIFO_DIR,0644);
+    mknod(FIFO_FILE, S_IFIFO|0644, 0);
+    chmod(FIFO_FILE, 0644);
 
     mPipe_fd = open(FIFO_FILE, O_RDONLY | O_NONBLOCK);
     if (mPipe_fd > -1) {
         mPipeOpen = true;
-        QTimer::singleShot( 100, this, SLOT(checkPipe()) );
+        QTimer::singleShot( PIPE_CHECK_INTERVAL, this, SLOT(checkPipe()) );
+    }
+
+    mknod(FIFO_FILE_OUT, S_IFIFO|0600, 0);
+    chmod(FIFO_FILE_OUT, 0600);
+
+    mPipe_fd_out = open(FIFO_FILE_OUT, O_RDWR | O_NONBLOCK);
+    if (mPipe_fd_out > -1) {
+        mPipeOpen_out = true;
     }
 }
 
@@ -255,6 +265,7 @@ void LockProcess::checkPipe()
     char readbuf[128];
     int numread;
     QString to_display;
+    const char * pin_entry;
 
     if (mPipeOpen == true) {
         readbuf[0]=' ';
@@ -262,7 +273,6 @@ void LockProcess::checkPipe()
         readbuf[numread] = 0;
         if (numread > 0) {
             if (readbuf[0] == 'C') {
-                printf("Clearing info box!\n\r");
                 mInfoMessageDisplayed=false;
                 if (currentDialog != NULL) {
                     mForceReject = true;
@@ -272,7 +282,6 @@ void LockProcess::checkPipe()
             if (readbuf[0] == 'T') {
                 to_display = readbuf;
                 to_display = to_display.remove(0,1);
-                printf("Will display info message: %s\n", to_display.ascii());
                 // Lock out password dialogs and close any active dialog
                 mInfoMessageDisplayed=true;
                 if (currentDialog != NULL) {
@@ -280,7 +289,7 @@ void LockProcess::checkPipe()
                     currentDialog->close();
                 }
                 // Display info message dialog
-                QTimer::singleShot( 100, this, SLOT(checkPipe()) );
+                QTimer::singleShot( PIPE_CHECK_INTERVAL, this, SLOT(checkPipe()) );
                 InfoDlg inDlg( this );
                 inDlg.updateLabel(to_display);
                 inDlg.setUnlockIcon();
@@ -288,10 +297,9 @@ void LockProcess::checkPipe()
                 mForceReject = false;
                 return;
             }
-            if (readbuf[0] == 'E') {
+            if ((readbuf[0] == 'E') || (readbuf[0] == 'W') || (readbuf[0] == 'I') || (readbuf[0] == 'K')) {
                 to_display = readbuf;
                 to_display = to_display.remove(0,1);
-                printf("Will display error message: %s\n", to_display.ascii());
                 // Lock out password dialogs and close any active dialog
                 mInfoMessageDisplayed=true;
                 if (currentDialog != NULL) {
@@ -299,16 +307,46 @@ void LockProcess::checkPipe()
                     currentDialog->close();
                 }
                 // Display info message dialog
-                QTimer::singleShot( 100, this, SLOT(checkPipe()) );
+                QTimer::singleShot( PIPE_CHECK_INTERVAL, this, SLOT(checkPipe()) );
                 InfoDlg inDlg( this );
                 inDlg.updateLabel(to_display);
-                inDlg.setWarningIcon();
+                if (readbuf[0] == 'K') inDlg.setKDEIcon();
+                if (readbuf[0] == 'I') inDlg.setInfoIcon();
+                if (readbuf[0] == 'W') inDlg.setWarningIcon();
+                if (readbuf[0] == 'E') inDlg.setErrorIcon();
                 int ret = execDialog( &inDlg );
                 mForceReject = false;
                 return;
             }
+            if (readbuf[0] == 'Q') {
+                to_display = readbuf;
+                to_display = to_display.remove(0,1);
+                // Lock out password dialogs and close any active dialog
+                mInfoMessageDisplayed=true;
+                if (currentDialog != NULL) {
+                    mForceReject = true;
+                    currentDialog->close();
+                }
+                // Display query dialog
+                QTimer::singleShot( PIPE_CHECK_INTERVAL, this, SLOT(checkPipe()) );
+                QueryDlg qryDlg( this );
+                qryDlg.updateLabel(to_display);
+                qryDlg.setUnlockIcon();
+                mForceReject = false;
+                int ret = execDialog( &qryDlg );
+                if (mForceReject == false) {
+                    pin_entry = qryDlg.getEntry();
+                    mInfoMessageDisplayed=false;
+                    if (mPipeOpen_out == true) {
+                        write(mPipe_fd_out, pin_entry, strlen(pin_entry)+1);
+                        write(mPipe_fd_out, "\n\r", 3);
+                    }
+                }
+                mForceReject = false;
+                return;
+            }
         }
-        QTimer::singleShot( 100, this, SLOT(checkPipe()) );
+        QTimer::singleShot( PIPE_CHECK_INTERVAL, this, SLOT(checkPipe()) );
     }
 }
 
diff --git a/kdesktop/lock/lockprocess.h b/kdesktop/lock/lockprocess.h
index 18a624d57..eed5f92b9 100644
--- a/kdesktop/lock/lockprocess.h
+++ b/kdesktop/lock/lockprocess.h
@@ -31,6 +31,8 @@ struct GreeterPluginHandle {
 
 #define FIFO_DIR "/tmp/ksocket-global"
 #define FIFO_FILE "/tmp/ksocket-global/kdesktoplockcontrol"
+#define FIFO_FILE_OUT "/tmp/ksocket-global/kdesktoplockcontrol_out"
+#define PIPE_CHECK_INTERVAL 50
 
 //===========================================================================
 //
@@ -136,6 +138,8 @@ private:
 
     bool        mPipeOpen;
     int         mPipe_fd;
+    bool        mPipeOpen_out;
+    int         mPipe_fd_out;
 };
 
 #endif
-- 
cgit v1.2.3

