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
This commit is contained in:
@@ -2,20 +2,40 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||||
|
|
||||||
#include "permissionsmodel.h"
|
#include "permissionsmodel.h"
|
||||||
#include "powerlevel.h"
|
|
||||||
|
|
||||||
#include <Quotient/events/roompowerlevelsevent.h>
|
#include <Quotient/events/roompowerlevelsevent.h>
|
||||||
|
|
||||||
#include <KLazyLocalizedString>
|
#include <KLazyLocalizedString>
|
||||||
|
|
||||||
|
#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 = {
|
static const QStringList defaultPermissions = {
|
||||||
QStringLiteral("users_default"),
|
UsersDefaultKey,
|
||||||
QStringLiteral("state_default"),
|
StateDefaultKey,
|
||||||
QStringLiteral("events_default"),
|
EventsDefaultKey,
|
||||||
QStringLiteral("invite"),
|
};
|
||||||
QStringLiteral("kick"),
|
|
||||||
QStringLiteral("ban"),
|
static const QStringList basicPermissions = {
|
||||||
QStringLiteral("redact"),
|
InviteKey,
|
||||||
|
KickKey,
|
||||||
|
BanKey,
|
||||||
|
RedactKey,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const QStringList knownPermissions = {
|
||||||
QStringLiteral("m.reaction"),
|
QStringLiteral("m.reaction"),
|
||||||
QStringLiteral("m.room.redaction"),
|
QStringLiteral("m.room.redaction"),
|
||||||
QStringLiteral("m.room.power_levels"),
|
QStringLiteral("m.room.power_levels"),
|
||||||
@@ -33,14 +53,14 @@ static const QStringList defaultPermissions = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Alternate name text for default permissions.
|
// Alternate name text for default permissions.
|
||||||
static const QHash<QString, KLazyLocalizedString> defaultPermissionNames = {
|
static const QHash<QString, KLazyLocalizedString> permissionNames = {
|
||||||
{QStringLiteral("users_default"), kli18nc("Room permission type", "Default user power level")},
|
{UsersDefaultKey, kli18nc("Room permission type", "Default user power level")},
|
||||||
{QStringLiteral("state_default"), kli18nc("Room permission type", "Default power level to set the room state")},
|
{StateDefaultKey, 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")},
|
{EventsDefaultKey, kli18nc("Room permission type", "Default power level to send messages")},
|
||||||
{QStringLiteral("invite"), kli18nc("Room permission type", "Invite users")},
|
{InviteKey, kli18nc("Room permission type", "Invite users")},
|
||||||
{QStringLiteral("kick"), kli18nc("Room permission type", "Kick users")},
|
{KickKey, kli18nc("Room permission type", "Kick users")},
|
||||||
{QStringLiteral("ban"), kli18nc("Room permission type", "Ban users")},
|
{BanKey, kli18nc("Room permission type", "Ban users")},
|
||||||
{QStringLiteral("redact"), kli18nc("Room permission type", "Remove messages sent by other users")},
|
{RedactKey, kli18nc("Room permission type", "Remove messages sent by other users")},
|
||||||
{QStringLiteral("m.reaction"), kli18nc("Room permission type", "Send reactions")},
|
{QStringLiteral("m.reaction"), kli18nc("Room permission type", "Send reactions")},
|
||||||
{QStringLiteral("m.room.redaction"), kli18nc("Room permission type", "Remove their own messages")},
|
{QStringLiteral("m.room.redaction"), kli18nc("Room permission type", "Remove their own messages")},
|
||||||
{QStringLiteral("m.room.power_levels"), kli18nc("Room permission type", "Change user permissions")},
|
{QStringLiteral("m.room.power_levels"), kli18nc("Room permission type", "Change user permissions")},
|
||||||
@@ -58,10 +78,10 @@ static const QHash<QString, KLazyLocalizedString> defaultPermissionNames = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Subtitles for the default values.
|
// Subtitles for the default values.
|
||||||
static const QHash<QString, KLazyLocalizedString> defaultSubtitles = {
|
static const QHash<QString, KLazyLocalizedString> permissionSubtitles = {
|
||||||
{QStringLiteral("users_default"), kli18nc("Room permission type", "This is the power level for all new users when joining the room")},
|
{UsersDefaultKey, 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")},
|
{StateDefaultKey, 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")},
|
{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.
|
// Permissions that should use the event default.
|
||||||
@@ -70,6 +90,7 @@ static const QStringList eventPermissions = {
|
|||||||
QStringLiteral("m.reaction"),
|
QStringLiteral("m.reaction"),
|
||||||
QStringLiteral("m.room.redaction"),
|
QStringLiteral("m.room.redaction"),
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
PermissionsModel::PermissionsModel(QObject *parent)
|
PermissionsModel::PermissionsModel(QObject *parent)
|
||||||
: QAbstractListModel(parent)
|
: QAbstractListModel(parent)
|
||||||
@@ -109,6 +130,8 @@ void PermissionsModel::initializeModel()
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_permissions.append(defaultPermissions);
|
m_permissions.append(defaultPermissions);
|
||||||
|
m_permissions.append(basicPermissions);
|
||||||
|
m_permissions.append(knownPermissions);
|
||||||
|
|
||||||
for (const auto &event : currentPowerLevelEvent->events().keys()) {
|
for (const auto &event : currentPowerLevelEvent->events().keys()) {
|
||||||
if (!m_permissions.contains(event)) {
|
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());
|
const auto permission = m_permissions.value(index.row());
|
||||||
if (role == NameRole) {
|
if (role == NameRole) {
|
||||||
if (defaultPermissionNames.keys().contains(permission)) {
|
if (permissionNames.keys().contains(permission)) {
|
||||||
return defaultPermissionNames.value(permission).toString();
|
return permissionNames.value(permission).toString();
|
||||||
}
|
}
|
||||||
return permission;
|
return permission;
|
||||||
}
|
}
|
||||||
if (role == SubtitleRole) {
|
if (role == SubtitleRole) {
|
||||||
if (permission.startsWith(QLatin1String("m.")) && defaultPermissionNames.keys().contains(permission)) {
|
if (knownPermissions.contains(permission) && permissionNames.keys().contains(permission)) {
|
||||||
return permission;
|
return permission;
|
||||||
}
|
}
|
||||||
if (defaultSubtitles.contains(permission)) {
|
if (permissionSubtitles.contains(permission)) {
|
||||||
return defaultSubtitles.value(permission).toString();
|
return permissionSubtitles.value(permission).toString();
|
||||||
}
|
}
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
@@ -166,11 +189,10 @@ QVariant PermissionsModel::data(const QModelIndex &index, int role) const
|
|||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
if (role == IsDefaultValueRole) {
|
if (role == IsDefaultValueRole) {
|
||||||
return permission.contains(QLatin1String("default"));
|
return defaultPermissions.contains(permission);
|
||||||
}
|
}
|
||||||
if (role == IsBasicPermissionRole) {
|
if (role == IsBasicPermissionRole) {
|
||||||
return permission == QStringLiteral("invite") || permission == QStringLiteral("kick") || permission == QStringLiteral("ban")
|
return basicPermissions.contains(permission);
|
||||||
|| permission == QStringLiteral("redact");
|
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@@ -201,19 +223,19 @@ std::optional<int> PermissionsModel::powerLevel(const QString &permission) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (const auto currentPowerLevelEvent = m_room->currentState().get<Quotient::RoomPowerLevelsEvent>()) {
|
if (const auto currentPowerLevelEvent = m_room->currentState().get<Quotient::RoomPowerLevelsEvent>()) {
|
||||||
if (permission == QStringLiteral("ban")) {
|
if (permission == BanKey) {
|
||||||
return currentPowerLevelEvent->ban();
|
return currentPowerLevelEvent->ban();
|
||||||
} else if (permission == QStringLiteral("kick")) {
|
} else if (permission == KickKey) {
|
||||||
return currentPowerLevelEvent->kick();
|
return currentPowerLevelEvent->kick();
|
||||||
} else if (permission == QStringLiteral("invite")) {
|
} else if (permission == InviteKey) {
|
||||||
return currentPowerLevelEvent->invite();
|
return currentPowerLevelEvent->invite();
|
||||||
} else if (permission == QStringLiteral("redact")) {
|
} else if (permission == RedactKey) {
|
||||||
return currentPowerLevelEvent->redact();
|
return currentPowerLevelEvent->redact();
|
||||||
} else if (permission == QStringLiteral("users_default")) {
|
} else if (permission == UsersDefaultKey) {
|
||||||
return currentPowerLevelEvent->usersDefault();
|
return currentPowerLevelEvent->usersDefault();
|
||||||
} else if (permission == QStringLiteral("state_default")) {
|
} else if (permission == StateDefaultKey) {
|
||||||
return currentPowerLevelEvent->stateDefault();
|
return currentPowerLevelEvent->stateDefault();
|
||||||
} else if (permission == QStringLiteral("events_default")) {
|
} else if (permission == EventsDefaultKey) {
|
||||||
return currentPowerLevelEvent->eventsDefault();
|
return currentPowerLevelEvent->eventsDefault();
|
||||||
} else if (eventPermissions.contains(permission)) {
|
} else if (eventPermissions.contains(permission)) {
|
||||||
return currentPowerLevelEvent->powerLevelForEvent(permission);
|
return currentPowerLevelEvent->powerLevelForEvent(permission);
|
||||||
@@ -241,6 +263,9 @@ void PermissionsModel::setPowerLevel(const QString &permission, const int &newPo
|
|||||||
auto powerLevelContent = currentPowerLevelEvent->contentJson();
|
auto powerLevelContent = currentPowerLevelEvent->contentJson();
|
||||||
if (powerLevelContent.contains(permission)) {
|
if (powerLevelContent.contains(permission)) {
|
||||||
powerLevelContent[permission] = clampPowerLevel;
|
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 {
|
} else {
|
||||||
auto eventPowerLevels = powerLevelContent[QLatin1String("events")].toObject();
|
auto eventPowerLevels = powerLevelContent[QLatin1String("events")].toObject();
|
||||||
eventPowerLevels[permission] = clampPowerLevel;
|
eventPowerLevels[permission] = clampPowerLevel;
|
||||||
|
|||||||
Reference in New Issue
Block a user