summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/opie-login/loginwindow.ui6
-rw-r--r--core/opie-login/loginwindowimpl.cpp19
2 files changed, 25 insertions, 0 deletions
diff --git a/core/opie-login/loginwindow.ui b/core/opie-login/loginwindow.ui
index edd0819..5a35c8d 100644
--- a/core/opie-login/loginwindow.ui
+++ b/core/opie-login/loginwindow.ui
@@ -360,53 +360,59 @@
<property stdset="1">
<name>margin</name>
<number>0</number>
</property>
</widget>
</vbox>
</widget>
<images>
<image>
<name>image0</name>
<data format="XPM.GZ" length="394">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022230543251d2e253d856405bffcbc54105b19c856360003b0141a808a2983b03284848a298304c108240e15033141045829580cac07ac4e590f5d0c22a4876caf32d45898797a48044caf32c22948e629c39d0457a78ce60f65b8f104ec50d6c366af1e865eb4b0aab5e602008bcd444d</data>
</image>
<image>
<name>image1</name>
<data format="XPM.GZ" length="341">789c558fcd0a02310c84ef7d8ad0b915c9bae84d7c04c5a3201e4275d1c32ab8eb41c477b73fa96e43a1f30d4d266d1ced771b728d194619af9efc451ee44ecfbe7f1d8eebb7b1ed92c259506b67c63279dade6fe7a81134e6a9224ac4ae2bc85565075004901c8820731069a648b490effc26eac4a25dcc195373c94231b87a8349fabf894b7a3d27a76af8cf01eb0e534757d70da1bf8a933f2bf30509e84b68</data>
</image>
</images>
<connections>
<connection>
<sender>ToolButton1</sender>
<signal>clicked()</signal>
<receiver>m_password</receiver>
<slot>clear()</slot>
</connection>
<connection>
<sender>ToolButton3</sender>
<signal>toggled(bool)</signal>
<receiver>LoginWindow</receiver>
<slot>toggleEchoMode(bool)</slot>
</connection>
<connection>
<sender>m_suspend</sender>
<signal>clicked()</signal>
<receiver>LoginWindow</receiver>
<slot>suspend()</slot>
</connection>
<connection>
<sender>m_password</sender>
<signal>returnPressed()</signal>
<receiver>m_login</receiver>
<slot>animateClick()</slot>
</connection>
<connection>
<sender>m_login</sender>
<signal>clicked()</signal>
<receiver>LoginWindow</receiver>
<slot>login()</slot>
</connection>
+ <connection>
+ <sender>m_user</sender>
+ <signal>activated(int)</signal>
+ <receiver>m_password</receiver>
+ <slot>setFocus()</slot>
+ </connection>
<slot access="public">login()</slot>
<slot access="public">suspend()</slot>
<slot access="public">toggleEchoMode(bool)</slot>
</connections>
</UI>
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 ( );
}
}