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