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