Skip to content
Snippets Groups Projects
Commit 1103cc15 authored by CH Chethan Reddy's avatar CH Chethan Reddy
Browse files

Adding icons to UserProfile

parent 08028d5c
No related branches found
No related tags found
No related merge requests found
...@@ -15,9 +15,6 @@ set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard") ...@@ -15,9 +15,6 @@ set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard")
set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE BOOL "Require C++ standard to be supported") set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE BOOL "Require C++ standard to be supported")
set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "compile as PIC by default") set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "compile as PIC by default")
# set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
# set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
option(HUNTER_ENABLED "Enable Hunter package manager" OFF) option(HUNTER_ENABLED "Enable Hunter package manager" OFF)
include("cmake/HunterGate.cmake") include("cmake/HunterGate.cmake")
HunterGate( HunterGate(
......
...@@ -106,7 +106,7 @@ Page { ...@@ -106,7 +106,7 @@ Page {
} }
Connections { Connections {
target: TimelineManager target: TimelineManager
function onNewDeviceVerificationRequest(flow) { function onNewDeviceVerificationRequest(flow,transactionId,userId,deviceId) {
flow.userId = userId; flow.userId = userId;
flow.sender = false; flow.sender = false;
flow.deviceId = deviceId; flow.deviceId = deviceId;
......
...@@ -17,6 +17,13 @@ ApplicationWindow{ ...@@ -17,6 +17,13 @@ ApplicationWindow{
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
palette: colors palette: colors
Connections{
target: deviceVerificationList
onUpdateProfile: {
profile.fetchDeviceList(profile.userid)
}
}
Component { Component {
id: deviceVerificationDialog id: deviceVerificationDialog
DeviceVerification {} DeviceVerification {}
...@@ -139,20 +146,12 @@ ApplicationWindow{ ...@@ -139,20 +146,12 @@ ApplicationWindow{
top : 50 top : 50
} }
ColumnLayout{ ColumnLayout{
RowLayout{ Text{
Text{ Layout.fillWidth: true
Layout.fillWidth: true color: colors.text
color: colors.text font.bold: true
font.bold: true Layout.alignment: Qt.AlignLeft
Layout.alignment: Qt.AlignLeft text: model.deviceId
text: model.deviceId
}
Text{
Layout.fillWidth: true
color:colors.text
Layout.alignment: Qt.AlignLeft
text: (model.verificationStatus == VerificationStatus.VERIFIED?"V":(model.verificationStatus == VerificationStatus.UNVERIFIED?"NV":"B"))
}
} }
Text{ Text{
Layout.fillWidth: true Layout.fillWidth: true
...@@ -161,27 +160,41 @@ ApplicationWindow{ ...@@ -161,27 +160,41 @@ ApplicationWindow{
text: model.deviceName text: model.deviceName
} }
} }
Button{ RowLayout{
id: verifyButton Image{
text:"Verify" Layout.preferredWidth: 20
onClicked: { Layout.preferredHeight: 20
var newFlow = deviceVerificationFlow.createObject(userProfileDialog, source: ((model.verificationStatus == VerificationStatus.VERIFIED)?"image://colorimage/:/icons/icons/ui/lock.png?green":
{userId : profile.userid, sender: true, deviceId : model.deviceID}); ((model.verificationStatus == VerificationStatus.UNVERIFIED)?"image://colorimage/:/icons/icons/ui/unlock.png?yellow":
deviceVerificationList.add(newFlow.tranId); "image://colorimage/:/icons/icons/ui/unlock.png?red"))
var dialog = deviceVerificationDialog.createObject(userProfileDialog, {flow: newFlow});
dialog.show();
} }
Layout.margins:{ Button{
right: 10 id: verifyButton
} text:(model.verificationStatus != VerificationStatus.VERIFIED)?"Verify":"Unverify"
palette { onClicked: {
button: "white" var newFlow = deviceVerificationFlow.createObject(userProfileDialog,
} {userId : profile.userid, sender: true, deviceId : model.deviceId});
contentItem: Text { if(model.verificationStatus == VerificationStatus.VERIFIED){
text: verifyButton.text newFlow.unverify();
color: "black" deviceVerificationList.updateProfile(newFlow.userId);
horizontalAlignment: Text.AlignHCenter }else{
verticalAlignment: Text.AlignVCenter deviceVerificationList.add(newFlow.tranId);
var dialog = deviceVerificationDialog.createObject(userProfileDialog, {flow: newFlow});
dialog.show();
}
}
Layout.margins:{
right: 10
}
palette {
button: "white"
}
contentItem: Text {
text: verifyButton.text
color: "black"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
} }
} }
} }
......
...@@ -33,6 +33,10 @@ ApplicationWindow { ...@@ -33,6 +33,10 @@ ApplicationWindow {
case DeviceVerificationFlow.Decimal: stack.replace(digitVerification); break; case DeviceVerificationFlow.Decimal: stack.replace(digitVerification); break;
case DeviceVerificationFlow.Emoji: stack.replace(emojiVerification); break; case DeviceVerificationFlow.Emoji: stack.replace(emojiVerification); break;
} }
onRefreshProfile: {
deviceVerificationList.updateProfile(flow.userId);
}
} }
Component { Component {
......
#include "DeviceVerificationFlow.h" #include "DeviceVerificationFlow.h"
#include "Cache.h"
#include "ChatPage.h" #include "ChatPage.h"
#include "Logging.h" #include "Logging.h"
...@@ -181,9 +182,9 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *) ...@@ -181,9 +182,9 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *)
// uncomment this in future to be compatible with the // uncomment this in future to be compatible with the
// MSC2366 this->sendVerificationDone(); and remove the // MSC2366 this->sendVerificationDone(); and remove the
// below line // below line
if (this->isMacVerified == true) if (this->isMacVerified == true) {
emit this->deviceVerified(); this->acceptDevice();
else } else
this->isMacVerified = true; this->isMacVerified = true;
} else { } else {
this->cancelVerification( this->cancelVerification(
...@@ -208,7 +209,7 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *) ...@@ -208,7 +209,7 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *)
auto msg = auto msg =
std::get<mtx::events::DeviceEvent<msgs::KeyVerificationDone>>(message); std::get<mtx::events::DeviceEvent<msgs::KeyVerificationDone>>(message);
if (msg.content.transaction_id == this->transaction_id) { if (msg.content.transaction_id == this->transaction_id) {
emit this->deviceVerified(); this->acceptDevice();
} }
}); });
timeout->start(TIMEOUT); timeout->start(TIMEOUT);
...@@ -259,36 +260,22 @@ DeviceVerificationFlow::setTransactionId(QString transaction_id_) ...@@ -259,36 +260,22 @@ DeviceVerificationFlow::setTransactionId(QString transaction_id_)
void void
DeviceVerificationFlow::setUserId(QString userID) DeviceVerificationFlow::setUserId(QString userID)
{ {
this->userId = userID; this->userId = userID;
this->toClient = mtx::identifiers::parse<mtx::identifiers::User>(userID.toStdString()); this->toClient = mtx::identifiers::parse<mtx::identifiers::User>(userID.toStdString());
auto user_cache = cache::getUserCache(userID.toStdString());
mtx::responses::QueryKeys res;
mtx::requests::QueryKeys req; if (user_cache.has_value()) {
req.device_keys[userID.toStdString()] = {}; this->callback_fn(user_cache->keys, {}, userID.toStdString());
http::client()->query_keys( } else {
req, mtx::requests::QueryKeys req;
[user_id = userID.toStdString(), this](const mtx::responses::QueryKeys &res, req.device_keys[userID.toStdString()] = {};
mtx::http::RequestErr err) { http::client()->query_keys(
if (err) { req,
nhlog::net()->warn("failed to query device keys: {},{}", [user_id = userID.toStdString(), this](const mtx::responses::QueryKeys &res,
err->matrix_error.errcode, mtx::http::RequestErr err) {
static_cast<int>(err->status_code)); this->callback_fn(res, err, user_id);
return; });
} }
for (auto x : res.device_keys) {
for (auto y : x.second) {
auto z = y.second;
if (z.user_id == user_id &&
z.device_id == this->deviceId.toStdString()) {
for (auto a : z.keys) {
// TODO: Verify Signatures
this->device_keys[a.first] = a.second;
}
}
}
}
});
} }
void void
...@@ -482,6 +469,16 @@ DeviceVerificationFlow::cancelVerification(DeviceVerificationFlow::Error error_c ...@@ -482,6 +469,16 @@ DeviceVerificationFlow::cancelVerification(DeviceVerificationFlow::Error error_c
nhlog::net()->warn("failed to cancel verification request: {} {}", nhlog::net()->warn("failed to cancel verification request: {} {}",
err->matrix_error.error, err->matrix_error.error,
static_cast<int>(err->status_code)); static_cast<int>(err->status_code));
auto verified_cache = cache::getVerifiedCache(this->userId.toStdString());
if (verified_cache.has_value()) {
verified_cache->device_blocked.push_back(this->deviceId.toStdString());
cache::setVerifiedCache(this->userId.toStdString(),
verified_cache.value());
} else {
cache::setVerifiedCache(
this->userId.toStdString(),
DeviceVerifiedCache{{}, {this->deviceId.toStdString()}});
}
this->deleteLater(); this->deleteLater();
}); });
} }
...@@ -546,7 +543,7 @@ DeviceVerificationFlow::sendVerificationMac() ...@@ -546,7 +543,7 @@ DeviceVerificationFlow::sendVerificationMac()
static_cast<int>(err->status_code)); static_cast<int>(err->status_code));
if (this->isMacVerified == true) if (this->isMacVerified == true)
emit this->deviceVerified(); this->acceptDevice();
else else
this->isMacVerified = true; this->isMacVerified = true;
}); });
...@@ -555,8 +552,69 @@ DeviceVerificationFlow::sendVerificationMac() ...@@ -555,8 +552,69 @@ DeviceVerificationFlow::sendVerificationMac()
void void
DeviceVerificationFlow::acceptDevice() DeviceVerificationFlow::acceptDevice()
{ {
auto verified_cache = cache::getVerifiedCache(this->userId.toStdString());
if (verified_cache.has_value()) {
verified_cache->device_verified.push_back(this->deviceId.toStdString());
for (auto it = verified_cache->device_blocked.begin();
it != verified_cache->device_blocked.end();
it++) {
if (*it == this->deviceId.toStdString()) {
verified_cache->device_blocked.erase(it);
}
}
cache::setVerifiedCache(this->userId.toStdString(), verified_cache.value());
} else {
cache::setVerifiedCache(this->userId.toStdString(),
DeviceVerifiedCache{{this->deviceId.toStdString()}, {}});
}
emit deviceVerified(); emit deviceVerified();
emit refreshProfile();
this->deleteLater(); this->deleteLater();
}
//! callback function to keep track of devices
void
DeviceVerificationFlow::callback_fn(const mtx::responses::QueryKeys &res,
mtx::http::RequestErr err,
std::string user_id)
{
if (err) {
nhlog::net()->warn("failed to query device keys: {},{}",
err->matrix_error.errcode,
static_cast<int>(err->status_code));
return;
}
if (res.device_keys.empty() || (res.device_keys.find(user_id) == res.device_keys.end())) {
nhlog::net()->warn("no devices retrieved {}", user_id);
return;
}
// Yet to add send to_device message for (auto x : res.device_keys) {
for (auto y : x.second) {
auto z = y.second;
if (z.user_id == user_id && z.device_id == this->deviceId.toStdString()) {
for (auto a : z.keys) {
// TODO: Verify Signatures
this->device_keys[a.first] = a.second;
}
}
}
}
}
void
DeviceVerificationFlow::unverify()
{
auto verified_cache = cache::getVerifiedCache(this->userId.toStdString());
if (verified_cache.has_value()) {
auto it = std::remove(verified_cache->device_verified.begin(),
verified_cache->device_verified.end(),
this->deviceId.toStdString());
verified_cache->device_verified.erase(it);
cache::setVerifiedCache(this->userId.toStdString(), verified_cache.value());
}
emit refreshProfile();
this->deleteLater();
} }
...@@ -51,6 +51,9 @@ public: ...@@ -51,6 +51,9 @@ public:
void setDeviceId(QString deviceID); void setDeviceId(QString deviceID);
void setMethod(Method method_); void setMethod(Method method_);
void setSender(bool sender_); void setSender(bool sender_);
void callback_fn(const mtx::responses::QueryKeys &res,
mtx::http::RequestErr err,
std::string user_id);
nlohmann::json canonical_json; nlohmann::json canonical_json;
...@@ -73,12 +76,15 @@ public slots: ...@@ -73,12 +76,15 @@ public slots:
void sendVerificationMac(); void sendVerificationMac();
//! Completes the verification flow //! Completes the verification flow
void acceptDevice(); void acceptDevice();
//! unverifies a device
void unverify();
signals: signals:
void verificationRequestAccepted(Method method); void verificationRequestAccepted(Method method);
void deviceVerified(); void deviceVerified();
void timedout(); void timedout();
void verificationCanceled(); void verificationCanceled();
void refreshProfile();
private: private:
QString userId; QString userId;
......
...@@ -29,6 +29,8 @@ public: ...@@ -29,6 +29,8 @@ public:
Q_INVOKABLE void add(QString tran_id); Q_INVOKABLE void add(QString tran_id);
Q_INVOKABLE void remove(QString tran_id); Q_INVOKABLE void remove(QString tran_id);
Q_INVOKABLE bool exist(QString tran_id); Q_INVOKABLE bool exist(QString tran_id);
signals:
void updateProfile(QString userId);
private: private:
QVector<QString> deviceVerificationList; QVector<QString> deviceVerificationList;
......
#include "UserProfile.h" #include "UserProfile.h"
#include "Cache.h" #include "Cache.h"
#include "ChatPage.h" #include "ChatPage.h"
#include "DeviceVerificationFlow.h"
#include "Logging.h" #include "Logging.h"
#include "Utils.h" #include "Utils.h"
#include "mtx/responses/crypto.hpp" #include "mtx/responses/crypto.hpp"
...@@ -122,10 +123,10 @@ UserProfile::callback_fn(const mtx::responses::QueryKeys &res, ...@@ -122,10 +123,10 @@ UserProfile::callback_fn(const mtx::responses::QueryKeys &res,
verified}); verified});
} }
// std::sort( std::sort(
// deviceInfo.begin(), deviceInfo.end(), [](const DeviceInfo &a, const DeviceInfo &b) { deviceInfo.begin(), deviceInfo.end(), [](const DeviceInfo &a, const DeviceInfo &b) {
// return a.device_id > b.device_id; return a.device_id > b.device_id;
// }); });
this->deviceList_.queueReset(std::move(deviceInfo)); this->deviceList_.queueReset(std::move(deviceInfo));
} }
...@@ -176,4 +177,4 @@ UserProfile::startChat() ...@@ -176,4 +177,4 @@ UserProfile::startChat()
if (utils::localUser() != this->userid_) if (utils::localUser() != this->userid_)
req.invite = {this->userid_.toStdString()}; req.invite = {this->userid_.toStdString()};
emit ChatPage::instance()->createRoom(req); emit ChatPage::instance()->createRoom(req);
} }
\ No newline at end of file
...@@ -19,6 +19,8 @@ enum Status ...@@ -19,6 +19,8 @@ enum Status
Q_ENUM_NS(Status) Q_ENUM_NS(Status)
} }
class DeviceVerificationFlow;
class DeviceInfo class DeviceInfo
{ {
public: public:
...@@ -88,7 +90,7 @@ public: ...@@ -88,7 +90,7 @@ public:
QString displayName(); QString displayName();
QString avatarUrl(); QString avatarUrl();
void fetchDeviceList(const QString &userID); Q_INVOKABLE void fetchDeviceList(const QString &userID);
Q_INVOKABLE void banUser(); Q_INVOKABLE void banUser();
// Q_INVOKABLE void ignoreUser(); // Q_INVOKABLE void ignoreUser();
Q_INVOKABLE void kickUser(); Q_INVOKABLE void kickUser();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment