From 833de44d81c7a79bb1327cd829116c1cce3861f6 Mon Sep 17 00:00:00 2001 From: timoreo Date: Sat, 9 Dec 2023 14:39:57 +0100 Subject: [PATCH] Added deviceid query and login --- include/matrixclient.h | 8 +++++--- source/matrixclient.cpp | 33 ++++++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/include/matrixclient.h b/include/matrixclient.h index 514601c..8fff9e3 100644 --- a/include/matrixclient.h +++ b/include/matrixclient.h @@ -43,7 +43,8 @@ private: std::string hsUrl; std::string token; Store* store; - std::string userIdCache = ""; + std::string userIdCache; + std::string deviceIdCache; int requestId = 0; bool stopSyncing = false; bool isSyncing = false; @@ -62,10 +63,11 @@ private: json_t* doRequestCurl(const char* method, std::string url, json_t* body, u32 timeout, CURLcode* retRes); public: Client(std::string homeserverUrl, std::string matrixToken = "", Store* clientStore = NULL); - std::string getToken(); - bool login(std::string username, std::string password); + std::string getToken() const; + bool login(std::string username, std::string password, std::string device_id=""); void logout(); std::string getUserId(); + std::string getDeviceId(); std::string resolveRoom(std::string alias); std::vector getJoinedRooms(); RoomInfo getRoomInfo(std::string roomId); diff --git a/source/matrixclient.cpp b/source/matrixclient.cpp index 6fec3ea..53fe40c 100644 --- a/source/matrixclient.cpp +++ b/source/matrixclient.cpp @@ -57,11 +57,11 @@ Client::Client(std::string homeserverUrl, std::string matrixToken, Store* client #endif } -std::string Client::getToken() { +std::string Client::getToken() const { return token; } -bool Client::login(std::string username, std::string password) { +bool Client::login(std::string username, std::string password, std::string device_id) { json_t* request = json_object(); json_object_set_new(request, "type", json_string("m.login.password")); json_t* identifier = json_object(); @@ -70,10 +70,12 @@ bool Client::login(std::string username, std::string password) { json_object_set_new(request, "identifier", identifier); json_object_set_new(request, "password", json_string(password.c_str())); json_object_set_new(request, "initial_device_display_name", json_string("Nintendo 3DS")); - + if(!device_id.empty()) { + json_object_set_new(request, "device_id", json_string(device_id.c_str())); + } json_t* ret = doRequest("POST", "/_matrix/client/r0/login", request); json_decref(request); - + printf_top("Result : %s\n" ,json_dumps(ret, JSON_ENSURE_ASCII | JSON_ESCAPE_SLASH)); const char* tokenCStr = json_object_get_string_value(ret, "access_token"); if (!tokenCStr) { if (ret) json_decref(ret); @@ -92,7 +94,7 @@ void Client::logout() { } std::string Client::getUserId() { - if (userIdCache != "") { + if (!userIdCache.empty()) { return userIdCache; } json_t* ret = doRequest("GET", "/_matrix/client/r0/account/whoami"); @@ -101,11 +103,32 @@ std::string Client::getUserId() { if (ret) json_decref(ret); return ""; } + const char* deviceIdCStr = json_object_get_string_value(ret, "device_id"); + std::string deviceIdStr = deviceIdCStr; std::string userIdStr = userIdCStr; json_decref(ret); userIdCache = std::string(userIdStr); + deviceIdCache = std::string(deviceIdStr); return userIdCache; } +std::string Client::getDeviceId() { + if(!deviceIdCache.empty()){ + return deviceIdCache; + } + json_t* ret = doRequest("GET", "/_matrix/client/r0/account/whoami"); + const char* userIdCStr = json_object_get_string_value(ret, "user_id"); + if (!userIdCStr) { + if (ret) json_decref(ret); + return ""; + } + const char* deviceIdCStr = json_object_get_string_value(ret, "device_id"); + std::string deviceIdStr = deviceIdCStr; + std::string userIdStr = userIdCStr; + json_decref(ret); + userIdCache = std::string(userIdStr); + deviceIdCache = std::string(deviceIdStr); + return deviceIdCache; +} std::string Client::resolveRoom(std::string alias) { if (alias[0] == '!') {