summaryrefslogtreecommitdiff
authorclem <clem>2004-10-08 22:50:28 (UTC)
committer clem <clem>2004-10-08 22:50:28 (UTC)
commit2f29d0ec4bb2355f193d744c890add203bd6f2b2 (patch) (side-by-side diff)
treea703b00b673b9be036415393b53d9c95a5bb87cd
parentdec031cc21181d70e0c806bcf6c228044f7df90b (diff)
downloadopie-2f29d0ec4bb2355f193d744c890add203bd6f2b2.zip
opie-2f29d0ec4bb2355f193d744c890add203bd6f2b2.tar.gz
opie-2f29d0ec4bb2355f193d744c890add203bd6f2b2.tar.bz2
Big commit thanks to a little feature request :-) We now have an O-menu applet
to lock the PDA immediately, and the internal way to ask for an authentication (on resume, on start up, on demand or for a simple test) is much cleaner: it's through MultiauthPassword(int lockMode) (instead of the old bool at_poweron)
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/applets/lockapplet/.cvsignore4
-rw-r--r--core/applets/lockapplet/config.in4
-rw-r--r--core/applets/lockapplet/lock.cpp84
-rw-r--r--core/applets/lockapplet/lock.h36
-rw-r--r--core/applets/lockapplet/lockapplet.pro12
-rw-r--r--core/applets/lockapplet/opie-lockapplet.control11
-rw-r--r--core/launcher/serverapp.cpp3
-rw-r--r--core/settings/security/demo/main.cpp2
-rw-r--r--core/settings/security/multiauthconfig.cpp20
-rw-r--r--libopie2/opiesecurity/multiauthpassword.cpp45
-rw-r--r--libopie2/opiesecurity/multiauthpassword.h8
-rw-r--r--packages1
-rw-r--r--pics/security/lock.pngbin0 -> 419 bytes
13 files changed, 204 insertions, 26 deletions
diff --git a/core/applets/lockapplet/.cvsignore b/core/applets/lockapplet/.cvsignore
new file mode 100644
index 0000000..5e2908c
--- a/dev/null
+++ b/core/applets/lockapplet/.cvsignore
@@ -0,0 +1,4 @@
+Makefile*
+.moc
+.obj
+
diff --git a/core/applets/lockapplet/config.in b/core/applets/lockapplet/config.in
new file mode 100644
index 0000000..ddc3522
--- a/dev/null
+++ b/core/applets/lockapplet/config.in
@@ -0,0 +1,4 @@
+ config LOCKAPPLET
+ boolean "opie-lockapplet (button in the Opie menu to lock the PDA)"
+ default "y"
+ depends ( LIBQPE || LIBQPE-X11 ) && SECURITY
diff --git a/core/applets/lockapplet/lock.cpp b/core/applets/lockapplet/lock.cpp
new file mode 100644
index 0000000..89f27bb
--- a/dev/null
+++ b/core/applets/lockapplet/lock.cpp
@@ -0,0 +1,84 @@
+#include "lock.h"
+
+/* OPIE */
+#include <opie2/multiauthpassword.h>
+
+#include <qpe/applnk.h>
+#include <qpe/resource.h>
+
+/* QT */
+#include <qiconset.h>
+#include <qpopupmenu.h>
+#include <qmessagebox.h>
+
+
+LockMenuApplet::LockMenuApplet()
+ :QObject( 0, "LockMenuApplet" )
+{
+}
+
+LockMenuApplet::~LockMenuApplet ( )
+{}
+
+int LockMenuApplet::position() const
+{
+ return 3;
+}
+
+QString LockMenuApplet::name() const
+{
+ return tr( "Lock shortcut" );
+}
+
+QString LockMenuApplet::text() const
+{
+ return tr( "Lock" );
+}
+
+
+QIconSet LockMenuApplet::icon() const
+{
+ QPixmap pix;
+ QImage img = Resource::loadImage( "security/lock" );
+ if ( !img.isNull() )
+ pix.convertFromImage( img.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ) );
+ return pix;
+}
+
+QPopupMenu* LockMenuApplet::popup(QWidget*) const
+{
+ /* no subdir */
+ return 0;
+}
+
+void LockMenuApplet::activated()
+{
+ /*
+ QMessageBox::information(0,tr("No white rabbit found"),
+ tr("<qt>No white rabbit was seen near Opie."
+ "Only the beautiful OpieZilla is available"
+ "for your pleassure</qt>"));
+ */
+ Opie::Security::MultiauthPassword::authenticate(Opie::Security::LockNow);
+}
+
+
+QRESULT LockMenuApplet::queryInterface( const QUuid &uuid, QUnknownInterface **iface )
+{
+ *iface = 0;
+ if ( uuid == IID_QUnknown )
+ *iface = this;
+ else if ( uuid == IID_MenuApplet )
+ *iface = this;
+ else
+ return QS_FALSE;
+
+ if ( *iface )
+ (*iface)->addRef();
+ return QS_OK;
+}
+
+Q_EXPORT_INTERFACE()
+{
+ Q_CREATE_INSTANCE( LockMenuApplet )
+}
diff --git a/core/applets/lockapplet/lock.h b/core/applets/lockapplet/lock.h
new file mode 100644
index 0000000..ff94bce
--- a/dev/null
+++ b/core/applets/lockapplet/lock.h
@@ -0,0 +1,36 @@
+/**
+ * \file lock.h
+ * \brief defines a lock button that goes in the 'O' Opie menu
+ * It's based on the examples/menuapplet code of 2004/10/06.
+ */
+#ifndef CORE_SETTINGS_SECURITY_LOCKAPPLET_LOCK_H
+#define CORE_SETTINGS_SECURITY_LOCKAPPLET_LOCK_H
+
+#include <qpe/menuappletinterface.h>
+#include <qobject.h>
+
+class LockMenuApplet: public QObject, public MenuAppletInterface
+{
+
+ Q_OBJECT
+
+public:
+ LockMenuApplet ( );
+ virtual ~LockMenuApplet ( );
+
+ QRESULT queryInterface( const QUuid&, QUnknownInterface** );
+ Q_REFCOUNT
+
+ virtual int position() const;
+
+ virtual QString name ( ) const;
+ virtual QIconSet icon ( ) const;
+ virtual QString text ( ) const;
+ /* virtual QString tr( const char* ) const;
+ virtual QString tr( const char*, const char* ) const;
+ */
+ virtual QPopupMenu *popup ( QWidget *parent ) const;
+ virtual void activated ( );
+};
+
+#endif
diff --git a/core/applets/lockapplet/lockapplet.pro b/core/applets/lockapplet/lockapplet.pro
new file mode 100644
index 0000000..e0ee780
--- a/dev/null
+++ b/core/applets/lockapplet/lockapplet.pro
@@ -0,0 +1,12 @@
+TEMPLATE = lib
+CONFIG += qt plugn warn_on
+HEADERS = lock.h
+SOURCES = lock.cpp
+TARGET = lockapplet
+DESTDIR = $(OPIEDIR)/plugins/applets
+INCLUDEPATH += $(OPIEDIR)/include
+DEPENDPATH += $(OPIEDIR)/include
+LIBS += -lqpe
+VERSION = 1.0.0
+
+include ( $(OPIEDIR)/include.pro )
diff --git a/core/applets/lockapplet/opie-lockapplet.control b/core/applets/lockapplet/opie-lockapplet.control
new file mode 100644
index 0000000..e175a3e
--- a/dev/null
+++ b/core/applets/lockapplet/opie-lockapplet.control
@@ -0,0 +1,11 @@
+Package: opie-lockapplet
+Files: plugins/applets/liblockapplet.so*
+Priority: optional
+Section: opie/applets
+Maintainer: Opie Team <opie@handhelds.org>
+Architecture: arm
+Depends: task-opie-minimal, opie-security
+Description: Lock Opie now
+ Button to lock Opie (as configured in the Security
+ settings) on demand.
+Version: $QPE_VERSION$EXTRAVERSION
diff --git a/core/launcher/serverapp.cpp b/core/launcher/serverapp.cpp
index dc1f2c7..e541d10 100644
--- a/core/launcher/serverapp.cpp
+++ b/core/launcher/serverapp.cpp
@@ -489,49 +489,50 @@ void ServerApplication::launcherMessage( const QCString & msg, const QByteArray
int keycode, press, autoRepeat;
stream >> keycode >> press >> autoRepeat;
kf->checkButtonAction ( true, keycode, press, autoRepeat );
}
else if ( msg == "keyRegister(int,QCString,QCString)" ) {
int k;
QCString c, m;
stream >> k >> c >> m;
kf -> registerKey( QCopKeyRegister(k, c, m) );
}
}
bool ServerApplication::screenLocked()
{
return loggedin == 0;
}
void ServerApplication::login(bool at_poweron)
{
if ( !loggedin ) {
Global::terminateBuiltin("calibrate"); // No tr
- Opie::Security::MultiauthPassword::authenticate(at_poweron);
+ int lockMode = at_poweron ? Opie::Security::IfPowerOn : Opie::Security::IfResume;
+ Opie::Security::MultiauthPassword::authenticate(lockMode);
loggedin=1;
#ifndef QT_NO_COP
QCopEnvelope e( "QPE/Desktop", "unlocked()" );
#endif
}
}
#if defined(QPE_HAVE_TOGGLELIGHT)
#include <qtopia/config.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <linux/ioctl.h>
#include <time.h>
#endif
namespace {
void execAutoStart(const QDateTime& suspendTime ) {
QString appName;
int delay;
QDateTime now = QDateTime::currentDateTime();
diff --git a/core/settings/security/demo/main.cpp b/core/settings/security/demo/main.cpp
index 1c49f57..82f940d 100644
--- a/core/settings/security/demo/main.cpp
+++ b/core/settings/security/demo/main.cpp
@@ -1,12 +1,12 @@
#include <opie2/multiauthpassword.h>
#include <opie2/oapplication.h>
/// Run an authentication sequence using the global opie-security settings
int main( int argc, char ** argv )
{
Opie::Core::OApplication app(argc, argv, "Multi-authentication demo");
// Run the authentication process until it succeeds
- Opie::Security::MultiauthPassword::authenticate();
+ Opie::Security::MultiauthPassword::authenticate(Opie::Security::LockNow);
}
diff --git a/core/settings/security/multiauthconfig.cpp b/core/settings/security/multiauthconfig.cpp
index 192b8ca..9d5c032 100644
--- a/core/settings/security/multiauthconfig.cpp
+++ b/core/settings/security/multiauthconfig.cpp
@@ -1,26 +1,26 @@
#include <opie2/odebug.h>
-#include <opie2/multiauthmainwindow.h>
+#include <opie2/multiauthpassword.h>
#include <qgroupbox.h>
#include <qvgroupbox.h>
#include <qpe/resource.h>
#include <qlayout.h>
#include <qlabel.h>
#include <qhbox.h>
#include <qheader.h>
#include <qvbox.h>
#include <qwhatsthis.h>
#include <qtoolbutton.h>
#include <qstringlist.h>
#include <qdir.h>
#include <qpe/qlibrary.h>
#include <qpe/qpeapplication.h>
#include "multiauthconfig.h"
using Opie::Security::MultiauthPluginInterface;
using Opie::Security::MultiauthPluginObject;
using Opie::Security::MultiauthConfigWidget;
/// keeps information about MultiauthPluginObject plugins
struct MultiauthPlugin {
@@ -100,64 +100,50 @@ class ToolButton : public QToolButton {
}
/// nothing to do
MultiauthGeneralConfig::~MultiauthGeneralConfig()
{}
/// launches the authentication process, as configured, with the option to bypass it
void MultiauthGeneralConfig::tryAuth()
{
QMessageBox confirmSave(
tr("Attention"),
"<p>" + tr("You must save your current settings before trying to authenticate. Press OK to accept and launch a simulated authentication process.") + "</p><p><em>" +
tr("If you don't like the result of this test, don't forget to change your settings before you exit the configuration application!") + "</em></p>",
QMessageBox::Warning,
QMessageBox::Cancel, QMessageBox::Yes, QMessageBox::NoButton,
0, QString::null, TRUE, WStyle_StaysOnTop);
confirmSave.setButtonText(QMessageBox::Cancel, tr("Cancel"));
confirmSave.setButtonText(QMessageBox::Yes, tr("OK"));
if ( confirmSave.exec() == QMessageBox::Yes)
{
owarn << "writing config as user accepted" << oendl;
m_parentConfig->writeConfigs();
owarn << "testing authentication" << oendl;
-
- /* launch the authentication in debug, aka "allowBypass == true", mode
- */
-
- Opie::Security::MultiauthMainWindow win(true);
- // resize the QDialog object so it fills all the screen
- QRect desk = qApp->desktop()->geometry();
- win.setGeometry( 0, 0, desk.width(), desk.height() );
-
- // the authentication has already succeeded (without win interactions)
- if ( win.isAlreadyDone() )
- return;
-
- win.exec();
-
- }
+ // launch the authentication in testing mode
+ Opie::Security::MultiauthPassword::authenticate(Opie::Security::TestNow);
}
/// Builds and displays the Opie multi-authentication configuration dialog
static void test_and_start() {
Config pcfg("Security");
pcfg.setGroup( "Misc" );
bool protectConfigDialog = ! pcfg.readBoolEntry("noProtectConfig", true);
if (protectConfigDialog && Opie::Security::Internal::runPlugins() != 0) {
owarn << "authentication failed, not showing opie-security" << oendl;
exit( -1 );
}
}
MultiauthConfig::MultiauthConfig(QWidget* par, const char* w = "MultiauthConfig dialog", WFlags f = 0)
: QDialog(par, w, TRUE, f),
m_mainTW(0), m_pluginListView(0), m_pluginListWidget(0),
m_generalConfig(0), m_loginWidget(0), m_syncWidget(0),
m_nbSuccessReq(0), m_plugins_changed(false)
{
diff --git a/libopie2/opiesecurity/multiauthpassword.cpp b/libopie2/opiesecurity/multiauthpassword.cpp
index 42341f7..8eda554 100644
--- a/libopie2/opiesecurity/multiauthpassword.cpp
+++ b/libopie2/opiesecurity/multiauthpassword.cpp
@@ -32,74 +32,107 @@
*/
/* OPIE */
#include <opie2/multiauthcommon.h>
#include <opie2/multiauthmainwindow.h>
#include <qpe/config.h>
#include <qpe/qlibrary.h>
#include <qpe/qcom.h>
/* QT */
#include <qapplication.h>
#include <qvbox.h>
#include <qpushbutton.h>
#include <qlabel.h>
#include <qdir.h>
#include "multiauthpassword.h"
namespace Opie {
namespace Security {
/**
- * If the users requires authentication... #fixme
+ * Tells if the users requires authentication (used internally to
+ * know whether to repaint the screen on resume)
*
- * @todo fix up at_poweron attribute
+ * \param at_poweron true if we are booting Opie, false if we are resuming it
+ * \return true if authenticate() launched right now would trigger an authentication
*/
bool MultiauthPassword::needToAuthenticate(bool at_poweron)
{
Config cfg("Security");
cfg.setGroup("Misc");
if ( !at_poweron && cfg.readBoolEntry("onStart", false) )
return true;
else if ( at_poweron && cfg.readBoolEntry("onResume", false) )
return true;
else
return false;
}
+
/**
- * \brief Require user authentication to unlock and continue
+ * \brief Require (if configured so) user authentication to unlock and continue
*
* This method will check if you require authentication
* and then will lock the screen and ask for a successful
* authentication (explaining what it does or not, depending
* on your local configuration).
* It may go into an event loop, but anyhow it will only end
* when the user has successfully authenticated to the system.
*/
-void MultiauthPassword::authenticate(bool at_poweron)
+void MultiauthPassword::authenticate(int lockMode)
+{
+ /**
+ * \par Conditions
+ *
+ * If lockMode is an If, it's conditional:
+ * \li IfPowerOn will not trigger an authentication if
+ * onStart is set to false in Security.conf,
+ * \li IfResume will not trigger an authentication if
+ * onResume is set to false in Security.conf.
+ */
+ if ( (lockMode == IfPowerOn) || (lockMode == IfResume) )
{
- if ( ! needToAuthenticate(at_poweron) )
+ Config cfg("Security");
+ cfg.setGroup("Misc");
+ if ( (
+ (lockMode == IfPowerOn) && cfg.readBoolEntry("onStart", false)
+ ) || (
+ (lockMode == IfResume) && cfg.readBoolEntry("onResume", false)
+ ) )
return;
+ }
+
+ /**
+ * \li TestNow will ensure that the authentication window will let
+ * people escape through the last screen (which they can reach skipping
+ * all the authentication steps)
+ * \li LockNow will always go on with the authentication, and won't let
+ * people escape.
+ */
+ bool allowByPass = false;
+
+ if (lockMode == TestNow)
+ allowByPass = true;
/* Constructs the main window, which displays messages and blocks
* access to the desktop
*/
- MultiauthMainWindow win;
+ MultiauthMainWindow win(allowByPass);
// resize the QDialog object so it fills all the screen
QRect desk = qApp->desktop()->geometry();
win.setGeometry( 0, 0, desk.width(), desk.height() );
// the authentication has already succeeded (without win interactions)
if ( win.isAlreadyDone() )
return;
win.exec();
}
}
}
diff --git a/libopie2/opiesecurity/multiauthpassword.h b/libopie2/opiesecurity/multiauthpassword.h
index fe276da..effdaa1 100644
--- a/libopie2/opiesecurity/multiauthpassword.h
+++ b/libopie2/opiesecurity/multiauthpassword.h
@@ -17,43 +17,49 @@
.i_,=:_. -<s. This library 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
..}^=.= = ; Library General Public License for more
++= -. .` .: details.
: = ...= . :.=-
-. .:....=;==+<; You should have received a copy of the GNU
-_. . . )=. = Library General Public License along with
-- :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#ifndef OPIE_SEC_MULTIAUTHPASSWORD_H
#define OPIE_SEC_MULTIAUTHPASSWORD_H
namespace Opie {
namespace Security {
+enum lockMode {
+ IfPowerOn,
+ IfResume,
+ TestNow,
+ LockNow };
/**
* This is the dropin replacement for the libqpe Password class.
* If you call authenticate() a widget will cover the whole screen
* and only return if the user is able to authenticate with any of the
* configured Authentication Plugins.
* It uses the Opie::Security::MultiauthMainWindow QDialog internally.
*
* @author Clement Séveillac, Holger Freyther
*/
class MultiauthPassword {
+
public:
+ static void authenticate(int authMode = LockNow);
static bool needToAuthenticate( bool atpoweron = false );
- static void authenticate(bool atpoweron = false);
};
}
}
#endif
diff --git a/packages b/packages
index 275d2f9..dcbbe78 100644
--- a/packages
+++ b/packages
@@ -77,48 +77,49 @@ CONFIG_LIBMAD core/multimedia/opieplayer/libmad libmad.pro
CONFIG_LIBMAIL noncore/unsupported/mail2/libmail libmail.pro
CONFIG_LIBMAILWRAPPER noncore/net/mail/libmailwrapper libmailwrapper.pro
CONFIG_LIBMPEG3 core/multimedia/opieplayer/libmpeg3 libmpeg3.pro
CONFIG_LIBOPIE2CORE libopie2/opiecore opiecore.pro
CONFIG_LIBOPIE2DB libopie2/opiedb opiedb.pro
CONFIG_LIBOPIE2EXAMPLES libopie2/examples examples.pro
CONFIG_LIBOPIE2MM libopie2/opiemm opiemm.pro
CONFIG_LIBOPIE2NET libopie2/opienet opienet.pro
CONFIG_LIBOPIE2PIM libopie2/opiepim opiepim.pro
CONFIG_LIBOPIE2SECURITY libopie2/opiesecurity opiesecurity.pro
CONFIG_LIBOPIE2UI libopie2/opieui opieui.pro
CONFIG_LIBOPIE libopie libopie.pro
CONFIG_LIBOPIE_PIM libopie/pim pim.pro
CONFIG_LIBOPIETOOTH noncore/net/opietooth/lib lib.pro
CONFIG_LIBQPE library library.pro
CONFIG_LIBQPE-X11 x11/libqpe-x11 libqpe-x11.pro
CONFIG_LIBQRSYNC rsync rsync.pro
CONFIG_LIBQTAUX libqtaux libqtaux.pro
CONFIG_LIBSLCOMPAT libslcompat libslcompat.pro
CONFIG_LIBSQL libsql libsql.pro
CONFIG_LIBTREMOR core/multimedia/opieplayer/vorbis/tremor tremor.pro
CONFIG_LIBTREMORPLUGIN core/multimedia/opieplayer/vorbis libtremor.pro
CONFIG_LIGHT-AND-POWER core/settings/light-and-power light-and-power.pro
CONFIG_LIQUID noncore/styles/liquid liquid.pro
+CONFIG_LOCKAPPLET core/applets/lockapplet lockapplet.pro
CONFIG_LOGOUTAPPLET core/applets/logoutapplet logoutapplet.pro
CONFIG_MAIL3 noncore/net/mail mail.pro
CONFIG_MAILAPPLET noncore/net/mail/taskbarapplet taskbarapplet.pro
CONFIG_MAILIT noncore/unsupported/mailit mailit.pro
CONFIG_MAIN_TAB_EXAMPLE examples/main-tab example.pro
CONFIG_MEDIUMMOUNT noncore/settings/mediummount mediummount.pro
CONFIG_MEMORYAPPLET noncore/applets/memoryapplet memoryapplet.pro
CONFIG_METAL noncore/styles/metal metal.pro
CONFIG_MINDBREAKER noncore/games/mindbreaker mindbreaker.pro
CONFIG_MINESWEEP noncore/games/minesweep minesweep.pro
CONFIG_MOBILEMSG noncore/comm/mobilemsg mobilemsg.pro
CONFIG_MODPLUG core/multimedia/opieplayer/modplug modplug.pro
CONFIG_MULTIAUTH_BLUEPING noncore/securityplugins/blueping bluepingplugin.pro
CONFIG_MULTIAUTH_DUMMY noncore/securityplugins/dummy dummyplugin.pro
CONFIG_MULTIAUTH_NOTICE noncore/securityplugins/notice noticeplugin.pro
CONFIG_MULTIAUTH_PIN noncore/securityplugins/pin pinplugin.pro
CONFIG_MULTIKEYAPPLET core/applets/multikeyapplet multikeyapplet.pro
CONFIG_MULTIKEY inputmethods/multikey multikey.pro
CONFIG_NETSYSTEMTIME noncore/settings/netsystemtime netsystemtime.pro
CONFIG_NETWORKAPPLET noncore/applets/networkapplet networkapplet.pro
CONFIG_NETWORKSETUP noncore/settings/networksettings networksettings.pro
CONFIG_NOTESAPPLET noncore/applets/notesapplet notesapplet.pro
CONFIG_NS2BT noncore/settings/networksettings2/bluetooth bluetooth.pro
CONFIG_NS2CABLE noncore/settings/networksettings2/cable cable.pro
diff --git a/pics/security/lock.png b/pics/security/lock.png
new file mode 100644
index 0000000..94d1dbc
--- a/dev/null
+++ b/pics/security/lock.png
Binary files differ