-rw-r--r-- | libopie2/opiesecurity/multiauthcommon.cpp | 7 | ||||
-rw-r--r-- | libopie2/opiesecurity/multiauthcommon.h | 13 | ||||
-rw-r--r-- | libopie2/opiesecurity/multiauthconfigwidget.h | 20 | ||||
-rw-r--r-- | libopie2/opiesecurity/multiauthmainwindow.cpp | 8 | ||||
-rw-r--r-- | libopie2/opiesecurity/multiauthmainwindow.h | 10 | ||||
-rw-r--r-- | libopie2/opiesecurity/multiauthplugininterface.h | 20 | ||||
-rw-r--r-- | libopie2/opiesecurity/opiesecurity.pro | 6 |
7 files changed, 69 insertions, 15 deletions
diff --git a/libopie2/opiesecurity/multiauthcommon.cpp b/libopie2/opiesecurity/multiauthcommon.cpp index b72b9b1..d8e26d5 100644 --- a/libopie2/opiesecurity/multiauthcommon.cpp +++ b/libopie2/opiesecurity/multiauthcommon.cpp @@ -1,179 +1,186 @@ #include "multiauthplugininterface.h" #include "multiauthcommon.h" /* Opie */ #include <opie2/odebug.h> #include <opie2/oapplication.h> /* Qt */ #include <qpe/qpeapplication.h> #include <qpe/qlibrary.h> #include <qpe/qcom.h> #include <qtextview.h> #include <qdir.h> /* UNIX */ #include <unistd.h> #include <qpe/config.h> +namespace Opie { +namespace Security { SecOwnerDlg::SecOwnerDlg( QWidget *parent, const char * name, Contact c, bool modal, bool fullscreen = FALSE ) : QDialog( parent, name, modal, fullscreen ? WStyle_NoBorder | WStyle_Customize | WStyle_StaysOnTop : 0 ) { if ( fullscreen ) { QRect desk = qApp->desktop()->geometry(); setGeometry( 0, 0, desk.width(), desk.height() ); } // set up contents. QString text("<H3>" + tr("Please contact the owner (directions follow), or try again clicking of this screen (and waiting for the penalty time) if you are the legitimate owner") + "</H3>"); text += c.toRichText(); tv = new QTextView(this); tv->setText(text); tv->viewport()->installEventFilter(this); } void SecOwnerDlg::resizeEvent( QResizeEvent * ) { tv->resize( size() ); } bool SecOwnerDlg::eventFilter(QObject *o, QEvent *e) { if (e->type() == QEvent::KeyPress || e->type() == QEvent::MouseButtonPress ) { accept(); return TRUE; } return QWidget::eventFilter(o, e); } void SecOwnerDlg::mousePressEvent( QMouseEvent * ) { accept(); } +namespace Internal { /// run plugins until we reach nbSuccessMin successes int runPlugins() { SecOwnerDlg *oi = 0; // see if there is contact information. QString vfilename = Global::applicationFileName("addressbook", "businesscard.vcf"); if (QFile::exists(vfilename)) { Contact c; c = Contact::readVCard( vfilename )[0]; oi = new SecOwnerDlg(0, 0, c, TRUE, TRUE); } Config config("Security"); config.setGroup("Plugins"); QStringList plugins = config.readListEntry("IncludePlugins", ','); config.setGroup("Misc"); int nbSuccessMin = config.readNumEntry("nbSuccessMin", 1); int nbSuccess = 0; /* tries to launch successively each plugin in $OPIEDIR/plugins/security * directory which file name is in Security.conf / [Misc] / IncludePlugins */ QString path = QPEApplication::qpeDir() + "/plugins/security"; QStringList::Iterator libIt; for ( libIt = plugins.begin(); libIt != plugins.end(); ++libIt ) { QInterfacePtr<MultiauthPluginInterface> iface; QLibrary *lib = new QLibrary( path + "/" + *libIt ); if ( lib->queryInterface( IID_MultiauthPluginInterface, (QUnknownInterface**)&iface ) == QS_OK ) { // the plugin is a true Multiauth plugin odebug << "Accepted plugin: " << QString( path + "/" + *libIt ) << oendl; odebug << "Plugin name: " << iface->plugin()->pluginName() << oendl; int resultCode; int tries = 0; // perform authentication resultCode = iface->plugin()->authenticate(); // display the result in command line QString resultMessage; switch (resultCode) { case MultiauthPluginObject::Success: resultMessage = "Success!"; nbSuccess++; break; case MultiauthPluginObject::Failure: resultMessage = "Failure..."; break; case MultiauthPluginObject::Skip: resultMessage = "Skip"; break; } odebug << "Plugin result: " << resultMessage << oendl; // if failure, wait, reperform, wait, reperform... until right while (resultCode == MultiauthPluginObject::Failure) { tries++; owarn << "This plugin has failed " << tries << " times already" << oendl; // displays owner information, if any if (oi) { oi->exec(); odebug << "Contact information displayed" << oendl; } /// \todo parametrize the time penalty according to \em mode (exponential, /// linear or fixed) and \em basetime (time penalty for the first failure) sleep(2 * tries); if (oi) { oi->hide(); /** \todo fix the focus here: should go back to the current plugin widget * but it doesn't, so we have to tap once on the widget before e.g. buttons * are active again */ odebug << "Contact information hidden" << oendl; } // perform authentication resultCode = iface->plugin()->authenticate(); // display the result in command line switch (resultCode) { case MultiauthPluginObject::Success: resultMessage = "Success!"; nbSuccess++; break; case MultiauthPluginObject::Failure: resultMessage = "Failure..."; break; case MultiauthPluginObject::Skip: resultMessage = "Skip"; break; } odebug << "Plugin result: " << resultMessage << oendl; } delete lib; if (resultCode == MultiauthPluginObject::Success && nbSuccess == nbSuccessMin) { if(oi) delete oi; // we have reached the required number of successes, we can exit the plugin loop return 0; } } else { owarn << "Could not recognize plugin " << QString( path + "/" + *libIt ) << oendl; delete lib; } // end if plugin recognized } //end for if(oi) delete oi; return 1; } + +} +} +} diff --git a/libopie2/opiesecurity/multiauthcommon.h b/libopie2/opiesecurity/multiauthcommon.h index 6d6d5d1..46beab0 100644 --- a/libopie2/opiesecurity/multiauthcommon.h +++ b/libopie2/opiesecurity/multiauthcommon.h @@ -1,62 +1,75 @@ /** * \file multiauthcommon.h * \brief Objects and functions for Opie multiauth framework * \author Clément Séveillac (clement . seveillac (at) via . ecp . fr) */ /* =. This file is part of the Opie Project .=l. Copyright (C) 2004 Opie Developer Team <opie-devel@handhelds.org> .>+-= _;:, .> :=|. This library is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU Library General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. .%`+i> _;_. .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 MULTIAUTHCOMMON_H #define MULTIAUTHCOMMON_H /* OwnerDialog stuff */ #include <qpe/global.h> #include <qpe/contact.h> #include <qtextview.h> #include <qdialog.h> + +namespace Opie { +namespace Security { + class SecOwnerDlg : public QDialog { Q_OBJECT public: SecOwnerDlg( QWidget *parent, const char * name, Contact c, bool modal, bool fullscreen); void resizeEvent( QResizeEvent * ); bool eventFilter(QObject *o, QEvent *e); void mousePressEvent( QMouseEvent * ); private: QTextView *tv; + + private: + struct Private; + Private *d; }; +namespace Internal { int runPlugins(); +} + +} +} #endif // MULTIAUTHCOMMON_H diff --git a/libopie2/opiesecurity/multiauthconfigwidget.h b/libopie2/opiesecurity/multiauthconfigwidget.h index cd6f047..2ed8fc0 100644 --- a/libopie2/opiesecurity/multiauthconfigwidget.h +++ b/libopie2/opiesecurity/multiauthconfigwidget.h @@ -1,68 +1,78 @@ /** * \file multiauthconfigwidget.h * \brief Defines the Opie multiauth configuration widget interface. * \author Clément Séveillac (clement . seveillac (at) via . ecp . fr) */ /* =. This file is part of the Opie Project .=l. Copyright (C) 2004 Opie Developer Team <opie-devel@handhelds.org> .>+-= - _;:, .> :=|. This library is free software; you can + _;:, .> :=|. This library is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU Library General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. - .%`+i> _;_. - .i_,=:_. -<s. This library is distributed in the hope that + .%`+i> _;_. + .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. + -- :-=` 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 MULTIAUTHCONFIGWIDGET_H #define MULTIAUTHCONFIGWIDGET_H #include <qwidget.h> #include <qobject.h> +namespace Opie { +namespace Security { + /// Base class of all Opie multiauth config widgets /** * A base class for all Opie Multiauth Config Widgets. * This will let a Opie multiauth plugin to add the possibility of configuration. * Plugins need to inherit from this class and need to implement * the pure virtual method to control configuration. * The Plugin should read its configuration during creation of the Widget * * \author Clement Seveillac (helped by Maximilian Reiß's Today framework) */ class MultiauthConfigWidget : public QWidget { Q_OBJECT public: /// standard widget constructor MultiauthConfigWidget( QWidget *parent, const char *name ) : QWidget( parent, name ) {} virtual ~MultiauthConfigWidget() {} /// Method to reimplement, supposed to save the plugin configuration /** * Plugins need to reimplement this in the config widget * Used when the config dialog is closed to write config stuff */ virtual void writeConfig() = 0; + + private: + struct Private; + Private *d; }; +} +} + #endif // MULTIAUTHCONFIGWIDGET_H diff --git a/libopie2/opiesecurity/multiauthmainwindow.cpp b/libopie2/opiesecurity/multiauthmainwindow.cpp index 2be3473..c6229c7 100644 --- a/libopie2/opiesecurity/multiauthmainwindow.cpp +++ b/libopie2/opiesecurity/multiauthmainwindow.cpp @@ -1,129 +1,135 @@ #include "multiauthmainwindow.h" #include "multiauthcommon.h" #include <qpe/config.h> +namespace Opie { +namespace Security { + /// Initializes widgets according to allowBypass and explanScreens config MultiauthMainWindow::MultiauthMainWindow() : QDialog(0, "main Opie multiauth modal dialog", TRUE, Qt::WStyle_NoBorder | Qt::WStyle_Customize | Qt::WStyle_StaysOnTop) { alreadyDone = false; // initializes widget pointers which not always point to an object quit = 0; message2 = 0; Config *pcfg = new Config("Security"); pcfg->setGroup("Misc"); explanScreens = pcfg->readBoolEntry("explanScreens", true); allowBypass = pcfg->readBoolEntry("allowBypass", true); delete pcfg; layout = new QVBoxLayout(this); layout->setSpacing(11); layout->setMargin(11); layout->setAlignment( Qt::AlignTop ); // if explanScreens is false, we don't show any text in the QDialog, // and we proceed directly if ( explanScreens == true ) { title = new QLabel("<center><h1>" + tr("Welcome to Opie Multi-authentication Framework") + "</h1></center>", this); message = new QLabel("<center><h3>" + tr("Launching authentication plugins...") + "</h3></center>", this); } else { title = new QLabel("", this); message = new QLabel("", this); } layout->addWidget(title); layout->addWidget(message); proceedButton = new QPushButton(tr("Proceed..."), this); layout->addWidget(proceedButton, 0, Qt::AlignHCenter); QObject::connect(proceedButton, SIGNAL(clicked()), this, SLOT(proceed())); if ( explanScreens == true ) { quit = new QPushButton("Exit", this); layout->addWidget(quit, 0, Qt::AlignHCenter); if ( allowBypass == true ) { // very important: we can close the widget through the quit button, and bypass authentication, only if allowBypass is set! message2 = new QLabel("<center><i>" + tr("Note: the 'exit' button should be removed for real protection, through Security config dialog") + ".</i></center>", this); layout->addWidget(message2); QObject::connect(quit, SIGNAL(clicked()), this, SLOT(close())); } else { quit->hide(); } } else { // we will need this button only if runPlugins() fails in proceed() proceedButton->hide(); // let's proceed now proceed(); } } /// nothing to do MultiauthMainWindow::~MultiauthMainWindow() { } /// launch the authentication void MultiauthMainWindow::proceed() { - int result = runPlugins(); + int result = Internal::runPlugins(); if ( (result == 0) && !explanScreens ) { // the authentication has succeeded, we can exit directly // this will work if we haven't been called by the constructor of MultiauthMainWindow close(); // and if we've been called by this constructor, we use this variable to tell our // caller we're already done alreadyDone = true; return; } else { proceedButton->setText("Another try?"); QString resultMessage; if (result == 0) { // authentication has succeeded, adapt interface then message->setText( "<center><h3>" + tr("Congratulations! Your authentication has been successful.") + "</h3></center>" ); quit->setText("Enter Opie"); if ( quit->isHidden() ) { // that means we don't allow to bypass, but now we can show and connect this button QObject::connect(quit, SIGNAL(clicked()), this, SLOT(close())); quit->show(); } else { if ( message2 != 0 ) message2->hide(); } } else { // authentication has failed, explain that according to allowBypass message->setText( "<center><h3>" + tr("You have not succeeded enough authentication steps!") + "</h3></center>" ); proceedButton->show(); if ( allowBypass == true ) message2->setText( "<center><p>" + tr("Note: if 'allow to bypass' was uncheck in Security config, you would have to go back through all the steps now.") + "</p></center>" ); } } } /** When we don't show explanatory screens and we succeed authentication, * as early as during the proceed() call of the constructor, the caller must know * (through this function) authentication has already been succeeded.. * \todo try to avoid this hack? */ bool MultiauthMainWindow::isAlreadyDone() { return alreadyDone; } + +} +} diff --git a/libopie2/opiesecurity/multiauthmainwindow.h b/libopie2/opiesecurity/multiauthmainwindow.h index d5f53c6..626b8b3 100644 --- a/libopie2/opiesecurity/multiauthmainwindow.h +++ b/libopie2/opiesecurity/multiauthmainwindow.h @@ -1,74 +1,84 @@ /** * \file multiauthmainwindow.h * \brief Defines the Opie multiauth main window. * * This implementation was derived from the today plugins implementation. * \author Clément Séveillac (clement . seveillac (at) via . ecp . fr) */ /* =. This file is part of the Opie Project .=l. Copyright (C) 2004 Opie Developer Team <opie-devel@handhelds.org> .>+-= _;:, .> :=|. This library is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU Library General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. .%`+i> _;_. .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 MULTIAUTHMAINWINDOW_H #define MULTIAUTHMAINWINDOW_H #include <qdialog.h> #include <qlayout.h> #include <qpushbutton.h> #include <qlabel.h> + +namespace Opie { +namespace Security { + /// Multiauth main window /** * This QDialog window displays some information and an exit button, * and completely hides the desktop, preventing user interactions * with it. */ class MultiauthMainWindow : public QDialog { Q_OBJECT public: MultiauthMainWindow(); ~MultiauthMainWindow(); bool isAlreadyDone(); private: QVBoxLayout * layout; QLabel * title, * message, * message2; QPushButton * proceedButton, * quit; /// whether to show explanatory screens before and after the authentication plugins bool explanScreens; /// allow to bypass authnentication via 'exit' buttons on both explan. screens bool allowBypass; /// true when the authentication has been done successfully bool alreadyDone; private slots: void proceed(); + private: + struct Private; + Private *d; }; +} +} + #endif // MULTIAUTHMAINWINDOW_H diff --git a/libopie2/opiesecurity/multiauthplugininterface.h b/libopie2/opiesecurity/multiauthplugininterface.h index 0035107..5998a18 100644 --- a/libopie2/opiesecurity/multiauthplugininterface.h +++ b/libopie2/opiesecurity/multiauthplugininterface.h @@ -1,109 +1,115 @@ /** * \file multiauthplugininterface.h * \brief Main public interface to Opie multiauth authentication plugins. - * + * * This implementation was derived from the todolist plugin implementation. * \author Clément Séveillac (clement . seveillac (at) via . ecp . fr) */ /* =. This file is part of the Opie Project .=l. Copyright (C) 2004 Opie Developer Team <opie-devel@handhelds.org> .>+-= - _;:, .> :=|. This library is free software; you can + _;:, .> :=|. This library is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU Library General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. - .%`+i> _;_. - .i_,=:_. -<s. This library is distributed in the hope that + .%`+i> _;_. + .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. + -- :-=` 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 MULTIAUTH_PLUGIN_INTERFACE #define MULTIAUTH_PLUGIN_INTERFACE #include <qpe/qcom.h> #include "multiauthconfigwidget.h" class QString; class QWidget; +namespace Opie { +namespace Security { + #ifndef IID_MultiauthPluginInterface /// Universally Unique Id of the interface (required by QCOM): /// {AD5BE8B1-8421-447b-9AED-250BE1CDA49c} #define IID_MultiauthPluginInterface QUuid(0xad5be8b1, 0x8421, 0x447b, 0x9a, 0xed, 0x25, 0x0b, 0xe1, 0xcd, 0xa4, 0x9c) #endif /// Base class for Opie multiauth plugins /** * A MultiauthPluginObject is the base for all Multiauth Plugins. * A plugin author needs to inherit this class and implement * the pure virtual methods. * * \author Clement Seveillac (helped by Maximilian Reiß's Today framework) */ class MultiauthPluginObject { public: virtual ~MultiauthPluginObject() {}; /// The name of the plugin /* * \return The plugin should return its name here */ virtual QString pluginName() const = 0; /// Ask the plugin to launch one authentication attempt virtual int authenticate() = 0; /// Possible return codes for authenticate() function enum authResult { Success = 0, Failure = 1, Skip = 2 }; /// Pointer to the (optional) plugin configuration widget virtual MultiauthConfigWidget * configWidget(QWidget * parent) = 0; /// (optional) plugin configuration tab icon /** * \return path to the image file (without the extension) * from $OPIEDIR/pics */ virtual QString pixmapNameConfig() const = 0; /// Plugin icon, to be displayed in the plugin list configuration widget /** * \return path to the image file (without the extension) * from $OPIEDIR/pics */ virtual QString pixmapNameWidget() const = 0; }; /// Interface for multiauth plugin classes. -/* +/* * This is part of the QCOM works. See example plugins how to do it right. * \see http://doc.trolltech.com/qtopia/html/pluginintro.html */ struct MultiauthPluginInterface : public QUnknownInterface { /// return the MultiauthPluginObject implementation virtual MultiauthPluginObject *plugin() = 0; }; +} +} + #endif diff --git a/libopie2/opiesecurity/opiesecurity.pro b/libopie2/opiesecurity/opiesecurity.pro index 8cb4821..8535785 100644 --- a/libopie2/opiesecurity/opiesecurity.pro +++ b/libopie2/opiesecurity/opiesecurity.pro @@ -1,15 +1,17 @@ TEMPLATE = lib CONFIG += qt warn_on DESTDIR = $(OPIEDIR)/lib HEADERS = multiauthcommon.h \ multiauthmainwindow.h \ multiauthconfigwidget.h \ - multiauthplugininterface.h + multiauthplugininterface.h \ + multiauthpassword.h SOURCES = multiauthcommon.cpp \ - multiauthmainwindow.cpp + multiauthmainwindow.cpp \ + multiauthpassword.cpp TARGET = opiesecurity2 VERSION = 0.0.2 INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include include ( $(OPIEDIR)/include.pro ) |