Handle local permissions as a ulong and decouple from the ones stored in the database.

This commit is contained in:
flash 2025-04-26 23:58:32 +00:00
parent b9a7a43db8
commit 9381bdfe51
Signed by: flash
GPG key ID: 2C9C2C574D47FE3E
5 changed files with 138 additions and 22 deletions

View file

@ -32,7 +32,8 @@ public class SendMessageC2SPacketHandler(
User? user = ctx.Connection.User;
string? messageText = args.ElementAtOrDefault(2);
if(user == null || !user.Can(UserPermissions.SendMessage) || string.IsNullOrWhiteSpace(messageText))
if(user?.Permissions.HasFlag(UserPermissions.SendMessage) != true
|| string.IsNullOrWhiteSpace(messageText))
return;
// Extra validation step, not necessary at all but enforces proper formatting in SCv1.

View file

@ -35,7 +35,7 @@ public partial class MariaDBEventStorage(string connString) : EventStorage {
new MySqlParameter("sender_colour", senderColour.ToMisuzu()),
new MySqlParameter("sender_rank", senderRank),
new MySqlParameter("sender_nick", string.IsNullOrWhiteSpace(senderNick) ? null : senderNick),
new MySqlParameter("sender_perms", senderPerms)
new MySqlParameter("sender_perms", ToStoredPermissions(senderPerms))
);
}
@ -75,7 +75,7 @@ public partial class MariaDBEventStorage(string connString) : EventStorage {
reader.IsDBNull(reader.GetOrdinal("event_sender_name")) ? string.Empty : reader.GetString("event_sender_name"),
ColourInheritable.FromMisuzu(reader.GetInt32("event_sender_colour")),
reader.GetInt32("event_sender_rank"),
(UserPermissions)reader.GetInt32("event_sender_perms"),
FromStoredPermissions((StoredUserPermissions)reader.GetInt32("event_sender_perms")),
reader.IsDBNull(reader.GetOrdinal("event_sender_nick")) ? string.Empty : reader.GetString("event_sender_nick")
),
DateTimeOffset.FromUnixTimeSeconds(reader.GetInt32("event_created")),

View file

@ -0,0 +1,88 @@
namespace SharpChat.EventStorage;
public partial class MariaDBEventStorage {
public static UserPermissions FromStoredPermissions(StoredUserPermissions sup) {
UserPermissions perms = 0;
if(sup.HasFlag(StoredUserPermissions.KickUser))
perms |= UserPermissions.KickUser;
if(sup.HasFlag(StoredUserPermissions.BanUser))
perms |= UserPermissions.BanUser;
if(sup.HasFlag(StoredUserPermissions.Broadcast))
perms |= UserPermissions.Broadcast;
if(sup.HasFlag(StoredUserPermissions.SetOwnNickname))
perms |= UserPermissions.SetOwnNickname;
if(sup.HasFlag(StoredUserPermissions.SetOthersNickname))
perms |= UserPermissions.SetOthersNickname;
if(sup.HasFlag(StoredUserPermissions.CreateChannel))
perms |= UserPermissions.CreateChannel;
if(sup.HasFlag(StoredUserPermissions.DeleteChannel))
perms |= UserPermissions.DeleteChannel;
if(sup.HasFlag(StoredUserPermissions.SetChannelPermanent))
perms |= UserPermissions.SetChannelPermanent;
if(sup.HasFlag(StoredUserPermissions.SetChannelPassword))
perms |= UserPermissions.SetChannelPassword;
if(sup.HasFlag(StoredUserPermissions.SetChannelHierarchy))
perms |= UserPermissions.SetChannelHierarchy;
if(sup.HasFlag(StoredUserPermissions.JoinAnyChannel))
perms |= UserPermissions.JoinAnyChannel;
if(sup.HasFlag(StoredUserPermissions.SendMessage))
perms |= UserPermissions.SendMessage;
if(sup.HasFlag(StoredUserPermissions.DeleteOwnMessage))
perms |= UserPermissions.DeleteOwnMessage;
if(sup.HasFlag(StoredUserPermissions.DeleteAnyMessage))
perms |= UserPermissions.DeleteAnyMessage;
if(sup.HasFlag(StoredUserPermissions.EditOwnMessage))
perms |= UserPermissions.EditOwnMessage;
if(sup.HasFlag(StoredUserPermissions.EditAnyMessage))
perms |= UserPermissions.EditAnyMessage;
if(sup.HasFlag(StoredUserPermissions.SeeIPAddress))
perms |= UserPermissions.SeeIPAddress;
if(sup.HasFlag(StoredUserPermissions.ViewLogs))
perms |= UserPermissions.ViewLogs;
return perms;
}
public static StoredUserPermissions ToStoredPermissions(UserPermissions up) {
StoredUserPermissions perms = 0;
if(up.HasFlag(UserPermissions.KickUser))
perms |= StoredUserPermissions.KickUser;
if(up.HasFlag(UserPermissions.BanUser))
perms |= StoredUserPermissions.BanUser;
if(up.HasFlag(UserPermissions.Broadcast))
perms |= StoredUserPermissions.Broadcast;
if(up.HasFlag(UserPermissions.SetOwnNickname))
perms |= StoredUserPermissions.SetOwnNickname;
if(up.HasFlag(UserPermissions.SetOthersNickname))
perms |= StoredUserPermissions.SetOthersNickname;
if(up.HasFlag(UserPermissions.CreateChannel))
perms |= StoredUserPermissions.CreateChannel;
if(up.HasFlag(UserPermissions.DeleteChannel))
perms |= StoredUserPermissions.DeleteChannel;
if(up.HasFlag(UserPermissions.SetChannelPermanent))
perms |= StoredUserPermissions.SetChannelPermanent;
if(up.HasFlag(UserPermissions.SetChannelPassword))
perms |= StoredUserPermissions.SetChannelPassword;
if(up.HasFlag(UserPermissions.SetChannelHierarchy))
perms |= StoredUserPermissions.SetChannelHierarchy;
if(up.HasFlag(UserPermissions.JoinAnyChannel))
perms |= StoredUserPermissions.JoinAnyChannel;
if(up.HasFlag(UserPermissions.SendMessage))
perms |= StoredUserPermissions.SendMessage;
if(up.HasFlag(UserPermissions.DeleteOwnMessage))
perms |= StoredUserPermissions.DeleteOwnMessage;
if(up.HasFlag(UserPermissions.DeleteAnyMessage))
perms |= StoredUserPermissions.DeleteAnyMessage;
if(up.HasFlag(UserPermissions.EditOwnMessage))
perms |= StoredUserPermissions.EditOwnMessage;
if(up.HasFlag(UserPermissions.EditAnyMessage))
perms |= StoredUserPermissions.EditAnyMessage;
if(up.HasFlag(UserPermissions.SeeIPAddress))
perms |= StoredUserPermissions.SeeIPAddress;
if(up.HasFlag(UserPermissions.ViewLogs))
perms |= StoredUserPermissions.ViewLogs;
return perms;
}
}

