summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2014-12-14 06:03:21 +0100
committerJavier <dev.git@javispedro.com>2014-12-14 06:03:21 +0100
commitab362bf43227552bab209fea792d60d370ce0260 (patch)
tree9060d1f9be58b3f4ba73df345fc3e0200994bbaa /daemon
parent6ad0d9aee73808c95a7af5cac932b63ff2ce15dd (diff)
implement account and device tokens
Diffstat (limited to 'daemon')
-rw-r--r--daemon/jskitmanager.cpp4
-rw-r--r--daemon/jskitmanager.h5
-rw-r--r--daemon/jskitobjects.cpp39
-rw-r--r--daemon/jskitobjects.h3
-rw-r--r--daemon/manager.cpp2
-rw-r--r--daemon/settings.h29
-rw-r--r--daemon/watchconnector.cpp64
-rw-r--r--daemon/watchconnector.h2
8 files changed, 123 insertions, 25 deletions
diff --git a/daemon/jskitmanager.cpp b/daemon/jskitmanager.cpp
index c73d32e..6d40970 100644
--- a/daemon/jskitmanager.cpp
+++ b/daemon/jskitmanager.cpp
@@ -4,8 +4,8 @@
#include "jskitmanager.h"
#include "jskitobjects.h"
-JSKitManager::JSKitManager(AppManager *apps, AppMsgManager *appmsg, QObject *parent) :
- QObject(parent), _apps(apps), _appmsg(appmsg), _engine(0)
+JSKitManager::JSKitManager(WatchConnector *watch, AppManager *apps, AppMsgManager *appmsg, Settings *settings, QObject *parent) :
+ QObject(parent), _watch(watch), _apps(apps), _appmsg(appmsg), _settings(settings), _engine(0)
{
connect(_appmsg, &AppMsgManager::appStarted, this, &JSKitManager::handleAppStarted);
connect(_appmsg, &AppMsgManager::appStopped, this, &JSKitManager::handleAppStopped);
diff --git a/daemon/jskitmanager.h b/daemon/jskitmanager.h
index 7ffc0ad..871ab8e 100644
--- a/daemon/jskitmanager.h
+++ b/daemon/jskitmanager.h
@@ -4,6 +4,7 @@
#include <QJSEngine>
#include "appmanager.h"
#include "appmsgmanager.h"
+#include "settings.h"
class JSKitPebble;
class JSKitConsole;
@@ -16,7 +17,7 @@ class JSKitManager : public QObject
LOG4QT_DECLARE_QCLASS_LOGGER
public:
- explicit JSKitManager(AppManager *apps, AppMsgManager *appmsg, QObject *parent = 0);
+ explicit JSKitManager(WatchConnector *watch, AppManager *apps, AppMsgManager *appmsg, Settings *settings, QObject *parent = 0);
~JSKitManager();
QJSEngine * engine();
@@ -44,8 +45,10 @@ private:
private:
friend class JSKitPebble;
+ WatchConnector *_watch;
AppManager *_apps;
AppMsgManager *_appmsg;
+ Settings *_settings;
AppInfo _curApp;
QJSEngine *_engine;
QPointer<JSKitPebble> _jspebble;
diff --git a/daemon/jskitobjects.cpp b/daemon/jskitobjects.cpp
index 5f5acaf..fe924e8 100644
--- a/daemon/jskitobjects.cpp
+++ b/daemon/jskitobjects.cpp
@@ -4,9 +4,12 @@
#include <QAuthenticator>
#include <QBuffer>
#include <QDir>
+#include <QCryptographicHash>
#include <limits>
#include "jskitobjects.h"
+static const char *token_salt = "0feeb7416d3c4546a19b04bccd8419b1";
+
JSKitPebble::JSKitPebble(const AppInfo &info, JSKitManager *mgr)
: QObject(mgr), _appInfo(info), _mgr(mgr)
{
@@ -88,6 +91,42 @@ void JSKitPebble::openURL(const QUrl &url)
emit _mgr->appOpenUrl(url);
}
+QString JSKitPebble::getAccountToken() const
+{
+ // We do not have any account system, so we just fake something up.
+ QCryptographicHash hasher(QCryptographicHash::Md5);
+
+ hasher.addData(token_salt, strlen(token_salt));
+ hasher.addData(_appInfo.uuid().toByteArray());
+
+ QString token = _mgr->_settings->property("accountToken").toString();
+ if (token.isEmpty()) {
+ token = QUuid::createUuid().toString();
+ logger()->debug() << "created new account token" << token;
+ _mgr->_settings->setProperty("accountToken", token);
+ }
+ hasher.addData(token.toLatin1());
+
+ QString hash = hasher.result().toHex();
+ logger()->debug() << "returning account token" << hash;
+
+ return hash;
+}
+
+QString JSKitPebble::getWatchToken() const
+{
+ QCryptographicHash hasher(QCryptographicHash::Md5);
+
+ hasher.addData(token_salt, strlen(token_salt));
+ hasher.addData(_appInfo.uuid().toByteArray());
+ hasher.addData(_mgr->_watch->serialNumber().toLatin1());
+
+ QString hash = hasher.result().toHex();
+ logger()->debug() << "returning watch token" << hash;
+
+ return hash;
+}
+
QJSValue JSKitPebble::createXMLHttpRequest()
{
JSKitXMLHttpRequest *xhr = new JSKitXMLHttpRequest(_mgr, 0);
diff --git a/daemon/jskitobjects.h b/daemon/jskitobjects.h
index 23dfabe..532ce1b 100644
--- a/daemon/jskitobjects.h
+++ b/daemon/jskitobjects.h
@@ -25,6 +25,9 @@ public:
Q_INVOKABLE void openURL(const QUrl &url);
+ Q_INVOKABLE QString getAccountToken() const;
+ Q_INVOKABLE QString getWatchToken() const;
+
Q_INVOKABLE QJSValue createXMLHttpRequest();
void invokeCallbacks(const QString &type, const QJSValueList &args = QJSValueList());
diff --git a/daemon/manager.cpp b/daemon/manager.cpp
index 212a1d7..32b313f 100644
--- a/daemon/manager.cpp
+++ b/daemon/manager.cpp
@@ -18,7 +18,7 @@ Manager::Manager(Settings *settings, QObject *parent) :
music(new MusicManager(watch, this)),
datalog(new DataLogManager(watch, this)),
appmsg(new AppMsgManager(apps, watch, this)),
- js(new JSKitManager(apps, appmsg, this)),
+ js(new JSKitManager(watch, apps, appmsg, settings, this)),
notification(MNotification::DeviceEvent)
{
connect(settings, SIGNAL(valueChanged(QString)), SLOT(onSettingChanged(const QString&)));
diff --git a/daemon/settings.h b/daemon/settings.h
index d6db9b6..90e25e2 100644
--- a/daemon/settings.h
+++ b/daemon/settings.h
@@ -18,6 +18,8 @@ class Settings : public MDConfGroup
Q_PROPERTY(bool notificationsFacebook MEMBER notificationsFacebook NOTIFY notificationsFacebookChanged)
Q_PROPERTY(bool notificationsOther MEMBER notificationsOther NOTIFY notificationsOtherChanged)
Q_PROPERTY(bool notificationsAll MEMBER notificationsAll NOTIFY notificationsAllChanged)
+ Q_PROPERTY(QString accountToken MEMBER accountToken NOTIFY accountTokenChanged)
+
bool silentWhenConnected;
bool transliterateMessage;
bool incomingCallNotification;
@@ -29,6 +31,7 @@ class Settings : public MDConfGroup
bool notificationsFacebook;
bool notificationsOther;
bool notificationsAll;
+ QString accountToken;
public:
explicit Settings(QObject *parent = 0) :
@@ -36,20 +39,18 @@ public:
{ resolveMetaObject(); }
signals:
- void silentWhenConnectedChanged(bool);
- void transliterateMessageChanged(bool);
- void incomingCallNotificationChanged(bool);
- void notificationsCommhistorydChanged(bool);
- void notificationsMissedCallChanged(bool);
- void notificationsEmailsChanged(bool);
- void notificationsMitakuuluuChanged(bool);
- void notificationsTwitterChanged(bool);
- void notificationsFacebookChanged(bool);
- void notificationsOtherChanged(bool);
- void notificationsAllChanged(bool);
-
-public slots:
-
+ void silentWhenConnectedChanged();
+ void transliterateMessageChanged();
+ void incomingCallNotificationChanged();
+ void notificationsCommhistorydChanged();
+ void notificationsMissedCallChanged();
+ void notificationsEmailsChanged();
+ void notificationsMitakuuluuChanged();
+ void notificationsTwitterChanged();
+ void notificationsFacebookChanged();
+ void notificationsOtherChanged();
+ void notificationsAllChanged();
+ void accountTokenChanged();
};
#endif // SETTINGS_H
diff --git a/daemon/watchconnector.cpp b/daemon/watchconnector.cpp
index 22f4a8a..27a5511 100644
--- a/daemon/watchconnector.cpp
+++ b/daemon/watchconnector.cpp
@@ -1,19 +1,60 @@
#include <QDateTime>
#include <QMetaEnum>
-#include "watchconnector.h"
#include "unpacker.h"
+#include "watchconnector.h"
static const int RECONNECT_TIMEOUT = 500; //ms
static const bool PROTOCOL_DEBUG = false;
-using std::function;
-
WatchConnector::WatchConnector(QObject *parent) :
QObject(parent), socket(nullptr), is_connected(false)
{
reconnectTimer.setSingleShot(true);
connect(&reconnectTimer, SIGNAL(timeout()), SLOT(reconnect()));
+
+ setEndpointHandler(watchVERSION, [this](const QByteArray &data) {
+ Unpacker u(data);
+
+ u.skip(1);
+
+ quint32 version = u.read<quint32>();
+ QString version_string = u.readFixedString(32);
+ QString commit = u.readFixedString(8);
+ bool is_recovery = u.read<quint8>();
+ quint8 hw_platform = u.read<quint8>();
+ quint8 metadata_version = u.read<quint8>();
+
+ quint32 safe_version = u.read<quint32>();
+ QString safe_version_string = u.readFixedString(32);
+ QString safe_commit = u.readFixedString(8);
+ bool safe_is_recovery = u.read<quint8>();
+ quint8 safe_hw_platform = u.read<quint8>();
+ quint8 safe_metadata_version = u.read<quint8>();
+
+ quint32 bootLoaderTimestamp = u.read<quint32>();
+ QString hardwareRevision = u.readFixedString(9);
+ QString serialNumber = u.readFixedString(12);
+ QByteArray address = u.readBytes(6);
+
+ if (u.bad()) {
+ logger()->warn() << "short read while reading firmware version";
+ }
+
+ logger()->debug() << "got version information"
+ << version << version_string << commit
+ << is_recovery << hw_platform << metadata_version;
+ logger()->debug() << "recovery version information"
+ << safe_version << safe_version_string << safe_commit
+ << safe_is_recovery << safe_hw_platform << safe_metadata_version;
+ logger()->debug() << "hardware information" << bootLoaderTimestamp << hardwareRevision;
+ logger()->debug() << "serial number" << serialNumber.left(3) << "...";
+ logger()->debug() << "bt address" << address.toHex();
+
+ this->_serialNumber = serialNumber;
+
+ return true;
+ });
}
WatchConnector::~WatchConnector()
@@ -46,11 +87,11 @@ void WatchConnector::reconnect()
void WatchConnector::disconnect()
{
- logger()->debug() << __FUNCTION__;
+ logger()->debug() << "disconnecting";
socket->close();
socket->deleteLater();
reconnectTimer.stop();
- logger()->debug() << "Stopped reconnect timer";
+ logger()->debug() << "stopped reconnect timer";
}
void WatchConnector::handleWatch(const QString &name, const QString &address)
@@ -67,6 +108,11 @@ void WatchConnector::handleWatch(const QString &name, const QString &address)
_last_address = address;
if (emit_name) emit nameChanged();
+ if (emit_name) {
+ // If we've changed names, don't reuse cached serial number!
+ _serialNumber.clear();
+ }
+
logger()->debug() << "Creating socket";
#if QT_VERSION < QT_VERSION_CHECK(5, 2, 0)
socket = new QBluetoothSocket(QBluetoothSocket::RfcommSocket);
@@ -198,11 +244,15 @@ void WatchConnector::onConnected()
is_connected = true;
reconnectTimer.stop();
reconnectTimer.setInterval(0);
- if (not was_connected) {
- if (not writeData.isEmpty()) {
+ if (!was_connected) {
+ if (!writeData.isEmpty()) {
logger()->info() << "Found" << writeData.length() << "bytes in write buffer - resending";
sendData(writeData);
}
+ if (_serialNumber.isEmpty()) {
+ // Ask for version information from the watch
+ sendMessage(watchVERSION, QByteArray(1, 0));
+ }
emit connectedChanged();
}
}
diff --git a/daemon/watchconnector.h b/daemon/watchconnector.h
index 6546302..45fd3c7 100644
--- a/daemon/watchconnector.h
+++ b/daemon/watchconnector.h
@@ -188,6 +188,7 @@ public:
inline bool isConnected() const { return is_connected; }
inline QString name() const { return socket != nullptr ? socket->peerName() : ""; }
+ inline QString serialNumber() const { return _serialNumber; }
void setEndpointHandler(uint endpoint, const EndpointHandlerFunc &func);
void clearEndpointHandler(uint endpoint);
@@ -245,6 +246,7 @@ private:
QTimer reconnectTimer;
QString _last_name;
QString _last_address;
+ QString _serialNumber;
};
#endif // WATCHCONNECTOR_H