Show verification status in memberlist

This commit is contained in:
Nicolas Werner 2021-08-13 23:58:26 +02:00
parent 18ea01e198
commit 9bad584931
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9
8 changed files with 59 additions and 16 deletions

View file

@ -13,6 +13,7 @@ ApplicationWindow {
id: roomMembersRoot id: roomMembersRoot
property MemberList members property MemberList members
property Room room
title: qsTr("Members of %1").arg(members.roomName) title: qsTr("Members of %1").arg(members.roomName)
height: 650 height: 650
@ -83,9 +84,14 @@ ApplicationWindow {
} }
delegate: RowLayout { delegate: RowLayout {
id: del
width: ListView.view.width
spacing: Nheko.paddingMedium spacing: Nheko.paddingMedium
Avatar { Avatar {
id: avatar
width: Nheko.avatarSize width: Nheko.avatarSize
height: Nheko.avatarSize height: Nheko.avatarSize
userid: model.mxid userid: model.mxid
@ -97,16 +103,18 @@ ApplicationWindow {
ColumnLayout { ColumnLayout {
spacing: Nheko.paddingSmall spacing: Nheko.paddingSmall
Label { ElidedLabel {
text: model.displayName fullText: model.displayName
color: TimelineManager.userColor(model ? model.mxid : "", Nheko.colors.window) color: TimelineManager.userColor(model ? model.mxid : "", Nheko.colors.window)
font.pointSize: fontMetrics.font.pointSize font.pixelSize: fontMetrics.font.pixelSize
elideWidth: del.width - Nheko.paddingMedium * 2 - avatar.width - encryptInd.width
} }
Label { ElidedLabel {
text: model.mxid fullText: model.mxid
color: Nheko.colors.buttonText color: Nheko.colors.buttonText
font.pointSize: fontMetrics.font.pointSize * 0.9 font.pixelSize: Math.ceil(fontMetrics.font.pixelSize * 0.9)
elideWidth: del.width - Nheko.paddingMedium * 2 - avatar.width - encryptInd.width
} }
Item { Item {
@ -116,6 +124,28 @@ ApplicationWindow {
} }
EncryptionIndicator {
id: encryptInd
Layout.alignment: Qt.AlignRight
visible: room.isEncrypted
encrypted: room.isEncrypted
trust: encrypted ? model.trustlevel : Crypto.Unverified
ToolTip.text: {
if (!encrypted)
return qsTr("This room is not encrypted!");
switch (trust) {
case Crypto.Verified:
return qsTr("This user is verified.");
case Crypto.TOFU:
return qsTr("This user isn't verified, but is still using the same master key from the first time you met.");
default:
return qsTr("This user has unverified devices!");
}
}
}
} }
footer: Item { footer: Item {

View file

@ -153,10 +153,10 @@ Page {
packSet.show(); packSet.show();
} }
function onOpenRoomMembersDialog(members) { function onOpenRoomMembersDialog(members, room) {
var membersDialog = roomMembersComponent.createObject(timelineRoot, { var membersDialog = roomMembersComponent.createObject(timelineRoot, {
"members": members, "members": members,
"roomName": Rooms.currentRoom.roomName "room": room
}); });
membersDialog.show(); membersDialog.show();
} }

View file

@ -140,7 +140,7 @@ Rectangle {
Platform.MenuItem { Platform.MenuItem {
text: qsTr("Members") text: qsTr("Members")
onTriggered: TimelineManager.openRoomMembers(room.roomId) onTriggered: TimelineManager.openRoomMembers(room)
} }
Platform.MenuItem { Platform.MenuItem {

View file

@ -3584,8 +3584,6 @@ Cache::roomMembers(const std::string &room_id)
crypto::Trust crypto::Trust
Cache::roomVerificationStatus(const std::string &room_id) Cache::roomVerificationStatus(const std::string &room_id)
{ {
std::string_view keys;
crypto::Trust trust = crypto::Verified; crypto::Trust trust = crypto::Verified;
try { try {

View file

@ -53,6 +53,7 @@ MemberList::roleNames() const
{Mxid, "mxid"}, {Mxid, "mxid"},
{DisplayName, "displayName"}, {DisplayName, "displayName"},
{AvatarUrl, "avatarUrl"}, {AvatarUrl, "avatarUrl"},
{Trustlevel, "trustlevel"},
}; };
} }
@ -69,6 +70,17 @@ MemberList::data(const QModelIndex &index, int role) const
return m_memberList[index.row()].first.display_name; return m_memberList[index.row()].first.display_name;
case AvatarUrl: case AvatarUrl:
return m_memberList[index.row()].second; return m_memberList[index.row()].second;
case Trustlevel: {
auto stat =
cache::verificationStatus(m_memberList[index.row()].first.user_id.toStdString());
if (!stat)
return crypto::Unverified;
if (stat->unverified_device_count)
return crypto::Unverified;
else
return stat->user_verified;
}
default: default:
return {}; return {};
} }

View file

@ -25,6 +25,7 @@ public:
Mxid, Mxid,
DisplayName, DisplayName,
AvatarUrl, AvatarUrl,
Trustlevel,
}; };
MemberList(const QString &room_id, QObject *parent = nullptr); MemberList(const QString &room_id, QObject *parent = nullptr);

View file

@ -375,10 +375,12 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
} }
void void
TimelineViewManager::openRoomMembers(QString room_id) TimelineViewManager::openRoomMembers(TimelineModel *room)
{ {
MemberList *memberList = new MemberList(room_id, this); if (!room)
emit openRoomMembersDialog(memberList); return;
MemberList *memberList = new MemberList(room->roomId(), this);
emit openRoomMembersDialog(memberList, room);
} }
void void

View file

@ -66,7 +66,7 @@ public:
Q_INVOKABLE QString userPresence(QString id) const; Q_INVOKABLE QString userPresence(QString id) const;
Q_INVOKABLE QString userStatus(QString id) const; Q_INVOKABLE QString userStatus(QString id) const;
Q_INVOKABLE void openRoomMembers(QString room_id); Q_INVOKABLE void openRoomMembers(TimelineModel *room);
Q_INVOKABLE void openRoomSettings(QString room_id); Q_INVOKABLE void openRoomSettings(QString room_id);
Q_INVOKABLE void openInviteUsers(QString roomId); Q_INVOKABLE void openInviteUsers(QString roomId);
Q_INVOKABLE void openGlobalUserProfile(QString userId); Q_INVOKABLE void openGlobalUserProfile(QString userId);
@ -92,7 +92,7 @@ signals:
void focusChanged(); void focusChanged();
void focusInput(); void focusInput();
void openImageOverlayInternalCb(QString eventId, QImage img); void openImageOverlayInternalCb(QString eventId, QImage img);
void openRoomMembersDialog(MemberList *members); void openRoomMembersDialog(MemberList *members, TimelineModel *room);
void openRoomSettingsDialog(RoomSettings *settings); void openRoomSettingsDialog(RoomSettings *settings);
void openInviteUsersDialog(InviteesModel *invitees); void openInviteUsersDialog(InviteesModel *invitees);
void openProfile(UserProfile *profile); void openProfile(UserProfile *profile);