You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
853 lines
23 KiB
853 lines
23 KiB
Index: kdm/backend/client.c
|
|
===================================================================
|
|
--- kdm/backend/client.c.orig
|
|
+++ kdm/backend/client.c
|
|
@@ -547,6 +547,9 @@ Verify( GConvFunc gconv, int rootok )
|
|
} else
|
|
psrv = PAMService;
|
|
pdata.usecur = TRUE;
|
|
+ } else if (!strcmp( curtype, "pam" )) {
|
|
+ psrv = PAMService;
|
|
+ pdata.usecur = FALSE;
|
|
} else {
|
|
sprintf( psrvb, "%.31s-%.31s", PAMService, curtype );
|
|
psrv = psrvb;
|
|
@@ -616,7 +619,7 @@ Verify( GConvFunc gconv, int rootok )
|
|
free( msg );
|
|
V_RET_FAIL( 0 );
|
|
}
|
|
- } else if (!strcmp( curtype, "generic" )) {
|
|
+ } else if (!strcmp( curtype, "generic" ) || !strcmp(curtype, "pam")) {
|
|
if (!gconv( GCONV_USER, 0 ))
|
|
return 0;
|
|
for (curret = 0;;) {
|
|
Index: kdm/kfrontend/themer/kdmlabel.h
|
|
===================================================================
|
|
--- kdm/kfrontend/themer/kdmlabel.h.orig
|
|
+++ kdm/kfrontend/themer/kdmlabel.h
|
|
@@ -50,6 +50,7 @@ protected:
|
|
// handle switching between normal / active / prelight configurations
|
|
virtual void statusChanged();
|
|
|
|
+public:
|
|
struct LabelStruct {
|
|
QString text;
|
|
bool isTimer;
|
|
Index: kdmlib/kgreet_pam.cpp
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ kdmlib/kgreet_pam.cpp
|
|
@@ -0,0 +1,668 @@
|
|
+/*
|
|
+
|
|
+Conversation widget for kdm greeter
|
|
+
|
|
+Copyright (C) 2008 Dirk Mueller <mueller@kde.org>
|
|
+
|
|
+based on classic kdm greeter:
|
|
+
|
|
+ Copyright (C) 1997, 1998, 2000 Steffen Hansen <hansen@kde.org>
|
|
+ Copyright (C) 2000-2003 Oswald Buddenhagen <ossi@kde.org>
|
|
+
|
|
+
|
|
+This program is free software; you can redistribute it and/or modify
|
|
+it under the terms of the GNU General Public License as published by
|
|
+the Free Software Foundation; either version 2 of the License, or
|
|
+(at your option) any later version.
|
|
+
|
|
+This program is distributed in the hope that it will be useful,
|
|
+but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+GNU General Public License for more details.
|
|
+
|
|
+You should have received a copy of the GNU General Public License
|
|
+along with this program; if not, write to the Free Software
|
|
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
+
|
|
+*/
|
|
+
|
|
+#include "kgreet_pam.h"
|
|
+#include "themer/kdmthemer.h"
|
|
+#include "themer/kdmlabel.h"
|
|
+
|
|
+#include <klocale.h>
|
|
+#include <klineedit.h>
|
|
+#include <kpassdlg.h>
|
|
+#include <kuser.h>
|
|
+
|
|
+#include <qregexp.h>
|
|
+#include <qlayout.h>
|
|
+#include <qlabel.h>
|
|
+#include <qtimer.h>
|
|
+
|
|
+#include <stdlib.h>
|
|
+#include <stdio.h>
|
|
+#include <stdarg.h>
|
|
+#include <syslog.h>
|
|
+
|
|
+//#define PAM_GREETER_DEBUG
|
|
+
|
|
+class KDMPasswordEdit : public KPasswordEdit {
|
|
+public:
|
|
+ KDMPasswordEdit( QWidget *parent ) : KPasswordEdit( parent, 0 ) {}
|
|
+ KDMPasswordEdit( KPasswordEdit::EchoModes echoMode, QWidget *parent ) : KPasswordEdit( echoMode, parent, 0 ) {}
|
|
+protected:
|
|
+ virtual void contextMenuEvent( QContextMenuEvent * ) {}
|
|
+};
|
|
+
|
|
+static FILE* log;
|
|
+static void debug(const char* fmt, ...)
|
|
+{
|
|
+ va_list lst;
|
|
+ va_start(lst, fmt);
|
|
+
|
|
+#ifdef PAM_GREETER_DEBUG
|
|
+#if 0
|
|
+ vfprintf(log, fmt, lst);
|
|
+ fflush(log);
|
|
+#else
|
|
+ char buf[6000];
|
|
+ sprintf(buf, "*** %s\n", fmt);
|
|
+ vsyslog(LOG_WARNING, buf, lst);
|
|
+#endif
|
|
+#endif
|
|
+ va_end(lst);
|
|
+}
|
|
+
|
|
+static KPasswordEdit::EchoModes echoMode;
|
|
+
|
|
+KPamGreeter::KPamGreeter( KGreeterPluginHandler *_handler,
|
|
+ KdmThemer *themer,
|
|
+ QWidget *parent, QWidget *pred,
|
|
+ const QString &_fixedEntity,
|
|
+ Function _func, Context _ctx ) :
|
|
+ QObject(),
|
|
+ KGreeterPlugin( _handler ),
|
|
+ fixedUser( _fixedEntity ),
|
|
+ func( _func ),
|
|
+ ctx( _ctx ),
|
|
+ exp( -1 ),
|
|
+ pExp( -1 ),
|
|
+ running( false )
|
|
+{
|
|
+ ctx = Login;
|
|
+
|
|
+ debug("KPamGreeter constructed\n");
|
|
+
|
|
+ m_parentWidget = parent;
|
|
+
|
|
+ KdmItem *user_entry = 0, *pw_entry = 0;
|
|
+ int line = 0;
|
|
+
|
|
+ layoutItem = 0;
|
|
+
|
|
+ if (themer &&
|
|
+ (!(user_entry = themer->findNode( "user-entry" )) ||
|
|
+ !(pw_entry = themer->findNode( "pw-entry" ))))
|
|
+ themer = 0;
|
|
+
|
|
+ m_themer = themer;
|
|
+
|
|
+ if (!themer)
|
|
+ layoutItem = new QGridLayout( 0, 0, 10 );
|
|
+
|
|
+ loginLabel = 0;
|
|
+ authLabel.clear();
|
|
+ authEdit.clear();
|
|
+ loginLabel = 0;
|
|
+ loginEdit = 0;
|
|
+ if (ctx == ExUnlock || ctx == ExChangeTok)
|
|
+ fixedUser = KUser().loginName();
|
|
+ if (func != ChAuthTok) {
|
|
+ debug("func != ChAuthTok\n");
|
|
+ debug("fixedUser: *%s*\n", fixedUser.latin1());
|
|
+
|
|
+ if (fixedUser.isEmpty()) {
|
|
+ loginEdit = new KLineEdit( parent );
|
|
+ loginEdit->setContextMenuEnabled( false );
|
|
+ connect( loginEdit, SIGNAL(lostFocus()), SLOT(slotLoginLostFocus()) );
|
|
+ connect( loginEdit, SIGNAL(lostFocus()), SLOT(slotActivity()) );
|
|
+ connect( loginEdit, SIGNAL(textChanged( const QString & )), SLOT(slotActivity()) );
|
|
+ connect( loginEdit, SIGNAL(selectionChanged()), SLOT(slotActivity()) );
|
|
+ if (pred) {
|
|
+ parent->setTabOrder( pred, loginEdit );
|
|
+ pred = loginEdit;
|
|
+ }
|
|
+ if (!getLayoutItem()) {
|
|
+ loginEdit->adjustSize();
|
|
+ user_entry->setWidget( loginEdit );
|
|
+ } else {
|
|
+ loginLabel = new QLabel( loginEdit, i18n("Username:"), parent );
|
|
+ getLayoutItem()->addWidget( loginLabel, line, 0 );
|
|
+ getLayoutItem()->addWidget( loginEdit, line++, 1 );
|
|
+ }
|
|
+ } else if (ctx != Login && ctx != Shutdown && getLayoutItem()) {
|
|
+ loginLabel = new QLabel( i18n("Username:"), parent );
|
|
+ getLayoutItem()->addWidget( loginLabel, line, 0 );
|
|
+ getLayoutItem()->addWidget( new QLabel( fixedUser, parent ), line++, 1 );
|
|
+ }
|
|
+#if 0
|
|
+ if (echoMode == -1)
|
|
+ passwdEdit = new KDMPasswordEdit( parent );
|
|
+ else
|
|
+ passwdEdit = new KDMPasswordEdit( echoMode,
|
|
+ parent );
|
|
+ connect( passwdEdit, SIGNAL(textChanged( const QString & )),
|
|
+ SLOT(slotActivity()) );
|
|
+ connect( passwdEdit, SIGNAL(lostFocus()), SLOT(slotActivity()) );
|
|
+ if (pred) {
|
|
+ parent->setTabOrder( pred, passwdEdit );
|
|
+ pred = passwdEdit;
|
|
+ }
|
|
+ if (!getLayoutItem()) {
|
|
+ passwdEdit->adjustSize();
|
|
+ pw_entry->setWidget( passwdEdit );
|
|
+ } else {
|
|
+ passwdLabel = new QLabel( passwdEdit,
|
|
+ func == Authenticate ?
|
|
+ i18n("hello &Password:") :
|
|
+ i18n("Current &password:"),
|
|
+ parent );
|
|
+ getLayoutItem()->addWidget( passwdLabel, line, 0 );
|
|
+ getLayoutItem()->addWidget( passwdEdit, line++, 1 );
|
|
+ }
|
|
+#endif
|
|
+ if (loginEdit)
|
|
+ loginEdit->setFocus();
|
|
+ }
|
|
+ if (func != Authenticate) {
|
|
+ if (echoMode == -1) {
|
|
+ authEdit << new KDMPasswordEdit( echoMode, parent );
|
|
+ authEdit << new KDMPasswordEdit( echoMode, parent );
|
|
+ } else {
|
|
+ authEdit << new KDMPasswordEdit( parent );
|
|
+ authEdit << new KDMPasswordEdit( parent );
|
|
+ }
|
|
+ authLabel << new QLabel( authEdit[0], i18n("&New password:"), parent );
|
|
+ authLabel << new QLabel( authEdit[1], i18n("Con&firm password:"), parent );
|
|
+ if (pred) {
|
|
+ parent->setTabOrder( pred, authEdit[0] );
|
|
+ parent->setTabOrder( authEdit[0], authEdit[1] );
|
|
+ }
|
|
+ if (getLayoutItem()) {
|
|
+ getLayoutItem()->addWidget( authLabel[0], line, 0 );
|
|
+ getLayoutItem()->addWidget( authEdit[0], line++, 1 );
|
|
+ getLayoutItem()->addWidget( authLabel[1], line, 0 );
|
|
+ getLayoutItem()->addWidget( authEdit[1], line, 1 );
|
|
+ }
|
|
+ if (authEdit.size() >= 2)
|
|
+ authEdit[1]->setFocus();
|
|
+ }
|
|
+}
|
|
+
|
|
+// virtual
|
|
+KPamGreeter::~KPamGreeter()
|
|
+{
|
|
+ debug("KPamGreeter::~KPamGreeter");
|
|
+ abort();
|
|
+ if (!layoutItem) {
|
|
+ delete loginEdit;
|
|
+ return;
|
|
+ }
|
|
+ QLayoutIterator it = static_cast<QLayout *>(layoutItem)->iterator();
|
|
+ for (QLayoutItem *itm = it.current(); itm; itm = ++it)
|
|
+ delete itm->widget();
|
|
+ delete layoutItem;
|
|
+ debug("destructor finished, good bye");
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::loadUsers( const QStringList &users )
|
|
+{
|
|
+ KCompletion *userNamesCompletion = new KCompletion;
|
|
+ userNamesCompletion->setItems( users );
|
|
+ loginEdit->setCompletionObject( userNamesCompletion );
|
|
+ loginEdit->setAutoDeleteCompletionObject( true );
|
|
+ loginEdit->setCompletionMode( KGlobalSettings::CompletionAuto );
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::presetEntity( const QString &entity, int field )
|
|
+{
|
|
+ debug("presetEntity(%s,%d) called!\n", entity.latin1(), field);
|
|
+ loginEdit->setText( entity );
|
|
+ if (field == 1 && authEdit.size() >= 1)
|
|
+ authEdit[0]->setFocus();
|
|
+ else {
|
|
+ loginEdit->setFocus();
|
|
+ loginEdit->selectAll();
|
|
+ if (field == -1 && authEdit.size() >= 1) {
|
|
+ authEdit[0]->setText( " " );
|
|
+ authEdit[0]->setEnabled( false );
|
|
+ authTok = false;
|
|
+ }
|
|
+ }
|
|
+ curUser = entity;
|
|
+}
|
|
+
|
|
+QString // virtual
|
|
+KPamGreeter::getEntity() const
|
|
+{
|
|
+ return fixedUser.isEmpty() ? loginEdit->text() : fixedUser;
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::setUser( const QString &user )
|
|
+{
|
|
+ // assert( fixedUser.isEmpty() );
|
|
+ curUser = user;
|
|
+ loginEdit->setText( user );
|
|
+ if (authEdit.size() >= 1) {
|
|
+ authEdit[0]->setFocus();
|
|
+ authEdit[0]->selectAll();
|
|
+ }
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::setEnabled(bool enable)
|
|
+{
|
|
+ // assert( !passwd1Label );
|
|
+ // assert( func == Authenticate && ctx == Shutdown );
|
|
+// if (loginLabel)
|
|
+// loginLabel->setEnabled( enable );
|
|
+ authEdit[0]->setEnabled( enable );
|
|
+ setActive( enable );
|
|
+ if (enable)
|
|
+ authEdit[0]->setFocus();
|
|
+ }
|
|
+
|
|
+void // private
|
|
+KPamGreeter::returnData()
|
|
+{
|
|
+ debug("*************** returnData called with exp %d\n", exp);
|
|
+
|
|
+
|
|
+ switch (exp) {
|
|
+ case 0:
|
|
+ handler->gplugReturnText( (loginEdit ? loginEdit->text() :
|
|
+ fixedUser).local8Bit(),
|
|
+ KGreeterPluginHandler::IsUser );
|
|
+ break;
|
|
+ case 1:
|
|
+ handler->gplugReturnText( authEdit[0]->password(),
|
|
+ KGreeterPluginHandler::IsPassword |
|
|
+ KGreeterPluginHandler::IsSecret );
|
|
+ break;
|
|
+ case 2:
|
|
+ handler->gplugReturnText( authEdit[1]->password(),
|
|
+ KGreeterPluginHandler::IsSecret );
|
|
+ break;
|
|
+ default: // case 3:
|
|
+ handler->gplugReturnText( authEdit[2]->password(),
|
|
+ KGreeterPluginHandler::IsNewPassword |
|
|
+ KGreeterPluginHandler::IsSecret );
|
|
+ break;
|
|
+ }
|
|
+}
|
|
+
|
|
+bool // virtual
|
|
+KPamGreeter::textMessage( const char *text, bool err )
|
|
+{
|
|
+ debug(" ************** textMessage(%s, %d)\n", text, err);
|
|
+
|
|
+ if (!authEdit.size())
|
|
+ return false;
|
|
+
|
|
+ if (getLayoutItem()) {
|
|
+ QLabel* label = new QLabel(QString::fromUtf8(text), m_parentWidget);
|
|
+ getLayoutItem()->addWidget(label, state+1, 0, 0);
|
|
+ }
|
|
+
|
|
+ return true;
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::textPrompt( const char *prompt, bool echo, bool nonBlocking )
|
|
+{
|
|
+ debug("textPrompt called with prompt %s echo %d nonBlocking %d", prompt, echo, nonBlocking);
|
|
+ debug("state is %d, authEdit.size is %d\n", state, authEdit.size());
|
|
+
|
|
+ if (state == 0 && echo) {
|
|
+ if (loginLabel)
|
|
+ loginLabel->setText(QString::fromUtf8(prompt));
|
|
+ else if (m_themer) {
|
|
+ KdmLabel *kdmlabel = static_cast<KdmLabel*>(m_themer->findNode("user-label"));
|
|
+ if (kdmlabel) {
|
|
+ //userLabel->setText(QString::fromUtf8(prompt));
|
|
+ kdmlabel->label.text = QString::fromUtf8(prompt);
|
|
+ QTimer::singleShot(0, kdmlabel, SLOT(update()));
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ else if (state >= authEdit.size()) {
|
|
+ if (getLayoutItem()) {
|
|
+ QLabel* label = new QLabel(QString::fromUtf8(prompt), m_parentWidget);
|
|
+ getLayoutItem()->addWidget(label, state+1, 0, 0);
|
|
+ debug("added label widget to layout");
|
|
+ }
|
|
+ else if (m_themer) {
|
|
+ debug("themer found!");
|
|
+ KdmItem *pw_label = 0;
|
|
+
|
|
+ KdmLabel *kdmlabel = static_cast<KdmLabel*>(m_themer->findNode("pw-label"));
|
|
+ if (kdmlabel) {
|
|
+ //userLabel->setText(QString::fromUtf8(prompt));
|
|
+ QString str = QString::fromUtf8(prompt);
|
|
+ kdmlabel->label.text = str;
|
|
+ QTimer::singleShot(0, kdmlabel, SLOT(update()));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ KDMPasswordEdit* passwdEdit;
|
|
+
|
|
+ if (echoMode == -1)
|
|
+ passwdEdit = new KDMPasswordEdit( m_parentWidget );
|
|
+ else
|
|
+ passwdEdit = new KDMPasswordEdit( echoMode, m_parentWidget);
|
|
+ connect( passwdEdit, SIGNAL(textChanged( const QString & )),
|
|
+ SLOT(slotActivity()) );
|
|
+ connect( passwdEdit, SIGNAL(lostFocus()), SLOT(slotActivity()) );
|
|
+ authEdit << passwdEdit;
|
|
+
|
|
+#if 1
|
|
+ for(QValueList<KPasswordEdit*>::iterator it = authEdit.begin();
|
|
+ it != authEdit.end();
|
|
+ ++it) {
|
|
+ if ((*it)->isEnabled() && (*it)->text().isEmpty()) {
|
|
+ (*it)->setFocus();
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+ if (getLayoutItem())
|
|
+ getLayoutItem()->addWidget(passwdEdit, state+1, 1, 0);
|
|
+
|
|
+ if (m_themer) {
|
|
+ debug("themer found!");
|
|
+ KdmItem *pw_entry = 0;
|
|
+
|
|
+ pw_entry = m_themer->findNode("pw-entry");
|
|
+
|
|
+ if (pw_entry && passwdEdit)
|
|
+ pw_entry->setWidget(passwdEdit);
|
|
+
|
|
+ if (0) {
|
|
+ //userLabel->setText(QString::fromUtf8(prompt));
|
|
+ //kdmlabel->label.text = QString::fromUtf8(prompt);
|
|
+ //QTimer::singleShot(0, kdmlabel, SLOT(update()));
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ debug("no themer found!");
|
|
+ }
|
|
+ ++state;
|
|
+ pExp = exp;
|
|
+
|
|
+ exp = authEdit.size();
|
|
+ debug("state %d exp: %d, has %d\n", state, exp, has);
|
|
+
|
|
+ if (has >= exp || nonBlocking)
|
|
+ returnData();
|
|
+}
|
|
+
|
|
+bool // virtual
|
|
+KPamGreeter::binaryPrompt( const char *, bool )
|
|
+{
|
|
+ // this simply cannot happen ... :}
|
|
+ return true;
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::start()
|
|
+{
|
|
+ debug("******* start() called\n");
|
|
+
|
|
+ while(authEdit.begin() != authEdit.end()) {
|
|
+ KPasswordEdit* item = *authEdit.remove(authEdit.begin());
|
|
+ delete item;
|
|
+ }
|
|
+
|
|
+ while(authLabel.begin() != authLabel.end()) {
|
|
+ QLabel* item = *authLabel.remove(authLabel.begin());
|
|
+ delete item;
|
|
+ }
|
|
+
|
|
+ authTok = !(authEdit.size() >= 2 && authEdit[1]->isEnabled());
|
|
+ exp = has = -1;
|
|
+ state = 0;
|
|
+ running = true;
|
|
+ handler->gplugStart();
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::suspend()
|
|
+{
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::resume()
|
|
+{
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::next()
|
|
+{
|
|
+ debug("********* next() called state %d\n", state);
|
|
+
|
|
+ if (state == 0 && running && handler) {
|
|
+ debug(" **** returned text!\n");
|
|
+ handler->gplugReturnText( (loginEdit ? loginEdit->text() :
|
|
+ fixedUser).local8Bit(),
|
|
+ KGreeterPluginHandler::IsUser );
|
|
+ setActive(false);
|
|
+ }
|
|
+
|
|
+ has = 0;
|
|
+
|
|
+ for(QValueList<KPasswordEdit*>::iterator it = authEdit.begin();
|
|
+ it != authEdit.end();
|
|
+ ++it) {
|
|
+
|
|
+ has++;
|
|
+ if ((*it)->hasFocus()) {
|
|
+ ++it;
|
|
+ if (it != authEdit.end())
|
|
+ (*it)->setFocus();
|
|
+ break;
|
|
+ }
|
|
+ if (it == authEdit.end())
|
|
+ has = -1;
|
|
+ }
|
|
+
|
|
+ debug(" has %d and exp %d\n", has, exp);
|
|
+
|
|
+#if 0
|
|
+ // assert( running );
|
|
+ if (loginEdit && loginEdit->hasFocus()) {
|
|
+ passwdEdit->setFocus(); // will cancel running login if necessary
|
|
+ has = 0;
|
|
+ } else if (passwdEdit && passwdEdit->hasFocus()) {
|
|
+ if (passwd1Edit)
|
|
+ passwd1Edit->setFocus();
|
|
+ has = 1;
|
|
+ } else if (passwd1Edit) {
|
|
+ if (passwd1Edit->hasFocus()) {
|
|
+ passwd2Edit->setFocus();
|
|
+ has = 1; // sic!
|
|
+ } else
|
|
+ has = 3;
|
|
+ } else
|
|
+ has = 1;
|
|
+ if (exp < 0)
|
|
+ handler->gplugStart();
|
|
+#endif
|
|
+ if (has >= exp)
|
|
+ returnData();
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::abort()
|
|
+{
|
|
+ debug("***** abort() called\n");
|
|
+
|
|
+ running = false;
|
|
+ if (exp >= 0) {
|
|
+ exp = -1;
|
|
+ handler->gplugReturnText( 0, 0 );
|
|
+ }
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::succeeded()
|
|
+{
|
|
+ debug("**** succeeded() called\n");
|
|
+
|
|
+ // assert( running || timed_login );
|
|
+ if (!authTok)
|
|
+ setActive( false );
|
|
+ else
|
|
+ setAllActive( false );
|
|
+ exp = -1;
|
|
+ running = false;
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::failed()
|
|
+{
|
|
+ // assert( running || timed_login );
|
|
+ setActive( false );
|
|
+ setAllActive( false );
|
|
+ exp = -1;
|
|
+ running = false;
|
|
+}
|
|
+
|
|
+#include<assert.h>
|
|
+void // virtual
|
|
+KPamGreeter::revive()
|
|
+{
|
|
+ // assert( !running );
|
|
+ setAllActive( true );
|
|
+
|
|
+#if 1
|
|
+ if (authEdit.size() < 1)
|
|
+ return;
|
|
+#endif
|
|
+
|
|
+ assert(authEdit.size() >= 1);
|
|
+ if (authTok) {
|
|
+ authEdit[0]->erase();
|
|
+ if(authEdit.size() >= 2)
|
|
+ authEdit[1]->erase();
|
|
+ authEdit[0]->setFocus();
|
|
+ } else {
|
|
+ authEdit[0]->erase();
|
|
+ if (loginEdit && loginEdit->isEnabled())
|
|
+ authEdit[0]->setEnabled( true );
|
|
+ else {
|
|
+ setActive( true );
|
|
+ if (loginEdit && loginEdit->text().isEmpty())
|
|
+ loginEdit->setFocus();
|
|
+ else
|
|
+ authEdit[0]->setFocus();
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+void // virtual
|
|
+KPamGreeter::clear()
|
|
+{
|
|
+ // assert( !running && !passwd1Edit );
|
|
+ authEdit[0]->erase();
|
|
+ if (loginEdit) {
|
|
+ loginEdit->clear();
|
|
+ loginEdit->setFocus();
|
|
+ curUser = QString::null;
|
|
+ } else
|
|
+ authEdit[0]->setFocus();
|
|
+}
|
|
+
|
|
+
|
|
+// private
|
|
+
|
|
+void
|
|
+KPamGreeter::setActive( bool enable )
|
|
+{
|
|
+ if (loginEdit)
|
|
+ loginEdit->setEnabled( enable );
|
|
+}
|
|
+
|
|
+void
|
|
+KPamGreeter::setAllActive( bool enable )
|
|
+{
|
|
+ for(QValueList<KPasswordEdit*>::iterator it = authEdit.begin();
|
|
+ it != authEdit.end();
|
|
+ ++it)
|
|
+ (*it)->setEnabled( enable );
|
|
+}
|
|
+
|
|
+void
|
|
+KPamGreeter::slotLoginLostFocus()
|
|
+{
|
|
+ if (!running)
|
|
+ return;
|
|
+ if (exp > 0) {
|
|
+ if (curUser == loginEdit->text())
|
|
+ return;
|
|
+ exp = -1;
|
|
+ handler->gplugReturnText( 0, 0 );
|
|
+ }
|
|
+ curUser = loginEdit->text();
|
|
+ debug("curUser is %s", curUser.latin1());
|
|
+ handler->gplugSetUser( curUser );
|
|
+}
|
|
+
|
|
+void
|
|
+KPamGreeter::slotActivity()
|
|
+{
|
|
+ debug("slotActivity");
|
|
+
|
|
+ if (running)
|
|
+ handler->gplugActivity();
|
|
+}
|
|
+
|
|
+// factory
|
|
+
|
|
+static bool init( const QString &,
|
|
+ QVariant (*getConf)( void *, const char *, const QVariant & ),
|
|
+ void *ctx )
|
|
+{
|
|
+ echoMode = (KPasswordEdit::EchoModes) getConf( ctx, "EchoMode", QVariant( -1 ) ).toInt();
|
|
+ KGlobal::locale()->insertCatalogue( "kgreet_pam" );
|
|
+ return true;
|
|
+}
|
|
+
|
|
+static void done( void )
|
|
+{
|
|
+ KGlobal::locale()->removeCatalogue( "kgreet_pam" );
|
|
+ if (log && log != stderr)
|
|
+ fclose(log);
|
|
+ log = 0;
|
|
+}
|
|
+
|
|
+static KGreeterPlugin *
|
|
+create( KGreeterPluginHandler *handler, KdmThemer *themer,
|
|
+ QWidget *parent, QWidget *predecessor,
|
|
+ const QString &fixedEntity,
|
|
+ KGreeterPlugin::Function func,
|
|
+ KGreeterPlugin::Context ctx )
|
|
+{
|
|
+ return new KPamGreeter( handler, themer, parent, predecessor, fixedEntity, func, ctx );
|
|
+}
|
|
+
|
|
+KDE_EXPORT kgreeterplugin_info kgreeterplugin_info = {
|
|
+ I18N_NOOP("Pam conversation plugin"), "pam",
|
|
+ kgreeterplugin_info::Local | kgreeterplugin_info::Presettable,
|
|
+ init, done, create
|
|
+};
|
|
+
|
|
+#include "kgreet_pam.moc"
|
|
Index: kdmlib/kgreet_pam.h
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ kdmlib/kgreet_pam.h
|
|
@@ -0,0 +1,93 @@
|
|
+/*
|
|
+
|
|
+Conversation widget for kdm greeter
|
|
+
|
|
+Copyright (C) 2008 Dirk Mueller <mueller@kde.org>
|
|
+
|
|
+
|
|
+This program is free software; you can redistribute it and/or modify
|
|
+it under the terms of the GNU General Public License as published by
|
|
+the Free Software Foundation; either version 2 of the License, or
|
|
+(at your option) any later version.
|
|
+
|
|
+This program is distributed in the hope that it will be useful,
|
|
+but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+GNU General Public License for more details.
|
|
+
|
|
+You should have received a copy of the GNU General Public License
|
|
+along with this program; if not, write to the Free Software
|
|
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
+
|
|
+*/
|
|
+
|
|
+
|
|
+#ifndef KGREET_CLASSIC_H
|
|
+#define KGREET_CLASSIC_H
|
|
+
|
|
+#include "kgreeterplugin.h"
|
|
+
|
|
+#include <qobject.h>
|
|
+#include <qlayout.h>
|
|
+
|
|
+class KLineEdit;
|
|
+class KPasswordEdit;
|
|
+class KSimpleConfig;
|
|
+class QGridLayout;
|
|
+class QLabel;
|
|
+
|
|
+class KPamGreeter : public QObject, public KGreeterPlugin {
|
|
+ Q_OBJECT
|
|
+
|
|
+ public:
|
|
+ KPamGreeter( KGreeterPluginHandler *handler,
|
|
+ KdmThemer *themer,
|
|
+ QWidget *parent, QWidget *predecessor,
|
|
+ const QString &fixedEntitiy,
|
|
+ Function func, Context ctx );
|
|
+ ~KPamGreeter();
|
|
+ virtual void loadUsers( const QStringList &users );
|
|
+ virtual void presetEntity( const QString &entity, int field );
|
|
+ virtual QString getEntity() const;
|
|
+ virtual void setUser( const QString &user );
|
|
+ virtual void setEnabled( 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 );
|
|
+ virtual void start();
|
|
+ virtual void suspend();
|
|
+ virtual void resume();
|
|
+ virtual void next();
|
|
+ virtual void abort();
|
|
+ virtual void succeeded();
|
|
+ virtual void failed();
|
|
+ virtual void revive();
|
|
+ virtual void clear();
|
|
+
|
|
+ QGridLayout *getLayoutItem() const { return static_cast<QGridLayout*>(layoutItem); }
|
|
+
|
|
+ public slots:
|
|
+ void slotLoginLostFocus();
|
|
+ void slotActivity();
|
|
+
|
|
+ private:
|
|
+ void setActive( bool enable );
|
|
+ void setAllActive( bool enable );
|
|
+ void returnData();
|
|
+
|
|
+ QLabel *loginLabel;
|
|
+ QValueList<QLabel*> authLabel;
|
|
+ KLineEdit *loginEdit;
|
|
+ QWidget* m_parentWidget;
|
|
+ QValueList<KPasswordEdit*> authEdit;
|
|
+ KSimpleConfig *stsFile;
|
|
+ KdmThemer *m_themer;
|
|
+ QString fixedUser, curUser;
|
|
+ Function func;
|
|
+ Context ctx;
|
|
+ int exp, pExp, has;
|
|
+ unsigned state;
|
|
+ bool running, authTok;
|
|
+};
|
|
+
|
|
+#endif /* KGREET_CLASSIC_H */
|
|
Index: kdmlib/Makefile.am
|
|
===================================================================
|
|
--- kdmlib/Makefile.am.orig
|
|
+++ kdmlib/Makefile.am
|
|
@@ -1,11 +1,15 @@
|
|
AM_CPPFLAGS = -I$(top_srcdir)/kdm/kfrontend $(all_includes)
|
|
|
|
-kde_module_LTLIBRARIES = kgreet_classic.la kgreet_winbind.la
|
|
+kde_module_LTLIBRARIES = kgreet_classic.la kgreet_pam.la kgreet_winbind.la
|
|
|
|
kgreet_classic_la_SOURCES = kgreet_classic.cpp
|
|
kgreet_classic_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries)
|
|
kgreet_classic_la_LIBADD = $(LIB_KDEUI)
|
|
|
|
+kgreet_pam_la_SOURCES = kgreet_pam.cpp
|
|
+kgreet_pam_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries)
|
|
+kgreet_pam_la_LIBADD = $(LIB_KDEUI)
|
|
+
|
|
kgreet_winbind_la_SOURCES = kgreet_winbind.cpp
|
|
kgreet_winbind_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries)
|
|
kgreet_winbind_la_LIBADD = $(LIB_KDEUI)
|
|
Index: kcheckpass/checkpass_pam.c
|
|
===================================================================
|
|
--- kcheckpass/checkpass_pam.c.orig
|
|
+++ kcheckpass/checkpass_pam.c
|
|
@@ -140,13 +140,16 @@ AuthReturn Authenticate(const char *call
|
|
openlog("kcheckpass", LOG_PID, LOG_AUTH);
|
|
|
|
PAM_data.conv = conv;
|
|
- if (strcmp(method, "classic")) {
|
|
- sprintf(pservb, "%.31s-%.31s", caller, method);
|
|
- pam_service = pservb;
|
|
- } else {
|
|
+ if (!strcmp(method, "classic")) {
|
|
PAM_data.classic = 1;
|
|
pam_service = caller;
|
|
}
|
|
+ else if (!strcmp(method, "pam")) {
|
|
+ pam_service = caller;
|
|
+ } else {
|
|
+ sprintf(pservb, "%.31s-%.31s", caller, method);
|
|
+ pam_service = pservb;
|
|
+ }
|
|
pam_error = pam_start(pam_service, user, &PAM_conversation, &pamh);
|
|
if (pam_error != PAM_SUCCESS)
|
|
return AuthError;
|