summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2015-09-18 20:54:06 (GMT)
committer Timothy Pearson <kb9vqf@pearsoncomputing.net>2015-09-18 20:54:06 (GMT)
commit9ea67803526cec0439175b8dc2ee5f0e7b87bc89 (patch)
treeab6d82eb81e1794f99d4665a3b4f99db36a704bb
parent46d9df235b2b98b057e2bc9719b7d3416bd5438f (diff)
downloadtdebase-9ea67803.zip
tdebase-9ea67803.tar.gz
Stabilize cryptographic card login
Fix some coding style issues
-rw-r--r--kdesktop/lock/lockdlg.cc42
-rw-r--r--kdesktop/lock/lockdlg.h2
-rw-r--r--kdesktop/lockeng.cc25
-rw-r--r--kdesktop/lockeng.h1
-rw-r--r--tdm/backend/dpylist.c103
-rw-r--r--tdm/backend/server.c44
-rw-r--r--tdm/backend/util.c65
-rw-r--r--tdm/kfrontend/kgapp.cpp21
-rw-r--r--tdm/kfrontend/kgreeter.cpp14
-rw-r--r--tdm/kfrontend/kgreeter.h3
-rw-r--r--tdm/kfrontend/kgverify.cpp9
-rw-r--r--tdm/kfrontend/kgverify.h1
-rw-r--r--tdmlib/dmctl.h28
-rw-r--r--tdmlib/kgreet_classic.cpp19
-rw-r--r--tdmlib/kgreet_classic.h3
-rw-r--r--tdmlib/kgreet_pam.cpp28
-rw-r--r--tdmlib/kgreet_pam.h3
-rw-r--r--tdmlib/kgreet_winbind.cpp13
-rw-r--r--tdmlib/kgreet_winbind.h3
-rw-r--r--tdmlib/kgreeterplugin.h7
20 files changed, 307 insertions, 127 deletions
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 @@ PasswordDlg::PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin)
: 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 @@ PasswordDlg::PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin, TQDat
: 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 @@ void PasswordDlg::init(GreeterPluginHandle *plugin)
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 @@ void PasswordDlg::reapVerify()
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::capsLocked()
}
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 @@ class PasswordDlg : public TQDialog, public KGreeterPluginHandler
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 @@ SaverEngine::SaverEngine()
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 @@ SaverEngine::~SaverEngine()
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 @@ void SaverEngine::cryptographicCardInserted(TDECryptographicCardDevice* cdevice)
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 @@ private slots:
*/
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 @@ AnyRunningDisplays( void )
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 @@ AnyReserveDisplays( void )
{
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 @@ idleReserveDisplays( void )
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 @@ StartReserveDisplay( int lt )
{
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 @@ static void
_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 @@ FindDisplayByName( const char *name )
{
struct display *d;
- for (d = displays; d; d = d->next)
- if (!strcmp( name, d->name ))
+ for (d = displays; d; d = d->next) {
+ if (!strcmp( name, d->name )) {
return d;
+ }
+ }
return 0;
}
@@ -158,9 +167,11 @@ FindDisplayByPid( int pid )
{
struct display *d;
- for (d = displays; d; d = d->next)
- if (pid == d->pid)
+ for (d = displays; d; d = d->next) {
+ if (pid == d->pid) {
return d;
+ }
+ }
return 0;
}
@@ -169,9 +180,11 @@ FindDisplayByServerPid( int serverPid )
{
struct display *d;
- for (d = displays; d; d = d->next)
- if (serverPid == d->serverPid)
+ for (d = displays; d; d = d->next) {
+ if (serverPid == d->serverPid) {
return d;
+ }
+ }
return 0;
}
@@ -182,9 +195,11 @@ FindDisplayBySessionID( CARD32 sessionID )
{
struct display *d;
- for (d = displays; d; d = d->next)
- if (sessionID == d->sessionID)
+ for (d = displays; d; d = d->next) {
+ if (sessionID == d->sessionID) {
return d;
+ }
+ }
return 0;
}
@@ -193,12 +208,14 @@ FindDisplayByAddress( XdmcpNetaddr addr, int addrlen, CARD16 displayNumber )
{
struct display *d;
- for (d = displays; d; d = d->next)
+ for (d = displays; d; d = d->next) {
if ((d->displayType & d_origin) == dFromXDMCP &&
d->displayNumber == displayNumber &&
addressEqual( (XdmcpNetaddr)d->from.data, d->from.length,
- addr, addrlen ))
+ addr, addrlen )) {
return d;
+ }
+ }
return 0;
}
@@ -207,37 +224,38 @@ FindDisplayByAddress( XdmcpNetaddr addr, int addrlen, CARD16 displayNumber )
#define IfFree(x) if (x) free( (char *)x )
void
-RemoveDisplay( struct display *old )
+RemoveDisplay(struct display *old)
{
struct display *d, **dp;
int i;
for (dp = &displays; (d = *dp); dp = &(*dp)->next) {
if (d == old) {
- Debug( "Removing display %s\n", d->name );
+ Debug("Removing display %s\n", d->name);
*dp = d->next;
- IfFree( d->class2 );
- IfFree( d->cfg.data );
- delStr( d->cfg.dep.name );
+ IfFree(d->class2);
+ IfFree(d->cfg.data);
+ delStr(d->cfg.dep.name);
#ifdef XDMCP
- IfFree( d->remoteHost );
+ IfFree(d->remoteHost);
#endif
if (d->authorizations) {
- for (i = 0; i < d->authNum; i++)
- XauDisposeAuth( d->authorizations[i] );
- free( (char *)d->authorizations );
+ for (i = 0; i < d->authNum; i++) {
+ XauDisposeAuth(d->authorizations[i]);
+ }
+ free((char *)d->authorizations);
}
if (d->authFile) {
- (void)unlink( d->authFile );
- free( d->authFile );
+ (void)unlink(d->authFile);
+ free(d->authFile);
}
- IfFree( d->authNameLens );
+ IfFree(d->authNameLens);
#ifdef XDMCP
- XdmcpDisposeARRAY8( &d->peer );
- XdmcpDisposeARRAY8( &d->from );
- XdmcpDisposeARRAY8( &d->clientAddr );
+ XdmcpDisposeARRAY8(&d->peer);
+ XdmcpDisposeARRAY8(&d->from);
+ XdmcpDisposeARRAY8(&d->clientAddr);
#endif
- free( (char *)d );
+ free((char *)d);
break;
}
}
@@ -270,8 +288,9 @@ NewDisplay( const char *name )
hstent->next = disphist; disphist = hstent;
}
- if (!(d = (struct display *)Calloc( 1, sizeof(*d) )))
+ if (!(d = (struct display *)Calloc( 1, sizeof(*d) ))) {
return 0;
+ }
d->next = displays;
d->hstent = hstent;
d->name = hstent->name;
@@ -289,6 +308,6 @@ NewDisplay( const char *name )
d->xdmcpFd = -1;
#endif
displays = d;
- Debug( "created new display %s\n", d->name );
+ Debug("created new display %s\n", d->name);
return d;
}
diff --git a/tdm/backend/server.c b/tdm/backend/server.c
index e78d8a6..3c934e2 100644
--- a/tdm/backend/server.c
+++ b/tdm/backend/server.c
@@ -178,28 +178,28 @@ StartServerTimeout()
{
struct display *d = startingServer;
switch (d->serverStatus) {
- case ignore:
- case awaiting:
- break; /* cannot happen */
- case starting:
- LogError( "X server startup timeout, terminating\n" );
- kill( d->serverPid, d->termSignal );
- d->serverStatus = d->termSignal == SIGKILL ? killed : terminated;
- serverTimeout = d->serverTimeout + now;
- break;
- case terminated:
- LogInfo( "X server termination timeout, killing\n" );
- kill( d->serverPid, SIGKILL );
- d->serverStatus = killed;
- serverTimeout = 10 + now;
- break;
- case killed:
- LogInfo( "X server is stuck in D state; leaving it alone\n" );
- StartServerFailed();
- break;
- case pausing:
- StartServerOnce();
- break;
+ case ignore:
+ case awaiting:
+ break; /* cannot happen */
+ case starting:
+ LogError( "X server startup timeout, terminating\n" );
+ kill( d->serverPid, d->termSignal );
+ d->serverStatus = d->termSignal == SIGKILL ? killed : terminated;
+ serverTimeout = d->serverTimeout + now;
+ break;
+ case terminated:
+ LogInfo( "X server termination timeout, killing\n" );
+ kill( d->serverPid, SIGKILL );
+ d->serverStatus = killed;
+ serverTimeout = 10 + now;
+ break;
+ case killed:
+ LogInfo( "X server is stuck in D state; leaving it alone\n" );
+ StartServerFailed();
+ break;
+ case pausing:
+ StartServerOnce();
+ break;
}
}
diff --git a/tdm/backend/util.c b/tdm/backend/util.c
index 7dd58f0..4290c6d 100644
--- a/tdm/backend/util.c
+++ b/tdm/backend/util.c
@@ -565,18 +565,22 @@ ListSessions( int flags, struct display *d, void *ctx,
STRUCTUTMP *ut;
#endif
- for (di = displays; di; di = di->next)
+ for (di = displays; di; di = di->next) {
if (((flags & lstRemote) || (di->displayType & d_location) == dLocal) &&
(di->status == remoteLogin ||
- ((flags & lstPassive) ? di->status == running : di->userSess >= 0)))
- emitXSess( di, d, ctx );
+ ((flags & lstPassive) ? di->status == running : di->userSess >= 0))) {
+ emitXSess(di, d, ctx);
+ }
+ }
- if (!(flags & lstTTY))
+ if (!(flags & lstTTY)) {
return;
+ }
#ifdef BSD_UTMP
- if ((fd = open( UTMP_FILE, O_RDONLY )) < 0)
+ if ((fd = open( UTMP_FILE, O_RDONLY )) < 0) {
return;
+ }
while (Reader( fd, ut, sizeof(ut[0]) ) == sizeof(ut[0])) {
if (*ut->ut_user) { /* no idea how to list passive TTYs on BSD */
#else
@@ -590,40 +594,43 @@ ListSessions( int flags, struct display *d, void *ctx,
{
#endif
if (*ut->ut_host) { /* from remote or x */
- if (!(flags & lstRemote))
+ if (!(flags & lstRemote)) {
continue;
- } else {
+ }
+ }
+ else {
/* hack around broken konsole which does not set ut_host. */
/* this check is probably linux-specific. */
/* alternatively we could open the device and try VT_OPENQRY. */
- if (memcmp( ut->ut_line, "tty", 3 ) ||
- !isdigit( ut->ut_line[3] ))
+ if (memcmp( ut->ut_line, "tty", 3 ) || !isdigit( ut->ut_line[3] )) {
continue;
+ }
}
- if (StrNChrCnt( ut->ut_line, sizeof(ut->ut_line), ':' ))
+ if (StrNChrCnt( ut->ut_line, sizeof(ut->ut_line), ':' )) {
continue; /* x login */
+ }
switch (StrNChrCnt( ut->ut_host, sizeof(ut->ut_host), ':' )) {
- case 1: /* x terminal */
- continue;
- default:
+ case 1: /* x terminal */
+ continue;
+ default:
#ifdef IP6_MAGIC
- /* unknown - IPv6 makes things complicated */
- le = StrNLen( ut->ut_host, sizeof(ut->ut_host) );
- /* cut off screen number */
- for (dot = le; ut->ut_host[--dot] != ':'; )
- if (ut->ut_host[dot] == '.') {
- le = dot;
- break;
- }
- for (di = displays; di; di = di->next)
- if (!memcmp( di->name, ut->ut_host, le ) && !di->name[le])
- goto cont; /* x terminal */
- break;
- cont:
- continue;
- case 0: /* no x terminal */
+ /* unknown - IPv6 makes things complicated */
+ le = StrNLen( ut->ut_host, sizeof(ut->ut_host) );
+ /* cut off screen number */
+ for (dot = le; ut->ut_host[--dot] != ':'; )
+ if (ut->ut_host[dot] == '.') {
+ le = dot;
+ break;
+ }
+ for (di = displays; di; di = di->next)
+ if (!memcmp( di->name, ut->ut_host, le ) && !di->name[le])
+ goto cont; /* x terminal */
+ break;
+ cont:
+ continue;
+ case 0: /* no x terminal */
#endif
- break;
+ break;
}
emitTTYSess( ut, d, ctx );
}
diff --git a/tdm/kfrontend/kgapp.cpp b/tdm/kfrontend/kgapp.cpp
index 65e6cf0..86a67cb 100644
--- a/tdm/kfrontend/kgapp.cpp
+++ b/tdm/kfrontend/kgapp.cpp
@@ -34,6 +34,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#endif
#include "sakdlg.h"
+#include <kuser.h>
#include <kprocess.h>
#include <tdecmdlineargs.h>
#include <kcrash.h>
@@ -342,6 +343,7 @@ kg_main( const char *argv0 )
XSetIOErrorHandler( xIOErr );
TQString login_user;
+ TQString login_card_user;
TQString login_session_wm;
Display *dpy = tqt_xdisplay();
@@ -499,6 +501,7 @@ kg_main( const char *argv0 )
Debug( "left event loop\n" );
login_user = static_cast<KGreeter*>(dialog)->curUser;
+ login_card_user = static_cast<KGreeter*>(dialog)->cardLoginUser;
login_session_wm = static_cast<KGreeter*>(dialog)->curWMSession;
if (rslt != ex_greet) {
@@ -522,6 +525,24 @@ kg_main( const char *argv0 )
KGVerify::done();
+ KUser userinfo(login_user);
+ if (userinfo.isValid()) {
+ TQString fileName = userinfo.homeDir() + "/.tde_card_login_state";
+ TQFile flagFile(fileName);
+ if ((login_card_user != TQString::null) && (login_user == login_card_user)) {
+ // Card was likely used to log in
+ if (flagFile.open(IO_WriteOnly)) {
+ flagFile.writeBlock("1\n", 2);
+ fchown(flagFile.handle(), userinfo.uid(), userinfo.gid());
+ flagFile.close();
+ }
+ }
+ else {
+ // Card was not used to log in
+ flagFile.remove();
+ }
+ }
+
if (kbdl) {
kbdl->closeStdin();
kbdl->detach();
diff --git a/tdm/kfrontend/kgreeter.cpp b/tdm/kfrontend/kgreeter.cpp
index 945110d..15b3258 100644
--- a/tdm/kfrontend/kgreeter.cpp
+++ b/tdm/kfrontend/kgreeter.cpp
@@ -192,6 +192,7 @@ KGreeter::KGreeter( bool framed )
, prevValid( true )
, needLoad( false )
, themed( framed )
+ , showInfoMessages( true )
, closingDown( false )
{
stsFile = new KSimpleConfig( _stsFile );
@@ -242,6 +243,8 @@ KGreeter::~KGreeter()
}
void KGreeter::cryptographicCardWatcherSetup() {
+ cardLoginUser = TQString::null;
+
// Initialize SmartCard readers
TDEGenericDevice *hwdevice;
TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
@@ -892,15 +895,24 @@ void KGreeter::cryptographicCardInserted(TDECryptographicCardDevice* cdevice) {
verifySetUser(login_name);
verify->lockUserEntry(true);
+ // FIXME
+ // pam_pkcs11 is extremely chatty with no apparent way to disable the unwanted messages
+ verify->setInfoMessageDisplay(false);
+
// Initiate login
+ cardLoginUser = login_name;
verify->accept();
}
}
}
void KGreeter::cryptographicCardRemoved(TDECryptographicCardDevice* cdevice) {
+ cardLoginUser = TQString::null;
verify->lockUserEntry(false);
verify->requestAbort();
+
+ // Restore information message display settings
+ verify->setInfoMessageDisplay(showInfoMessages);
}
KStdGreeter::KStdGreeter()
@@ -1048,6 +1060,7 @@ KStdGreeter::KStdGreeter()
pluginSetup();
+ verify->setInfoMessageDisplay(showInfoMessages);
verify->start();
TQTimer::singleShot(0, this, SLOT(cryptographicCardWatcherSetup()));
@@ -1197,6 +1210,7 @@ KThemedGreeter::KThemedGreeter()
pluginSetup();
+ verify->setInfoMessageDisplay(showInfoMessages);
verify->start();
TQTimer::singleShot(0, this, SLOT(cryptographicCardWatcherSetup()));
diff --git a/tdm/kfrontend/kgreeter.h b/tdm/kfrontend/kgreeter.h
index 793a034..f715b3a 100644
--- a/tdm/kfrontend/kgreeter.h
+++ b/tdm/kfrontend/kgreeter.h
@@ -110,7 +110,7 @@ class KGreeter : public KGDialog, public KGVerifyHandler {
void processInputPipeCommand(TQString command);
public:
- TQString curUser, curWMSession, dName;
+ TQString curUser, cardLoginUser, curWMSession, dName;
protected slots:
void cryptographicCardWatcherSetup();
@@ -137,6 +137,7 @@ class KGreeter : public KGDialog, public KGVerifyHandler {
bool prevValid;
bool needLoad;
bool themed;
+ bool showInfoMessages;
static int curPlugin;
static PluginList pluginList;
diff --git a/tdm/kfrontend/kgverify.cpp b/tdm/kfrontend/kgverify.cpp
index a25fac8..cc20d54 100644
--- a/tdm/kfrontend/kgverify.cpp
+++ b/tdm/kfrontend/kgverify.cpp
@@ -287,6 +287,14 @@ KGVerify::setPassword( const TQString &pass )
}
void
+KGVerify::setInfoMessageDisplay(bool on)
+{
+ // assert( fixedEntity.isEmpty() );
+ Debug( "%s->setInfoMessageDisplay(%\"s)\n", pName.data(), on );
+ greet->setInfoMessageDisplay(on);
+}
+
+void
KGVerify::start()
{
authTok = (func == KGreeterPlugin::ChAuthTok);
@@ -383,6 +391,7 @@ KGVerify::doReject( bool initial )
void // not a slot - called manually by greeter
KGVerify::reject()
{
+ inGreeterPlugin = false;
doReject( true );
}
diff --git a/tdm/kfrontend/kgverify.h b/tdm/kfrontend/kgverify.h
index 3cd22b6..278cc0d 100644
--- a/tdm/kfrontend/kgverify.h
+++ b/tdm/kfrontend/kgverify.h
@@ -102,6 +102,7 @@ class KGVerify : public TQObject, public KGreeterPluginHandler {
void setUser( const TQString &user );
void lockUserEntry( const bool lock );
void setPassword( const TQString &pass );
+ void setInfoMessageDisplay( bool on );
/* virtual */ void selectPlugin( int id );
bool entitiesLocal() const;
bool entitiesFielded() const;
diff --git a/tdmlib/dmctl.h b/tdmlib/dmctl.h
index 90928e2..e0cdc96 100644
--- a/tdmlib/dmctl.h
+++ b/tdmlib/dmctl.h
@@ -39,27 +39,33 @@ public:
DM();
~DM();
- enum { Unknown, NoDM, NewTDM, OldTDM, GDM };
+ enum {
+ Unknown,
+ NoDM,
+ NewTDM,
+ OldTDM,
+ GDM
+ };
bool canShutdown();
- void shutdown( TDEApplication::ShutdownType shutdownType,
- TDEApplication::ShutdownMode shutdownMode,
- const TQString &bootOption = TQString::null );
+ void shutdown(TDEApplication::ShutdownType shutdownType,
+ TDEApplication::ShutdownMode shutdownMode,
+ const TQString &bootOption = TQString::null);
- void setLock( bool on );
+ void setLock(bool on);
bool isSwitchable();
int numReserve();
void startReserve();
- bool localSessions( SessList &list );
- bool switchVT( int vt );
- void lockSwitchVT( int vt );
+ bool localSessions(SessList &list);
+ bool switchVT(int vt);
+ void lockSwitchVT(int vt);
int activeVT();
- bool bootOptions( TQStringList &opts, int &dflt, int &curr );
+ bool bootOptions(TQStringList &opts, int &dflt, int &curr);
- static TQString sess2Str( const SessEnt &se );
- static void sess2Str2( const SessEnt &se, TQString &user, TQString &loc );
+ static TQString sess2Str(const SessEnt &se);
+ static void sess2Str2(const SessEnt &se, TQString &user, TQString &loc);
int type();
diff --git a/tdmlib/kgreet_classic.cpp b/tdmlib/kgreet_classic.cpp
index 6aac4d9..5b8f51d 100644
--- a/tdmlib/kgreet_classic.cpp
+++ b/tdmlib/kgreet_classic.cpp
@@ -66,7 +66,8 @@ KClassicGreeter::KClassicGreeter( KGreeterPluginHandler *_handler,
ctx( _ctx ),
exp( -1 ),
pExp( -1 ),
- running( false )
+ running( false ),
+ suppressInfoMsg(false)
{
KdmItem *user_entry = 0, *pw_entry = 0;
grid = 0;
@@ -246,6 +247,10 @@ KClassicGreeter::setEnabled( bool enable )
passwdEdit->setFocus();
}
+void KClassicGreeter::setInfoMessageDisplay(bool enable) {
+ suppressInfoMsg = !enable;
+}
+
void // private
KClassicGreeter::returnData()
{
@@ -276,8 +281,18 @@ bool // virtual
KClassicGreeter::textMessage( const char *text, bool err )
{
if (!err &&
- TQString( text ).find( TQRegExp( "^Changing password for [^ ]+$" ) ) >= 0)
+ TQString( text ).find( TQRegExp( "^Changing password for [^ ]+$" ) ) >= 0) {
+ return true;
+ }
+ if (!err && suppressInfoMsg) {
return true;
+ }
+ if (!err && ((TQString(text).lower().find("smartcard") >= 0) || (TQString(text).lower().find("smart card") >= 0))) {
+ // FIXME
+ // pam_pkcs11 is extremely chatty, even with no card inserted,
+ // and there is no apparent way to disable the unwanted messages!
+ return true;
+ }
return false;
}
diff --git a/tdmlib/kgreet_classic.h b/tdmlib/kgreet_classic.h
index 78bacf5..4f023db 100644
--- a/tdmlib/kgreet_classic.h
+++ b/tdmlib/kgreet_classic.h
@@ -53,6 +53,7 @@ class KClassicGreeter : public TQObject, public KGreeterPlugin {
virtual void lockUserEntry( const bool lock );
virtual void setPassword( const TQString &pass );
virtual void setEnabled( bool on );
+ virtual void setInfoMessageDisplay( bool on );
virtual bool textMessage( const char *message, bool error );
virtual void textPrompt( const char *prompt, bool echo, bool nonBlocking );
virtual bool binaryPrompt( const char *prompt, bool nonBlocking );
@@ -85,7 +86,7 @@ class KClassicGreeter : public TQObject, public KGreeterPlugin {
Context ctx;
TQGridLayout* grid;
int exp, pExp, has;
- bool running, authTok;
+ bool running, authTok, suppressInfoMsg;
};
#endif /* KGREET_CLASSIC_H */
diff --git a/tdmlib/kgreet_pam.cpp b/tdmlib/kgreet_pam.cpp
index 97d19af..7fcfafc 100644
--- a/tdmlib/kgreet_pam.cpp
+++ b/tdmlib/kgreet_pam.cpp
@@ -88,7 +88,8 @@ KPamGreeter::KPamGreeter( KGreeterPluginHandler *_handler,
ctx( _ctx ),
exp( -1 ),
pExp( -1 ),
- running( false )
+ running( false ),
+ suppressInfoMsg(false)
{
ctx = Login;
@@ -287,6 +288,10 @@ KPamGreeter::setEnabled(bool enable)
authEdit[0]->setFocus();
}
+void KPamGreeter::setInfoMessageDisplay(bool enable) {
+ suppressInfoMsg = !enable;
+}
+
void // private
KPamGreeter::returnData()
{
@@ -319,17 +324,22 @@ KPamGreeter::returnData()
bool // virtual
KPamGreeter::textMessage( const char *text, bool err )
{
- kg_debug(" ************** textMessage(%s, %d)\n", text, err);
+ kg_debug(" ************** textMessage(%s, %d)\n", text, err);
- if (!authEdit.size())
- return false;
+ if (!authEdit.size()) {
+ return false;
+ }
- if (getLayoutItem()) {
- TQLabel* label = new TQLabel(TQString::fromUtf8(text), m_parentWidget);
- getLayoutItem()->addWidget(label, state+1, 0, 0);
- }
+ if (!err && suppressInfoMsg) {
+ return true;
+ }
- return true;
+ if (getLayoutItem()) {
+ TQLabel* label = new TQLabel(TQString::fromUtf8(text), m_parentWidget);
+ getLayoutItem()->addWidget(label, state+1, 0, 0);
+ }
+
+ return true;
}
void // virtual
diff --git a/tdmlib/kgreet_pam.h b/tdmlib/kgreet_pam.h
index 7772880..79e92b3 100644
--- a/tdmlib/kgreet_pam.h
+++ b/tdmlib/kgreet_pam.h
@@ -53,6 +53,7 @@ class KPamGreeter : public TQObject, public KGreeterPlugin {
virtual void lockUserEntry( const bool lock );
virtual void setPassword( const TQString &pass );
virtual void setEnabled( bool on );
+ virtual void setInfoMessageDisplay( bool on );
virtual bool textMessage( const char *message, bool error );
virtual void textPrompt( const char *prompt, bool echo, bool nonBlocking );
virtual bool binaryPrompt( const char *prompt, bool nonBlocking );
@@ -89,7 +90,7 @@ class KPamGreeter : public TQObject, public KGreeterPlugin {
Context ctx;
int exp, pExp, has;
unsigned state;
- bool running, authTok;
+ bool running, authTok, suppressInfoMsg;
};
#endif /* KGREET_CLASSIC_H */
diff --git a/tdmlib/kgreet_winbind.cpp b/tdmlib/kgreet_winbind.cpp
index 53b992f..1efd170 100644
--- a/tdmlib/kgreet_winbind.cpp
+++ b/tdmlib/kgreet_winbind.cpp
@@ -74,7 +74,8 @@ KWinbindGreeter::KWinbindGreeter( KGreeterPluginHandler *_handler,
ctx( _ctx ),
exp( -1 ),
pExp( -1 ),
- running( false )
+ running( false ),
+ suppressInfoMsg(false)
{
KdmItem *user_entry = 0, *pw_entry = 0, *domain_entry = 0;
TQGridLayout *grid = 0;
@@ -323,6 +324,10 @@ KWinbindGreeter::setEnabled( bool enable )
passwdEdit->setFocus();
}
+void KWinbindGreeter::setInfoMessageDisplay(bool enable) {
+ suppressInfoMsg = !enable;
+}
+
void // private
KWinbindGreeter::returnData()
{
@@ -352,8 +357,12 @@ bool // virtual
KWinbindGreeter::textMessage( const char *text, bool err )
{
if (!err &&
- TQString( text ).find( TQRegExp( "^Changing password for [^ ]+$" ) ) >= 0)
+ TQString( text ).find( TQRegExp( "^Changing password for [^ ]+$" ) ) >= 0) {
return true;
+ }
+ if (!err && suppressInfoMsg) {
+ return true;
+ }
return false;
}
diff --git a/tdmlib/kgreet_winbind.h b/tdmlib/kgreet_winbind.h
index 8c41ca5..e21fce3 100644
--- a/tdmlib/kgreet_winbind.h
+++ b/tdmlib/kgreet_winbind.h
@@ -57,6 +57,7 @@ class KWinbindGreeter : public TQObject, public KGreeterPlugin {
virtual void lockUserEntry( const bool lock );
virtual void setPassword( const TQString &pass );
virtual void setEnabled( bool on );
+ virtual void setInfoMessageDisplay( bool on );
virtual bool textMessage( const char *message, bool error );
virtual void textPrompt( const char *prompt, bool echo, bool nonBlocking );
virtual bool binaryPrompt( const char *prompt, bool nonBlocking );
@@ -96,7 +97,7 @@ class KWinbindGreeter : public TQObject, public KGreeterPlugin {
Function func;
Context ctx;
int exp, pExp, has;
- bool running, authTok;
+ bool running, authTok, suppressInfoMsg;
};
#endif /* KGREET_WINBIND_H */
diff --git a/tdmlib/kgreeterplugin.h b/tdmlib/kgreeterplugin.h
index 4604a6a..029da23 100644
--- a/tdmlib/kgreeterplugin.h
+++ b/tdmlib/kgreeterplugin.h
@@ -171,6 +171,13 @@ public:
virtual void setEnabled( bool on ) = 0;
/**
+ * En-/disable display of informational messages
+ * The default is to display all informational messages
+ * @param on the state to set
+ */
+ virtual void setInfoMessageDisplay( bool on ) = 0;
+
+ /**
* Called when a message from the authentication backend arrives.
* @param message the message received from the backend
* @param error if true, @p message is an error message, otherwise it's