signon  8.58
ssotest2plugin.cpp
Go to the documentation of this file.
00001 /*
00002  * This file is part of signon
00003  *
00004  * Copyright (C) 2009-2010 Nokia Corporation.
00005  *
00006  * Contact: Alberto Mardegan <alberto.mardegan@canonical.com>
00007  *
00008  * This library is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public License
00010  * version 2.1 as published by the Free Software Foundation.
00011  *
00012  * This library is distributed in the hope that it will be useful, but
00013  * WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
00020  * 02110-1301 USA
00021  */
00022 
00023 #include <QMutex>
00024 #include <QMutexLocker>
00025 #include <QImage>
00026 #include <unistd.h>
00027 
00028 #include "ssotest2plugin.h"
00029 #include "ssotest2data.h"
00030 
00031 #include "SignOn/signonplugincommon.h"
00032 #include "SignOn/uisessiondata.h"
00033 #include "SignOn/uisessiondata_priv.h"
00034 
00035 using namespace SignOn;
00036 
00037 namespace SsoTest2PluginNS {
00038 
00039 static QMutex mutex;
00040 static bool is_canceled = false;
00041 static QEventLoop uiLoop;
00042 static SignOn::UiSessionData uiData;
00043 
00044 SsoTest2Plugin::SsoTest2Plugin(QObject *parent):
00045     AuthPluginInterface(parent)
00046 {
00047     TRACE();
00048 
00049     m_type = QLatin1String("ssotest2");
00050     m_mechanisms = QStringList(QLatin1String("mech1"));
00051     m_mechanisms += QLatin1String("mech2");
00052     m_mechanisms += QLatin1String("mech3");
00053 
00054     qRegisterMetaType<SignOn::SessionData>("SignOn::SessionData");
00055 }
00056 
00057 SsoTest2Plugin::~SsoTest2Plugin()
00058 {
00059 
00060 }
00061 
00062 void SsoTest2Plugin::cancel()
00063 {
00064     TRACE();
00065     QMutexLocker locker(&mutex);
00066     is_canceled = true;
00067     if (uiLoop.isRunning()) uiLoop.quit();
00068 }
00069 
00070 /*
00071  * dummy plugin is used for testing purposes only
00072  * */
00073 void SsoTest2Plugin::process(const SignOn::SessionData &inData,
00074                              const QString &mechanism)
00075 {
00076     if (! mechanisms().contains(mechanism) ) {
00077         emit error(Error::MechanismNotAvailable);
00078         return;
00079     }
00080 
00081     QMetaObject::invokeMethod(this,
00082                               "execProcess",
00083                               Qt::QueuedConnection,
00084                               Q_ARG(SignOn::SessionData, inData),
00085                               Q_ARG(QString, mechanism));
00086 }
00087 
00088 static QByteArray loadImage(const QString &name)
00089 {
00090     //TODO: adopt to something changeable
00091     QString resource = QLatin1String(":/");
00092     QByteArray ba;
00093 
00094     QImage realImage(resource + name);
00095     QBuffer buffer(&ba);
00096     buffer.open(QIODevice::ReadWrite);
00097     ba.clear();
00098     realImage.save(&buffer);
00099     return ba;
00100 }
00101 
00102 static QVariantMap nameToParameters(const QString &dialogName)
00103 {
00104     QVariantMap data;
00105 
00106     if (dialogName  == QLatin1String("Browser")) {
00107         static int ii = 0;
00108         ii++;
00109 
00110         if (ii % 2)
00111             data["OpenUrl"] = "www.yahoo.com";
00112         else
00113             data["OpenUrl"] = "www.google.com";
00114 
00115         data["watchdog"] = QString(SSOUI_KEY_SLOT_ACCEPT);
00116 
00117     } else if (dialogName  == QLatin1String("Login")) {
00118         data["UserName"] = "testUsername";
00119         data["Secret"] = "testSecret";
00120         data["QueryMessageId"] = 0;
00121         data["QueryUserName"] = true;
00122         data["QueryPassword"] = true;
00123         data["watchdog"] = QString(SSOUI_KEY_SLOT_ACCEPT);
00124     } else if (dialogName  == QLatin1String("Captcha")) {
00125         data["QueryMessageId"] = 0;
00126         data["CaptchaImage"] = loadImage("Captcha1.jpg");
00127         data["watchdog"] = QString(SSOUI_KEY_SLOT_REJECT);
00128     } else if (dialogName  == QLatin1String("LoginAndCaptcha")) {
00129         data["UserName"] = "testUsername";
00130         data["Secret"] = "testSecret";
00131         data["QueryMessageId"] = 0;
00132         data["QueryUserName"] = true;
00133         data["QueryPassword"] = true;
00134         data["QueryMessageId"] = 0;
00135 
00136         data["CaptchaImage"] = loadImage("Captcha1.jpg");
00137         data["watchdog"] = QString(SSOUI_KEY_SLOT_REJECT);
00138     }
00139 
00140     return data;
00141 }
00142 
00143 void SsoTest2Plugin::execProcess(const SignOn::SessionData &inData,
00144                                  const QString &mechanism)
00145 {
00146     Q_UNUSED(mechanism);
00147     int err;
00148     SsoTest2Data testData = inData.data<SsoTest2Data>();
00149     QStringList chainOfResults;
00150 
00151     for (int i = 0; i < testData.ChainOfStates().length(); i++)
00152         if (!is_canceled) {
00153             quint32 currState = testData.CurrentState();
00154             QString message =
00155                 QString("message from plugin, state : %1").arg(currState);
00156             TRACE() << message;
00157             emit statusChanged(PLUGIN_STATE_WAITING, message);
00158             usleep(0.1 * 1000000);
00159 
00160             QString dialogName = testData.ChainOfStates().at(currState);
00161 
00162             QVariantMap parameters = nameToParameters(dialogName);
00163             SignOn::UiSessionData data(parameters);
00164 
00165             emit userActionRequired(data);
00166             uiLoop.exec();
00167 
00168             int errorCode = data.QueryErrorCode();
00169 
00170             if ( dialogName == QLatin1String("Browser") ) {
00171                 if ( errorCode == SignOn::QUERY_ERROR_NONE ||
00172                     errorCode == SignOn::QUERY_ERROR_BAD_URL )
00173                     chainOfResults.append(QLatin1String("OK"));
00174                 else
00175                     chainOfResults.append(QString("FAIL"));
00176             } else if ( dialogName == QLatin1String("Login") ) {
00177                 if (errorCode == SignOn::QUERY_ERROR_NONE)
00178                     chainOfResults.append(QLatin1String("OK"));
00179                 else
00180                     chainOfResults.append(QString("FAIL"));
00181             } else if ( dialogName == QLatin1String("Captcha") ||
00182                       dialogName == QLatin1String("LoginAndCaptcha") ) {
00183                 if (errorCode == SignOn::QUERY_ERROR_CANCELED)
00184                     chainOfResults.append(QLatin1String("OK"));
00185                 else
00186                     chainOfResults.append(QLatin1String("FAIL"));
00187             }
00188 
00189             testData.setCurrentState(currState+1);
00190         }
00191 
00192     if (is_canceled) {
00193         TRACE() << "Operation is canceled";
00194         QMutexLocker locker(&mutex);
00195         is_canceled = false;
00196         emit error(Error::SessionCanceled);
00197         return;
00198     }
00199 
00200     if (!testData.ChainOfStates().length() ||
00201         testData.CurrentState() >= (quint32)testData.ChainOfStates().length()) {
00202         err = 0;
00203     }
00204 
00205     testData.setSecret("testSecret_after_test");
00206 
00207     foreach(QString key, testData.propertyNames())
00208         TRACE() << key << ": " << testData.getProperty(key);
00209 
00210     TRACE() << "Emit the signal";
00211     if (err)
00212         emit error(err);
00213     else
00214         emit result(testData);
00215 }
00216 
00217 void SsoTest2Plugin::userActionFinished(const SignOn::UiSessionData &data)
00218 {
00219     TRACE();
00220     uiData = data;
00221     uiLoop.quit();
00222     TRACE() << "Completed";
00223 }
00224 
00225 void SsoTest2Plugin::refresh(const SignOn::UiSessionData &data)
00226 {
00227     TRACE();
00228     static int ii = 2;
00229 
00230     uiData = data;
00231     QString imageName = QString("Captcha%1.jpg").arg(ii);
00232     TRACE() << imageName;
00233     uiData.setCaptchaImage(loadImage(imageName));
00234     ii++;
00235     if (ii>4)
00236         ii = 1;
00237     emit refreshed(uiData);
00238     TRACE() << "Completed";
00239 }
00240 
00241 SIGNON_DECL_AUTH_PLUGIN(SsoTest2Plugin)
00242 } //namespace SsoTest2PluginNS
00243 
00244