signon  8.40
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 }
00068 
00069 /*
00070  * dummy plugin is used for testing purposes only
00071  * */
00072 void SsoTest2Plugin::process(const SignOn::SessionData &inData,
00073                              const QString &mechanism)
00074 {
00075     if (! mechanisms().contains(mechanism) ) {
00076         emit error(Error::MechanismNotAvailable);
00077         return;
00078     }
00079 
00080     QMetaObject::invokeMethod(this,
00081                               "execProcess",
00082                               Qt::QueuedConnection,
00083                               Q_ARG(SignOn::SessionData, inData),
00084                               Q_ARG(QString, mechanism));
00085 }
00086 
00087 static QByteArray loadImage(const QString &name)
00088 {
00089     //TODO: adopt to something changeable
00090     QString resource = QLatin1String(":/");
00091     QByteArray ba;
00092 
00093     QImage realImage(resource + name);
00094     QBuffer buffer(&ba);
00095     buffer.open(QIODevice::ReadWrite);
00096     ba.clear();
00097     realImage.save(&buffer);
00098     return ba;
00099 }
00100 
00101 static QVariantMap nameToParameters(const QString &dialogName)
00102 {
00103     QVariantMap data;
00104 
00105     if (dialogName  == QLatin1String("Browser")) {
00106         static int ii = 0;
00107         ii++;
00108 
00109         if (ii % 2)
00110             data["OpenUrl"] = "www.yahoo.com";
00111         else
00112             data["OpenUrl"] = "www.google.com";
00113 
00114         data["watchdog"] = QString(SSOUI_KEY_SLOT_ACCEPT);
00115 
00116     } else if (dialogName  == QLatin1String("Login")) {
00117         data["UserName"] = "testUsername";
00118         data["Secret"] = "testSecret";
00119         data["QueryMessageId"] = 0;
00120         data["QueryUserName"] = true;
00121         data["QueryPassword"] = true;
00122         data["watchdog"] = QString(SSOUI_KEY_SLOT_ACCEPT);
00123     } else if (dialogName  == QLatin1String("Captcha")) {
00124         data["QueryMessageId"] = 0;
00125         data["CaptchaImage"] = loadImage("Captcha1.jpg");
00126         data["watchdog"] = QString(SSOUI_KEY_SLOT_REJECT);
00127     } else if (dialogName  == QLatin1String("LoginAndCaptcha")) {
00128         data["UserName"] = "testUsername";
00129         data["Secret"] = "testSecret";
00130         data["QueryMessageId"] = 0;
00131         data["QueryUserName"] = true;
00132         data["QueryPassword"] = true;
00133         data["QueryMessageId"] = 0;
00134 
00135         data["CaptchaImage"] = loadImage("Captcha1.jpg");
00136         data["watchdog"] = QString(SSOUI_KEY_SLOT_REJECT);
00137     }
00138 
00139     return data;
00140 }
00141 
00142 void SsoTest2Plugin::execProcess(const SignOn::SessionData &inData,
00143                                  const QString &mechanism)
00144 {
00145     Q_UNUSED(mechanism);
00146     int err;
00147     SsoTest2Data testData = inData.data<SsoTest2Data>();
00148     QStringList chainOfResults;
00149 
00150     for (int i = 0; i < testData.ChainOfStates().length(); i++)
00151         if (!is_canceled) {
00152             quint32 currState = testData.CurrentState();
00153             QString message =
00154                 QString("message from plugin, state : %1").arg(currState);
00155             TRACE() << message;
00156             emit statusChanged(PLUGIN_STATE_WAITING, message);
00157             usleep(0.1 * 1000000);
00158 
00159             QString dialogName = testData.ChainOfStates().at(currState);
00160 
00161             QVariantMap parameters = nameToParameters(dialogName);
00162             SignOn::UiSessionData data(parameters);
00163 
00164             emit userActionRequired(data);
00165             uiLoop.exec();
00166 
00167             int errorCode = data.QueryErrorCode();
00168 
00169             if ( dialogName == QLatin1String("Browser") ) {
00170                 if ( errorCode == SignOn::QUERY_ERROR_NONE ||
00171                     errorCode == SignOn::QUERY_ERROR_BAD_URL )
00172                     chainOfResults.append(QLatin1String("OK"));
00173                 else
00174                     chainOfResults.append(QString("FAIL"));
00175             } else if ( dialogName == QLatin1String("Login") ) {
00176                 if (errorCode == SignOn::QUERY_ERROR_NONE)
00177                     chainOfResults.append(QLatin1String("OK"));
00178                 else
00179                     chainOfResults.append(QString("FAIL"));
00180             } else if ( dialogName == QLatin1String("Captcha") ||
00181                       dialogName == QLatin1String("LoginAndCaptcha") ) {
00182                 if (errorCode == SignOn::QUERY_ERROR_CANCELED)
00183                     chainOfResults.append(QLatin1String("OK"));
00184                 else
00185                     chainOfResults.append(QLatin1String("FAIL"));
00186             }
00187 
00188             testData.setCurrentState(currState+1);
00189         }
00190 
00191     if (is_canceled) {
00192         TRACE() << "Operation is canceled";
00193         QMutexLocker locker(&mutex);
00194         is_canceled = false;
00195         emit error(Error::SessionCanceled);
00196         return;
00197     }
00198 
00199     if (!testData.ChainOfStates().length() ||
00200         testData.CurrentState() >= (quint32)testData.ChainOfStates().length()) {
00201         err = 0;
00202     }
00203 
00204     testData.setSecret("testSecret_after_test");
00205 
00206     foreach(QString key, testData.propertyNames())
00207         TRACE() << key << ": " << testData.getProperty(key);
00208 
00209     TRACE() << "Emit the signal";
00210     if (err)
00211         emit error(err);
00212     else
00213         emit result(testData);
00214 }
00215 
00216 void SsoTest2Plugin::userActionFinished(const SignOn::UiSessionData &data)
00217 {
00218     TRACE();
00219     uiData = data;
00220     uiLoop.quit();
00221     TRACE() << "Completed";
00222 }
00223 
00224 void SsoTest2Plugin::refresh(const SignOn::UiSessionData &data)
00225 {
00226     TRACE();
00227     static int ii = 2;
00228 
00229     uiData = data;
00230     QString imageName = QString("Captcha%1.jpg").arg(ii);
00231     TRACE() << imageName;
00232     uiData.setCaptchaImage(loadImage(imageName));
00233     ii++;
00234     if (ii>4)
00235         ii = 1;
00236     emit refreshed(uiData);
00237     TRACE() << "Completed";
00238 }
00239 
00240 SIGNON_DECL_AUTH_PLUGIN(SsoTest2Plugin)
00241 } //namespace SsoTest2PluginNS
00242 
00243