author | kergoth <kergoth> | 2002-01-25 22:14:26 (UTC) |
---|---|---|
committer | kergoth <kergoth> | 2002-01-25 22:14:26 (UTC) |
commit | 15318cad33835e4e2dc620d033e43cd930676cdd (patch) (side-by-side diff) | |
tree | c2fa0399a2c47fda8e2cd0092c73a809d17f68eb /core/opie-login | |
download | opie-15318cad33835e4e2dc620d033e43cd930676cdd.zip opie-15318cad33835e4e2dc620d033e43cd930676cdd.tar.gz opie-15318cad33835e4e2dc620d033e43cd930676cdd.tar.bz2 |
Initial revision
-rw-r--r-- | core/opie-login/.cvsignore | 3 | ||||
-rw-r--r-- | core/opie-login/README | 78 | ||||
-rw-r--r-- | core/opie-login/qdm_config.h | 30 | ||||
-rw-r--r-- | core/opie-login/qdmdialog.ui | 856 | ||||
-rw-r--r-- | core/opie-login/qdmdialogimpl.cpp | 535 | ||||
-rw-r--r-- | core/opie-login/qdmdialogimpl.h | 90 |
6 files changed, 1592 insertions, 0 deletions
diff --git a/core/opie-login/.cvsignore b/core/opie-login/.cvsignore new file mode 100644 index 0000000..edfa921 --- a/dev/null +++ b/core/opie-login/.cvsignore @@ -0,0 +1,3 @@ +moc_* +*.moc +Makefile diff --git a/core/opie-login/README b/core/opie-login/README new file mode 100644 index 0000000..ad3b298 --- a/dev/null +++ b/core/opie-login/README @@ -0,0 +1,78 @@ + +Welcome to LISA System's + + QDM - the Login-Dialog for QPE + + +WHAT'S THIS: + +This small add-on for the Qtopia Environment (QPE - see +http://qpe.sourceforge.net for further details) allows You to use your +handheld computer running QPE and Linux with the typical Un*x user +handling, i.e. just log in on a graphical environment, as e.g. KDM or +XDM. This way your personal data can be easily protected against +unwanted access from others in case you loose your machine. + + +STATUS: + +Still in development, but should be useable. + + +REQUIREMENTS: + +- QDM needs Linux-PAM (Pluggable Authentication Modules for Linux) for + proper user validation. + +- the /dev/fb0 device has to writeable to everyone ;-( + + +INSTALLATION: + +Per default this little add-on is not enabled. You have to do so +yourself for now, by setting a compile option variable called +QT_QWS_LOGIN . Furthermore there have to be made some changes in +taskbar/taskbar.pro : + +At the section HEADERS insert a line: + ../login/qdmdialogimpl.h \ + +At the section SOURCES insert a line: + ../login/qdmdialogimpl.cpp \ + +furthermore serte these lines: + +INCLUDEPATH += ../login +DEPENDPATH += ../login + +INTERFACES = ../login/qdmdialog.ui + +For unix-login make folloing changes to a line: +LIBS = -lqpe -lcrypt + +For PAM use the following: +LIBS = -lqpe -ldl -lpam + + + +CONFIGURATION: + +Configuration of the 'Look' of QDM is done via Qt Designer. Just open +the .ui file and edit the look of the dialog as you like. You can, for +instance, change the logo pixmap. QDM should also be ready for i18n so +far. + +Other configuration stuff, eg welcome string in the upper right, and +user list can be changed in the qdm_config.h file. + + +USAGE: + +The QDM comes up, when the QPE is started, and if the QPE is started +as 'root'. Being started as any other user, the uid couldn't be +changed and the login dialog wouldn't be ofg much use. + + +CONTACT: + +http://www.lisa.de diff --git a/core/opie-login/qdm_config.h b/core/opie-login/qdm_config.h new file mode 100644 index 0000000..bf5b5a4 --- a/dev/null +++ b/core/opie-login/qdm_config.h @@ -0,0 +1,30 @@ +//-- -*- c++ -*- + +#ifndef _QDM_CONFIG_H +#define _QDM_CONFIG_H + +/* + * Config file for QDM + */ + + +/** define this to enable the qdm login dialog for qpe */ +#define QT_QWS_LOGIN + +/** define this to let qdm use Linux-PAM */ +//define QT_QWS_LOGIN_USEPAM + +/** this is the list of users shown in the input-list */ +#define QDM_SHOWNUSERS static char *Shown_Users[] = { "guest", "root", "lisa", 0 }; + +/** which command to execute when going to sleep mode */ +#define QDM_CMD_SLEEP "/sbin/shutdow","-z","now" + +/** which command to execute when shutting down */ +#define QDM_CMD_SHUTDOWN "/sbin/shutdow","-z","now" + +/** Welcome string on dialog */ +#define QDM_WELCOME_STRING "Welcome to\nmLinux [iPAQ]" + + +#endif //-- _QDM_CONFIG_H diff --git a/core/opie-login/qdmdialog.ui b/core/opie-login/qdmdialog.ui new file mode 100644 index 0000000..c9faf6f --- a/dev/null +++ b/core/opie-login/qdmdialog.ui @@ -0,0 +1,856 @@ +<!DOCTYPE UI><UI> +<class>QDMDialog</class> +<widget> + <class>QDialog</class> + <property stdset="1"> + <name>name</name> + <cstring>QDMDialog</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>7</y> + <width>240</width> + <height>320</height> + </rect> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>minimumSize</name> + <size> + <width>240</width> + <height>240</height> + </size> + </property> + <property stdset="1"> + <name>maximumSize</name> + <size> + <width>240</width> + <height>320</height> + </size> + </property> + <property stdset="1"> + <name>palette</name> + <palette> + <active> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>242</red> + <green>242</green> + <blue>242</blue> + </color> + <color> + <red>78</red> + <green>78</green> + <blue>78</blue> + </color> + <color> + <red>183</red> + <green>183</green> + <blue>183</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>220</red> + <green>220</green> + <blue>220</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>10</red> + <green>95</green> + <blue>137</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </active> + <disabled> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>242</red> + <green>242</green> + <blue>242</blue> + </color> + <color> + <red>78</red> + <green>78</green> + <blue>78</blue> + </color> + <color> + <red>183</red> + <green>183</green> + <blue>183</blue> + </color> + <color> + <red>183</red> + <green>183</green> + <blue>183</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>220</red> + <green>220</green> + <blue>220</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </disabled> + <inactive> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>228</red> + <green>228</green> + <blue>228</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>242</red> + <green>242</green> + <blue>242</blue> + </color> + <color> + <red>78</red> + <green>78</green> + <blue>78</blue> + </color> + <color> + <red>183</red> + <green>183</green> + <blue>183</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>220</red> + <green>220</green> + <blue>220</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>10</red> + <green>95</green> + <blue>137</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </inactive> + </palette> + </property> + <property stdset="1"> + <name>caption</name> + <string>QDM</string> + </property> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>label_logo</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>10</x> + <y>10</y> + <width>100</width> + <height>33</height> + </rect> + </property> + <property stdset="1"> + <name>palette</name> + <palette> + <active> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>220</red> + <green>220</green> + <blue>220</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>237</red> + <green>237</green> + <blue>237</blue> + </color> + <color> + <red>110</red> + <green>110</green> + <blue>110</blue> + </color> + <color> + <red>146</red> + <green>146</green> + <blue>146</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>84</red> + <green>112</green> + <blue>152</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </active> + <disabled> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>220</red> + <green>220</green> + <blue>220</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>253</red> + <green>253</green> + <blue>253</blue> + </color> + <color> + <red>110</red> + <green>110</green> + <blue>110</blue> + </color> + <color> + <red>146</red> + <green>146</green> + <blue>146</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>128</red> + <green>128</green> + <blue>128</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>84</red> + <green>112</green> + <blue>152</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </disabled> + <inactive> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>220</red> + <green>220</green> + <blue>220</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>253</red> + <green>253</green> + <blue>253</blue> + </color> + <color> + <red>110</red> + <green>110</green> + <blue>110</blue> + </color> + <color> + <red>146</red> + <green>146</green> + <blue>146</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + <color> + <red>0</red> + <green>0</green> + <blue>0</blue> + </color> + <color> + <red>84</red> + <green>112</green> + <blue>152</blue> + </color> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </inactive> + </palette> + </property> + <property stdset="1"> + <name>frameShape</name> + <enum>Panel</enum> + </property> + <property stdset="1"> + <name>frameShadow</name> + <enum>Sunken</enum> + </property> + <property stdset="1"> + <name>margin</name> + <number>2</number> + </property> + <property stdset="1"> + <name>pixmap</name> + <pixmap>image0</pixmap> + </property> + <property stdset="1"> + <name>scaledContents</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>label_welcome</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>120</x> + <y>10</y> + <width>110</width> + <height>40</height> + </rect> + </property> + <property stdset="1"> + <name>font</name> + <font> + <pointsize>14</pointsize> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string>Welcome to +mLinux [iPAQ]</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignCenter</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>label_time</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>180</x> + <y>50</y> + <width>50</width> + <height>16</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>12:30:88</string> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>label_date</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>70</x> + <y>50</y> + <width>100</width> + <height>16</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>Wed Feb 12 2001</string> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel5</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>20</x> + <y>50</y> + <width>50</width> + <height>16</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>Today:</string> + </property> + </widget> + <widget> + <class>QGroupBox</class> + <property stdset="1"> + <name>name</name> + <cstring>GroupBox3</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>10</x> + <y>80</y> + <width>220</width> + <height>120</height> + </rect> + </property> + <property stdset="1"> + <name>backgroundOrigin</name> + <enum>WidgetOrigin</enum> + </property> + <property stdset="1"> + <name>title</name> + <string>Login</string> + </property> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>PushButton3</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>160</x> + <y>60</y> + <width>50</width> + <height>21</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>Clear</string> + </property> + </widget> + <widget> + <class>QLineEdit</class> + <property stdset="1"> + <name>name</name> + <cstring>input_password</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>80</x> + <y>60</y> + <width>70</width> + <height>22</height> + </rect> + </property> + <property stdset="1"> + <name>echoMode</name> + <enum>Password</enum> + </property> + </widget> + <widget> + <class>QComboBox</class> + <property stdset="1"> + <name>name</name> + <cstring>input_user</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>80</x> + <y>30</y> + <width>120</width> + <height>21</height> + </rect> + </property> + <property stdset="1"> + <name>editable</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>label_user</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>10</x> + <y>30</y> + <width>60</width> + <height>21</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>User</string> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>label_password</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>10</x> + <y>60</y> + <width>60</width> + <height>21</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>Password</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>button_shutdown</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>150</x> + <y>90</y> + <width>61</width> + <height>20</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>Shutdown</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>button_login</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>10</x> + <y>90</y> + <width>60</width> + <height>20</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>Login</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>button_sleep</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>90</x> + <y>90</y> + <width>60</width> + <height>20</height> + </rect> + </property> + <property stdset="1"> + <name>text</name> + <string>Sleep</string> + </property> + </widget> + </widget> +</widget> +<images> + <image> + <name>image0</name> + <data format="XPM.GZ" length="4080">789ced97db72e2461086effd149475e74a69413258d4d65ef880c7c022cbd8eb35a472a123c8465a09640ebb9577cffc3d033a986c2a38a9ca45bacb653ecd34bf7aba67843e9cd49eac41ede4c3d122b3b3d0adb9537b5e3bf15ea368f3eb6f9f7e1c1db78d9adea8358d5ae3f897a3e3b8e6d6943a19302234e04005d8a8c3811ea10107da40ad01073e123a70e01d502703ce086d38f00bf0b401075e13da70e03760b30e070e086d38d001b6c8804be059130e4c091d3850071aa770a04fe8c2817d609b0ca801e92e68b24be8c18109d0d1e1c021a10f07f6806e130e3409c98016d03b8303c784011c3802fa677020230ce0c00c180486236a3495e8d7697228b0ad891a2d24b6448d3a126d8d4637123d8d6227026d4dd7806b894d51a3ae44e39462eb12bd535ad82b8981a8d1ad40476b52facf129b4d4abf21d168d1d27d97e8b668f446627046a35f05ba4d83bef95262dba01a9d4b740c2aca834457543010e8e96d2aca85c49628e8ab44dba6d1cf123d87eef945a0df10057d92d87269ade612db2e15e55ea2e7d13aaf24061e65a40a84112ab6eda87bcdb56dcf7f7335984c4361cf2f7bc3669ee7450526152f8ebfed5749f8505ab9369f2cb29d2d16af7bee4d89e3385abe4765b5ceb2e9e6fbf9457079d509b3cefc6dd435d788638fbd43e5669a65dd95848bcd9e25eb7971348b62a5ff0e950d5fa6cffb674b1bc4b16df2c0d92e99bfafd2c9b2f0fc6722a68d1887af9a7bb8ca33af79e7767f6fed52b154247377b8ca4af4d6e6ea72bf125219f0ff335effe1c12aeafd3adc7671f781bd097178dd4d84f276fe72b88aaabedc4c3a62cf848b6a428c7ff98c3e3cc6b1d27b870ab7d5ebd76e678a849eca0383288eae53d82c4fe6501552bac1d2754bd746d8f6b945e377abf0038dcb2c56c52bbe1247b9c5b1f30fa8acaa2aa3bb387eb4c6c212de6ddef8309555a110975c655d4d253fc3f9ce11c96c55664369bdbf529984f5877bfa346ff0460b8ba70df555dedc431efd382ea8283bb37eae82c332ec7436ddee063db6b9280e6acab612c2f8ce8cd2ad4ab12f9471316ca8545556b761b87db84c17f5f2b9cf0b1115ef52930f0052d1d3dcfaa530b65c2e476ac59ece9fd793ce66520f569591beae27a5707e41dfe6f2afdbff2aff61959ee627f96e1ca2977b79439baeef0e775b2d11b64546c472a4e042a3b1c4d7127ab970993ada3da35553676a2f3f26923e53597e245896e5f0bf1d02ac9d8a95a64c1debf9ce64a9a53293de6892f2132fe98fd3fc8ad6af3e0f8bbbbbaae2f3347d96cf182db7270c73fda55f3cbfb4e24ee4292ffdd25e2bab9456ccf2d5d44d8a33cc7e2a5e4048332d9c2c56f5a731f387052aab9426f2486bc9d4caaf6eaa8b6f614159696e6eaec9573a35ff54a5b262951963de378c5e01ccc42f97861597cfc268f9a02e4eadf458af32830d355feb1dfffef1e80f6ca1ac19</data> + </image> +</images> +<connections> + <connection> + <sender>button_shutdown</sender> + <signal>clicked()</signal> + <receiver>QDMDialog</receiver> + <slot>slot_shutdown()</slot> + </connection> + <connection> + <sender>button_login</sender> + <signal>clicked()</signal> + <receiver>QDMDialog</receiver> + <slot>slot_login()</slot> + </connection> + <connection> + <sender>input_password</sender> + <signal>returnPressed()</signal> + <receiver>button_login</receiver> + <slot>setFocus()</slot> + </connection> + <connection> + <sender>input_user</sender> + <signal>highlighted(const QString&)</signal> + <receiver>input_password</receiver> + <slot>setFocus()</slot> + </connection> + <connection> + <sender>PushButton3</sender> + <signal>clicked()</signal> + <receiver>input_password</receiver> + <slot>clear()</slot> + </connection> + <connection> + <sender>button_sleep</sender> + <signal>clicked()</signal> + <receiver>QDMDialog</receiver> + <slot>slot_sleepmode()</slot> + </connection> + <slot access="public">slot_sleepmode()</slot> + <slot access="public">slot_login()</slot> + <slot access="public">slot_shutdown()</slot> +</connections> +<tabstops> + <tabstop>input_user</tabstop> + <tabstop>input_password</tabstop> + <tabstop>button_login</tabstop> + <tabstop>PushButton3</tabstop> + <tabstop>button_sleep</tabstop> + <tabstop>button_shutdown</tabstop> +</tabstops> +</UI> diff --git a/core/opie-login/qdmdialogimpl.cpp b/core/opie-login/qdmdialogimpl.cpp new file mode 100644 index 0000000..bb1b453 --- a/dev/null +++ b/core/opie-login/qdmdialogimpl.cpp @@ -0,0 +1,535 @@ +/********************************************************************** +** Copyright (C) 2001 LISA Systems +** +** This file is an additional part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** For further information contact info@lisa.de +** +**********************************************************************/ + +/* + * AUTHOR: Christian Rahn + * EMAIL: cdr@lisa.de + * + * $Id$ + */ + +#include "qdm_config.h" + +#ifdef QT_QWS_LOGIN + +#include <pwd.h> +#include <unistd.h> +#include <stdlib.h> +#include <iostream.h> +#include <assert.h> + +#include <qlabel.h> +#include <qregexp.h> +#include <qdatetime.h> +#include <qmessagebox.h> +#include <qcombobox.h> +#include <qlineedit.h> +#include <qtranslator.h> +#include <qpeapplication.h> + +#include <qwsdisplay_qws.h> + +#include <string.h> +#include <stdio.h> +#include <errno.h> +#include <unistd.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/sem.h> +#include <sys/shm.h> +#include <sys/ipc.h> + +#include <global.h> + +#if defined(QT_QWS_LOGIN_USEPAM) +extern "C" { +#include <security/pam_appl.h> +} +#else +#define _XOPEN_SOURCE +#include <unistd.h> +#include <crypt.h> +#endif + + +#include "qdmdialogimpl.h" +#include "../taskbar/inputmethods.h" + + +//---------------------------------------------------------------------------- + +//-- taken from semctl man page +#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) +//-- union semun is defined by including <sys/sem.h> +#else +//-- according to X/OPEN we have to define it ourselves +union semun { + int val; // value for SETVAL + struct semid_ds *buf; // buffer for IPC_STAT, IPC_SET + unsigned short int *array; // array for GETALL, SETALL + struct seminfo *__buf; // buffer for IPC_INFO +}; +#endif + +//---------------------------------------------------------------------------- + +static const int ShowClockFreq = 1; + +QDM_SHOWNUSERS; + +#ifdef QT_QWS_LOGIN_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; + int size = sizeof(struct pam_response); + + for( count = 0; count < num_msg; count++ ) { + switch (msg[count]->msg_style) { + case PAM_PROMPT_ECHO_ON: + /* user name given to PAM already */ + return PAM_CONV_ERR; + + case PAM_PROMPT_ECHO_OFF: + /* wants password */ + GET_MEM; + reply[replies].resp_retcode = PAM_SUCCESS; + reply[replies].resp = COPY_STRING(PAM_password); + replies++; + /* PAM frees resp */ + break; + case PAM_TEXT_INFO: + break; + default: + /* unknown or PAM_ERROR_MSG */ + if (reply) free (reply); + return PAM_CONV_ERR; + } + } + if (reply) *resp = reply; + return PAM_SUCCESS; +} + +#endif + + +//---------------------------------------------------------------------------- + +QDMDialogImpl::QDMDialogImpl( QWidget* parent, const char* name, bool modal, WFlags f ) + : QDMDialog( parent, name, modal, f ) +{ + showTime(); + clockTimer = startTimer( ShowClockFreq * 1000 ); //-- call timer evry min. + setActiveWindow(); + setFocus(); + + input = new InputMethods( this ); + input->resize( input->sizeHint() ); + input->move( 0, height() - input->height() ); + + for( int i=0; Shown_Users[i]; ++i ) { + input_user->insertItem( Shown_Users[i] ); + } + input_user->clearEdit(); + + label_welcome->setText( QDM_WELCOME_STRING ); + +}; + + + +QDMDialogImpl::~QDMDialogImpl() +{ + input->lower(); + input->close( false ); + input->hide(); + delete input; + input = 0; + if( parent() ) { + ((QWidget*)parent())->repaint(true); + } +}; + + +void QDMDialogImpl::accept () { }; +void QDMDialogImpl::reject () { }; + + +void QDMDialogImpl::showTime( void ) +{ + label_date->setText( QDate::currentDate().toString() ); + label_time->setText( QTime::currentTime().toString() ); +} + + +void QDMDialogImpl::timerEvent( QTimerEvent * e ) +{ + if( e->timerId() == clockTimer ) + showTime(); +} + + +//---------------------------------------------------------------------------- + +void QDMDialogImpl::slot_sleepmode() +{ + const int button = QMessageBox::warning( this, "Shutdown", tr( "Do you really want to go\nto sleep mode now?" ), + QString::null, tr( "Cancel" ), QString::null,0,1 ); + switch( button ) { + case 0: + done( Rejected ); + // Global::execute( cmd_shutdown ); + if( vfork() == 0 ) { + execl( QDM_CMD_SLEEP, 0 ); + cerr << "Sleepmode: " << strerror( errno ) << endl; + } + break; + + default: + break; + } +} + + +//---------------------------------------------------------------------------- + +void QDMDialogImpl::slot_shutdown() +{ + const int button = QMessageBox::warning( this, "Shutdown", tr("Do you really want to shut\nthe system down now?"), + QString::null, tr("Cancel"), QString::null,0,1 ); + switch( button ) { + case 0: + done( Rejected ); + // Global::execute( cmd_shutdown ); + if( vfork() == 0 ) { + execl( QDM_CMD_SHUTDOWN, 0 ); + cerr << "Shutdown: " << strerror( errno ) << endl; + } + break; + + default: + break; + } +} + + + + +//---------------------------------------------------------------------------- + +void QDMDialogImpl::informBadPassword() +{ + QMessageBox::warning( this, tr("Password wrong"), + tr("The given password is incorrect") ); +} + + +//---------------------------------------------------------------------------- + +#if defined(QT_QWS_LOGIN_USEPAM) + +static bool pwcheck_PAM( const char *user, const char *password ) +{ + bool pw_correct = false; + int pam_error; + int pam_return = 0; + pam_handle_t *pamh = 0; + PAM_password = password.latin1(); + + pam_error = pam_start( _PAM_SERVICE, user, &PAM_conversation, &pamh ); + if( pam_error == PAM_SUCCESS ) { + pam_error = pam_authenticate( pamh, 0 ); + if( pam_error == PAM_SUCCESS ) { + //-- password correct + pw_correct = true; + pam_return = PAM_SUCCESS; + } else { + pam_return = pam_error; + } + } else { + // cerr << "PAM error: " << pam_strerror( pamh, pam_error ) << endl; + } + pam_end( pamh, pam_return ); + return pw_correct; +} + +#else + +//---------------------------------------------------------------------------- + +static bool pwcheck_Unix( const char *user, const char *password ) +{ + struct passwd * pword = getpwnam( user ); + if( pword ) { + if( strcmp( crypt(password, password), pword->pw_passwd) == 0 ) { + return true; + } + } + return false; +} + +#endif + + + +//---------------------------------------------------------------------------- + +void QDMDialogImpl::slot_login() +{ + bool pw_correct = false; + const char *username = input_user->currentText().latin1(); + const char *password = input_password->text().latin1(); + + assert( username ); + +#if defined(QT_QWS_LOGIN_USEPAM) + pw_correct = pwcheck_PAM( username, password ); +#else + pw_correct = pwcheck_Unix( username, password ); +#endif + + if( pw_correct ) { + if( changePersona( username ) ) { + // cerr << "Password correct" << endl; + done( Accepted ); + return; + } + } else { + // cerr << "Password incorrect" << endl; + } + informBadPassword(); +} + + +//---------------------------------------------------------------------------- + +bool QDMDialogImpl::changePersona( const char *username ) +{ + int err; + + //-- get some info on user <username> + struct passwd * pword; + pword = getpwnam( username ); + + if( pword == 0 ) + return false; + + gid_t gid = pword->pw_gid; + uid_t uid = pword->pw_uid; + + //-- some very dirty hacks following + // extern int qws_display_id; + extern QString qws_qtePipeFilename(); + extern QString qws_dataDir(); + + + const QString QTEdataDir = qws_dataDir(); + QString QTEdataDirNew = QTEdataDir; + QTEdataDirNew.replace( QRegExp("root"), username ); + + const char *qws_display_str = getenv("QWS_DISPLAY"); + + //-- get name of semaphore and lock + QString pipe = qws_qtePipeFilename(); + + //-- change owner of semaphore + key_t semkey = ftok( pipe.latin1(), 'd' ); + int semid = semget( semkey, 0, 0 ); + if( semid < 0 ) + cerr << "error: semget, " << strerror( errno ) << endl; + + struct shmid_ds shminfo; + semun arg; + semid_ds semidds; + arg.buf = & semidds; + + if( semctl( semid, 0, IPC_STAT, arg ) < 0 ) + cerr << "error: semctl stat, " << strerror( errno ) << endl; + + arg.buf->sem_perm.uid = uid; + arg.buf->sem_perm.gid = gid; + + if( semctl( semid, 0, IPC_SET, arg ) < 0 ) + cerr << "error: semctl set, " << strerror( errno ) << endl; + + //-- change owner of shared memory + key_t memkey = ftok( pipe.latin1(), 'm' ); + int ramid = shmget( memkey, 0, 0 ); + if( ramid < 0 ) cerr << "error: shmget, " << strerror( errno ) << endl; + + if( shmctl( ramid, IPC_STAT, &shminfo ) < 0 ) + cerr << "error: shmctl stat, " << strerror( errno ) << endl; + + shminfo.shm_perm.uid = uid; + shminfo.shm_perm.gid = gid; + + if( shmctl( ramid, IPC_SET, &shminfo ) < 0 ) + cerr << "error: shmctl set, " << strerror( errno ) << endl; + + //-- change owner of region manager + memkey = ftok( pipe.latin1(), 'r' ); + int regionid = shmget( memkey, 0, 0 ); + if( regionid < 0 ) + cerr << "error: shmget, " << strerror( errno ) << endl; + + if( shmctl( regionid, IPC_STAT, &shminfo ) < 0 ) + cerr << "error: shmctl stat, " << strerror( errno ) << endl; + + shminfo.shm_perm.uid = uid; + shminfo.shm_perm.gid = gid; + + if( shmctl( regionid, IPC_SET, &shminfo ) < 0 ) + cerr << "error: shmctl set, " << strerror( errno ) << endl; + + // cerr << "ungrabbing qws display: " << qws_display_id << " on lock " << pipe << endl; + // QWSDisplay::ungrab(); + + //-- presenting socket-file to new user + chown( pipe.latin1(), uid, gid ); + chown( QTEdataDir.latin1(), uid, gid ); + + + //-- another dirty hack - force framebuffer to be writeable... + struct stat devstat; + if( ! stat( "/dev/fb0", &devstat ) ) { + if( chmod( "/dev/fb0", devstat.st_mode |S_IWOTH |S_IWUSR |S_IWGRP ) ) { + cerr << "chmod error: " << strerror( errno ) << endl; + } + } + + err = rename( QTEdataDir, QTEdataDirNew ) ; + if( err < 0 ) cerr << "error: rename " << strerror(errno) + << " , " << QTEdataDir << " -> " << QTEdataDirNew << endl; + + // + //-- actually change uid and gid + // + // cerr << "changing persona, uid: " << uid << " gid: " << gid << endl; + + err = setgid( gid ); + if( err != 0 ) cerr << "error: gid changePersona " << err << endl; + + err = setuid( uid ); + if( err != 0 ) cerr << "error: uid changePersona " << err << endl; + + + //-- set some environment + setenv( "QWS_DISPLAY", qws_display_str, true ); + setenv( "LOGNAME", username, true ); + setenv( "USER", username, true ); + setenv( "HOME", pword->pw_dir, true ); + + // cout << "QTE data dir: " << qws_dataDir() << endl; + + //-- I am reborn + + return true; +} + + + +//---------------------------------------------------------------------------- + +bool QDMDialogImpl::login( QWidget *parent ) +{ + //-- only when called as 'root' do login-box + if( getuid() != 0 ) + return true; + + + //-- are we coming from a 'restart' ? + if( getenv("QDM_STARTED") ) + return true; + else + unsetenv("QDM_STARTED"); + + +#ifndef QT_NO_TRANSLATION + QString lang = getenv( "LANG" ); + + QTranslator * trans = new QTranslator(qApp); + QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/login.qm"; + if ( trans->load( tfn )) + qApp->installTranslator( trans ); + else { + delete trans; + trans = 0; + } +#endif + + if( parent ) parent->erase(); + + QDMDialog *dialog = new QDMDialogImpl( parent, "Login", true //); + ,WStyle_NoBorder | WStyle_Customize ); + +#if QT_VERSION >= 300 + Q_CHECK_PTR( dialog ); +#else + CHECK_PTR( dialog ); +#endif + int result = dialog->exec(); + delete dialog; + + if( parent ) parent->erase(); + +#ifndef QT_NO_TRANSLATION + if( trans ) { + qApp->removeTranslator( trans ); + delete trans; + trans = 0; + } +#endif + + setenv( "QDM_STARTED", "", true ); + + // if( parent ) parent->erase(); + + //-- get all configs going + Global::restart(); + + return result; +} + + +#endif //-- QT_QWS_LOGIN diff --git a/core/opie-login/qdmdialogimpl.h b/core/opie-login/qdmdialogimpl.h new file mode 100644 index 0000000..d62695b --- a/dev/null +++ b/core/opie-login/qdmdialogimpl.h @@ -0,0 +1,90 @@ +//-- -*- c++ -*- +/********************************************************************** +** Copyright (C) 2001 LISA Systems +** +** This file is an additional part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** For further information contact info@lisa.de +** +**********************************************************************/ + +/* + * AUTHOR: Christian Rahn + * EMAIL: cdr@lisa.de + * + * $Id$ + */ + +#ifndef _QDM_IMPL_H +#define _QDM_IMPL_H + +#include "qdm_config.h" + +#if defined(QT_QWS_LOGIN) + +#include "qdmdialog.h" + +class InputMethods; + +class QDMDialogImpl : public QDMDialog +{ + Q_OBJECT + + public: + /** Pop up login dialog and do all stuff */ + static bool login( QWidget * parent = 0 ); + + protected: + /** a protected constructor */ + QDMDialogImpl( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags f = 0 ); + ~QDMDialogImpl(); + + /** Timer for clock display */ + void timerEvent( QTimerEvent * ); + + /** The Timer for the clock */ + int clockTimer; + + /** Conersation function for PAM */ + // int PAM_conv (int num_msg, pam_message_type **msg, struct pam_response **resp, void *); + + /** Just become (i.e. log in as) user <name> */ + bool changePersona( const char *name ); + + /** Inform about an incorrect given password */ + void informBadPassword(); + +private: + InputMethods *input; + + protected slots: + /** These got to be overridden so that the login dialog can't be circumvented */ + virtual void accept (); + virtual void reject (); + +public slots: + /** Display the atual time and date */ + void showTime( void ); + + /** login button pressed */ + virtual void slot_login(); + + /** Shutdown button pressed */ + virtual void slot_shutdown(); + + /** Sleep button pressed */ + virtual void slot_sleepmode(); +}; + +#endif //-- QT_QWS_LOGIN + +#endif //-- _QDM_IMPL_H + |