signon  8.42
ssotest2plugin.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of signon
3  *
4  * Copyright (C) 2009-2010 Nokia Corporation.
5  *
6  * Contact: Alberto Mardegan <alberto.mardegan@canonical.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * version 2.1 as published by the Free Software Foundation.
11  *
12  * This library is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20  * 02110-1301 USA
21  */
22 
23 #include <QMutex>
24 #include <QMutexLocker>
25 #include <QImage>
26 #include <unistd.h>
27 
28 #include "ssotest2plugin.h"
29 #include "ssotest2data.h"
30 
31 #include "SignOn/signonplugincommon.h"
32 #include "SignOn/uisessiondata.h"
33 #include "SignOn/uisessiondata_priv.h"
34 
35 using namespace SignOn;
36 
37 namespace SsoTest2PluginNS {
38 
39 static QMutex mutex;
40 static bool is_canceled = false;
41 static QEventLoop uiLoop;
42 static SignOn::UiSessionData uiData;
43 
44 SsoTest2Plugin::SsoTest2Plugin(QObject *parent):
45  AuthPluginInterface(parent)
46 {
47  TRACE();
48 
49  m_type = QLatin1String("ssotest2");
50  m_mechanisms = QStringList(QLatin1String("mech1"));
51  m_mechanisms += QLatin1String("mech2");
52  m_mechanisms += QLatin1String("mech3");
53 
54  qRegisterMetaType<SignOn::SessionData>("SignOn::SessionData");
55 }
56 
58 {
59 
60 }
61 
63 {
64  TRACE();
65  QMutexLocker locker(&mutex);
66  is_canceled = true;
67 }
68 
69 /*
70  * dummy plugin is used for testing purposes only
71  * */
72 void SsoTest2Plugin::process(const SignOn::SessionData &inData,
73  const QString &mechanism)
74 {
75  if (! mechanisms().contains(mechanism) ) {
76  emit error(Error::MechanismNotAvailable);
77  return;
78  }
79 
80  QMetaObject::invokeMethod(this,
81  "execProcess",
82  Qt::QueuedConnection,
83  Q_ARG(SignOn::SessionData, inData),
84  Q_ARG(QString, mechanism));
85 }
86 
87 static QByteArray loadImage(const QString &name)
88 {
89  //TODO: adopt to something changeable
90  QString resource = QLatin1String(":/");
91  QByteArray ba;
92 
93  QImage realImage(resource + name);
94  QBuffer buffer(&ba);
95  buffer.open(QIODevice::ReadWrite);
96  ba.clear();
97  realImage.save(&buffer);
98  return ba;
99 }
100 
101 static QVariantMap nameToParameters(const QString &dialogName)
102 {
103  QVariantMap data;
104 
105  if (dialogName == QLatin1String("Browser")) {
106  static int ii = 0;
107  ii++;
108 
109  if (ii % 2)
110  data["OpenUrl"] = "www.yahoo.com";
111  else
112  data["OpenUrl"] = "www.google.com";
113 
114  data["watchdog"] = QString(SSOUI_KEY_SLOT_ACCEPT);
115 
116  } else if (dialogName == QLatin1String("Login")) {
117  data["UserName"] = "testUsername";
118  data["Secret"] = "testSecret";
119  data["QueryMessageId"] = 0;
120  data["QueryUserName"] = true;
121  data["QueryPassword"] = true;
122  data["watchdog"] = QString(SSOUI_KEY_SLOT_ACCEPT);
123  } else if (dialogName == QLatin1String("Captcha")) {
124  data["QueryMessageId"] = 0;
125  data["CaptchaImage"] = loadImage("Captcha1.jpg");
126  data["watchdog"] = QString(SSOUI_KEY_SLOT_REJECT);
127  } else if (dialogName == QLatin1String("LoginAndCaptcha")) {
128  data["UserName"] = "testUsername";
129  data["Secret"] = "testSecret";
130  data["QueryMessageId"] = 0;
131  data["QueryUserName"] = true;
132  data["QueryPassword"] = true;
133  data["QueryMessageId"] = 0;
134 
135  data["CaptchaImage"] = loadImage("Captcha1.jpg");
136  data["watchdog"] = QString(SSOUI_KEY_SLOT_REJECT);
137  }
138 
139  return data;
140 }
141 
142 void SsoTest2Plugin::execProcess(const SignOn::SessionData &inData,
143  const QString &mechanism)
144 {
145  Q_UNUSED(mechanism);
146  int err;
147  SsoTest2Data testData = inData.data<SsoTest2Data>();
148  QStringList chainOfResults;
149 
150  for (int i = 0; i < testData.ChainOfStates().length(); i++)
151  if (!is_canceled) {
152  quint32 currState = testData.CurrentState();
153  QString message =
154  QString("message from plugin, state : %1").arg(currState);
155  TRACE() << message;
156  emit statusChanged(PLUGIN_STATE_WAITING, message);
157  usleep(0.1 * 1000000);
158 
159  QString dialogName = testData.ChainOfStates().at(currState);
160 
161  QVariantMap parameters = nameToParameters(dialogName);
162  SignOn::UiSessionData data(parameters);
163 
164  emit userActionRequired(data);
165  uiLoop.exec();
166 
167  int errorCode = data.QueryErrorCode();
168 
169  if ( dialogName == QLatin1String("Browser") ) {
170  if ( errorCode == SignOn::QUERY_ERROR_NONE ||
171  errorCode == SignOn::QUERY_ERROR_BAD_URL )
172  chainOfResults.append(QLatin1String("OK"));
173  else
174  chainOfResults.append(QString("FAIL"));
175  } else if ( dialogName == QLatin1String("Login") ) {
176  if (errorCode == SignOn::QUERY_ERROR_NONE)
177  chainOfResults.append(QLatin1String("OK"));
178  else
179  chainOfResults.append(QString("FAIL"));
180  } else if ( dialogName == QLatin1String("Captcha") ||
181  dialogName == QLatin1String("LoginAndCaptcha") ) {
182  if (errorCode == SignOn::QUERY_ERROR_CANCELED)
183  chainOfResults.append(QLatin1String("OK"));
184  else
185  chainOfResults.append(QLatin1String("FAIL"));
186  }
187 
188  testData.setCurrentState(currState+1);
189  }
190 
191  if (is_canceled) {
192  TRACE() << "Operation is canceled";
193  QMutexLocker locker(&mutex);
194  is_canceled = false;
195  emit error(Error::SessionCanceled);
196  return;
197  }
198 
199  if (!testData.ChainOfStates().length() ||
200  testData.CurrentState() >= (quint32)testData.ChainOfStates().length()) {
201  err = 0;
202  }
203 
204  testData.setSecret("testSecret_after_test");
205 
206  foreach(QString key, testData.propertyNames())
207  TRACE() << key << ": " << testData.getProperty(key);
208 
209  TRACE() << "Emit the signal";
210  if (err)
211  emit error(err);
212  else
213  emit result(testData);
214 }
215 
216 void SsoTest2Plugin::userActionFinished(const SignOn::UiSessionData &data)
217 {
218  TRACE();
219  uiData = data;
220  uiLoop.quit();
221  TRACE() << "Completed";
222 }
223 
224 void SsoTest2Plugin::refresh(const SignOn::UiSessionData &data)
225 {
226  TRACE();
227  static int ii = 2;
228 
229  uiData = data;
230  QString imageName = QString("Captcha%1.jpg").arg(ii);
231  TRACE() << imageName;
232  uiData.setCaptchaImage(loadImage(imageName));
233  ii++;
234  if (ii>4)
235  ii = 1;
236  emit refreshed(uiData);
237  TRACE() << "Completed";
238 }
239 
240 SIGNON_DECL_AUTH_PLUGIN(SsoTest2Plugin)
241 } //namespace SsoTest2PluginNS
242 
243