diff options
Diffstat (limited to 'kdmlib/kgreet_winbind.cpp')
-rw-r--r-- | kdmlib/kgreet_winbind.cpp | 679 |
1 files changed, 0 insertions, 679 deletions
diff --git a/kdmlib/kgreet_winbind.cpp b/kdmlib/kgreet_winbind.cpp deleted file mode 100644 index d5626a3fd..000000000 --- a/kdmlib/kgreet_winbind.cpp +++ /dev/null @@ -1,679 +0,0 @@ -/* - -Conversation widget for tdm greeter - -Copyright (C) 1997, 1998, 2000 Steffen Hansen <hansen@kde.org> -Copyright (C) 2000-2004 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_winbind.h" -#include "themer/tdmthemer.h" -#include "themer/tdmitem.h" - -#include <klocale.h> -#include <kdebug.h> -#include <kcombobox.h> -#include <klineedit.h> -#include <kpassdlg.h> -#include <kuser.h> -#include <kprocio.h> - -#include <tqregexp.h> -#include <tqlayout.h> -#include <tqlabel.h> - -#include <stdlib.h> - -class TDMPasswordEdit : public KPasswordEdit { -public: - TDMPasswordEdit( TQWidget *parent ) : KPasswordEdit( parent, 0 ) {} - TDMPasswordEdit( KPasswordEdit::EchoModes echoMode, TQWidget *parent ) : KPasswordEdit( echoMode, parent, 0 ) {} -protected: - virtual void contextMenuEvent( TQContextMenuEvent * ) {} -}; - -static int echoMode; -static char separator; -static TQStringList staticDomains; -static TQString defaultDomain; - -static void -splitEntity( const TQString &ent, TQString &dom, TQString &usr ) -{ - int pos = ent.find( separator ); - if (pos < 0) - dom = "<local>", usr = ent; - else - dom = ent.left( pos ), usr = ent.mid( pos + 1 ); -} - -KWinbindGreeter::KWinbindGreeter( KGreeterPluginHandler *_handler, - KdmThemer *themer, - TQWidget *parent, TQWidget *pred, - const TQString &_fixedEntity, - Function _func, Context _ctx ) : - TQObject(), - KGreeterPlugin( _handler ), - func( _func ), - ctx( _ctx ), - exp( -1 ), - pExp( -1 ), - running( false ) -{ - KdmItem *user_entry = 0, *pw_entry = 0, *domain_entry = 0; - TQGridLayout *grid = 0; - - int line = 0; - layoutItem = 0; - - if (themer && - (!(user_entry = themer->findNode( "user-entry" )) || - !(pw_entry = themer->findNode( "pw-entry" )) || - !(domain_entry = themer->findNode( "domain-entry" )))) - themer = 0; - - if (!themer) - grid = new TQGridLayout( 0, 0, 10 ); - layoutItem = TQT_TQLAYOUTITEM(grid); - - domainLabel = loginLabel = passwdLabel = passwd1Label = passwd2Label = 0; - domainCombo = 0; - loginEdit = 0; - passwdEdit = passwd1Edit = passwd2Edit = 0; - m_domainLister = 0; - if (ctx == ExUnlock || ctx == ExChangeTok) - splitEntity( KUser().loginName(), fixedDomain, fixedUser ); - else - splitEntity( _fixedEntity, fixedDomain, fixedUser ); - if (func != ChAuthTok) { - if (fixedUser.isEmpty()) { - domainCombo = new KComboBox( parent ); - connect( domainCombo, TQT_SIGNAL(activated( const TQString & )), - TQT_SLOT(slotChangedDomain( const TQString & )) ); - connect( domainCombo, TQT_SIGNAL(activated( const TQString & )), - TQT_SLOT(slotLoginLostFocus()) ); - connect( domainCombo, TQT_SIGNAL(activated( const TQString & )), - TQT_SLOT(slotActivity()) ); - // should handle loss of focus - loginEdit = new KLineEdit( parent ); - loginEdit->setContextMenuEnabled( false ); - - if (pred) { - parent->setTabOrder( pred, domainCombo ); - parent->setTabOrder( domainCombo, loginEdit ); - pred = loginEdit; - } - if (!grid) { - loginEdit->adjustSize(); - domainCombo->adjustSize(); - user_entry->setWidget( loginEdit ); - domain_entry->setWidget( domainCombo ); - } else { - domainLabel = new TQLabel( domainCombo, i18n("&Domain:"), parent ); - loginLabel = new TQLabel( loginEdit, i18n("&Username:"), parent ); - grid->addWidget( domainLabel, line, 0 ); - grid->addWidget( domainCombo, line++, 1 ); - grid->addWidget( loginLabel, line, 0 ); - grid->addWidget( loginEdit, line++, 1 ); - } - connect( loginEdit, TQT_SIGNAL(lostFocus()), TQT_SLOT(slotLoginLostFocus()) ); - connect( loginEdit, TQT_SIGNAL(lostFocus()), TQT_SLOT(slotActivity()) ); - connect( loginEdit, TQT_SIGNAL(textChanged( const TQString & )), TQT_SLOT(slotActivity()) ); - connect( loginEdit, TQT_SIGNAL(selectionChanged()), TQT_SLOT(slotActivity()) ); - connect(&mDomainListTimer, TQT_SIGNAL(timeout()), TQT_SLOT(slotStartDomainList())); - domainCombo->insertStringList( staticDomains ); - TQTimer::singleShot(0, this, TQT_SLOT(slotStartDomainList())); - } else if (ctx != Login && ctx != Shutdown && grid) { - domainLabel = new TQLabel( i18n("Domain:"), parent ); - grid->addWidget( domainLabel, line, 0 ); - grid->addWidget( new TQLabel( fixedDomain, parent ), line++, 1 ); - loginLabel = new TQLabel( i18n("Username:"), parent ); - grid->addWidget( loginLabel, line, 0 ); - grid->addWidget( new TQLabel( fixedUser, parent ), line++, 1 ); - } - if (echoMode == -1) - passwdEdit = new TDMPasswordEdit( parent ); - else - passwdEdit = new TDMPasswordEdit( (KPasswordEdit::EchoModes)echoMode, - parent ); - connect( passwdEdit, TQT_SIGNAL(textChanged( const TQString & )), - TQT_SLOT(slotActivity()) ); - connect( passwdEdit, TQT_SIGNAL(lostFocus()), TQT_SLOT(slotActivity()) ); - - if (!grid) { - passwdEdit->adjustSize(); - pw_entry->setWidget( passwdEdit ); - } else { - passwdLabel = new TQLabel( passwdEdit, - func == Authenticate ? - i18n("&Password:") : - i18n("Current &password:"), - parent ); - if (pred) { - parent->setTabOrder( pred, passwdEdit ); - pred = passwdEdit; - } - grid->addWidget( passwdLabel, line, 0 ); - grid->addWidget( passwdEdit, line++, 1 ); - } - - if (loginEdit) - loginEdit->setFocus(); - else - passwdEdit->setFocus(); - } - if (func != Authenticate) { - if (echoMode == -1) { - passwd1Edit = new TDMPasswordEdit( (KPasswordEdit::EchoModes)echoMode, parent ); - passwd2Edit = new TDMPasswordEdit( (KPasswordEdit::EchoModes)echoMode, parent ); - } else { - passwd1Edit = new TDMPasswordEdit( parent ); - passwd2Edit = new TDMPasswordEdit( parent ); - } - passwd1Label = new TQLabel( passwd1Edit, i18n("&New password:"), parent ); - passwd2Label = new TQLabel( passwd2Edit, i18n("Con&firm password:"), parent ); - if (pred) { - parent->setTabOrder( pred, passwd1Edit ); - parent->setTabOrder( passwd1Edit, passwd2Edit ); - } - if (grid) { - grid->addWidget( passwd1Label, line, 0 ); - grid->addWidget( passwd1Edit, line++, 1 ); - grid->addWidget( passwd2Label, line, 0 ); - grid->addWidget( passwd2Edit, line, 1 ); - } - if (!passwdEdit) - passwd1Edit->setFocus(); - } -} - -// virtual -KWinbindGreeter::~KWinbindGreeter() -{ - abort(); - if (!layoutItem) { - delete loginEdit; - delete passwdEdit; - delete domainCombo; - return; - } - TQLayoutIterator it = TQT_TQLAYOUT(layoutItem)->iterator(); - for (TQLayoutItem *itm = it.current(); itm; itm = ++it) - delete itm->widget(); - delete layoutItem; - delete m_domainLister; -} - -void -KWinbindGreeter::slotChangedDomain( const TQString &dom ) -{ - if (!loginEdit->completionObject()) - return; - TQStringList users; - if (dom == "<local>") { - for (TQStringList::ConstIterator it = allUsers.begin(); it != allUsers.end(); ++it) - if ((*it).find( separator ) < 0) - users << *it; - } else { - TQString st( dom + separator ); - for (TQStringList::ConstIterator it = allUsers.begin(); it != allUsers.end(); ++it) - if ((*it).startsWith( st )) - users << (*it).mid( st.length() ); - } - loginEdit->completionObject()->setItems( users ); -} - -void // virtual -KWinbindGreeter::loadUsers( const TQStringList &users ) -{ - allUsers = users; - KCompletion *userNamesCompletion = new KCompletion; - loginEdit->setCompletionObject( userNamesCompletion ); - loginEdit->setAutoDeleteCompletionObject( true ); - loginEdit->setCompletionMode( KGlobalSettings::CompletionAuto ); - slotChangedDomain( defaultDomain ); -} - -void // virtual -KWinbindGreeter::presetEntity( const TQString &entity, int field ) -{ - TQString dom, usr; - splitEntity( entity, dom, usr ); - domainCombo->setCurrentItem( dom, true ); - slotChangedDomain( dom ); - loginEdit->setText( usr ); - if (field > 1) - passwdEdit->setFocus(); - else if (field == 1 || field == -1) { - if (field == -1) { - passwdEdit->setText( " " ); - passwdEdit->setEnabled( false ); - authTok = false; - } - loginEdit->setFocus(); - loginEdit->selectAll(); - } - curUser = entity; -} - -TQString // virtual -KWinbindGreeter::getEntity() const -{ - TQString dom, usr; - if (fixedUser.isEmpty()) - dom = domainCombo->currentText(), usr = loginEdit->text(); - else - dom = fixedDomain, usr = fixedUser; - return dom == "<local>" ? usr : dom + separator + usr; -} - -void // virtual -KWinbindGreeter::setUser( const TQString &user ) -{ - // assert (fixedUser.isEmpty()); - curUser = user; - TQString dom, usr; - splitEntity( user, dom, usr ); - domainCombo->setCurrentItem( dom, true ); - slotChangedDomain( dom ); - loginEdit->setText( usr ); - passwdEdit->setFocus(); - passwdEdit->selectAll(); -} - -void // virtual -KWinbindGreeter::setPassword( const TQString &pass ) -{ - passwdEdit->erase(); - passwdEdit->insert( pass ); -} - -void // virtual -KWinbindGreeter::setEnabled( bool enable ) -{ - // assert( !passwd1Label ); - // assert( func == Authenticate && ctx == Shutdown ); -// if (domainCombo) -// domainCombo->setEnabled( enable ); -// if (loginLabel) -// loginLabel->setEnabled( enable ); - passwdLabel->setEnabled( enable ); - setActive( enable ); - if (enable) - passwdEdit->setFocus(); -} - -void // private -KWinbindGreeter::returnData() -{ - switch (exp) { - case 0: - handler->gplugReturnText( getEntity().local8Bit(), - KGreeterPluginHandler::IsUser ); - break; - case 1: - handler->gplugReturnText( passwdEdit->password(), - KGreeterPluginHandler::IsPassword | - KGreeterPluginHandler::IsSecret ); - break; - case 2: - handler->gplugReturnText( passwd1Edit->password(), - KGreeterPluginHandler::IsSecret ); - break; - default: // case 3: - handler->gplugReturnText( passwd2Edit->password(), - KGreeterPluginHandler::IsNewPassword | - KGreeterPluginHandler::IsSecret ); - break; - } -} - -bool // virtual -KWinbindGreeter::textMessage( const char *text, bool err ) -{ - if (!err && - TQString( text ).find( TQRegExp( "^Changing password for [^ ]+$" ) ) >= 0) - return true; - return false; -} - -void // virtual -KWinbindGreeter::textPrompt( const char *prompt, bool echo, bool nonBlocking ) -{ - pExp = exp; - if (echo) - exp = 0; - else if (!authTok) - exp = 1; - else { - TQString pr( prompt ); - if (pr.find( TQRegExp( "\\b(old|current)\\b", false ) ) >= 0) { - handler->gplugReturnText( "", - KGreeterPluginHandler::IsOldPassword | - KGreeterPluginHandler::IsSecret ); - return; - } else if (pr.find( TQRegExp( "\\b(re-?(enter|type)|again|confirm|repeat)\\b", - false ) ) >= 0) - exp = 3; - else if (pr.find( TQRegExp( "\\bnew\\b", false ) ) >= 0) - exp = 2; - else { - handler->gplugMsgBox( TQMessageBox::Critical, - i18n("Unrecognized prompt \"%1\"") - .arg( prompt ) ); - handler->gplugReturnText( 0, 0 ); - exp = -1; - return; - } - } - - if (pExp >= 0 && pExp >= exp) { - revive(); - has = -1; - } - - if (has >= exp || nonBlocking) - returnData(); -} - -bool // virtual -KWinbindGreeter::binaryPrompt( const char *, bool ) -{ - // this simply cannot happen ... :} - return true; -} - -void // virtual -KWinbindGreeter::start() -{ - authTok = !(passwdEdit && passwdEdit->isEnabled()); - exp = has = -1; - running = true; -} - -void // virtual -KWinbindGreeter::suspend() -{ -} - -void // virtual -KWinbindGreeter::resume() -{ -} - -void // virtual -KWinbindGreeter::next() -{ - // assert( running ); - if (domainCombo && domainCombo->hasFocus()) - loginEdit->setFocus(); - else 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(); - else if (has >= exp) - returnData(); -} - -void // virtual -KWinbindGreeter::abort() -{ - running = false; - if (exp >= 0) { - exp = -1; - handler->gplugReturnText( 0, 0 ); - } -} - -void // virtual -KWinbindGreeter::succeeded() -{ - // assert( running || timed_login ); - if (!authTok) { - setActive( false ); - if (passwd1Edit) { - authTok = true; - return; - } - } else - setActive2( false ); - exp = -1; - running = false; -} - -void // virtual -KWinbindGreeter::failed() -{ - // assert( running || timed_login ); - setActive( false ); - setActive2( false ); - exp = -1; - running = false; -} - -void // virtual -KWinbindGreeter::revive() -{ - // assert( !running ); - setActive2( true ); - if (authTok) { - passwd1Edit->erase(); - passwd2Edit->erase(); - passwd1Edit->setFocus(); - } else { - passwdEdit->erase(); - if (loginEdit && loginEdit->isEnabled()) - passwdEdit->setEnabled( true ); - else { - setActive( true ); - if (loginEdit && loginEdit->text().isEmpty()) - loginEdit->setFocus(); - else - passwdEdit->setFocus(); - } - } -} - -void // virtual -KWinbindGreeter::clear() -{ - // assert( !running && !passwd1Edit ); - passwdEdit->erase(); - if (loginEdit) { - domainCombo->setCurrentItem( defaultDomain ); - slotChangedDomain( defaultDomain ); - loginEdit->clear(); - loginEdit->setFocus(); - curUser = TQString::null; - } else - passwdEdit->setFocus(); -} - - -// private - -void -KWinbindGreeter::setActive( bool enable ) -{ - if (domainCombo) - domainCombo->setEnabled( enable ); - if (loginEdit) - loginEdit->setEnabled( enable ); - if (passwdEdit) - passwdEdit->setEnabled( enable ); -} - -void -KWinbindGreeter::setActive2( bool enable ) -{ - if (passwd1Edit) { - passwd1Edit->setEnabled( enable ); - passwd2Edit->setEnabled( enable ); - } -} - -void -KWinbindGreeter::slotLoginLostFocus() -{ - if (!running) - return; - TQString ent( getEntity() ); - if (exp > 0) { - if (curUser == ent) - return; - exp = -1; - handler->gplugReturnText( 0, 0 ); - } - curUser = ent; - handler->gplugSetUser( curUser ); -} - -void -KWinbindGreeter::slotActivity() -{ - if (running) - handler->gplugActivity(); -} - -void -KWinbindGreeter::slotStartDomainList() -{ - mDomainListTimer.stop(); - mDomainListing.clear(); - - m_domainLister = new KProcIO; - connect(m_domainLister, TQT_SIGNAL(readReady(KProcIO*)), TQT_SLOT(slotReadDomainList())); - connect(m_domainLister, TQT_SIGNAL(processExited(KProcess*)), TQT_SLOT(slotEndDomainList())); - - (*m_domainLister) << "wbinfo" << "--own-domain" << "--trusted-domains"; - m_domainLister->setComm (KProcess::Stdout); - m_domainLister->start(); -} - -void -KWinbindGreeter::slotReadDomainList() -{ - TQString line; - - while ( m_domainLister->readln( line ) != -1 ) { - mDomainListing.append(line); - } -} - -void -KWinbindGreeter::slotEndDomainList() -{ - delete m_domainLister; - m_domainLister = 0; - - TQStringList domainList; - domainList = staticDomains; - - for (TQStringList::const_iterator it = mDomainListing.begin(); - it != mDomainListing.end(); ++it) { - - if (!domainList.contains(*it)) - domainList.append(*it); - } - - TQString current = domainCombo->currentText(); - - for (int i = 0; i < domainList.count(); ++i) { - if (i < domainCombo->count()) - domainCombo->changeItem(domainList[i], i); - else - domainCombo->insertItem(domainList[i], i); - } - - while (domainCombo->count() > domainList.count()) - domainCombo->removeItem(domainCombo->count()-1); - - domainCombo->setCurrentItem( current ); - - if (domainCombo->currentText() != current) - domainCombo->setCurrentItem( defaultDomain ); - - mDomainListTimer.start(5 * 1000); -} - -// factory - -static bool init( const TQString &, - TQVariant (*getConf)( void *, const char *, const TQVariant & ), - void *ctx ) -{ - echoMode = getConf( ctx, "EchoMode", TQVariant( -1 ) ).toInt(); - staticDomains = TQStringList::split( ':', getConf( ctx, "winbind.Domains", TQVariant( "" ) ).toString() ); - if (!staticDomains.contains("<local>")) - staticDomains << "<local>"; - - defaultDomain = getConf( ctx, "winbind.DefaultDomain", TQVariant( staticDomains.first() ) ).toString(); - TQString sepstr = getConf( ctx, "winbind.Separator", TQVariant( TQString::null ) ).toString(); - if (sepstr.isNull()) { - FILE *sepfile = popen( "wbinfo --separator 2>/dev/null", "r" ); - if (sepfile) { - TQTextIStream( sepfile ) >> sepstr; - if (pclose( sepfile )) - sepstr = "\\"; - } else - sepstr = "\\"; - } - separator = sepstr[0].latin1(); - KGlobal::locale()->insertCatalogue( "kgreet_winbind" ); - return true; -} - -static void done( void ) -{ - KGlobal::locale()->removeCatalogue( "kgreet_winbind" ); - // avoid static deletion problems ... hopefully - staticDomains.clear(); - defaultDomain = TQString::null; -} - -static KGreeterPlugin * -create( KGreeterPluginHandler *handler, KdmThemer *themer, - TQWidget *parent, TQWidget *predecessor, - const TQString &fixedEntity, - KGreeterPlugin::Function func, - KGreeterPlugin::Context ctx ) -{ - return new KWinbindGreeter( handler, themer, parent, predecessor, fixedEntity, func, ctx ); -} - -KDE_EXPORT kgreeterplugin_info kgreeterplugin_info = { - I18N_NOOP("Winbind / Samba"), "classic", - kgreeterplugin_info::Local | kgreeterplugin_info::Fielded | kgreeterplugin_info::Presettable, - init, done, create -}; - -#include "kgreet_winbind.moc" |