signon
8.58
|
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