-rw-r--r-- | core/opie-login/loginwindow.ui | 22 | ||||
-rw-r--r-- | core/opie-login/loginwindowimpl.cpp | 54 | ||||
-rw-r--r-- | core/opie-login/loginwindowimpl.h | 1 | ||||
-rw-r--r-- | core/opie-login/main.cpp | 197 |
4 files changed, 168 insertions, 106 deletions
diff --git a/core/opie-login/loginwindow.ui b/core/opie-login/loginwindow.ui index 86d5469..edd0819 100644 --- a/core/opie-login/loginwindow.ui +++ b/core/opie-login/loginwindow.ui @@ -1,110 +1,126 @@ <!DOCTYPE UI><UI> <class>LoginWindow</class> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>LoginWindow</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> - <width>472</width> + <width>460</width> <height>341</height> </rect> </property> <property stdset="1"> <name>caption</name> <string>Login</string> </property> <property> <name>layoutMargin</name> </property> <property> <name>layoutSpacing</name> </property> <vbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>0</number> </property> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout7</cstring> </property> <property> <name>layoutMargin</name> </property> + <property> + <name>layoutSpacing</name> + </property> <vbox> <property stdset="1"> <name>margin</name> <number>4</number> </property> <property stdset="1"> <name>spacing</name> - <number>6</number> + <number>4</number> </property> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>m_caption</cstring> </property> <property stdset="1"> <name>sizePolicy</name> <sizepolicy> <hsizetype>5</hsizetype> <vsizetype>5</vsizetype> </sizepolicy> </property> <property stdset="1"> + <name>font</name> + <font> + <family>helvetica</family> + <pointsize>18</pointsize> + <bold>1</bold> + <underline>1</underline> + </font> + </property> + <property stdset="1"> <name>autoMask</name> <bool>true</bool> </property> <property stdset="1"> <name>backgroundOrigin</name> <enum>ParentOrigin</enum> </property> <property stdset="1"> + <name>margin</name> + <number>1</number> + </property> + <property stdset="1"> <name>text</name> - <string><center><h1>Welcome to OPIE</h1></center></string> + <string><center>Welcome to OPIE</center></string> </property> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout6</cstring> </property> <property> <name>layoutSpacing</name> </property> <grid> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>4</number> </property> <widget row="0" column="1" > <class>QComboBox</class> <property stdset="1"> <name>name</name> <cstring>m_user</cstring> </property> <property stdset="1"> <name>autoMask</name> <bool>true</bool> </property> <property stdset="1"> <name>editable</name> diff --git a/core/opie-login/loginwindowimpl.cpp b/core/opie-login/loginwindowimpl.cpp index 3265b46..f24ebb3 100644 --- a/core/opie-login/loginwindowimpl.cpp +++ b/core/opie-login/loginwindowimpl.cpp @@ -1,159 +1,163 @@ #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 <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" 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><h1><u>%1 %2</u></h1></center>" ). arg ( ODevice::inst ( )-> systemString ( )). arg ( ODevice::inst ( )-> systemVersionString ( ))); + 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 Key_F34: suspend ( ); + case HardKey_Suspend: suspend ( ); break; - case Key_F35: backlight ( ); + 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 ( ))) { + while (( pwd = ::getpwent ( ))) { if (( pwd-> pw_uid == 0 ) || ( pwd-> pw_uid >= 500 && pwd-> pw_uid < 65534 )) sl << QString ( pwd-> pw_name ); } - endpwent ( ); + ::endpwent ( ); return sl; } void LoginWindowImpl::showIM ( ) { m_input-> showInputMethod ( ); } void LoginWindowImpl::restart ( ) { qApp-> quit ( ); } -void LoginWindowImpl::suspend ( ) +void LoginWindowImpl::quit ( ) { - system ( "apm -s" ); - usleep ( 1 * 1000 * 1000 ); + 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"; static const char *PAM_password; typedef const struct pam_message pam_message_type; static int PAM_conv( int, pam_message_type **, struct pam_response **, void * ); static struct pam_conv PAM_conversation = { &PAM_conv, NULL }; //---------------------------------------------------------------------------- static char *COPY_STRING( const char * s ) { return (s) ? strdup(s) : (char *)NULL; } #define GET_MEM if (reply) realloc(reply, size);\ else reply = (struct pam_response *)malloc(size); \ if (!reply) return PAM_CONV_ERR; \ size += sizeof(struct pam_response) static int PAM_conv( int num_msg, pam_message_type **msg, struct pam_response **resp, void *) { int count = 0, replies = 0; struct pam_response *reply = NULL; @@ -229,95 +233,91 @@ static bool pwcheck_Unix( const char *user, const char *pass ) return false; if (( strcmp ( pw-> pw_passwd, "x" ) == 0 ) || ( strcmp ( pw-> pw_passwd, "*" ) == 0 )) { struct spwd *sp = getspnam ( pw-> pw_name ); if ( !sp ) return false; correct = sp-> sp_pwdp; } else correct = pw-> pw_passwd; if ( correct == 0 || correct[0] == '\0' ) return true; encrypted = crypt ( pass, correct ); return ( strcmp ( encrypted, correct ) == 0 ); } #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 ); - printf ( "1 %d\n", fail ); fail |= ( initgroups ( pw-> pw_name, pw-> pw_gid )); endgrent ( ); - printf ( "2 %d\n", fail ); fail |= ( setgid ( pw-> pw_gid )); - printf ( "3 %d\n", fail ); fail |= ( setuid ( pw-> pw_uid )); - printf ( "4 %d\n", fail ); fail |= ( chdir ( pw-> pw_dir ) && chdir ( "/" )); - printf ( "5 %d\n", fail ); fail |= ( setenv ( "HOME", pw-> pw_dir, 1 )); - printf ( "6 %d\n", fail ); fail |= ( setenv ( "SHELL", pw-> pw_shell, 1 )); - printf ( "7 %d\n", fail ); fail |= ( setenv ( "USER", pw-> pw_name, 1 )); - printf ( "8 %d\n", fail ); fail |= ( setenv ( "LOGNAME", pw-> pw_name, 1 )); - printf ( "9 %d\n", fail ); fail |= ( setenv ( "PATH", ( pw-> pw_uid ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH ), 1 )); - printf ( "10 %d\n", fail ); return !fail; } void LoginWindowImpl::login ( ) { - const char *user = strdup ( m_user-> currentText ( ). local8Bit ( )); - const char *pass = strdup ( m_password-> text ( ). local8Bit ( )); + 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 )) { - QString opie = getenv ( "OPIEDIR" ); - opie += "/bin/qpe"; + 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 ); - execl ( opie. latin1 ( ), "qpe", 0 ); + QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not start OPIE\n(%1)." ). arg ( arg )); + delete [] arg; - QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not start OPIE." )); 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 ( ); } } diff --git a/core/opie-login/loginwindowimpl.h b/core/opie-login/loginwindowimpl.h index 16c42e6..2e2ba0d 100644 --- a/core/opie-login/loginwindowimpl.h +++ b/core/opie-login/loginwindowimpl.h @@ -1,33 +1,34 @@ #ifndef __OPIE_LOGINWINDOW_IMPL_H__ #define __OPIE_LOGINWINDOW_IMPL_H__ #include "loginwindow.h" class InputMethods; class LoginWindowImpl : public LoginWindow { Q_OBJECT public: LoginWindowImpl ( ); virtual ~LoginWindowImpl ( ); protected slots: void restart ( ); + void quit ( ); void showIM ( ); void suspend ( ); void backlight ( ); void login ( ); void toggleEchoMode ( bool ); protected: virtual void keyPressEvent ( QKeyEvent *e ); QStringList getAllUsers ( ); bool changeIdentity ( const char *user ); private: InputMethods *m_input; }; #endif diff --git a/core/opie-login/main.cpp b/core/opie-login/main.cpp index 44d6f8d..718009a 100644 --- a/core/opie-login/main.cpp +++ b/core/opie-login/main.cpp @@ -1,179 +1,224 @@ #include <sys/time.h> #include <sys/resource.h> #include <unistd.h> #include <syslog.h> #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> +#include <signal.h> #include <qpe/qpeapplication.h> #include <qpe/qcopenvelope_qws.h> +#include <qpe/qpestyle.h> +#include <qpe/power.h> #include <opie/odevice.h> #include <qwindowsystem_qws.h> #include <qfile.h> #include "loginwindowimpl.h" #include "calibrate.h" int login_main ( int argc, char **argv ); +void sigusr1 ( int sig ); +void exit_closelog ( ); + int main ( int argc, char **argv ) { - if ( geteuid ( ) != 0 ) { - fprintf ( stderr, "%s can only be executed by root. (or chmod +s)", argv [0] ); + if ( ::geteuid ( ) != 0 ) { + ::fprintf ( stderr, "%s can only be executed by root. (or chmod +s)", argv [0] ); return 1; } // struct rlimit rl; -// getrlimit ( RLIMIT_NOFILE, &rl ); +// ::getrlimit ( RLIMIT_NOFILE, &rl ); // for ( unsigned int i = 0; i < rl. rlim_cur; i++ ) -// close ( i ); +// ::close ( i ); + + ::setpgid ( 0, 0 ); + ::setsid ( ); - setpgid ( 0, 0 ); - setsid ( ); + ::signal ( SIGUSR1, sigusr1 ); - openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV ); + ::openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV ); + ::atexit ( exit_closelog ); while ( true ) { - pid_t child = fork ( ); + pid_t child = ::fork ( ); if ( child < 0 ) { - syslog ( LOG_ERR, "Could not fork process" ); + ::syslog ( LOG_ERR, "Could not fork process" ); break; } else if ( child > 0 ) { int status = 0; - while ( waitpid ( child, &status, 0 ) < 0 ) { } + while ( ::waitpid ( child, &status, 0 ) < 0 ) { } } else { - exit ( login_main ( argc, argv )); + ::exit ( login_main ( argc, argv )); + } } + return 0; +} + +void sigusr1 ( int /*sig*/ ) +{ + ::exit ( 0 ); } - closelog ( ); + +void exit_closelog ( ) +{ + ::closelog ( ); } -class ModelKeyFilter : public QObject, public QWSServer::KeyboardFilter +class LoginScreenSaver : public QWSScreenSaver { public: - ModelKeyFilter ( ) : QObject ( 0, "MODEL_KEY_FILTER" ) + LoginScreenSaver ( ) { - bool doinst = false; + m_lcd_status = true; - m_model = ODevice::inst ( )-> model ( ); - m_power_timer = 0; + m_backlight_bright = -1; + m_backlight_forcedoff = false; - switch ( m_model ) { - case OMODEL_iPAQ_H31xx: - case OMODEL_iPAQ_H36xx: - case OMODEL_iPAQ_H37xx: - case OMODEL_iPAQ_H38xx: doinst = true; - break; - default : break; - } - if ( doinst ) - QWSServer::setKeyboardFilter ( this ); + // Make sure the LCD is in fact on, (if opie was killed while the LCD is off it would still be off) + ODevice::inst ( ) -> setDisplayStatus ( true ); } - - virtual bool filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat ) + void restore() { - bool kill = false; - - // Rotate cursor keys 180° - switch ( m_model ) { - case OMODEL_iPAQ_H31xx: - case OMODEL_iPAQ_H38xx: { - int newkeycode = keycode; + if ( !m_lcd_status ) // We must have turned it off + ODevice::inst ( ) -> setDisplayStatus ( true ); - switch ( keycode ) { - case Key_Left : newkeycode = Key_Right; break; - case Key_Right: newkeycode = Key_Left; break; - case Key_Up : newkeycode = Key_Down; break; - case Key_Down : newkeycode = Key_Up; break; + setBacklight ( -1 ); } - if ( newkeycode != keycode ) { - QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat ); - kill = true; + bool save( int level ) + { + switch ( level ) { + case 0: + if ( backlight() > 1 ) + setBacklight( 1 ); // lowest non-off + return true; + break; + case 1: + setBacklight( 0 ); // off + return true; + break; + case 2: + // We're going to suspend the whole machine + if ( PowerStatusManager::readStatus().acStatus() != PowerStatus::Online ) { + QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE ); + return true; } break; } - default: break; + return false; } - // map Power Button short/long press to F34/F35 - switch ( m_model ) { - case OMODEL_iPAQ_H31xx: - case OMODEL_iPAQ_H36xx: - case OMODEL_iPAQ_H37xx: - case OMODEL_iPAQ_H38xx: { - if ( keycode == Key_SysReq ) { - if ( isPress ) { - m_power_timer = startTimer ( 500 ); - } - else if ( m_power_timer ) { - killTimer ( m_power_timer ); - m_power_timer = 0; - QWSServer::sendKeyEvent ( -1, Key_F34, 0, true, false ); - QWSServer::sendKeyEvent ( -1, Key_F34, 0, false, false ); - } - kill = true; +private: +public: + void setIntervals( int i1 = 30, int i2 = 20, int i3 = 60 ) + { + int v [4]; + + v [ 0 ] = QMAX( 1000 * i1, 100 ); + v [ 1 ] = QMAX( 1000 * i2, 100 ); + v [ 2 ] = QMAX( 1000 * i3, 100 ); + v [ 3 ] = 0; + + if ( !i1 && !i2 && !i3 ) + QWSServer::setScreenSaverInterval ( 0 ); + else + QWSServer::setScreenSaverIntervals ( v ); } - break; + + int backlight ( ) + { + if ( m_backlight_bright == -1 ) + m_backlight_bright = 255; + + return m_backlight_bright; } - default: break; + + void setBacklight ( int bright ) + { + if ( bright == -3 ) { + // Forced on + m_backlight_forcedoff = false; + bright = -1; } - return kill; + if ( m_backlight_forcedoff && bright != -2 ) + return ; + if ( bright == -2 ) { + // Toggle between off and on + bright = m_backlight_bright ? 0 : -1; + m_backlight_forcedoff = !bright; } - virtual void timerEvent ( QTimerEvent * ) - { - killTimer ( m_power_timer ); - m_power_timer = 0; - QWSServer::sendKeyEvent ( -1, Key_F35, 0, true, false ); - QWSServer::sendKeyEvent ( -1, Key_F35, 0, false, false ); + m_backlight_bright = bright; + + bright = backlight ( ); + ODevice::inst ( ) -> setDisplayBrightness ( bright ); + + m_backlight_bright = bright; } private: - OModel m_model; - int m_power_timer; -}; + bool m_lcd_status; + int m_backlight_bright; + bool m_backlight_forcedoff; +}; int login_main ( int argc, char **argv ) { QWSServer::setDesktopBackground( QImage() ); QPEApplication app ( argc, argv, QApplication::GuiServer ); - (void) new ModelKeyFilter ( ); + app. setFont ( QFont ( "Helvetica", 10 )); + app. setStyle ( new QPEStyle ( )); + + ODevice::inst ( )-> setSoftSuspend ( true ); { QCopEnvelope e("QPE/System", "setBacklight(int)" ); e << -3; // Forced on } #if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) if ( !QFile::exists ( "/etc/pointercal" )) { // Make sure calibration widget starts on top. Calibrate *cal = new Calibrate; cal-> exec ( ); delete cal; } #endif + + LoginScreenSaver *saver = new LoginScreenSaver; + + saver-> setIntervals ( ); + QWSServer::setScreenSaver ( saver ); + + LoginWindowImpl *lw = new LoginWindowImpl ( ); app. setMainWidget ( lw ); lw-> setGeometry ( 0, 0, app. desktop ( )-> width ( ), app. desktop ( )-> height ( )); lw-> show ( ); - return app. exec ( ); + int rc = app. exec ( ); + + ODevice::inst ( )-> setSoftSuspend ( false ); + + return rc; } |