Remove speed sign when signing out
[staging/HomeScreen.git] / HomeScreen / src2 / usermanagement.cpp
1 #include "usermanagement.h"
2 #include <QDebug>
3 #include <QtCore/QJsonDocument>
4 #include <QByteArray>
5 UserManagement::UserManagement(QObject *root) : QObject()
6 {
7     home = root->findChild<QObject *>("Home");
8     QObject::connect(home, SIGNAL(disconnect()),
9                          this, SLOT(slot_disconnect()));
10     logo = root->findChild<QObject *>("Logo_colour");
11     shortcutArea = root->findChild<QObject *>("ShortcutArea");
12     statusArea = root->findChild<QObject *>("StatusArea");
13     this->appModel = home->findChild<ApplicationModel *>("ApplicationModel");
14     sequence = 0;
15     isRed = false;
16     connect(&timerRed, SIGNAL(timeout()), this, SLOT(slot_turnOffRed()));
17     timerRed.setSingleShot(true);
18     timerRed.setInterval(3000);
19 #ifdef REAL_SERVER
20     connectWebsockets();
21 #else
22     pSocket = NULL;
23     connect(&timerTest, SIGNAL(timeout()), this, SLOT(slot_timerTest()));
24     timerTest.setSingleShot(false);
25     timerTest.start(5000);
26     launchServer();
27 #endif
28 }
29 void UserManagement::slot_disconnect()
30 {
31     appModel->changeOrder(-1);
32     timerRed.stop();
33     slot_turnOffRed();
34     QMetaObject::invokeMethod(home, "languageChanged");
35     QMetaObject::invokeMethod(shortcutArea, "languageChanged", Q_ARG(QVariant, "en"));
36     QMetaObject::invokeMethod(statusArea, "languageChanged", Q_ARG(QVariant, "en"));
37     QMetaObject::invokeMethod(home, "showSign90", Q_ARG(QVariant, false), Q_ARG(QVariant, "en"));
38     QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, false), Q_ARG(QVariant, ""));
39     QMetaObject::invokeMethod(home, "changeFlag", Q_ARG(QVariant, "./images/us_flag.png"));
40     QMetaObject::invokeMethod(home, "setUser", Q_ARG(QVariant, ""), Q_ARG(QVariant, ""));
41     QVariantList list;
42     list << 2 << QString().setNum(++sequence) << "agl-identity-agent/logout" << true;
43     listToJson(list, &data);
44     slot_sendData();
45 }
46
47 void UserManagement::setUser(const User &user)
48 {
49     int hash = qHash(user.name + user.first_name);
50     timerRed.stop();
51     appModel->changeLanguage(user.graphPreferredLanguage);
52     appModel->changeOrder(hash);
53     slot_turnOffRed();
54     QMetaObject::invokeMethod(home, "languageChanged");
55     QMetaObject::invokeMethod(shortcutArea, "languageChanged", Q_ARG(QVariant, user.graphPreferredLanguage));
56     QMetaObject::invokeMethod(statusArea, "languageChanged", Q_ARG(QVariant, user.graphPreferredLanguage));
57     QMetaObject::invokeMethod(home, "showSign90", Q_ARG(QVariant, !user.graphActions.contains("Exceed 100 Kph")), Q_ARG(QVariant, user.graphPreferredLanguage));
58     QStringList t;
59     foreach(const QString &s, user.graphActions) {
60         if(!s.contains("Exceed"))
61             t.append(s);
62     }
63     QString type = user.policy;
64     if(user.graphPreferredLanguage == "fr") {
65         if(type == "Owner")
66             type = "Propriétaire";
67         else if(type == "Driver")
68             type = "Conducteur";
69         else if(type == "Maintainer")
70             type = "Maintenance";
71     }
72     QMetaObject::invokeMethod(home, "setUser", Q_ARG(QVariant, type), Q_ARG(QVariant, QVariant::fromValue(t)));
73     if(user.ccNumberMasked.isEmpty())
74         QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, false), Q_ARG(QVariant, ""));
75     else
76         QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, true), Q_ARG(QVariant, user.ccNumberMasked));
77     const QString welcome = QString("%1").arg(user.graphPreferredLanguage == "fr" ? "Bonjour " : "Hello") + " ";
78     QMetaObject::invokeMethod(home, "showHello", Q_ARG(QVariant, welcome + user.first_name));
79     QMetaObject::invokeMethod(home, "changeFlag", Q_ARG(QVariant, user.graphPreferredLanguage == "fr" ? "./images/french_flag.png" : "./images/us_flag.png"));
80 }
81 void UserManagement::slot_turnOffRed()
82 {
83     if(!isRed)
84         return;
85     QMetaObject::invokeMethod(logo, "setImage", Q_ARG(QVariant, "./images/Utility_Logo_Colour-01.png"));
86     isRed = false;
87 }
88
89 void UserManagement::connectWebsockets()
90 {
91 #ifdef REAL_SERVER
92     const QUrl url(REAL_SERVER);
93 #else
94     const QUrl url(QStringLiteral("ws://localhost:1234"));
95 #endif
96     QSslConfiguration config = QSslConfiguration::defaultConfiguration();
97     config.setProtocol(QSsl::SecureProtocols);
98     webSocket.setSslConfiguration(config);
99     connect(&webSocket, &QWebSocket::connected, this, &UserManagement::onConnected);
100     connect(&webSocket, &QWebSocket::disconnected, this, &UserManagement::onClosed);
101     if(!connect(&webSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onWebSocketError(QAbstractSocket::SocketError)))) {
102         qWarning() << "Failed to connect to QWebSocket::error";
103     }
104     webSocket.open(QUrl(url));
105 }
106 void UserManagement::onWebSocketError(QAbstractSocket::SocketError)
107 {
108     qWarning()<<"Websocket error:" << webSocket.errorString();
109 }
110
111 void UserManagement::onConnected()
112 {
113     connect(&webSocket, &QWebSocket::textMessageReceived,
114             this, &UserManagement::onTextMessageReceived);
115     QVariantList list;
116     QByteArray json;
117     list << 2 << QString().setNum(++sequence) << "agl-identity-agent/subscribe" << true;
118     listToJson(list, &json);
119     webSocket.sendTextMessage(QString(json));
120     list .clear();
121     list << 2 << QString().setNum(++sequence) << "agl-identity-agent/scan" << true;
122     listToJson(list, &json);
123     webSocket.sendTextMessage(QString(json));
124 }
125 void UserManagement::onTextMessageReceived(QString message)
126 {
127     QVariantList list;
128     const bool ok = jsonToList(message.toUtf8(), &list);
129     if(!ok || list.size() < 3) {
130         qWarning()<<"error 1 decoding json"<<list.size()<<message;
131         return;
132     }
133     QVariantMap map  = list.at(2).toMap();
134     if(list.first().toInt() == 5) {
135         if(!isRed)
136             QMetaObject::invokeMethod(logo, "setImage", Q_ARG(QVariant, "./images/Utility_Logo_Red-01.png"));
137         isRed = true;
138         timerRed.start();
139         map = map["data"].toMap();
140         if(map["eventName"].toString() == "login") {
141             //qWarning()<<"login received in client";
142             list.clear();
143             list << 2 << QString().setNum(++sequence) << "agl-identity-agent/get" << true;
144             listToJson(list, &data);
145             QTimer::singleShot(300, this, SLOT(slot_sendData()));
146         }
147         return;
148     }
149     if(list.first().toInt() == 3) {
150         if(!map.contains("response")) {
151             return;
152         }
153         map = map["response"].toMap();
154         User user;
155         user.postal_address = map["postal_address"].toString();
156         QStringList temp  = map["loc"].toString().split(",");
157         if(temp.size() == 2) {
158             user.loc.setX(temp.at(0).toDouble());
159             user.loc.setY(temp.at(1).toDouble());
160         }
161         user.graphActions = map["graphActions"].toString().split(",");
162         user.country = map["country"].toString();
163         user.mail = map["mail"].toString();
164         user.city = map["city"].toString();
165         user.graphEmail = map["graphEmail"].toString();
166         user.graphPreferredLanguage = map["graphPreferredLanguage"].toString();
167         user.ccNumberMasked = map["ccNumberMasked"].toString();
168         user.ccExpYear = map["ccExpYear"].toString();
169         user.ccExpMonth = map["ccExpMonth"].toString();
170         user.description = map["description"].toString();
171         user.groups = map["groups"].toStringList();
172         user.last_name = map["last_name"].toString();
173         user.ccNumber = map["ccNumber"].toString();
174         user.house_identifier = map["house_identifier"].toString();
175         user.phone = map["phone"].toString();
176         user.name = map["name"].toString();
177         user.state = map["state"].toString();
178         user.common_name = map["common_name"].toString();
179         user.fax = map["fax"].toString();
180         user.postal_code = map["postal_code"].toString();
181         user.first_name = map["first_name"].toString();
182         user.keytoken = map["keytoken"].toString();
183         user.policy = map["graphPolicies"].toString();
184         setUser(user);
185     }
186 }
187 void UserManagement::slot_sendData()
188 {
189     webSocket.sendTextMessage(QString(data));
190 }
191
192 void UserManagement::onClosed()
193 {
194     qWarning()<<"webSocket closed";
195 }
196 bool UserManagement::listToJson(const QList<QVariant> &list, QByteArray *json) const
197 {
198     QVariant v(list);
199     *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact);
200     return true;
201 }
202 bool UserManagement::jsonToList(const QByteArray &buf, QList<QVariant> *list) const
203 {
204     if(!list)
205         return false;
206     QJsonParseError err;
207     QVariant v = QJsonDocument::fromJson(buf, &err).toVariant();
208     if(err.error != 0) {
209         qWarning() << "Error parsing json data" << err.errorString() << buf;
210         *list = QList<QVariant>();
211         return false;
212     }
213     *list = v.toList();
214     return true;
215 }
216 bool UserManagement::mapToJson( const QVariantMap &map, QByteArray *json) const
217 {
218     if(!json)
219         return false;
220     QVariant v(map);
221     *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact);
222     return true;
223 }
224 bool UserManagement::jsonToMap(const QByteArray &buf, QVariantMap *map) const
225 {
226     if(!map)
227         return false;
228     QJsonParseError err;
229     QVariant v = QJsonDocument::fromJson(buf, &err).toVariant();
230     if(err.error != 0) {
231         qWarning() << "Error parsing json data" << err.errorString() << buf;
232         *map = QVariantMap();
233         return false;
234     }
235     *map = v.toMap();
236     return true;
237 }
238 #ifndef REAL_SERVER
239 void UserManagement::launchServer()
240 {
241       webSocketServer = new QWebSocketServer(QStringLiteral("My Server"),
242                                               QWebSocketServer::NonSecureMode, this);
243       if(webSocketServer->listen(QHostAddress::Any, 1234)) {
244           connect(webSocketServer, &QWebSocketServer::newConnection,
245                   this, &UserManagement::onServerNewConnection);
246           connect(webSocketServer, &QWebSocketServer::closed, this, &UserManagement::onServerClosed);
247           QTimer::singleShot(100, this, SLOT(connectWebsockets()));
248       } else {
249           qWarning()<<"unable to launch webSocket server";
250       }
251 }
252 void UserManagement::onServerNewConnection()
253 {
254     pSocket = webSocketServer->nextPendingConnection();
255     connect(pSocket, &QWebSocket::textMessageReceived, this, &UserManagement::processTextMessage, Qt::UniqueConnection);
256     connect(pSocket, &QWebSocket::binaryMessageReceived, this, &UserManagement::processBinaryMessage, Qt::UniqueConnection);
257     connect(pSocket, &QWebSocket::disconnected, this, &UserManagement::serverSocketDisconnected, Qt::UniqueConnection);
258 }
259 void UserManagement::processTextMessage(QString message)
260 {
261     QString clientDetails_1 = "{\"postal_address\":\"201 Mission Street\",\"loc\":\"37.7914374,-122.3950694\",\"graphActions\":\"Install App,Update Software,Open Trunk,View Online\""
262                               ",\"country\":\"USA\",\"mail\":\"bjensen@example.com\",\"city\":\"San Francisco\",\"graphEmail\":"
263                               "\"bjensen@example.com\",\"graphPreferredLanguage\":\"en\",\"ccNumberMasked\":\"-111\",\"ccExpYear\""
264                               ":\"19\",\"ccExpMonth\":\"01\",\"description\":\"Original description\",\"groups\":[],\"last_name\":\""
265                               "Jensen\",\"ccNumber\":\"111-2343-1121-111\",\"house_identifier\":\"ForgeRock\",\"phone\":\""
266                               "+1 408 555 1862\",\"name\":\"bjensen\",\"state\":\"CA\",\"common_name\":\"Barbara Jensen\",\"fax\":\""
267                               "+1 408 555 1862\",\"postal_code\":\"94105\",\"first_name\":\"Barbara\",\"keytoken\":\"a123456\",\"graphPolicies\":\"Driver\"}";
268     QString clientDetails_2 = "{\"postal_address\":\"201 Mission Street\",\"loc\":\"37.7914374,-122.3950694\""
269                               ",\"country\":\"USA\",\"mail\":\"bjensen@example.com\",\"city\":\"San Francisco\",\"graphEmail\":"
270                               "\"bjensen@example.com\",\"graphPreferredLanguage\":\"fr\",\"ccNumberMasked\":\"-222\",\"ccExpYear\""
271                               ":\"19\",\"ccExpMonth\":\"01\",\"description\":\"Original description\",\"groups\":[],\"last_name\":\""
272                               "Jensen\",\"ccNumber\":\"111-2343-1121-111\",\"house_identifier\":\"ForgeRock\",\"phone\":\""
273                               "+1 408 555 1862\",\"name\":\"bjensen\",\"state\":\"CA\",\"common_name\":\"Barbara Jensen\",\"fax\":\""
274                               "+1 408 555 1862\",\"postal_code\":\"94105\",\"first_name\":\"José\",\"keytoken\":\"a123456\",\"graphPolicies\":\"Maintainer\"}";
275     QString clientDetails = clientDetails_1;
276     if(sequence % 2 == 1)
277         clientDetails = clientDetails_2;
278     QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
279     //qDebug() << "message received in server:" << message;
280     if (!pClient)
281         return;
282     QVariantList list;
283     if(!jsonToList(message.toUtf8(), &list))
284         return;
285     if(list.size() < 2)
286         return;
287     const int messType = list.at(0).toInt();
288     const QString messId = list.at(1).toString();
289     const QString cmd = list.at(2).toString();
290     list.clear();
291     QString reply;
292     switch(messType) {
293     case 2:
294         if(cmd == "agl-identity-agent/subscribe") {
295             reply = "[3,\"999maitai999\",{\"jtype\":\"afb-reply\",\"request\":{\"status\":\"success\",\"uuid\":\"1f2f7678-6f2e-4f54-b7b5-d0d4dcbf2e41\"}}]";
296         } else if (cmd == "agl-identity-agent/get") {
297             reply = "[3,\"999maitai99\",{\"jtype\":\"afb-reply\",\"request\":{\"status\":\"success\"},\"response\":....}]";
298             reply = reply.replace("....", clientDetails);
299         } else {
300             qWarning()<<"invalid cmd received:"<<cmd;
301             return;
302         }
303         break;
304     default:
305         qWarning()<<"invalid message type"<<messType;
306         return;
307         break;
308     }
309     reply = reply.replace("999maitai999", messId);
310     pClient->sendTextMessage(reply);
311 }
312 void UserManagement::processBinaryMessage(QByteArray message)
313 {
314     QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
315     qDebug() << "Binary Message received ????:" << message;
316     if (pClient) {
317        // pClient->sendBinaryMessage(message);
318     }
319 }
320 void UserManagement::serverSocketDisconnected()
321 {
322     QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
323     qDebug() << "socketDisconnected:" << pClient;
324     if (pClient) {
325         pClient->deleteLater();
326     }
327 }
328 void UserManagement::slot_timerTest()
329 {
330     if(!pSocket)
331         return;
332     if(sequence > 3) {
333         timerTest.stop();
334         return;
335     }
336     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\"}]");
337     pSocket->sendTextMessage("[5,\"agl-identity-agent/event\",{\"event\":\"agl-identity-agent\/event\",\"data\":{\"eventName\":\"login\",\"accountid\":\"null\"},\"jtype\":\"afb-event\"}]");
338 }
339 void UserManagement::onServerClosed()
340 {
341     qWarning()<<"websocket server closed";
342 }
343 #endif