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