1 #include "usermanagement.h"
2 #include <QApplication>
4 #include <QtCore/QJsonDocument>
6 UserManagement::UserManagement(QObject *root) : QObject()
8 home = root->findChild<QObject *>("Home");
9 logo = root->findChild<QObject *>("Logo_colour");
10 shortcutArea = root->findChild<QObject *>("ShortcutArea");
11 statusArea = root->findChild<QObject *>("StatusArea");
12 this->appModel = home->findChild<ApplicationModel *>("ApplicationModel");
18 connect(&timerTest, SIGNAL(timeout()), this, SLOT(slot_timerTest()));
19 timerTest.setSingleShot(false);
20 timerTest.start(5000);
24 void UserManagement::setUser(const User &user)
26 appModel->changeLanguage(user.graphPreferredLanguage);
27 QMetaObject::invokeMethod(logo, "setImage", Q_ARG(QVariant, "./images/Utility_Logo_Colour-01.png"));
28 QMetaObject::invokeMethod(home, "languageChanged");
29 QMetaObject::invokeMethod(shortcutArea, "languageChanged", Q_ARG(QVariant, user.graphPreferredLanguage));
30 QMetaObject::invokeMethod(statusArea, "languageChanged", Q_ARG(QVariant, user.graphPreferredLanguage));
31 QMetaObject::invokeMethod(home, "showSign90", Q_ARG(QVariant, true));
32 QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, true), Q_ARG(QVariant, "---- ---- ---- " + user.ccNumberMasked));
33 const QString welcome = QString("%1").arg(user.graphPreferredLanguage == "fr" ? "Bonjour " : "Hello") + " ";
34 QMetaObject::invokeMethod(home, "showHello", Q_ARG(QVariant, welcome + user.first_name));
36 void UserManagement::connectWebsockets()
39 const QUrl url(REAL_SERVER);
41 const QUrl url(QStringLiteral("ws://localhost:1234"));
43 QSslConfiguration config = QSslConfiguration::defaultConfiguration();
44 config.setProtocol(QSsl::SecureProtocols);
45 webSocket.setSslConfiguration(config);
46 connect(&webSocket, &QWebSocket::connected, this, &UserManagement::onConnected);
47 connect(&webSocket, &QWebSocket::disconnected, this, &UserManagement::onClosed);
48 if(!connect(&webSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onWebSocketError(QAbstractSocket::SocketError)))) {
49 qWarning() << "Failed to connect to QWebSocket::error";
51 webSocket.open(QUrl(url));
53 void UserManagement::onWebSocketError(QAbstractSocket::SocketError)
55 qWarning()<<"Websocket error:" << webSocket.errorString();
58 void UserManagement::onConnected()
60 connect(&webSocket, &QWebSocket::textMessageReceived,
61 this, &UserManagement::onTextMessageReceived);
64 list << 2 << QString().setNum(++sequence) << "agl-identity-agent/subscribe" << true;
65 listToJson(list, &json);
66 webSocket.sendTextMessage(QString(json));
68 list << 2 << QString().setNum(++sequence) << "agl-identity-agent/scan" << true;
69 listToJson(list, &json);
70 webSocket.sendTextMessage(QString(json));
72 void UserManagement::onTextMessageReceived(QString message)
75 const bool ok = jsonToList(message.toUtf8(), &list);
76 if(!ok || list.size() < 3) {
77 qWarning()<<"error 1 decoding json"<<list.size()<<message;
80 QVariantMap map = list.at(2).toMap();
81 if(list.first().toInt() == 5) {
82 QMetaObject::invokeMethod(logo, "setImage", Q_ARG(QVariant, "./images/Utility_Logo_Red-01.png"));
83 map = map["data"].toMap();
84 if(map["eventName"].toString() == "login") {
85 //qWarning()<<"login received in client";
87 list << 2 << QString().setNum(++sequence) << "agl-identity-agent/get" << true;
88 listToJson(list, &data);
89 QTimer::singleShot(300, this, SLOT(slot_sendData()));
93 if(list.first().toInt() == 3) {
94 if(!map.contains("response")) {
97 map = map["response"].toMap();
99 user.postal_address = map["postal_address"].toString();
100 QStringList temp = map["loc"].toString().split(",");
101 if(temp.size() == 2) {
102 user.loc.setX(temp.at(0).toDouble());
103 user.loc.setY(temp.at(1).toDouble());
105 user.country = map["country"].toString();
106 user.mail = map["mail"].toString();
107 user.city = map["city"].toString();
108 user.graphEmail = map["graphEmail"].toString();
109 user.graphPreferredLanguage = map["graphPreferredLanguage"].toString();
110 user.ccNumberMasked = map["ccNumberMasked"].toString();
111 user.ccExpYear = map["ccExpYear"].toString();
112 user.ccExpMonth = map["ccExpMonth"].toString();
113 user.description = map["description"].toString();
114 user.groups = map["groups"].toStringList();
115 user.last_name = map["last_name"].toString();
116 user.ccNumber = map["ccNumber"].toString();
117 user.house_identifier = map["house_identifier"].toString();
118 user.phone = map["phone"].toString();
119 user.name = map["name"].toString();
120 user.state = map["state"].toString();
121 user.common_name = map["common_name"].toString();
122 user.fax = map["fax"].toString();
123 user.postal_code = map["postal_code"].toString();
124 user.first_name = map["first_name"].toString();
125 user.keytoken = map["keytoken"].toString();
129 void UserManagement::slot_sendData()
131 webSocket.sendTextMessage(QString(data));
134 void UserManagement::onClosed()
136 qWarning()<<"webSocket closed";
138 bool UserManagement::listToJson(const QList<QVariant> &list, QByteArray *json) const
141 *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact);
144 bool UserManagement::jsonToList(const QByteArray &buf, QList<QVariant> *list) const
149 QVariant v = QJsonDocument::fromJson(buf, &err).toVariant();
151 qWarning() << "Error parsing json data" << err.errorString() << buf;
152 *list = QList<QVariant>();
158 bool UserManagement::mapToJson( const QVariantMap &map, QByteArray *json) const
163 *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact);
166 bool UserManagement::jsonToMap(const QByteArray &buf, QVariantMap *map) const
171 QVariant v = QJsonDocument::fromJson(buf, &err).toVariant();
173 qWarning() << "Error parsing json data" << err.errorString() << buf;
174 *map = QVariantMap();
181 void UserManagement::launchServer()
183 webSocketServer = new QWebSocketServer(QStringLiteral("My Server"),
184 QWebSocketServer::NonSecureMode, this);
185 if(webSocketServer->listen(QHostAddress::Any, 1234)) {
186 connect(webSocketServer, &QWebSocketServer::newConnection,
187 this, &UserManagement::onServerNewConnection);
188 connect(webSocketServer, &QWebSocketServer::closed, this, &UserManagement::onServerClosed);
189 QTimer::singleShot(100, this, SLOT(connectWebsockets()));
191 qWarning()<<"unable to launch webSocket server";
194 void UserManagement::onServerNewConnection()
196 pSocket = webSocketServer->nextPendingConnection();
197 connect(pSocket, &QWebSocket::textMessageReceived, this, &UserManagement::processTextMessage, Qt::UniqueConnection);
198 connect(pSocket, &QWebSocket::binaryMessageReceived, this, &UserManagement::processBinaryMessage, Qt::UniqueConnection);
199 connect(pSocket, &QWebSocket::disconnected, this, &UserManagement::serverSocketDisconnected, Qt::UniqueConnection);
201 void UserManagement::processTextMessage(QString message)
203 QString clientDetails_1 = "{\"postal_address\":\"201 Mission Street\",\"loc\":\"37.7914374,-122.3950694\""
204 ",\"country\":\"USA\",\"mail\":\"bjensen@example.com\",\"city\":\"San Francisco\",\"graphEmail\":"
205 "\"bjensen@example.com\",\"graphPreferredLanguage\":\"en\",\"ccNumberMasked\":\"-111\",\"ccExpYear\""
206 ":\"19\",\"ccExpMonth\":\"01\",\"description\":\"Original description\",\"groups\":[],\"last_name\":\""
207 "Jensen\",\"ccNumber\":\"111-2343-1121-111\",\"house_identifier\":\"ForgeRock\",\"phone\":\""
208 "+1 408 555 1862\",\"name\":\"bjensen\",\"state\":\"CA\",\"common_name\":\"Barbara Jensen\",\"fax\":\""
209 "+1 408 555 1862\",\"postal_code\":\"94105\",\"first_name\":\"Barbara\",\"keytoken\":\"a123456\"}";
210 QString clientDetails_2 = "{\"postal_address\":\"201 Mission Street\",\"loc\":\"37.7914374,-122.3950694\""
211 ",\"country\":\"USA\",\"mail\":\"bjensen@example.com\",\"city\":\"San Francisco\",\"graphEmail\":"
212 "\"bjensen@example.com\",\"graphPreferredLanguage\":\"fr\",\"ccNumberMasked\":\"-222\",\"ccExpYear\""
213 ":\"19\",\"ccExpMonth\":\"01\",\"description\":\"Original description\",\"groups\":[],\"last_name\":\""
214 "Jensen\",\"ccNumber\":\"111-2343-1121-111\",\"house_identifier\":\"ForgeRock\",\"phone\":\""
215 "+1 408 555 1862\",\"name\":\"bjensen\",\"state\":\"CA\",\"common_name\":\"Barbara Jensen\",\"fax\":\""
216 "+1 408 555 1862\",\"postal_code\":\"94105\",\"first_name\":\"José\",\"keytoken\":\"a123456\"}";
217 QString clientDetails = clientDetails_1;
218 if(sequence % 2 == 1)
219 clientDetails = clientDetails_2;
220 QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
221 //qDebug() << "message received in server:" << message;
225 if(!jsonToList(message.toUtf8(), &list))
229 const int messType = list.at(0).toInt();
230 const QString messId = list.at(1).toString();
231 const QString cmd = list.at(2).toString();
236 if(cmd == "agl-identity-agent/subscribe") {
237 reply = "[3,\"999maitai999\",{\"jtype\":\"afb-reply\",\"request\":{\"status\":\"success\",\"uuid\":\"1f2f7678-6f2e-4f54-b7b5-d0d4dcbf2e41\"}}]";
238 } else if (cmd == "agl-identity-agent/get") {
239 reply = "[3,\"999maitai99\",{\"jtype\":\"afb-reply\",\"request\":{\"status\":\"success\"},\"response\":....}]";
240 reply = reply.replace("....", clientDetails);
242 qWarning()<<"invalid cmd received:"<<cmd;
247 qWarning()<<"invalid message type"<<messType;
251 reply = reply.replace("999maitai999", messId);
252 pClient->sendTextMessage(reply);
254 void UserManagement::processBinaryMessage(QByteArray message)
256 QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
257 qDebug() << "Binary Message received ????:" << message;
259 // pClient->sendBinaryMessage(message);
262 void UserManagement::serverSocketDisconnected()
264 QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
265 qDebug() << "socketDisconnected:" << pClient;
267 pClient->deleteLater();
270 void UserManagement::slot_timerTest()
274 pSocket->sendTextMessage("[5,\"agl-identity-agent/event\",{\"event\":\"agl-identity-agent\/event\",\"data\":{\"eventName\":\"incoming\",\"accountid\":\"D2:D4:71:0D:B5:F1\",\"nickname\":\"D2:D4:71:0D:B5:F1\"},\"jtype\":\"afb-event\"}]");
275 pSocket->sendTextMessage("[5,\"agl-identity-agent/event\",{\"event\":\"agl-identity-agent\/event\",\"data\":{\"eventName\":\"login\",\"accountid\":\"null\"},\"jtype\":\"afb-event\"}]");
277 void UserManagement::onServerClosed()
279 qWarning()<<"websocket server closed";