diff options
Diffstat (limited to 'opensuse/core/tdebase/kpamgreeter.diff')
-rw-r--r-- | opensuse/core/tdebase/kpamgreeter.diff | 852 |
1 files changed, 852 insertions, 0 deletions
diff --git a/opensuse/core/tdebase/kpamgreeter.diff b/opensuse/core/tdebase/kpamgreeter.diff new file mode 100644 index 000000000..ff8241623 --- /dev/null +++ b/opensuse/core/tdebase/kpamgreeter.diff @@ -0,0 +1,852 @@ +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; |