View file

@ -0,0 +1,24 @@
namespace SharpChat.EventStorage;
[Flags]
public enum StoredUserPermissions : int {
KickUser = 0x00000001,
BanUser = 0x00000002,
//SilenceUser = 0x00000004,
Broadcast = 0x00000008,
SetOwnNickname = 0x00000010,
SetOthersNickname = 0x00000020,
CreateChannel = 0x00000040,
DeleteChannel = 0x00010000,
SetChannelPermanent = 0x00000080,
SetChannelPassword = 0x00000100,
SetChannelHierarchy = 0x00000200,
JoinAnyChannel = 0x00020000,
SendMessage = 0x00000400,
DeleteOwnMessage = 0x00000800,
DeleteAnyMessage = 0x00001000,
EditOwnMessage = 0x00002000,
EditAnyMessage = 0x00004000,
SeeIPAddress = 0x00008000,
ViewLogs = 0x00040000,
}

View file

@ -1,23 +1,26 @@
namespace SharpChat;
[Flags]
public enum UserPermissions : int {
KickUser = 0x00000001,
BanUser = 0x00000002,
Broadcast = 0x00000008,
SetOwnNickname = 0x00000010,
SetOthersNickname = 0x00000020,
CreateChannel = 0x00000040,
DeleteChannel = 0x00010000,
SetChannelPermanent = 0x00000080,
SetChannelPassword = 0x00000100,
SetChannelHierarchy = 0x00000200,
JoinAnyChannel = 0x00020000,
SendMessage = 0x00000400,
DeleteOwnMessage = 0x00000800,
DeleteAnyMessage = 0x00001000,
EditOwnMessage = 0x00002000,
EditAnyMessage = 0x00004000,
SeeIPAddress = 0x00008000,
ViewLogs = 0x00040000,
public enum UserPermissions : ulong {
SendMessage = 1ul,
DeleteOwnMessage = 1ul << 2,
DeleteAnyMessage = 1ul << 3,
EditOwnMessage = 1ul << 4,
EditAnyMessage = 1ul << 5,
Broadcast = 1ul << 6,
ViewLogs = 1ul << 7,
KickUser = 1ul << 10,
BanUser = 1ul << 11,
SeeIPAddress = 1ul << 12,
CreateChannel = 1ul << 20,
SetChannelPermanent = 1ul << 21,
SetChannelPassword = 1ul << 22,
SetChannelHierarchy = 1ul << 23,
DeleteChannel = 1ul << 24,
JoinAnyChannel = 1ul << 25,
SetOwnNickname = 1ul << 30,
SetOthersNickname = 1ul << 31,
}