From 54be52b855e0f6205fe8d196d7449eb37db72f5f Mon Sep 17 00:00:00 2001 From: James Graham Date: Thu, 5 Sep 2024 13:48:42 +0000 Subject: [PATCH] Fix default permissions settings Make sure that if default permissions or basic permissons are not present in the power level event that they are set properly when changed rather than in the event section. Also define some of the commonly used strings BUG: 491371 --- src/models/permissionsmodel.cpp | 95 +++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 35 deletions(-) diff --git a/src/models/permissionsmodel.cpp b/src/models/permissionsmodel.cpp index 4289302f5..ff2bde68a 100644 --- a/src/models/permissionsmodel.cpp +++ b/src/models/permissionsmodel.cpp @@ -2,20 +2,40 @@ // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL #include "permissionsmodel.h" -#include "powerlevel.h" #include #include +#include "powerlevel.h" + +using namespace Qt::Literals::StringLiterals; + +namespace +{ +constexpr auto UsersDefaultKey = "users_default"_L1; +constexpr auto StateDefaultKey = "state_default"_L1; +constexpr auto EventsDefaultKey = "events_default"_L1; + +constexpr auto InviteKey = "invite"_L1; +constexpr auto KickKey = "kick"_L1; +constexpr auto BanKey = "ban"_L1; +constexpr auto RedactKey = "redact"_L1; + static const QStringList defaultPermissions = { - QStringLiteral("users_default"), - QStringLiteral("state_default"), - QStringLiteral("events_default"), - QStringLiteral("invite"), - QStringLiteral("kick"), - QStringLiteral("ban"), - QStringLiteral("redact"), + UsersDefaultKey, + StateDefaultKey, + EventsDefaultKey, +}; + +static const QStringList basicPermissions = { + InviteKey, + KickKey, + BanKey, + RedactKey, +}; + +static const QStringList knownPermissions = { QStringLiteral("m.reaction"), QStringLiteral("m.room.redaction"), QStringLiteral("m.room.power_levels"), @@ -33,14 +53,14 @@ static const QStringList defaultPermissions = { }; // Alternate name text for default permissions. -static const QHash defaultPermissionNames = { - {QStringLiteral("users_default"), kli18nc("Room permission type", "Default user power level")}, - {QStringLiteral("state_default"), kli18nc("Room permission type", "Default power level to set the room state")}, - {QStringLiteral("events_default"), kli18nc("Room permission type", "Default power level to send messages")}, - {QStringLiteral("invite"), kli18nc("Room permission type", "Invite users")}, - {QStringLiteral("kick"), kli18nc("Room permission type", "Kick users")}, - {QStringLiteral("ban"), kli18nc("Room permission type", "Ban users")}, - {QStringLiteral("redact"), kli18nc("Room permission type", "Remove messages sent by other users")}, +static const QHash permissionNames = { + {UsersDefaultKey, kli18nc("Room permission type", "Default user power level")}, + {StateDefaultKey, kli18nc("Room permission type", "Default power level to set the room state")}, + {EventsDefaultKey, kli18nc("Room permission type", "Default power level to send messages")}, + {InviteKey, kli18nc("Room permission type", "Invite users")}, + {KickKey, kli18nc("Room permission type", "Kick users")}, + {BanKey, kli18nc("Room permission type", "Ban users")}, + {RedactKey, kli18nc("Room permission type", "Remove messages sent by other users")}, {QStringLiteral("m.reaction"), kli18nc("Room permission type", "Send reactions")}, {QStringLiteral("m.room.redaction"), kli18nc("Room permission type", "Remove their own messages")}, {QStringLiteral("m.room.power_levels"), kli18nc("Room permission type", "Change user permissions")}, @@ -58,10 +78,10 @@ static const QHash defaultPermissionNames = { }; // Subtitles for the default values. -static const QHash defaultSubtitles = { - {QStringLiteral("users_default"), kli18nc("Room permission type", "This is the power level for all new users when joining the room")}, - {QStringLiteral("state_default"), kli18nc("Room permission type", "This is used for all state events that do not have their own entry here")}, - {QStringLiteral("events_default"), kli18nc("Room permission type", "This is used for all message events that do not have their own entry here")}, +static const QHash permissionSubtitles = { + {UsersDefaultKey, kli18nc("Room permission type", "This is the power level for all new users when joining the room")}, + {StateDefaultKey, kli18nc("Room permission type", "This is used for all state events that do not have their own entry here")}, + {EventsDefaultKey, kli18nc("Room permission type", "This is used for all message events that do not have their own entry here")}, }; // Permissions that should use the event default. @@ -70,6 +90,7 @@ static const QStringList eventPermissions = { QStringLiteral("m.reaction"), QStringLiteral("m.room.redaction"), }; +}; PermissionsModel::PermissionsModel(QObject *parent) : QAbstractListModel(parent) @@ -109,6 +130,8 @@ void PermissionsModel::initializeModel() } m_permissions.append(defaultPermissions); + m_permissions.append(basicPermissions); + m_permissions.append(knownPermissions); for (const auto &event : currentPowerLevelEvent->events().keys()) { if (!m_permissions.contains(event)) { @@ -131,17 +154,17 @@ QVariant PermissionsModel::data(const QModelIndex &index, int role) const const auto permission = m_permissions.value(index.row()); if (role == NameRole) { - if (defaultPermissionNames.keys().contains(permission)) { - return defaultPermissionNames.value(permission).toString(); + if (permissionNames.keys().contains(permission)) { + return permissionNames.value(permission).toString(); } return permission; } if (role == SubtitleRole) { - if (permission.startsWith(QLatin1String("m.")) && defaultPermissionNames.keys().contains(permission)) { + if (knownPermissions.contains(permission) && permissionNames.keys().contains(permission)) { return permission; } - if (defaultSubtitles.contains(permission)) { - return defaultSubtitles.value(permission).toString(); + if (permissionSubtitles.contains(permission)) { + return permissionSubtitles.value(permission).toString(); } return QString(); } @@ -166,11 +189,10 @@ QVariant PermissionsModel::data(const QModelIndex &index, int role) const return QString(); } if (role == IsDefaultValueRole) { - return permission.contains(QLatin1String("default")); + return defaultPermissions.contains(permission); } if (role == IsBasicPermissionRole) { - return permission == QStringLiteral("invite") || permission == QStringLiteral("kick") || permission == QStringLiteral("ban") - || permission == QStringLiteral("redact"); + return basicPermissions.contains(permission); } return {}; } @@ -201,19 +223,19 @@ std::optional PermissionsModel::powerLevel(const QString &permission) const } if (const auto currentPowerLevelEvent = m_room->currentState().get()) { - if (permission == QStringLiteral("ban")) { + if (permission == BanKey) { return currentPowerLevelEvent->ban(); - } else if (permission == QStringLiteral("kick")) { + } else if (permission == KickKey) { return currentPowerLevelEvent->kick(); - } else if (permission == QStringLiteral("invite")) { + } else if (permission == InviteKey) { return currentPowerLevelEvent->invite(); - } else if (permission == QStringLiteral("redact")) { + } else if (permission == RedactKey) { return currentPowerLevelEvent->redact(); - } else if (permission == QStringLiteral("users_default")) { + } else if (permission == UsersDefaultKey) { return currentPowerLevelEvent->usersDefault(); - } else if (permission == QStringLiteral("state_default")) { + } else if (permission == StateDefaultKey) { return currentPowerLevelEvent->stateDefault(); - } else if (permission == QStringLiteral("events_default")) { + } else if (permission == EventsDefaultKey) { return currentPowerLevelEvent->eventsDefault(); } else if (eventPermissions.contains(permission)) { return currentPowerLevelEvent->powerLevelForEvent(permission); @@ -241,6 +263,9 @@ void PermissionsModel::setPowerLevel(const QString &permission, const int &newPo auto powerLevelContent = currentPowerLevelEvent->contentJson(); if (powerLevelContent.contains(permission)) { powerLevelContent[permission] = clampPowerLevel; + // Deal with the case where a default or basic permission is missing from the event content erroneously. + } else if (defaultPermissions.contains(permission) || basicPermissions.contains(permission)) { + powerLevelContent[permission] = clampPowerLevel; } else { auto eventPowerLevels = powerLevelContent[QLatin1String("events")].toObject(); eventPowerLevels[permission] = clampPowerLevel;