mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-25 12:38:48 +03:00
Adding icons to UserProfile
This commit is contained in:
parent
08028d5c57
commit
1103cc15cf
9 changed files with 164 additions and 81 deletions
|
@ -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 {
|
||||||
}
|
}
|
||||||
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{
|
||||||
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{
|
||||||
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{
|
||||||
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 {
|
||||||
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 {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#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 *)
|
||||||
// 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 *)
|
||||||
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_)
|
||||||
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;
|
if (user_cache.has_value()) {
|
||||||
mtx::requests::QueryKeys req;
|
this->callback_fn(user_cache->keys, {}, userID.toStdString());
|
||||||
req.device_keys[userID.toStdString()] = {};
|
} else {
|
||||||
http::client()->query_keys(
|
mtx::requests::QueryKeys req;
|
||||||
req,
|
req.device_keys[userID.toStdString()] = {};
|
||||||
[user_id = userID.toStdString(), this](const mtx::responses::QueryKeys &res,
|
http::client()->query_keys(
|
||||||
mtx::http::RequestErr err) {
|
req,
|
||||||
if (err) {
|
[user_id = userID.toStdString(), this](const mtx::responses::QueryKeys &res,
|
||||||
nhlog::net()->warn("failed to query device keys: {},{}",
|
mtx::http::RequestErr err) {
|
||||||
err->matrix_error.errcode,
|
this->callback_fn(res, err, user_id);
|
||||||
static_cast<int>(err->status_code));
|
});
|
||||||
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
|
||||||
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()
|
||||||
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()
|
||||||
void
|
void
|
||||||
DeviceVerificationFlow::acceptDevice()
|
DeviceVerificationFlow::acceptDevice()
|
||||||
{
|
{
|
||||||
emit deviceVerified();
|
auto verified_cache = cache::getVerifiedCache(this->userId.toStdString());
|
||||||
this->deleteLater();
|
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()}, {}});
|
||||||
|
}
|
||||||
|
|
||||||
// Yet to add send to_device message
|
emit deviceVerified();
|
||||||
|
emit refreshProfile();
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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:
|
||||||
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:
|
||||||
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:
|
||||||
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;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#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,
|
||||||
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()
|
||||||
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);
|
||||||
}
|
}
|
|
@ -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:
|
||||||
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();
|
||||||
|
|
Loading…
Reference in a new issue