2 #include "usermanagement.h"
4 #include <QtCore/QJsonDocument>
7 #define APINAME "identity"
9 UserManagement::UserManagement(QObject *root) : QObject()
11 home = root->findChild<QObject *>("Home");
12 QObject::connect(home, SIGNAL(disconnect()),
13 this, SLOT(slot_disconnect()));
14 logo = root->findChild<QObject *>("Logo_colour");
15 shortcutArea = root->findChild<QObject *>("ShortcutArea");
16 statusArea = root->findChild<QObject *>("StatusArea");
17 this->appModel = home->findChild<ApplicationModel *>("ApplicationModel");
20 connect(&timerRed, SIGNAL(timeout()), this, SLOT(slot_turnOffRed()));
21 timerRed.setSingleShot(true);
22 timerRed.setInterval(3000);
27 connect(&timerTest, SIGNAL(timeout()), this, SLOT(slot_timerTest()));
28 timerTest.setSingleShot(false);
29 timerTest.start(5000);
33 void UserManagement::slot_disconnect()
35 appModel->changeLanguage("us");
36 appModel->changeOrder(-1);
39 QMetaObject::invokeMethod(home, "languageChanged");
40 QMetaObject::invokeMethod(shortcutArea, "languageChanged", Q_ARG(QVariant, "en"));
41 QMetaObject::invokeMethod(statusArea, "languageChanged", Q_ARG(QVariant, "en"));
42 QMetaObject::invokeMethod(home, "showSign90", Q_ARG(QVariant, false), Q_ARG(QVariant, "en"));
43 QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, false), Q_ARG(QVariant, ""));
44 QMetaObject::invokeMethod(home, "showLicence", Q_ARG(QVariant, false), Q_ARG(QVariant, ""));
45 QMetaObject::invokeMethod(home, "changeFlag", Q_ARG(QVariant, "./images/us_flag.png"));
46 QMetaObject::invokeMethod(home, "setUser", Q_ARG(QVariant, ""), Q_ARG(QVariant, ""));
48 list << 2 << QString().setNum(++sequence) << APINAME"/logout" << true;
49 listToJson(list, &data);
53 void UserManagement::setUser(const User &user)
55 int hash = qHash(user.name + user.first_name);
57 appModel->changeLanguage(user.graphPreferredLanguage);
58 appModel->changeOrder(hash);
60 QMetaObject::invokeMethod(home, "languageChanged");
61 QMetaObject::invokeMethod(shortcutArea, "languageChanged", Q_ARG(QVariant, user.graphPreferredLanguage));
62 QMetaObject::invokeMethod(statusArea, "languageChanged", Q_ARG(QVariant, user.graphPreferredLanguage));
63 QMetaObject::invokeMethod(home, "showSign90", Q_ARG(QVariant, !user.graphActions.contains("Exceed 90 Kph")), Q_ARG(QVariant, user.graphPreferredLanguage));
65 foreach(const QString &s, user.graphActions) {
66 if(!s.contains("Exceed"))
69 QString type = user.policy;
70 if(user.graphPreferredLanguage == "fr") {
72 type = "PropriƩtaire";
73 else if(type == "Driver")
75 else if(type == "Maintainer")
78 QMetaObject::invokeMethod(home, "setUser", Q_ARG(QVariant, type), Q_ARG(QVariant, QVariant::fromValue(t)));
79 if(user.ccNumberMasked.isEmpty())
80 QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, false), Q_ARG(QVariant, ""));
82 QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, true), Q_ARG(QVariant, user.ccNumberMasked));
83 const QString welcome = QString("%1").arg(user.graphPreferredLanguage == "fr" ? "Bonjour " : "Hello") + " ";
84 QMetaObject::invokeMethod(home, "showHello", Q_ARG(QVariant, welcome + user.first_name));
85 QMetaObject::invokeMethod(home, "changeFlag", Q_ARG(QVariant, user.graphPreferredLanguage == "fr" ? "./images/french_flag.png" : "./images/us_flag.png"));
86 if(user.name.toLower() == "philippea")
87 QMetaObject::invokeMethod(home, "showLicence", Q_ARG(QVariant, true), Q_ARG(QVariant, "./images/DL_Philippe.png"));
88 else if(user.name.toLower() == "alainp")
89 QMetaObject::invokeMethod(home, "showLicence", Q_ARG(QVariant, true), Q_ARG(QVariant, "./images/DL_Alain.png"));
90 else if(user.name.toLower() == "olivierc")
91 QMetaObject::invokeMethod(home, "showLicence", Q_ARG(QVariant, true), Q_ARG(QVariant, "./images/DL_Olivier.png"));
93 QMetaObject::invokeMethod(home, "showLicence", Q_ARG(QVariant, false), Q_ARG(QVariant, ""));
96 void UserManagement::slot_turnOffRed()
100 QMetaObject::invokeMethod(logo, "setImage", Q_ARG(QVariant, "./images/Utility_Logo_Colour-01.png"));
104 void UserManagement::connectWebsockets()
107 const QUrl url(getenv("IDENTITY_WEBSOCKET") ?: REAL_SERVER);
109 const QUrl url(QStringLiteral("ws://localhost:1234"));
111 QSslConfiguration config = QSslConfiguration::defaultConfiguration();
112 config.setProtocol(QSsl::SecureProtocols);
113 webSocket.setSslConfiguration(config);
114 connect(&webSocket, &QWebSocket::connected, this, &UserManagement::onConnected);
115 connect(&webSocket, &QWebSocket::disconnected, this, &UserManagement::onClosed);
116 if(!connect(&webSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onWebSocketError(QAbstractSocket::SocketError)))) {
117 qWarning() << "Failed to connect to QWebSocket::error";
119 webSocket.open(QUrl(url));
121 void UserManagement::onWebSocketError(QAbstractSocket::SocketError)
123 qWarning()<<"Websocket error:" << webSocket.errorString();
126 void UserManagement::onConnected()
128 connect(&webSocket, &QWebSocket::textMessageReceived,
129 this, &UserManagement::onTextMessageReceived);
132 list << 2 << QString().setNum(++sequence) << APINAME"/subscribe" << true;
133 listToJson(list, &json);
134 webSocket.sendTextMessage(QString(json));
136 list << 2 << QString().setNum(++sequence) << APINAME"/scan" << true;
137 listToJson(list, &json);
138 webSocket.sendTextMessage(QString(json));
140 void UserManagement::onTextMessageReceived(QString message)
143 const bool ok = jsonToList(message.toUtf8(), &list);
144 if(!ok || list.size() < 3) {
145 qWarning()<<"error 1 decoding json"<<list.size()<<message;
148 QVariantMap map = list.at(2).toMap();
149 if(list.first().toInt() == 5) {
151 QMetaObject::invokeMethod(logo, "setImage", Q_ARG(QVariant, "./images/Utility_Logo_Red-01.png"));
154 map = map["data"].toMap();
155 if(map["eventName"].toString() == "login") {
156 //qWarning()<<"login received in client";
158 list << 2 << QString().setNum(++sequence) << APINAME"/get" << true;
159 listToJson(list, &data);
160 QTimer::singleShot(300, this, SLOT(slot_sendData()));
164 if(list.first().toInt() == 3) {
165 if(!map.contains("response")) {
168 map = map["response"].toMap();
170 user.postal_address = map["postal_address"].toString();
171 QStringList temp = map["loc"].toString().split(",");
172 if(temp.size() == 2) {
173 user.loc.setX(temp.at(0).toDouble());
174 user.loc.setY(temp.at(1).toDouble());
176 user.graphActions = map["graphActions"].toString().split(",");
177 user.country = map["country"].toString();
178 user.mail = map["mail"].toString();
179 user.city = map["city"].toString();
180 user.graphEmail = map["graphEmail"].toString();
181 user.graphPreferredLanguage = map["graphPreferredLanguage"].toString();
182 user.ccNumberMasked = map["ccNumberMasked"].toString();
183 user.ccExpYear = map["ccExpYear"].toString();
184 user.ccExpMonth = map["ccExpMonth"].toString();
185 user.description = map["description"].toString();
186 user.groups = map["groups"].toStringList();
187 user.last_name = map["last_name"].toString();
188 user.ccNumber = map["ccNumber"].toString();
189 user.house_identifier = map["house_identifier"].toString();
190 user.phone = map["phone"].toString();
191 user.name = map["name"].toString();
192 user.state = map["state"].toString();
193 user.common_name = map["common_name"].toString();
194 user.fax = map["fax"].toString();
195 user.postal_code = map["postal_code"].toString();
196 user.first_name = map["first_name"].toString();
197 user.keytoken = map["keytoken"].toString();
198 user.policy = map["graphPolicies"].toString();
202 void UserManagement::slot_sendData()
204 webSocket.sendTextMessage(QString(data));
207 void UserManagement::onClosed()
209 qWarning()<<"webSocket closed";
211 bool UserManagement::listToJson(const QList<QVariant> &list, QByteArray *json) const
214 *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact);
217 bool UserManagement::jsonToList(const QByteArray &buf, QList<QVariant> *list) const
222 QVariant v = QJsonDocument::fromJson(buf, &err).toVariant();
224 qWarning() << "Error parsing json data" << err.errorString() << buf;
225 *list = QList<QVariant>();
231 bool UserManagement::mapToJson( const QVariantMap &map, QByteArray *json) const
236 *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact);
239 bool UserManagement::jsonToMap(const QByteArray &buf, QVariantMap *map) const
244 QVariant v = QJsonDocument::fromJson(buf, &err).toVariant();
246 qWarning() << "Error parsing json data" << err.errorString() << buf;
247 *map = QVariantMap();
254 void UserManagement::launchServer()
256 webSocketServer = new QWebSocketServer(QStringLiteral("My Server"),
257 QWebSocketServer::NonSecureMode, this);
258 if(webSocketServer->listen(QHostAddress::Any, 1234)) {
259 connect(webSocketServer, &QWebSocketServer::newConnection,
260 this, &UserManagement::onServerNewConnection);
261 connect(webSocketServer, &QWebSocketServer::closed, this, &UserManagement::onServerClosed);
262 QTimer::singleShot(100, this, SLOT(connectWebsockets()));
264 qWarning()<<"unable to launch webSocket server";
267 void UserManagement::onServerNewConnection()
269 pSocket = webSocketServer->nextPendingConnection();
270 connect(pSocket, &QWebSocket::textMessageReceived, this, &UserManagement::processTextMessage, Qt::UniqueConnection);
271 connect(pSocket, &QWebSocket::binaryMessageReceived, this, &UserManagement::processBinaryMessage, Qt::UniqueConnection);
272 connect(pSocket, &QWebSocket::disconnected, this, &UserManagement::serverSocketDisconnected, Qt::UniqueConnection);
274 void UserManagement::processTextMessage(QString message)
276 QString clientDetails_1 = "{\"postal_address\":\"201 Mission Street\",\"loc\":\"37.7914374,-122.3950694\",\"graphActions\":\"Install App,Update Software,Open Trunk,View Online\""
277 ",\"country\":\"USA\",\"mail\":\"bjensen@example.com\",\"city\":\"San Francisco\",\"graphEmail\":"
278 "\"bjensen@example.com\",\"graphPreferredLanguage\":\"en\",\"ccNumberMasked\":\"-111\",\"ccExpYear\""
279 ":\"19\",\"ccExpMonth\":\"01\",\"description\":\"Original description\",\"groups\":[],\"last_name\":\""
280 "Jensen\",\"ccNumber\":\"111-2343-1121-111\",\"house_identifier\":\"ForgeRock\",\"phone\":\""
281 "+1 408 555 1862\",\"name\":\"bjensen\",\"state\":\"CA\",\"common_name\":\"Barbara Jensen\",\"fax\":\""
282 "+1 408 555 1862\",\"postal_code\":\"94105\",\"first_name\":\"Barbara\",\"keytoken\":\"a123456\",\"graphPolicies\":\"Driver\"}";
283 QString clientDetails_2 = "{\"postal_address\":\"201 Mission Street\",\"loc\":\"37.7914374,-122.3950694\""
284 ",\"country\":\"USA\",\"mail\":\"bjensen@example.com\",\"city\":\"San Francisco\",\"graphEmail\":"
285 "\"bjensen@example.com\",\"graphPreferredLanguage\":\"fr\",\"ccNumberMasked\":\"-222\",\"ccExpYear\""
286 ":\"19\",\"ccExpMonth\":\"01\",\"description\":\"Original description\",\"groups\":[],\"last_name\":\""
287 "Jensen\",\"ccNumber\":\"111-2343-1121-111\",\"house_identifier\":\"ForgeRock\",\"phone\":\""
288 "+1 408 555 1862\",\"name\":\"bjensen\",\"state\":\"CA\",\"common_name\":\"Barbara Jensen\",\"fax\":\""
289 "+1 408 555 1862\",\"postal_code\":\"94105\",\"first_name\":\"Philippe\",\"keytoken\":\"a123456\",\"graphPolicies\":\"Maintainer\"}";
290 QString clientDetails = clientDetails_1;
291 if(sequence % 2 == 1)
292 clientDetails = clientDetails_2;
293 QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
294 //qDebug() << "message received in server:" << message;
298 if(!jsonToList(message.toUtf8(), &list))
302 const int messType = list.at(0).toInt();
303 const QString messId = list.at(1).toString();
304 const QString cmd = list.at(2).toString();
309 if(cmd == APINAME"/subscribe") {
310 reply = "[3,\"999maitai999\",{\"jtype\":\"afb-reply\",\"request\":{\"status\":\"success\",\"uuid\":\"1f2f7678-6f2e-4f54-b7b5-d0d4dcbf2e41\"}}]";
311 } else if (cmd == APINAME"/get") {
312 reply = "[3,\"999maitai99\",{\"jtype\":\"afb-reply\",\"request\":{\"status\":\"success\"},\"response\":....}]";
313 reply = reply.replace("....", clientDetails);
315 qWarning()<<"invalid cmd received:"<<cmd;
320 qWarning()<<"invalid message type"<<messType;
324 reply = reply.replace("999maitai999", messId);
325 pClient->sendTextMessage(reply);
327 void UserManagement::processBinaryMessage(QByteArray message)
329 QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
330 qDebug() << "Binary Message received ????:" << message;
332 // pClient->sendBinaryMessage(message);
335 void UserManagement::serverSocketDisconnected()
337 QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
338 qDebug() << "socketDisconnected:" << pClient;
340 pClient->deleteLater();
343 void UserManagement::slot_timerTest()
351 pSocket->sendTextMessage("[5,\APINAME"/event\",{\"event\":\APINAME"\/event\",\"data\":{\"eventName\":\"incoming\",\"accountid\":\"D2:D4:71:0D:B5:F1\",\"nickname\":\"D2:D4:71:0D:B5:F1\"},\"jtype\":\"afb-event\"}]");
352 pSocket->sendTextMessage("[5,\APINAME"/event\",{\"event\":\APINAME"\/event\",\"data\":{\"eventName\":\"login\",\"accountid\":\"null\"},\"jtype\":\"afb-event\"}]");
354 void UserManagement::onServerClosed()
356 qWarning()<<"websocket server closed";