diff --git a/LuskiServer/Classes/LuskiFunctions.cs b/LuskiServer/Classes/LuskiFunctions.cs index b2c8221..8002b35 100644 --- a/LuskiServer/Classes/LuskiFunctions.cs +++ b/LuskiServer/Classes/LuskiFunctions.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using System.Security.Cryptography; using System.Text; using System.Text.Json; @@ -165,6 +166,18 @@ public static class LuskiFunctions dbConnection.Close(); return Members.ToArray(); } + + public static long[] GetCategoryChannels(long Category, long User) + { + List chans = new(); + long[] channels = Tables.Channels.ReadColumn(Channels.ID, Channels.Parent.CreateParameter(Category)); + for (int i = 0; i < channels.Length; i++) + { + if (HasAccessToChannel(User, channels[i])) chans.Add(channels[i]); + } + + return chans.ToArray(); + } public static bool HasPermissions(long User, ServerPermission RequiredPerms) { @@ -190,8 +203,10 @@ public static class LuskiFunctions ServerPermission BadPermissions = ServerPermission.None; ServerPermission GoodPerms = ServerPermission.None; - long[] CatUserOverides = Tables.Categories.Read(Categories.UserOverrides, Categories.ID.CreateParameter(Category)); - foreach (long CatUserOveride in CatUserOverides) + (long[], long[]) crow = Tables.Categories.CreateCommand().WithFilter(Categories.ID, Category) + .Read(Categories.UserOverrides, Categories.RoleOverrides); + + foreach (long CatUserOveride in crow.Item1) { if (!Tables.UserRoleOverrides.TryReadRow(out UserRoleOverrideRow row, UserRoleOverrides.ID.CreateParameter(CatUserOveride), UserRoleOverrides.UserID.CreateParameter(User))) continue; if (!row.BadPermissions.HasPermission(ServerPermission.ViewThis)) @@ -203,39 +218,48 @@ public static class LuskiFunctions BadPermissions |= row.BadPermissions; GoodPerms |= row.GoodPermissions; } - long[] CatRoleOverides = Tables.Categories.Read(Categories.RoleOverrides, Categories.ID.CreateParameter(Category)); - foreach (long CatRoleOveride in CatRoleOverides) + + int bad_index = -1; + int good_index = -1; + + foreach (long CatRoleOveride in crow.Item2) { - if (!UserRoleIDList.Contains(CatRoleOveride)) continue; ServerRoleOverrideRow row = Tables.ServerRoleOverrides.ReadRow(ServerRoleOverrides.ID.CreateParameter(CatRoleOveride)); + if (!UserRoleIDList.Contains(row.RoleID)) continue; + int i = Tables.Roles.Read(Roles.Index, Roles.ID.CreateParameter(row.RoleID)); if (!row.BadPermissions.HasPermission(ServerPermission.ViewThis) && !GoodPerms.HasPermission(ServerPermission.ViewThis)) { - missing = ServerPermission.ViewThis; - return false; + if (bad_index < i) + bad_index = i; } + else good_index = i; - BadPermissions |= (GoodPerms ^ row.BadPermissions); + BadPermissions |= row.BadPermissions; GoodPerms |= row.GoodPermissions; } - + + if (bad_index > good_index) + { + missing = ServerPermission.ViewThis; + return false; + } foreach (long RoleID in UserRoleIDList) { ServerPermission pers = Tables.Roles.Read(Roles.ServerPermissions, Roles.ID.CreateParameter(RoleID)); - if (!pers.HasPermission(ServerPermission.ViewThis) && !GoodPerms.HasPermission(ServerPermission.ViewThis)) - { - missing = ServerPermission.ViewThis; - return false; - } - GoodPerms |= pers; } - + ServerPermission combine = GoodPerms ^ BadPermissions; missing = (combine ^ OptionalPerms) & OptionalPerms; + if (!combine.HasPermission(ServerPermission.ViewThis)) + { + missing |= ServerPermission.ViewThis; + return false; + } return true; } - public static bool HasAccessToCategory(long User, long Category, ServerPermission RequiredPerms) + public static bool HasAccessToCategory(long User, long Category, ServerPermission RequiredPerms = ServerPermission.ViewThis) { if (User == Tables.Server.Read(Server.Owner, Server.ID.CreateParameter(0))) return true; long[] UserRoleIDList = Tables.Users.Read(Users.Roles, Users.ID.CreateParameter(User)); @@ -244,62 +268,83 @@ public static class LuskiFunctions ServerPermission GoodPerms = ServerPermission.None; - long[] CatUserOverides = Tables.Categories.Read(Categories.UserOverrides, Categories.ID.CreateParameter(Category)); - foreach (long CatUserOveride in CatUserOverides) + (long[], long[]) crow = Tables.Categories.CreateCommand().WithFilter(Categories.ID, Category) + .Read(Categories.UserOverrides, Categories.RoleOverrides); + + foreach (long CatUserOveride in crow.Item1) { if (!Tables.UserRoleOverrides.TryReadRow(out UserRoleOverrideRow row, UserRoleOverrides.ID.CreateParameter(CatUserOveride), UserRoleOverrides.UserID.CreateParameter(User))) continue; if ((row.BadPermissions & RequiredPerms) > ServerPermission.None) return false; GoodPerms |= row.GoodPermissions; } - long[] CatRoleOverides = Tables.Categories.Read(Categories.RoleOverrides, Categories.ID.CreateParameter(Category)); - foreach (long CatRoleOveride in CatRoleOverides) + + int bad_index = -1; + int good_index = -1; + + foreach (long CatRoleOveride in crow.Item2) { - if (!UserRoleIDList.Contains(CatRoleOveride)) continue; ServerRoleOverrideRow row = Tables.ServerRoleOverrides.ReadRow(ServerRoleOverrides.ID.CreateParameter(CatRoleOveride)); - if (((row.BadPermissions & RequiredPerms) ^ GoodPerms) > ServerPermission.None) return false; + if (!UserRoleIDList.Contains(row.RoleID)) continue; + int i = Tables.Roles.Read(Roles.Index, Roles.ID.CreateParameter(row.RoleID)); + if (((row.BadPermissions & RequiredPerms) ^ GoodPerms) > ServerPermission.None) + { + if (bad_index < i) + bad_index = i; + } + else good_index = i; GoodPerms |= row.GoodPermissions; } - + if (bad_index > good_index) return false; foreach (long RoleID in UserRoleIDList) { ServerPermission pers = Tables.Roles.Read(Roles.ServerPermissions, Roles.ID.CreateParameter(RoleID)); - if (((pers & RequiredPerms) ^ GoodPerms) > ServerPermission.None) return false; GoodPerms |= pers; } return GoodPerms.HasPermission(RequiredPerms); } - public static bool HasAccessToChannel(long User, long Channel, ServerPermission RequiredPerms) + public static bool HasAccessToChannel(long User, long Channel, ServerPermission RequiredPerms = ServerPermission.ViewThis) { + if (User == Tables.Server.Read(Server.Owner, Server.ID.CreateParameter(0))) return true; long[] UserRoleIDList = Tables.Users.Read(Users.Roles, Users.ID.CreateParameter(User)); RequiredPerms |= ServerPermission.ViewThis; ServerPermission GoodPerms = ServerPermission.None; + + (long[], long[]) crow = Tables.Channels.CreateCommand().WithFilter(Channels.ID, Channel) + .Read(Channels.UserOverrides, Channels.RoleOverrides); - long[] ChanUserOverides = Tables.Channels.Read(Channels.UserOverrides, Channels.ID.CreateParameter(Channel)); - long[] ChanRoleOverides = Tables.Channels.Read(Channels.RoleOverrides, Channels.ID.CreateParameter(Channel)); - - foreach (long CatUserOveride in ChanUserOverides) + foreach (long CatUserOveride in crow.Item1) { if (!Tables.UserRoleOverrides.TryReadRow(out UserRoleOverrideRow row, UserRoleOverrides.ID.CreateParameter(CatUserOveride), UserRoleOverrides.UserID.CreateParameter(User))) continue; if ((row.BadPermissions & RequiredPerms) > ServerPermission.None) return false; GoodPerms |= row.GoodPermissions; } - foreach (long CatRoleOveride in ChanRoleOverides) + + int bad_index = -1; + int good_index = -1; + + foreach (long CatRoleOveride in crow.Item2) { - if (!UserRoleIDList.Contains(CatRoleOveride)) continue; ServerRoleOverrideRow row = Tables.ServerRoleOverrides.ReadRow(ServerRoleOverrides.ID.CreateParameter(CatRoleOveride)); - if (((row.BadPermissions & RequiredPerms) ^ GoodPerms) > ServerPermission.None) return false; + if (!UserRoleIDList.Contains(row.RoleID)) continue; + int i = Tables.Roles.Read(Roles.Index, Roles.ID.CreateParameter(row.RoleID)); + if (((row.BadPermissions & RequiredPerms) ^ GoodPerms) > ServerPermission.None) + { + if (bad_index < i) + bad_index = i; + } + else good_index = i; GoodPerms |= row.GoodPermissions; } + if (bad_index > good_index) return false; foreach (long RoleID in UserRoleIDList) { ServerPermission pers = Tables.Roles.Read(Roles.ServerPermissions, Roles.ID.CreateParameter(RoleID)); - if (((pers & RequiredPerms) ^ GoodPerms) > ServerPermission.None) return false; GoodPerms |= pers; } diff --git a/LuskiServer/Classes/ServerComs/WSS.cs b/LuskiServer/Classes/ServerComs/WSS.cs index 543dddf..e9a0ac8 100644 --- a/LuskiServer/Classes/ServerComs/WSS.cs +++ b/LuskiServer/Classes/ServerComs/WSS.cs @@ -79,7 +79,11 @@ public static class WSS string Token = $"{Convert.ToBase64String(Encoding.UTF8.GetBytes(row.User.ToString()))}.{Convert.ToBase64String(Encoding.UTF8.GetBytes(row.ID.ToString()))}.{Convert.ToBase64String(Encoding.UTF8.GetBytes(DateTime.UtcNow.ToString()))}.{Convert.ToBase64String(Encoding.UTF8.GetBytes(new Random().Next(0, 1000000).ToString()))}.{Convert.ToBase64String(Encoding.UTF8.GetBytes(new Random().Next(0, 1000000).ToString()))}"; te.Token = Token; te.Type = DataType.Token; - Tables.Sessions.Update(TableDef.Sessions.ID, row.ID, TableDef.Sessions.LoginToken.CreateParameter(string.Empty), TableDef.Sessions.Token.CreateParameter(Token), TableDef.Sessions.WSSTCP.CreateParameter(ID)); + Tables.Sessions.CreateCommand() + .WithFilter(TableDef.Sessions.ID, row.ID) + .WithValue(TableDef.Sessions.LoginToken, string.Empty) + .WithValue(TableDef.Sessions.Token, Token) + .WithValue(TableDef.Sessions.WSSTCP, ID).Update(); Token = $"{Convert.ToBase64String(Encoding.UTF8.GetBytes(row.User.ToString()))}.{Convert.ToBase64String(Encoding.UTF8.GetBytes(DateTime.UtcNow.ToString()))}.{Convert.ToBase64String(Encoding.UTF8.GetBytes(new Random().Next(0, 1000000).ToString()))}.{Convert.ToBase64String(Encoding.UTF8.GetBytes(new Random().Next(0, 1000000).ToString()))}"; te.SessionToken = Token; Tables.SessionTokens.Insert( diff --git a/LuskiServer/Classes/TableDef/AltServers.cs b/LuskiServer/Classes/TableDef/AltServers.cs index 0ad8d94..cdf7b70 100644 --- a/LuskiServer/Classes/TableDef/AltServers.cs +++ b/LuskiServer/Classes/TableDef/AltServers.cs @@ -5,9 +5,9 @@ namespace LuskiServer.Classes.TableDef; public static class AltServers { - public static TableColumn Address { get; } = new("address", true); - public static TableColumn Secure { get; }= new("secure"); - public static TableColumn Key { get; } = new("key"); + public static TableColumn Address { get; } = new("address", true); + public static TableColumn Secure { get; }= new("secure"); + public static TableColumn Key { get; } = new("key"); } [TableRow(typeof(AltServers))] diff --git a/LuskiServer/Classes/TableDef/Categories.cs b/LuskiServer/Classes/TableDef/Categories.cs index 8db4dbc..ef7fe49 100644 --- a/LuskiServer/Classes/TableDef/Categories.cs +++ b/LuskiServer/Classes/TableDef/Categories.cs @@ -7,19 +7,17 @@ namespace LuskiServer.Classes.TableDef; public static class Categories { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn Name { get; } = new("name") { DefaultValue = Encoding.UTF8.GetBytes("New Category") }; - public static TableColumn Color { get; } = new("color") { DefaultValue = new byte[]{255,255,255,255} }; - public static TableColumn Description { get; } = new("description") { DefaultValue = Encoding.UTF8.GetBytes("Description") }; - public static TableColumn Parent { get; } = new("parent") { DefaultValue = -1 }; - public static TableColumn InnerCategories { get; } = new("inner_categories") { DefaultValue = Array.Empty() }; - public static TableColumn Channels { get; } = new("channels") { DefaultValue = Array.Empty() }; - public static TableColumn RoleOverrides { get; } = new("role_overrides") { DefaultValue = Array.Empty() }; - public static TableColumn UserOverrides { get; } = new("member_overrides") { DefaultValue = Array.Empty() }; - public static TableColumn TitleEncryptionKey { get; } = new("title_encryption_key") { DefaultValue = 0 }; - public static TableColumn DescriptionEncryptionKey { get; } = new("description_encryption_key") { DefaultValue = 0 }; - public static TableColumn TitleEncoderType { get; } = new("title_encoder_type") { DefaultValue = EncoderType.UTF8 }; - public static TableColumn DescriptionEncoderType { get; } = new("description_encoder_type") { DefaultValue = EncoderType.UTF8 }; + public static TableColumn ID { get; } = new("id", true); + public static TableColumn Name { get; } = new("name") { DefaultValue = Encoding.UTF8.GetBytes("New Category") }; + public static TableColumn Color { get; } = new("color") { DefaultValue = new byte[]{255,255,255,255} }; + public static TableColumn Description { get; } = new("description") { DefaultValue = Encoding.UTF8.GetBytes("Description") }; + public static TableColumn Parent { get; } = new("parent") { DefaultValue = -1 }; + public static TableColumn RoleOverrides { get; } = new("role_overrides") { DefaultValue = Array.Empty() }; + public static TableColumn UserOverrides { get; } = new("member_overrides") { DefaultValue = Array.Empty() }; + public static TableColumn TitleEncryptionKey { get; } = new("title_encryption_key") { DefaultValue = 0 }; + public static TableColumn DescriptionEncryptionKey { get; } = new("description_encryption_key") { DefaultValue = 0 }; + public static TableColumn TitleEncoderType { get; } = new("title_encoder_type") { DefaultValue = EncoderType.UTF8 }; + public static TableColumn DescriptionEncoderType { get; } = new("description_encoder_type") { DefaultValue = EncoderType.UTF8 }; } [TableRow(typeof(Categories))] public partial class CategoryRow diff --git a/LuskiServer/Classes/TableDef/ChannelProfiles.cs b/LuskiServer/Classes/TableDef/ChannelProfiles.cs index 578c583..6b662d3 100644 --- a/LuskiServer/Classes/TableDef/ChannelProfiles.cs +++ b/LuskiServer/Classes/TableDef/ChannelProfiles.cs @@ -7,12 +7,12 @@ namespace LuskiServer.Classes.TableDef; public class ChannelProfiles { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn DisplayName { get; } = new("displayname"); - public static TableColumn Controllers { get; } = new("controllers") {DefaultValue = Array.Empty()}; - public static TableColumn PictureType { get; } = new("picture_type") {DefaultValue = bob.png }; - public static TableColumn Picture { get; } = new("picture"); - public static TableColumn Color { get; } = new("color") { DefaultValue = new byte[]{255,255,255,255}}; + public static TableColumn ID { get; } = new("id", true); + public static TableColumn DisplayName { get; } = new("displayname"); + public static TableColumn Controllers { get; } = new("controllers") {DefaultValue = Array.Empty()}; + public static TableColumn PictureType { get; } = new("picture_type") {DefaultValue = bob.png }; + public static TableColumn Picture { get; } = new("picture"); + public static TableColumn Color { get; } = new("color") { DefaultValue = new byte[]{255,255,255,255}}; } [TableRow(typeof(ChannelProfiles))] diff --git a/LuskiServer/Classes/TableDef/Channels.cs b/LuskiServer/Classes/TableDef/Channels.cs index 730c5ce..9119b1e 100644 --- a/LuskiServer/Classes/TableDef/Channels.cs +++ b/LuskiServer/Classes/TableDef/Channels.cs @@ -10,30 +10,30 @@ namespace LuskiServer.Classes.TableDef; public static class Channels { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn Parent { get; } = new("parent") { DefaultValue = -1 }; - public static TableColumn Color { get; } = new("color") {DefaultValue = new byte[]{255,255,255,255} }; - public static TableColumn Type { get; } = new("type"); - public static TableColumn Epoch { get; } = new("epoch"); - public static TableColumn Name { get; } = new("name") { DefaultValue = Encoding.UTF8.GetBytes("New Channel") }; - public static TableColumn Description { get; } = new("description") { DefaultValue = Encoding.UTF8.GetBytes("New Channel") }; - public static TableColumn RoleOverrides { get; } = new("role_overrides") { DefaultValue = Array.Empty() }; - public static TableColumn UserOverrides { get; } = new("member_overrides") { DefaultValue = Array.Empty() }; - public static TableColumn TitleEncryptionKey { get; } = new("title_encryption_key") { DefaultValue = 0 }; - public static TableColumn DescriptionEncryptionKey { get; } = new("description_encryption_key") { DefaultValue = 0 }; - public static TableColumn EncryptionKeys { get; } = new("encryption_keys") { DefaultValue = new long[]{0} }; - public static TableColumn TitleEncoderType { get; } = new("title_encoder_type") { DefaultValue = EncoderType.UTF8 }; - public static TableColumn DescriptionEncoderType { get; } = new("description_encoder_type") { DefaultValue = EncoderType.UTF8 }; - public static TableColumn PictureType { get; } = new("picture_type") {DefaultValue = bob.png }; - public static TableColumn Picture { get; } = new("picture"); - public static TableColumn EncoderTypes { get; } = new("encoder_types") { DefaultValue = new [] + public static TableColumn ID { get; } = new("id", true); + public static TableColumn Parent { get; } = new("parent") { DefaultValue = -1 }; + public static TableColumn Color { get; } = new("color") {DefaultValue = new byte[]{255,255,255,255} }; + public static TableColumn Type { get; } = new("type"); + public static TableColumn Epoch { get; } = new("epoch"); + public static TableColumn Name { get; } = new("name") { DefaultValue = Encoding.UTF8.GetBytes("New Channel") }; + public static TableColumn Description { get; } = new("description") { DefaultValue = Encoding.UTF8.GetBytes("New Channel") }; + public static TableColumn RoleOverrides { get; } = new("role_overrides") { DefaultValue = Array.Empty() }; + public static TableColumn UserOverrides { get; } = new("member_overrides") { DefaultValue = Array.Empty() }; + public static TableColumn TitleEncryptionKey { get; } = new("title_encryption_key") { DefaultValue = 0 }; + public static TableColumn DescriptionEncryptionKey { get; } = new("description_encryption_key") { DefaultValue = 0 }; + public static TableColumn EncryptionKeys { get; } = new("encryption_keys") { DefaultValue = new long[]{0} }; + public static TableColumn TitleEncoderType { get; } = new("title_encoder_type") { DefaultValue = EncoderType.UTF8 }; + public static TableColumn DescriptionEncoderType { get; } = new("description_encoder_type") { DefaultValue = EncoderType.UTF8 }; + public static TableColumn PictureType { get; } = new("picture_type") {DefaultValue = bob.png }; + public static TableColumn Picture { get; } = new("picture"); + public static TableColumn EncoderTypes { get; } = new("encoder_types") { DefaultValue = new [] { EncoderType.UTF8, EncoderType.UTF16, EncoderType.UTF32, EncoderType.ASCII, EncoderType.Latin1, EncoderType.BigEndianUnicode } }; - public static TableColumn Profiles { get; } = new("profiles") { DefaultValue = Array.Empty() }; + public static TableColumn Profiles { get; } = new("profiles") { DefaultValue = Array.Empty() }; } [TableRow(typeof(Channels))] diff --git a/LuskiServer/Classes/TableDef/Files.cs b/LuskiServer/Classes/TableDef/Files.cs index 8a90003..a1f038e 100644 --- a/LuskiServer/Classes/TableDef/Files.cs +++ b/LuskiServer/Classes/TableDef/Files.cs @@ -6,18 +6,18 @@ namespace LuskiServer.Classes.TableDef; public static class Files { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn Owner { get; } = new("owner"); - public static TableColumn Public { get; } = new("public_download"); - public static TableColumn AllowedChannels { get; } = new("channels"); - public static TableColumn Size { get; } = new("size"); - public static TableColumn Name { get; } = new("name"); - public static TableColumn Hash { get; } = new("hash"); - public static TableColumn Data { get; } = new("data"); - public static TableColumn EncryptionKey { get; } = new("encryption_key"); - public static TableColumn EncoderType { get; } = new("encoder_type"); - public static TableColumn NameEncryptionKey { get; } = new("name_encryption_key"); - public static TableColumn NameEncoderType { get; } = new("name_encoder_type"); + public static TableColumn ID { get; } = new("id", true); + public static TableColumn Owner { get; } = new("owner"); + public static TableColumn Public { get; } = new("public_download"); + public static TableColumn AllowedChannels { get; } = new("channels"); + public static TableColumn Size { get; } = new("size"); + public static TableColumn Name { get; } = new("name"); + public static TableColumn Hash { get; } = new("hash"); + public static TableColumn Data { get; } = new("data"); + public static TableColumn EncryptionKey { get; } = new("encryption_key"); + public static TableColumn EncoderType { get; } = new("encoder_type"); + public static TableColumn NameEncryptionKey { get; } = new("name_encryption_key"); + public static TableColumn NameEncoderType { get; } = new("name_encoder_type"); } [TableRow(typeof(Files))] diff --git a/LuskiServer/Classes/TableDef/Keys.cs b/LuskiServer/Classes/TableDef/Keys.cs index b7eab03..7d1c13e 100644 --- a/LuskiServer/Classes/TableDef/Keys.cs +++ b/LuskiServer/Classes/TableDef/Keys.cs @@ -6,10 +6,10 @@ namespace LuskiServer.Classes.TableDef; public static class Keys { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn Owner { get; } = new("owner"); - public static TableColumn EncryptionType { get; } = new("encryption_type"); - public static TableColumn KeyData { get; } = new("key_data"); + public static TableColumn ID { get; } = new("id", true); + public static TableColumn Owner { get; } = new("owner"); + public static TableColumn EncryptionType { get; } = new("encryption_type"); + public static TableColumn KeyData { get; } = new("key_data"); } [TableRow(typeof(Keys))] diff --git a/LuskiServer/Classes/TableDef/Logs.cs b/LuskiServer/Classes/TableDef/Logs.cs index 30a98a9..d02c18b 100644 --- a/LuskiServer/Classes/TableDef/Logs.cs +++ b/LuskiServer/Classes/TableDef/Logs.cs @@ -6,9 +6,9 @@ namespace LuskiServer.Classes.TableDef; public static class Logs { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn Type { get; } = new("type"); - public static TableColumn Message { get; } = new("message"); + public static TableColumn ID { get; } = new("id", true); + public static TableColumn Type { get; } = new("type"); + public static TableColumn Message { get; } = new("message"); } [TableRow(typeof(Logs))] diff --git a/LuskiServer/Classes/TableDef/Messages.cs b/LuskiServer/Classes/TableDef/Messages.cs index 385cefe..2b5aca7 100644 --- a/LuskiServer/Classes/TableDef/Messages.cs +++ b/LuskiServer/Classes/TableDef/Messages.cs @@ -6,15 +6,15 @@ namespace LuskiServer.Classes.TableDef; public static class Messages { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn ChannelID { get; } = new("channel_id", true); - public static TableColumn AuthorID { get; } = new("author_id"); - public static TableColumn Context { get; } = new("context"); - public static TableColumn EncryptionKey { get; } = new("encryption_key"); - public static TableColumn EncoderType { get; } = new("encoder_type"); - public static TableColumn Files { get; } = new("files"); - public static TableColumn IsChannelProfile { get; } = new("is_channel_profile") { DefaultValue = false }; - public static TableColumn ReplyTo { get; } = new("reply_to"); + public static TableColumn ID { get; } = new("id", true); + public static TableColumn ChannelID { get; } = new("channel_id", true); + public static TableColumn AuthorID { get; } = new("author_id"); + public static TableColumn Context { get; } = new("context"); + public static TableColumn EncryptionKey { get; } = new("encryption_key"); + public static TableColumn EncoderType { get; } = new("encoder_type"); + public static TableColumn Files { get; } = new("files"); + public static TableColumn IsChannelProfile { get; } = new("is_channel_profile") { DefaultValue = false }; + public static TableColumn ReplyTo { get; } = new("reply_to"); } [TableRow(typeof(Messages))] diff --git a/LuskiServer/Classes/TableDef/Roles.cs b/LuskiServer/Classes/TableDef/Roles.cs index be89536..7816cde 100644 --- a/LuskiServer/Classes/TableDef/Roles.cs +++ b/LuskiServer/Classes/TableDef/Roles.cs @@ -7,14 +7,14 @@ namespace LuskiServer.Classes.TableDef; public static class Roles { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn Name { get; } = new("name"); - public static TableColumn DisplayName { get; } = new("display_name") {DefaultValue = string.Empty}; - public static TableColumn Index { get; } = new("index") {DefaultValue = 0 }; - public static TableColumn Color { get; } = new("color") {DefaultValue = new byte[]{255,255,255,255}}; - public static TableColumn Description { get; } = new("description"); - public static TableColumn ServerPermissions { get; } = new("server_perms"); - public static TableColumn MembersList { get; } = new("members_list") {DefaultValue = Array.Empty()}; + public static TableColumn ID { get; } = new("id", true); + public static TableColumn Name { get; } = new("name"); + public static TableColumn DisplayName { get; } = new("display_name") {DefaultValue = string.Empty}; + public static TableColumn Index { get; } = new("index") {DefaultValue = 0 }; + public static TableColumn Color { get; } = new("color") {DefaultValue = new byte[]{255,255,255,255}}; + public static TableColumn Description { get; } = new("description"); + public static TableColumn ServerPermissions { get; } = new("server_perms"); + public static TableColumn MembersList { get; } = new("members_list") {DefaultValue = Array.Empty()}; } [TableRow(typeof(Roles))] diff --git a/LuskiServer/Classes/TableDef/Server.cs b/LuskiServer/Classes/TableDef/Server.cs index 0e4ce86..6143038 100644 --- a/LuskiServer/Classes/TableDef/Server.cs +++ b/LuskiServer/Classes/TableDef/Server.cs @@ -9,12 +9,12 @@ namespace LuskiServer.Classes.TableDef; public static class Server { - public static TableColumn ID { get; } = new("id", true) { DefaultValue = 0 }; - public static TableColumn PictureType { get; } = new("picture_type") {DefaultValue = bob.png }; - public static TableColumn Picture { get; } = new("picture") { DefaultValue = Array.Empty() }; - public static TableColumn Name { get; } = new("name") { DefaultValue = "Luski Server" }; - public static TableColumn Description { get; } = new("description") { DefaultValue = "description" }; - public static TableColumn Owner { get; } = new("owner") { DefaultValue = -1 }; + public static TableColumn ID { get; } = new("id", true) { DefaultValue = 0 }; + public static TableColumn PictureType { get; } = new("picture_type") {DefaultValue = bob.png }; + public static TableColumn Picture { get; } = new("picture") { DefaultValue = Array.Empty() }; + public static TableColumn Name { get; } = new("name") { DefaultValue = "Luski Server" }; + public static TableColumn Description { get; } = new("description") { DefaultValue = "description" }; + public static TableColumn Owner { get; } = new("owner") { DefaultValue = -1 }; } [TableRow(typeof(Server))] diff --git a/LuskiServer/Classes/TableDef/ServerRoleOverides.cs b/LuskiServer/Classes/TableDef/ServerRoleOverides.cs index 1c43ec7..f61f0ad 100644 --- a/LuskiServer/Classes/TableDef/ServerRoleOverides.cs +++ b/LuskiServer/Classes/TableDef/ServerRoleOverides.cs @@ -6,10 +6,10 @@ namespace LuskiServer.Classes.TableDef; public static class ServerRoleOverrides { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn RoleID { get; } = new("role_id"); - public static TableColumn BadPermissions { get; } = new("bad_permissions"); - public static TableColumn GoodPermissions { get; } = new("good_permissions"); + public static TableColumn ID { get; } = new("id", true); + public static TableColumn RoleID { get; } = new("role_id"); + public static TableColumn BadPermissions { get; } = new("bad_permissions"); + public static TableColumn GoodPermissions { get; } = new("good_permissions"); } [TableRow(typeof(ServerRoleOverrides))] diff --git a/LuskiServer/Classes/TableDef/SessionTokens.cs b/LuskiServer/Classes/TableDef/SessionTokens.cs index 09d9ce2..91f2f5e 100644 --- a/LuskiServer/Classes/TableDef/SessionTokens.cs +++ b/LuskiServer/Classes/TableDef/SessionTokens.cs @@ -5,11 +5,11 @@ namespace LuskiServer.Classes.TableDef; public static class SessionTokens { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn AccountID { get; } = new("account_id"); - public static TableColumn Token { get; } = new("token"); - public static TableColumn AddressFilter { get; } = new("address_filter"); - public static TableColumn TimeFilter { get; } = new("date_filter"); + public static TableColumn ID { get; } = new("id", true); + public static TableColumn AccountID { get; } = new("account_id"); + public static TableColumn Token { get; } = new("token"); + public static TableColumn AddressFilter { get; } = new("address_filter"); + public static TableColumn TimeFilter { get; } = new("date_filter"); } [TableRow(typeof(SessionTokens))] diff --git a/LuskiServer/Classes/TableDef/Sessions.cs b/LuskiServer/Classes/TableDef/Sessions.cs index 18d472d..4a00fef 100644 --- a/LuskiServer/Classes/TableDef/Sessions.cs +++ b/LuskiServer/Classes/TableDef/Sessions.cs @@ -7,16 +7,13 @@ namespace LuskiServer.Classes.TableDef; public static class Sessions { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn User { get; } = new("userid") - {ForeignKeys = new IForeignKey[]{ new ForeignKey(){Table = Tables.Users, Column = Users.ID}}}; - public static TableColumn WSSTCP { get; } = new("wsstcp"); - public static TableColumn Token { get; } = new("token"); - public static TableColumn LoginToken { get; } = new("login_token"); - public static TableColumn SessionKey { get; } = new("session_key") - {ForeignKeys = new IForeignKey[]{ new ForeignKey(){Table = Tables.Keys, Column = Keys.ID, OnDelete = ConstraintAction.Cascade}}}; - - public static TableColumn StorageID { get; } = new("storage_id"); + public static TableColumn ID { get; } = new("id", true); + public static TableColumn User { get; } = new("userid"); + public static TableColumn WSSTCP { get; } = new("wsstcp"); + public static TableColumn Token { get; } = new("token"); + public static TableColumn LoginToken { get; } = new("login_token"); + public static TableColumn SessionKey { get; } = new("session_key"); + public static TableColumn StorageID { get; } = new("storage_id"); } [TableRow(typeof(Sessions))] diff --git a/LuskiServer/Classes/TableDef/Storage.cs b/LuskiServer/Classes/TableDef/Storage.cs index ef60a7f..de20fa2 100644 --- a/LuskiServer/Classes/TableDef/Storage.cs +++ b/LuskiServer/Classes/TableDef/Storage.cs @@ -5,11 +5,11 @@ namespace LuskiServer.Classes.TableDef; public static class Storage { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn AccountID { get; } = new("account_id"); - public static TableColumn Data { get; } = new("data"); - public static TableColumn Password { get; } = new("password"); - public static TableColumn OffileKey { get; } = new("offline_key"); + public static TableColumn ID { get; } = new("id", true); + public static TableColumn AccountID { get; } = new("account_id"); + public static TableColumn Data { get; } = new("data"); + public static TableColumn Password { get; } = new("password"); + public static TableColumn OffileKey { get; } = new("offline_key"); } [TableRow(typeof(Storage))] diff --git a/LuskiServer/Classes/TableDef/UserRoleOverides.cs b/LuskiServer/Classes/TableDef/UserRoleOverides.cs index 7e220ab..5c76fd0 100644 --- a/LuskiServer/Classes/TableDef/UserRoleOverides.cs +++ b/LuskiServer/Classes/TableDef/UserRoleOverides.cs @@ -7,10 +7,10 @@ namespace LuskiServer.Classes.TableDef; public static class UserRoleOverrides { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn UserID { get; } = new("user_id"); - public static TableColumn BadPermissions { get; } = new("bad_permissions"); - public static TableColumn GoodPermissions { get; } = new("good_permissions"); + public static TableColumn ID { get; } = new("id", true); + public static TableColumn UserID { get; } = new("user_id"); + public static TableColumn BadPermissions { get; } = new("bad_permissions"); + public static TableColumn GoodPermissions { get; } = new("good_permissions"); } [TableRow(typeof(UserRoleOverrides))] diff --git a/LuskiServer/Classes/TableDef/Users.cs b/LuskiServer/Classes/TableDef/Users.cs index f872023..fa045bd 100644 --- a/LuskiServer/Classes/TableDef/Users.cs +++ b/LuskiServer/Classes/TableDef/Users.cs @@ -2,6 +2,7 @@ using Luski.Shared.PublicServers.V1.Enums; using LuskiServer.Enums; using ServerDatabase; using ServerDatabase.SourceGenerator; +using ServerDatabase.Utils; using bob = Luski.Shared.PublicServers.V1.Enums.PictureType; @@ -9,16 +10,16 @@ namespace LuskiServer.Classes.TableDef; public class Users { - public static TableColumn ID { get; } = new("id", true); - public static TableColumn DisplayName { get; } = new("displayname"); - public static TableColumn SelectedChannel { get; } = new("selected_channel"); - public static TableColumn Status { get; } = new("status") { DefaultValue = UserStatus.Offline }; - public static TableColumn PictureType { get; } = new("picture_type") {DefaultValue = bob.png }; - public static TableColumn Picture { get; } = new("picture"); - public static TableColumn Roles { get; } = new("roles"); - public static TableColumn Username { get; } = new("username"); - public static TableColumn Password { get; } = new("password"); - public static TableColumn Salt { get; } = new("salt"); + public static TableColumn ID { get; } = new("id", true); + public static TableColumn DisplayName { get; } = new("displayname"); + public static TableColumn SelectedChannel { get; } = new("selected_channel"); + public static TableColumn Status { get; } = new("status") { DefaultValue = UserStatus.Offline }; + public static TableColumn PictureType { get; } = new("picture_type") {DefaultValue = bob.png }; + public static TableColumn Picture { get; } = new("picture"); + public static TableColumn Roles { get; } = new("roles"); + public static TableColumn Username { get; } = new("username"); + public static TableColumn Password { get; } = new("password"); + public static TableColumn Salt { get; } = new("salt"); } [TableRow(typeof(Users))] diff --git a/LuskiServer/Controllers/v1/KeysController.cs b/LuskiServer/Controllers/v1/KeysController.cs index d1691ee..761156f 100644 --- a/LuskiServer/Controllers/v1/KeysController.cs +++ b/LuskiServer/Controllers/v1/KeysController.cs @@ -220,8 +220,7 @@ public class KeysController : ControllerBase Keys.Owner.CreateParameter(ID), Keys.EncryptionType.CreateParameter(keyreq.EncryptionType), Keys.KeyData.CreateParameter(Convert.FromBase64String(keyreq.Data))); - Tables.Storage.Update(Storage.ID, StorageID, - Storage.OffileKey.CreateParameter(sf.ID)); + Tables.Storage.CreateCommand().WithFilter(Storage.ID, StorageID).WithValue(Storage.OffileKey, sf.ID); return StatusCode(202); } catch (Exception ex) diff --git a/LuskiServer/Controllers/v1/OfflineDataController.cs b/LuskiServer/Controllers/v1/OfflineDataController.cs index d666790..001052b 100644 --- a/LuskiServer/Controllers/v1/OfflineDataController.cs +++ b/LuskiServer/Controllers/v1/OfflineDataController.cs @@ -29,7 +29,7 @@ public class OfflineDataController : ControllerBase { bbb.Add(Convert.ToBase64String(blob)); } - Tables.Storage.Update(Storage.ID, SID, Storage.Data.CreateParameter(Array.Empty())); + Tables.Storage.CreateCommand().WithFilter(Storage.ID, SID).WithValue(Storage.Data, Array.Empty()).Update(); return this.ResponseToResult(new OfflineDataBlobSTC() { Data = bbb.ToArray() @@ -68,7 +68,7 @@ public class OfflineDataController : ControllerBase { update = true; } - Tables.Sessions.Update(Sessions.ID, SSID, Sessions.StorageID.CreateParameter(SID)); + Tables.Sessions.CreateCommand().WithFilter(Sessions.ID, SID).WithValue(Sessions.StorageID, SID).Update(); } return this.ResponseToResult(new StorageInfoSTC() { @@ -102,7 +102,7 @@ public class OfflineDataController : ControllerBase if (!Tables.Storage.TryReadRow(out StorageRow row, Storage.ID.CreateParameter(SID))) return this.ResponseCodeToResult(ErrorCode.InvalidHeader); if (row.AccountID != UID) return this.ResponseCodeToResult(ErrorCode.Forbidden); - Tables.Storage.Update(Storage.ID, SID, Storage.Password.CreateParameter(Convert.FromBase64String(si.Password))); + Tables.Storage.CreateCommand().WithFilter(Storage.ID, SID).WithValue(Storage.Password, Convert.FromBase64String(si.Password)).Update(); return this.ResponseToResult(new StorageInfoSTC() { @@ -132,7 +132,7 @@ public class OfflineDataController : ControllerBase Storage.AccountID.CreateParameter(UID), Storage.Data.CreateParameter(Array.Empty()), Storage.OffileKey.CreateParameter(0)); - Tables.Sessions.Update(Sessions.StorageID, sf.ID, Sessions.ID.CreateParameter(SSID)); + Tables.Sessions.CreateCommand().WithFilter(Sessions.ID, sf.ID).WithValue(Sessions.ID, SSID).Update(); return this.ResponseToResult(new StorageInfoSTC() { diff --git a/LuskiServer/Controllers/v1/SocketAccountController.cs b/LuskiServer/Controllers/v1/SocketAccountController.cs index f8e9c07..5d69fcd 100644 --- a/LuskiServer/Controllers/v1/SocketAccountController.cs +++ b/LuskiServer/Controllers/v1/SocketAccountController.cs @@ -75,7 +75,7 @@ public class SocketAccountController : Controller LuskiFunctions.Snowflake id = LuskiFunctions.Snowflake.GenerateSnowflake(LuskiFunctions.Config.ServerEpoch); long kid = id.ID; - Tables.Users.Update(Users.ID, ID, Users.Status.CreateParameter(UserStatus.Invisible)); + Tables.Users.CreateCommand().WithFilter(Users.ID, ID).WithValue(Users.Status, UserStatus.Invisible).Update(); Tables.Keys.Insert( Keys.ID.CreateParameter(kid), Keys.EncryptionType.CreateParameter(EncryptionType.RSA), @@ -142,7 +142,7 @@ public class SocketAccountController : Controller Tables.SessionTokens.DeleteRow(SessionTokens.Token.CreateParameter(tok)); LuskiFunctions.Snowflake id = LuskiFunctions.Snowflake.GenerateSnowflake(LuskiFunctions.Config.ServerEpoch); long kid = id.ID; - Tables.Users.Update(Users.ID, ID, Users.Status.CreateParameter(UserStatus.Invisible)); + Tables.Users.CreateCommand().WithFilter(Users.ID, ID).WithValue(Users.Status, UserStatus.Invisible).Update(); Console.WriteLine("C"); Tables.Keys.Insert( Keys.ID.CreateParameter(kid), @@ -230,7 +230,7 @@ public class SocketAccountController : Controller if (Tables.Server.Read(Server.Owner, Server.ID.CreateParameter(0)) == -1) { id = new(0); - Tables.Server.Update(Server.ID, 0, Server.Owner.CreateParameter(id.ID)); + Tables.Server.CreateCommand().WithValue(Server.Owner, id.ID).Update(); } byte[] ID = Encoding.UTF8.GetBytes(id.ID.ToString()); byte[] Timestamp = Encoding.UTF8.GetBytes(DateTime.UtcNow.ToString()); @@ -254,7 +254,7 @@ public class SocketAccountController : Controller Users.Salt.CreateParameter(salt)); List old = Tables.Roles.Read(Roles.MembersList, Roles.ID.CreateParameter(0)).ToList(); old.Add(uid); - Tables.Roles.Update(Roles.ID, 0, Roles.MembersList.CreateParameter(old.ToArray())); + Tables.Roles.CreateCommand().WithFilter(Roles.ID, 0).WithValue(Roles.MembersList,old.ToArray()).Update(); Console.WriteLine("A"); Tables.Keys.Insert( Keys.ID.CreateParameter(kid), diff --git a/LuskiServer/Controllers/v1/SocketCategoryController.cs b/LuskiServer/Controllers/v1/SocketCategoryController.cs index 2b19f94..2ba150b 100644 --- a/LuskiServer/Controllers/v1/SocketCategoryController.cs +++ b/LuskiServer/Controllers/v1/SocketCategoryController.cs @@ -64,21 +64,23 @@ public class SocketCategoryController : ControllerBase Categories.TitleEncoderType.CreateParameter(ChanReq.TitleEncoderType), Categories.DescriptionEncoderType.CreateParameter(ChanReq.DescriptionEncoderType)); CategoryRow chan = Tables.Categories.ReadRow(Categories.ID.CreateParameter(chanSnowflake.ID)); - if (opt.HasPermission(ServerPermission.ViewCategories)) + long[] ic = Array.Empty(); + long[] c = Array.Empty(); + if (!opt.HasPermission(ServerPermission.ViewCategories)) { - chan.InnerCategories = Array.Empty(); + ic = Tables.Categories.ReadColumn(Categories.ID, Categories.Parent.CreateParameter(chanSnowflake.ID)); } - if (opt.HasPermission(ServerPermission.ViewChannels)) + if (!opt.HasPermission(ServerPermission.ViewChannels)) { - chan.Channels = Array.Empty(); + c = LuskiFunctions.GetCategoryChannels(chanSnowflake.ID, ID); } return this.ResponseToResult(new CategorySTC() { Name = Convert.ToBase64String(chan.Name), Description = Convert.ToBase64String(chan.Description), ID = chanSnowflake.ID, - Channels = chan.Channels, - InnerCategories = chan.InnerCategories, + Channels = c, + InnerCategories = ic, Parent = chan.Parent, TitleEncryptionKey = chan.TitleEncryptionKey, DescriptionEncryptionKey = chan.DescriptionEncryptionKey, @@ -129,21 +131,28 @@ public class SocketCategoryController : ControllerBase if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; if (!LuskiFunctions.HasAccessToCategory(ID, Channel, out ServerPermission opt, ServerPermission.ViewCategories | ServerPermission.ViewChannels)) return this.ResponseCodeToResult(ErrorCode.Forbidden); CategoryRow chan = Tables.Categories.ReadRow(Categories.ID.CreateParameter(Channel)); - if (opt.HasPermission(ServerPermission.ViewCategories)) + List ic = new(); + long[] c = Array.Empty(); + if (!opt.HasPermission(ServerPermission.ViewCategories)) { - chan.InnerCategories = Array.Empty(); + ic = Tables.Categories.ReadColumn(Categories.ID, Categories.Parent.CreateParameter(Channel)).ToList(); } - if (opt.HasPermission(ServerPermission.ViewChannels)) + if (!opt.HasPermission(ServerPermission.ViewChannels)) { - chan.Channels = Array.Empty(); + c = LuskiFunctions.GetCategoryChannels(Channel, ID); + } + + foreach (long cc in ic) + { + if (!LuskiFunctions.HasAccessToChannel(ID, cc)) ic.Remove(cc); } return this.ResponseToResult(new CategorySTC() { Name = Convert.ToBase64String(chan.Name), Description = Convert.ToBase64String(chan.Description), ID = Channel, - Channels = chan.Channels, - InnerCategories = chan.InnerCategories, + Channels = c, + InnerCategories = ic.ToArray(), Parent = chan.Parent, TitleEncryptionKey = chan.TitleEncryptionKey, DescriptionEncryptionKey = chan.DescriptionEncryptionKey, diff --git a/LuskiServer/Controllers/v1/SocketChannelController.cs b/LuskiServer/Controllers/v1/SocketChannelController.cs index e9737b4..4642b02 100644 --- a/LuskiServer/Controllers/v1/SocketChannelController.cs +++ b/LuskiServer/Controllers/v1/SocketChannelController.cs @@ -70,10 +70,6 @@ public class SocketChannelController : ControllerBase Channels.Picture.CreateParameter(Array.Empty()), Channels.EncoderTypes.CreateParameter(ChanReq.EncoderTypes), Channels.Profiles.CreateParameter(Array.Empty())); - List lll = Tables.Categories.Read(Categories.Channels, Categories.ID.CreateParameter(ChanReq.Parent)) - .ToList(); - lll.Add(chanSnowflake.ID); - Tables.Categories.Update(Categories.ID, ChanReq.Parent, Categories.Channels.CreateParameter(lll.ToArray())); ChannelRow chan = Tables.Channels.ReadRow(Channels.ID.CreateParameter(chanSnowflake.ID)); return this.ResponseToResult(new ChannelSTC() diff --git a/LuskiServer/Controllers/v1/SocketFileController.cs b/LuskiServer/Controllers/v1/SocketFileController.cs index 55403de..8019009 100644 --- a/LuskiServer/Controllers/v1/SocketFileController.cs +++ b/LuskiServer/Controllers/v1/SocketFileController.cs @@ -51,13 +51,15 @@ public class SocketFileController : ControllerBase { if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; if (!Tables.Files.TryRead(Files.Owner, out long raw, Files.ID.CreateParameter(File_id)) || raw != ID) return this.ResponseCodeToResult(ErrorCode.Forbidden); - Tables.Files.Update(Files.ID, File_id, - Files.Data.CreateParameter(Array.Empty()), - Files.NameEncoderType.CreateParameter(EncoderType.UTF8), - Files.NameEncryptionKey.CreateParameter(0), - Files.Name.CreateParameter(Encoding.UTF8.GetBytes("Deleted File")), - Files.Size.CreateParameter(0), - Files.EncryptionKey.CreateParameter(0)); + Tables.Files.CreateCommand() + .WithFilter(Files.ID, File_id) + .WithValue(Files.Data, Array.Empty()) + .WithValue(Files.NameEncoderType, EncoderType.UTF8) + .WithValue(Files.NameEncryptionKey, 0) + .WithValue(Files.Name, Encoding.UTF8.GetBytes("Deleted File")) + .WithValue(Files.Size, 0) + .WithValue(Files.EncryptionKey, 0).Update(); + return StatusCode(StatusCodes.Status202Accepted); } catch (Exception e) diff --git a/LuskiServer/Controllers/v1/SocketOverridesController.cs b/LuskiServer/Controllers/v1/SocketOverridesController.cs index a1ecfc1..3b92446 100644 --- a/LuskiServer/Controllers/v1/SocketOverridesController.cs +++ b/LuskiServer/Controllers/v1/SocketOverridesController.cs @@ -14,7 +14,7 @@ public class SocketOverridesController : ControllerBase { [HttpGet] [Route(LuskiFunctions.Info.Routes.Default.Base + "/UserOverride/{id:long}")] - public IActionResult GetUserOverride([FromQuery(Name = "id")]long id) + public IActionResult GetUserOverride([FromRoute(Name = "id")]long id) { if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; if (!Tables.UserRoleOverrides.TryReadRow(out UserRoleOverrideRow row, UserRoleOverrides.ID.CreateParameter(id))) return this.ShowError(ErrorCode.Forbidden, "Override does not exist"); @@ -29,7 +29,7 @@ public class SocketOverridesController : ControllerBase [HttpGet] [Route(LuskiFunctions.Info.Routes.Default.Base + "/RoleOverride/{id:long}")] - public IActionResult GetRoleOverride([FromQuery(Name = "id")]long id) + public IActionResult GetRoleOverride([FromRoute(Name = "id")]long id) { if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; if (!Tables.ServerRoleOverrides.TryReadRow(out ServerRoleOverrideRow? row, ServerRoleOverrides.ID.CreateParameter(id))) return this.ShowError(ErrorCode.Forbidden, "Override does not exist"); diff --git a/LuskiServer/Controllers/v1/SocketRoleController.cs b/LuskiServer/Controllers/v1/SocketRoleController.cs index fb5f39b..b578ab1 100644 --- a/LuskiServer/Controllers/v1/SocketRoleController.cs +++ b/LuskiServer/Controllers/v1/SocketRoleController.cs @@ -16,7 +16,7 @@ public class SocketRoleController : ControllerBase public IActionResult Get([FromQuery(Name = "id")]long id) { if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; - if (!Tables.Roles.TryReadRow(out RoleRow row, Roles.ID.CreateParameter(id))) return this.ShowError(ErrorCode.Forbidden, "User does not exist"); + if (!Tables.Roles.TryReadRow(out RoleRow row, Roles.ID.CreateParameter(id))) return this.ShowError(ErrorCode.Forbidden, "Role does not exist"); return this.ResponseToResult(new RoleSTC() { ID = row.ID, @@ -29,4 +29,32 @@ public class SocketRoleController : ControllerBase Color = Convert.ToHexString(row.Color) }); } + + [HttpGet] + [Route(LuskiFunctions.Info.Routes.Default.Base + "/GetAll")] + public IActionResult GetAll() + { + if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; + RoleRow[] rows = Tables.Roles.ReadRows(); + + List r = new(); + for (int i = 0; i < rows.Length; i++) + { + r.Add(new() + { + ID = rows[i].ID, + ServerPermissions = rows[i].ServerPermissions, + Description = rows[i].Description, + DisplayName = rows[i].DisplayName, + Index = rows[i].Index, + Name = rows[i].Name, + Members = rows[i].MembersList, + Color = Convert.ToHexString(rows[i].Color) + }); + } + return this.ResponseToResult(new RolesSTC() + { + Roles = r.ToArray() + }); + } } \ No newline at end of file diff --git a/LuskiServer/Controllers/v1/SocketUserProfileController.cs b/LuskiServer/Controllers/v1/SocketUserProfileController.cs index 046356e..0e59086 100644 --- a/LuskiServer/Controllers/v1/SocketUserProfileController.cs +++ b/LuskiServer/Controllers/v1/SocketUserProfileController.cs @@ -101,7 +101,7 @@ public class SocketUserProfileController : ControllerBase // { "after", (int)NewStatus }, // { "type", (int)DataType.Status_Update } // }; - Tables.Users.Update(Users.ID, ID, Users.Status.CreateParameter(NewStatus)); + Tables.Users.CreateCommand().WithFilter(Users.ID, ID).WithValue(Users.Status, NewStatus).Update(); if (NewStatus == UserStatus.Invisible) NewStatus = UserStatus.Offline; // WSS.SendData(SendType.All, @out); } diff --git a/LuskiServer/Converters/Matrix/Matrix.cs b/LuskiServer/Converters/Matrix/Matrix.cs index 28a774c..c927c13 100644 --- a/LuskiServer/Converters/Matrix/Matrix.cs +++ b/LuskiServer/Converters/Matrix/Matrix.cs @@ -59,24 +59,22 @@ public static class Matrix Tables.ChannelProfiles.DeleteRow(ChannelProfiles.ID.CreateParameter(i)); } - Tables.Channels.Update(Channels.ID, Channel, - //Tables.Channels.Insert( - Channels.ID.CreateParameter(Channel), - Channels.Parent.CreateParameter(0), - Channels.Type.CreateParameter(ChannelType.TextAndVoice), - Channels.Description.CreateParameter(export.RoomTopic.ToDB(Encoder, Encryption)), - Channels.Name.CreateParameter(export.RoomName.ToDB(Encoder, Encryption)), - Channels.RoleOverrides.CreateParameter(Array.Empty()), - Channels.UserOverrides.CreateParameter(Array.Empty()), - Channels.Epoch.CreateParameter(epoch), - Channels.TitleEncryptionKey.CreateParameter(Encryption), - Channels.DescriptionEncryptionKey.CreateParameter(Encryption), - Channels.EncryptionKeys.CreateParameter(new long[] { Encryption }), - Channels.TitleEncoderType.CreateParameter(Encoder), - Channels.DescriptionEncoderType.CreateParameter(Encoder), - //Channels.PictureType.CreateParameter(PictureType.none), - //Channels.Picture.CreateParameter(Array.Empty()), - Channels.EncoderTypes.CreateParameter(new[] { Encoder })); + Tables.Channels.CreateCommand() + .WithFilter(Channels.ID, Channel) + .WithValue(Channels.Parent, 0) + .WithValue(Channels.Type, ChannelType.TextAndVoice) + .WithValue(Channels.Description, export.RoomTopic.ToDB(Encoder, Encryption)) + .WithValue(Channels.Name, export.RoomName.ToDB(Encoder, Encryption)) + .WithValue(Channels.RoleOverrides, Array.Empty()) + .WithValue(Channels.UserOverrides, Array.Empty()) + .WithValue(Channels.Epoch, epoch) + .WithValue(Channels.TitleEncryptionKey, Encryption) + .WithValue(Channels.DescriptionEncryptionKey, Encryption) + .WithValue(Channels.EncryptionKeys, new long[] { Encryption }) + .WithValue(Channels.TitleEncoderType, Encoder) + .WithValue(Channels.DescriptionEncoderType, Encoder) + .WithValue(Channels.EncoderTypes, new[] { Encoder }).Update(); + Dictionary Events = new(); foreach (Message msg in export.Messages) @@ -275,7 +273,7 @@ public static class Matrix } } - Tables.Channels.Update(Channels.ID, Channel, Channels.Profiles.CreateParameter(IdConverter.Values.ToArray())); + Tables.Channels.CreateCommand().WithFilter(Channels.ID, Channel).WithValue(Channels.Profiles, IdConverter.Values.ToArray()).Update(); } catch (Exception e) { diff --git a/LuskiServer/LuskiServer.csproj b/LuskiServer/LuskiServer.csproj index e252631..b99cda3 100644 --- a/LuskiServer/LuskiServer.csproj +++ b/LuskiServer/LuskiServer.csproj @@ -5,7 +5,7 @@ enable enable true - 1.0.08 + 1.0.1.6 @@ -21,11 +21,13 @@ - + + + - - + + diff --git a/LuskiServer/Program.cs b/LuskiServer/Program.cs index d135fb0..fbf2bec 100644 --- a/LuskiServer/Program.cs +++ b/LuskiServer/Program.cs @@ -29,6 +29,22 @@ else tttt.Add(string.Join(";", LuskiFunctions.Config.Addresses)); } +//MatrixChatroomWatcher mcw = new("https://matrix.org", "!EqhzONquTblIjhgyHG:matrix.org", "Luski-Server", + // "syt_amFjb2J0ZWNoLWJvdA_mGvmyCvUOGKZXmMOyvTr_1QRrzv"); +//mcw.NewMessageReceived += McwOnNewMessageReceived; + +void McwOnNewMessageReceived(dynamic message) +{ + Console.WriteLine(message); +} + +//await mcw.Start(); + + + + +//await mcw.SendMessage("Test Message from Luski Server"); + args = tttt.ToArray(); Console.WriteLine($"Server starting with starting epoch of {LuskiFunctions.Config.ServerEpoch.ToLocalTime()} and current time of {DateTime.UtcNow.ToLocalTime()}"); LuskiFunctions.Database = new Database(LuskiFunctions.Config.Address, @@ -38,6 +54,8 @@ LuskiFunctions.Database = new Database(LuskiFunctions.Config.Address, LuskiFunctions.Config.CustomeName); + + Dictionary> fff = new(); @@ -65,8 +83,7 @@ foreach (PropertyInfo prop in typeof(Tables).GetProperties()) LuskiFunctions.Database.RegisterTables(); -bool d = Tables.Storage.TryReadRow(out StorageRow row, Storage.ID.CreateParameter(534144618594309)); -Console.WriteLine(d); + //Tables.Channels.Update(Channels.ID, 0, Channels.PictureType.CreateParameter(PictureType.png), Channels.Picture.CreateParameter(File.ReadAllBytes("/home/jacob/Pictures/Logo.png"))); /* Dictionary AMap = new() @@ -125,6 +142,47 @@ if (!Tables.Server.TryRead(Server.ID, out _, Server.ID.CreateParameter(0))) { Tables.Server.Insert(); } +/* +Tables.Roles.Insert( + Roles.ID.CreateParameter(2), + Roles.Name.CreateParameter("Admins"), + Roles.DisplayName.CreateParameter("Admins"), + Roles.Index.CreateParameter(2), + Roles.Color.CreateParameter(Convert.FromHexString("FF1B1BFF")), + Roles.Description.CreateParameter("Admins for the server"), + Roles.MembersList.CreateParameter(new long[]{0}), + Roles.ServerPermissions.CreateParameter( + ServerPermission.ViewChannels | + ServerPermission.ViewCategories | + ServerPermission.Nickname | + ServerPermission.SendMessages | + ServerPermission.SendFiles | + ServerPermission.ChannelPings | + ServerPermission.ServerPings | + ServerPermission.PingSomeone | + ServerPermission.ReadMessageHistory | + ServerPermission.UseServerCommands | + ServerPermission.JoinVoice | + ServerPermission.SpeakInVoice | + ServerPermission.ViewThis | + ServerPermission.Kick | + ServerPermission.CreateCategories | + ServerPermission.CreateChannels | + ServerPermission.DeleteCategories | + ServerPermission.DeleteChannels | + ServerPermission.EditCategories | + ServerPermission.EditChannels | + ServerPermission.EditCategoryPermissions | + ServerPermission.EditChannelPermissions | + ServerPermission.Invite | + ServerPermission.ManageMessages | + ServerPermission.ManageRoles | + ServerPermission.ViewLogs | + ServerPermission.Ban | + ServerPermission.AddServers) +);*/ + + //Tables.Server.Update(Server.ID, 0, Server.Picture.CreateParameter(File.ReadAllBytes("/home/jacob/Downloads/XBsECOXDZIXMVIxxMNxRfGRo.png"))); //Tables.Channels.Update(Channels.ID, 1, Channels.PictureType.CreateParameter(PictureType.png), Channels.Picture.CreateParameter(File.ReadAllBytes("/home/jacob/Downloads/zLqHooejmsmKzuMLneUSvjRH.png"))); /* @@ -282,7 +340,6 @@ if (!Tables.Categories.TryRead(Categories.ID, out _, Categories.ID.CreateParamet Categories.ID.CreateParameter(0), Categories.Name.CreateParameter(Encoding.UTF8.GetBytes("server")), Categories.Parent.CreateParameter(-1), - Categories.Channels.CreateParameter(new long[]{0}), Categories.Description.CreateParameter( Encoding.UTF8.GetBytes("The default category for the server. Everybody will see this category.")), Categories.RoleOverrides.CreateParameter(Array.Empty())