Diffstat (limited to 'core/opie-login/loginwindowimpl.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | core/opie-login/loginwindowimpl.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/core/opie-login/loginwindowimpl.cpp b/core/opie-login/loginwindowimpl.cpp index 63baaa6..c59338f 100644 --- a/core/opie-login/loginwindowimpl.cpp +++ b/core/opie-login/loginwindowimpl.cpp @@ -1,138 +1,141 @@ #include <qapplication.h> #include <qpushbutton.h> #include <qlayout.h> #include <qframe.h> #include <qlineedit.h> #include <qtimer.h> #include <qcombobox.h> #include <qpixmap.h> #include <qlabel.h> #include <qpopupmenu.h> #include <qmessagebox.h> +#include <qimage.h> +#include <qpe/resource.h> #include <qpe/qcopenvelope_qws.h> #include <opie/odevice.h> #include <stdio.h> #include <pwd.h> #include <grp.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #ifdef USEPAM extern "C" { #include <security/pam_appl.h> } #else #include <crypt.h> #include <shadow.h> #endif #include "loginwindowimpl.h" #include "inputmethods.h" using namespace Opie; LoginWindowImpl::LoginWindowImpl ( ) : LoginWindow ( 0, "LOGIN-WINDOW", WStyle_Customize | WStyle_NoBorder | WDestructiveClose ) { QPopupMenu *pop = new QPopupMenu ( this ); pop-> insertItem ( tr( "Restart" ), this, SLOT( restart ( ))); pop-> insertItem ( tr( "Quit" ), this, SLOT( quit ( ))); m_menu-> setPopup ( pop ); QHBoxLayout *lay = new QHBoxLayout ( m_taskbar, 4, 4 ); m_input = new InputMethods ( m_taskbar ); lay-> addWidget ( m_input ); lay-> addStretch ( 10 ); setActiveWindow ( ); m_password-> setFocus ( ); m_user-> insertStringList ( getAllUsers ( )); QTimer::singleShot ( 0, this, SLOT( showIM ( ))); QString opiedir = ::getenv ( "OPIEDIR" ); QPixmap bgpix ( opiedir + "/pics/launcher/opie-background.jpg" ); if ( !bgpix. isNull ( )) setBackgroundPixmap ( bgpix ); m_caption-> setText ( m_caption-> text ( ) + tr( "<center>%1 %2</center>" ). arg ( ODevice::inst ( )-> systemString ( )). arg ( ODevice::inst ( )-> systemVersionString ( ))); } LoginWindowImpl::~LoginWindowImpl ( ) { } void LoginWindowImpl::keyPressEvent ( QKeyEvent *e ) { switch ( e-> key ( )) { case HardKey_Suspend: suspend ( ); break; case HardKey_Backlight: backlight ( ); break; default: e-> ignore ( ); break; } LoginWindow::keyPressEvent ( e ); } void LoginWindowImpl::toggleEchoMode ( bool t ) { m_password-> setEchoMode ( t ? QLineEdit::Normal : QLineEdit::Password ); } + QStringList LoginWindowImpl::getAllUsers ( ) { struct passwd *pwd; QStringList sl; while (( pwd = ::getpwent ( ))) { if (( pwd-> pw_uid == 0 ) || ( pwd-> pw_uid >= 500 && pwd-> pw_uid < 65534 )) sl << QString ( pwd-> pw_name ); } ::endpwent ( ); return sl; } void LoginWindowImpl::showIM ( ) { m_input-> showInputMethod ( ); } void LoginWindowImpl::restart ( ) { qApp-> quit ( ); } void LoginWindowImpl::quit ( ) { qApp-> quit ( ); ::kill ( ::getppid ( ), SIGUSR1 ); } void LoginWindowImpl::suspend ( ) { ODevice::inst ( )-> suspend ( ); QCopEnvelope e("QPE/System", "setBacklight(int)"); e << -3; // Force on } void LoginWindowImpl::backlight ( ) { QCopEnvelope e("QPE/System", "setBacklight(int)"); e << -2; // toggle } #ifdef USEPAM static const char *_PAM_SERVICE = "xdm"; @@ -255,72 +258,88 @@ static bool pwcheck_Unix( const char *user, const char *pass ) #endif bool LoginWindowImpl::changeIdentity ( const char *user ) { const char *DEFAULT_LOGIN_PATH = "/bin:/usr/bin"; const char *DEFAULT_ROOT_LOGIN_PATH = "/usr/sbin:/bin:/usr/bin:/sbin"; bool fail = false; struct passwd *pw = getpwnam ( user ); fail |= ( pw == 0 ); fail |= ( initgroups ( pw-> pw_name, pw-> pw_gid )); endgrent ( ); fail |= ( setgid ( pw-> pw_gid )); fail |= ( setuid ( pw-> pw_uid )); fail |= ( chdir ( pw-> pw_dir ) && chdir ( "/" )); fail |= ( setenv ( "HOME", pw-> pw_dir, 1 )); fail |= ( setenv ( "SHELL", pw-> pw_shell, 1 )); fail |= ( setenv ( "USER", pw-> pw_name, 1 )); fail |= ( setenv ( "LOGNAME", pw-> pw_name, 1 )); fail |= ( setenv ( "PATH", ( pw-> pw_uid ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH ), 1 )); return !fail; } void LoginWindowImpl::login ( ) { const char *user = ::strdup ( m_user-> currentText ( ). local8Bit ( )); const char *pass = ::strdup ( m_password-> text ( ). local8Bit ( )); bool ok; if ( !user || !user [0] ) return; if ( !pass ) pass = ""; #if defined( USEPAM ) ok = pwcheck_PAM ( user, pass ); #else ok = pwcheck_Unix ( user, pass ); #endif if ( ok ) { if ( changeIdentity ( user )) { + // Draw a big wait icon, the image can be altered in later revisions + QWidget *d = QApplication::desktop ( ); + m_input-> hideInputMethod ( ); + + QImage img = Resource::loadImage( "launcher/new_wait" ); + QPixmap pix; + pix. convertFromImage ( img ); + QLabel *w = new QLabel ( 0, "wait hack!", WStyle_Customize | WStyle_NoBorder | WStyle_Tool ); + w-> setPixmap ( pix ); + w-> setAlignment ( AlignCenter ); + w-> showMaximized ( ); + qApp-> processEvents ( ); + char *opie = ::getenv ( "OPIEDIR" ); char *arg = new char [::strlen ( opie ) + 8 + 1]; ::strcpy ( arg, opie ); ::strcat ( arg, "/bin/qpe" ); // start qpe via a login shell ::execl ( "/bin/sh", "-sh", "-c", arg, 0 ); + w-> hide ( ); + delete w; + QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not start OPIE\n(%1)." ). arg ( arg )); delete [] arg; restart ( ); } else { QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not switch to new user identity" )); restart ( ); } } else { QMessageBox::warning ( this, tr( "Wrong password" ), tr( "The given password is incorrect." )); m_password-> clear ( ); } } |