From d8d8fc7a0d139e7b864eee3b573bd208f823ad4f Mon Sep 17 00:00:00 2001 From: Javier Date: Sun, 19 Oct 2014 18:45:03 +0200 Subject: initial import, no crypto --- hostmanagerconn.cc | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 hostmanagerconn.cc (limited to 'hostmanagerconn.cc') diff --git a/hostmanagerconn.cc b/hostmanagerconn.cc new file mode 100644 index 0000000..de1c61a --- /dev/null +++ b/hostmanagerconn.cc @@ -0,0 +1,155 @@ +#include +#include +#include + +#include "qtjson/json.h" + +#include "sappeer.h" +#include "hostmanagerconn.h" + +HostManagerConn::HostManagerConn(SAPConnection *conn, QObject *parent) + : QObject(parent), _conn(conn), _socket(conn->getSocket(103)) +{ + connect(_conn, SIGNAL(disconnected()), SLOT(deleteLater())); + Q_ASSERT(_socket); + connect(_socket, SIGNAL(connected()), SLOT(handleConnected())); + connect(_socket, SIGNAL(messageReceived()), SLOT(handleMessageReceived())); +} + +void HostManagerConn::sendMessage(const QString &json) +{ + qDebug() << "Send JSON:" << json; + _socket->send(QByteArray(3,0) + json.toUtf8()); +} + +void HostManagerConn::sendMessage(const QVariantMap &msg) +{ + sendMessage(QtJson::serializeStr(msg)); +} + +void HostManagerConn::handleMessage(const QVariantMap &msg) +{ + QString msgId = msg["msgId"].toString(); + qDebug() << "Got JSON msg" << msgId; + if (msgId == "mgr_watch_info_res") { + sendMessage("{\"timestamp\":\"1407542281196=B:L>:<=LAMO\",\"type\":\"connect\",\"msgId\":\"mgr_wearable_status_req\"}"); + } else if (msgId == "mgr_host_status_req") { + sendMessage(QString("{\"type\":\"connect\",\"data\":%1,\"msgId\":\"mgr_host_status_res\",\"preinstalled\":\"true\"}") + .arg(QtJson::sanitizeString(generateHostXml()))); + + } else if (msgId == "mgr_status_exchange_done") { + performTimeSync(); + sendMessage(QString("{\"btMac\":\"%1\",\"msgId\":\"mgr_setupwizard_eula_finished_req\",\"isOld\":1}") + .arg(_conn->peer()->localName())); + } +} + +void HostManagerConn::performTimeSync() +{ + //{"date1224":"24","datetimeepoch":"1409343828044","safety_declared":"0","locale":"es_ES","safety_voice":"1", + // "safetyVersion":0,"timezone":"Europe\/Madrid","safety":"false","tablet":"true","dateformat":"dd-MM-yyyy", + // "isfrominitial":true,"msgId":"mgr_sync_init_setting_req","usingCamera":"false","safety_cam":"0", + // "datetime":"2014 08 29 22 23 48","incomingCall":"false"} + + QVariantMap msg; + msg["msgId"] = "mgr_sync_init_setting_req"; + + msg["safety_declared"] = "0"; + msg["safety_voice"] = "0"; + msg["safetyVersion"] = "0"; + msg["safety"] = "false"; + msg["tablet"] = "true"; + msg["incomingCall"] = "false"; + msg["usingCamera"] = "false"; + msg["safety_cam"] = "0"; + + msg["locale"] = QLocale::system().name(); // ie es_ES + msg["data1224"] = "24"; // TODO + msg["dateformat"] = QLocale::system().dateFormat(QLocale::ShortFormat); + msg["timezone"] = "Europe/Madrid"; + + QDateTime dt = QDateTime::currentDateTime(); + msg["datetimeepoch"] = QString::number(dt.currentMSecsSinceEpoch()); + msg["datetime"] = dt.toString("yyyy MM dd hh mm ss"); + + sendMessage(msg); +} + +QString HostManagerConn::generateHostXml() +{ + QString xml; + QXmlStreamWriter w(&xml); + + w.setCodec("UTF-8"); + w.setAutoFormatting(true); + + w.writeStartDocument(); + + w.writeStartElement("DeviceStatus"); + w.writeStartElement("device"); + w.writeTextElement("deviceID", _conn->peer()->localName()); + w.writeTextElement("deviceName", "none"); + w.writeTextElement("devicePlatform", "android"); + w.writeTextElement("devicePlatformVersion", "4.4.2"); + w.writeTextElement("deviceType", "Host"); + w.writeTextElement("modelNumber", "EvilPhone"); + w.writeTextElement("swVersion", "1.0"); + + w.writeEmptyElement("connectivity"); + w.writeEmptyElement("apps"); + + w.writeStartElement("deviceFeature"); + w.writeTextElement("telephony", "true"); + w.writeTextElement("messaging", "true"); + w.writeTextElement("tablet", "true"); + w.writeTextElement("autolock", "true"); + w.writeTextElement("smartrelay", "true"); + w.writeTextElement("safetyassistance", "false"); + w.writeTextElement("vendor", "Samsung"); + w.writeEndElement(); + + w.writeEmptyElement("security"); + w.writeEmptyElement("notification"); + w.writeEmptyElement("settings"); + + w.writeEndElement(); + + w.writeEndElement(); + + w.writeEndDocument(); + + return xml; +} + +void HostManagerConn::handleConnected() +{ + qDebug() << "Manager socket now connected!"; + QString msg = QString("{\"btMac\":\"%1\",\"msgId\":\"mgr_watch_info_req\",\"hmVer\":\"2.0.14041404\"}").arg(_conn->peer()->localName()); + qDebug() << msg; + QByteArray data = QByteArray(3,0) + msg.toUtf8(); + _socket->send(data); +} + +void HostManagerConn::handleMessageReceived() +{ + QByteArray data = _socket->receive(); + + if (data.size() < 5) { + qWarning() << "Invalid HostManager message received"; + return; + } + + data.remove(0, 3); // First two bytes contain something related to ??? + + QString str = QString::fromUtf8(data); + bool success = false; + QVariant json = QtJson::parse(str, success); + + if (success) { + qDebug() << "Got JSON:" << str; + handleMessage(json.toMap()); + } else { + qWarning() << "Cannot parse JSON msg:" << str; + return; + } +} -- cgit v1.2.3