diff --git a/LuskiServer/Classes/ActionFilters/TokenFilterAttribute.cs b/LuskiServer/Classes/ActionFilters/TokenFilterAttribute.cs index 1978f29..5ce3e85 100644 --- a/LuskiServer/Classes/ActionFilters/TokenFilterAttribute.cs +++ b/LuskiServer/Classes/ActionFilters/TokenFilterAttribute.cs @@ -10,7 +10,7 @@ public class TokenFilterAttribute : Attribute, IActionFilter public void OnActionExecuting(ActionExecutingContext context) { //token check here - Console.WriteLine("Token Check"); + //Console.WriteLine("Token Check"); } public void OnActionExecuted(ActionExecutedContext context) diff --git a/LuskiServer/Classes/LuskiFunctions.cs b/LuskiServer/Classes/LuskiFunctions.cs index 8002b35..2d3b246 100644 --- a/LuskiServer/Classes/LuskiFunctions.cs +++ b/LuskiServer/Classes/LuskiFunctions.cs @@ -94,79 +94,70 @@ public static class LuskiFunctions public static long[] GetChannelBroadcastMembers(long Channel) { + ServerPermission RequiredPerms = ServerPermission.ViewThis | ServerPermission.ReadMessageHistory; List Members = new(); - long[] ChanUserOverides = Tables.Channels.Read(Channels.UserOverrides, Channels.ID.CreateParameter(Channel)); - long[] ChanRoleOverides = Tables.Channels.Read(Channels.RoleOverrides, Channels.ID.CreateParameter(Channel)); - Dictionary ChanRoleIDOverides = new(); - foreach (long cro in ChanRoleOverides) - { - ChanRoleIDOverides.Add(Tables.ServerRoleOverrides.Read(ServerRoleOverrides.RoleID, ServerRoleOverrides.ID.CreateParameter(cro)), cro); - } - Dictionary ChanUserIDOverides = new(); - foreach (long cro in ChanUserOverides) - { - ChanUserIDOverides.Add(Tables.UserRoleOverrides.Read(UserRoleOverrides.UserID, UserRoleOverrides.ID.CreateParameter(cro)), cro); - } - - ServerPermission req = ServerPermission.ViewThis | ServerPermission.ReadMessageHistory; - using NpgsqlConnection dbConnection = LuskiFunctions.Database.CreateConnection(); - dbConnection.Open(); - using NpgsqlCommand cmd = new(); - cmd.Connection = dbConnection; - cmd.CommandText = $"SELECT {Roles.ID.Name} FROM {Tables.Roles.Name};"; - NpgsqlDataReader reader = cmd.ExecuteReader(); - while (reader.Read()) + (long, ServerPermission, ServerPermission)[] ChanUserOverrides = Tables.ChannelUserOverrides.CreateCommand() + .WithFilter(ChannelUserOverrides.Channel, Channel) + .ReadColumns(ChannelUserOverrides.UserOverride, ChannelUserOverrides.GoodPermissions, ChannelUserOverrides.BadPermissions); + (long, ServerPermission, ServerPermission)[] ChanRoleOverrides = Tables.ChannelRoleOverrides.CreateCommand() + .WithFilter(ChannelRoleOverrides.Channel, Channel) + .ReadColumns(ChannelRoleOverrides.RoleOverride, + ChannelRoleOverrides.GoodPermissions, ChannelRoleOverrides.BadPermissions); + long owner = Tables.Server.Read(Server.Owner, Server.ID.CreateParameter(0)); + + foreach (var User in Tables.Users.ReadColumn(Users.ID)) { - long rol = reader.GetInt64(0); + if (User == owner) + { + Members.Add(User); + continue; + }; ServerPermission GoodPerms = ServerPermission.None; - if (ChanRoleIDOverides.ContainsKey(rol)) + bool Break = false; + foreach ((long, ServerPermission, ServerPermission) ChanUserOverride in ChanUserOverrides) { - GoodPerms |= Tables.ServerRoleOverrides.Read(ServerRoleOverrides.GoodPermissions, - ServerRoleOverrides.ID.CreateParameter(ChanRoleIDOverides[rol])); - + if (ChanUserOverride.Item1 != User) continue; + if ((ChanUserOverride.Item3 & RequiredPerms) > ServerPermission.None) + { + Break = true; + break; + } - if (GoodPerms.HasPermission(req)) - { - foreach (long m in Tables.Roles.Read(Roles.MembersList, Roles.ID.CreateParameter(rol))) - { - if (!Members.Contains(m)) Members.Add(m); - } - } + GoodPerms |= ChanUserOverride.Item2; } - else + if (Break) continue; + + int bad_index = -1; + int good_index = -1; + long[] UserRoleIDList = Tables.RoleMembers.ReadColumn(RoleMembers.Role, RoleMembers.User.CreateParameter(User)); + + foreach ((long, ServerPermission, ServerPermission) ChanRoleOverride in ChanRoleOverrides) { - ServerPermission pppp = Tables.Roles.Read(Roles.ServerPermissions, Roles.ID.CreateParameter(rol)); - GoodPerms |= pppp; - if (GoodPerms.HasPermission(req)) + if (!UserRoleIDList.Contains(ChanRoleOverride.Item1)) continue; + int i = Tables.Roles.Read(Roles.Index, Roles.ID.CreateParameter(ChanRoleOverride.Item1)); + if (((ChanRoleOverride.Item3 & RequiredPerms) ^ GoodPerms) > ServerPermission.None) { - foreach (long m in Tables.Roles.Read(Roles.MembersList, Roles.ID.CreateParameter(rol))) - { - if (!Members.Contains(m)) Members.Add(m); - } + if (bad_index < i) + bad_index = i; } + else good_index = i; + + GoodPerms |= ChanRoleOverride.Item2; } + + if (bad_index > good_index) continue; + foreach (long RoleID in UserRoleIDList) + { + ServerPermission pers = Tables.Roles.Read(Roles.ServerPermissions, Roles.ID.CreateParameter(RoleID)); + GoodPerms |= pers; + } + + if (GoodPerms.HasPermission(RequiredPerms)) Members.Add(User); } - foreach (long o in ChanUserOverides) - { - ServerPermission GoodPerms = ServerPermission.None; - long u = Tables.UserRoleOverrides.Read(UserRoleOverrides.UserID, UserRoleOverrides.ID.CreateParameter(o)); - GoodPerms |= Tables.UserRoleOverrides.Read(UserRoleOverrides.GoodPermissions, UserRoleOverrides.ID.CreateParameter(o)); - - if (GoodPerms.HasPermission(req)) - { - if (!Members.Contains(u)) Members.Add(u); - } - else - { - if (Members.Contains(u)) Members.Remove(u); - } - } - dbConnection.Close(); return Members.ToArray(); } - public static long[] GetCategoryChannels(long Category, long User) { List chans = new(); @@ -178,11 +169,10 @@ public static class LuskiFunctions return chans.ToArray(); } - public static bool HasPermissions(long User, ServerPermission RequiredPerms) { - if (User == Tables.Server.Read(Server.Owner, Server.ID.CreateParameter(0))) return true; - long[] UserRoleIDList = Tables.Users.Read(Users.Roles, Users.ID.CreateParameter(User)); + if (User == Tables.Server.Read(Server.Owner, Server.ID.CreateParameter(0))) return true; + long[] UserRoleIDList = Tables.RoleMembers.ReadColumn(RoleMembers.Role, RoleMembers.User.CreateParameter(User)); ServerPermission op = ServerPermission.None; foreach (long RoleID in UserRoleIDList) { @@ -191,7 +181,6 @@ public static class LuskiFunctions return op.HasPermission(RequiredPerms); } - public static bool HasAccessToCategory(long User, long Category, out ServerPermission missing, ServerPermission OptionalPerms) { if (User == Tables.Server.Read(Server.Owner, Server.ID.CreateParameter(0))) @@ -199,43 +188,43 @@ public static class LuskiFunctions missing = ServerPermission.None; return true; } - long[] UserRoleIDList = Tables.Users.Read(Users.Roles, Users.ID.CreateParameter(User)); + long[] UserRoleIDList = Tables.RoleMembers.ReadColumn(RoleMembers.Role, RoleMembers.User.CreateParameter(User)); ServerPermission BadPermissions = ServerPermission.None; ServerPermission GoodPerms = ServerPermission.None; - - (long[], long[]) crow = Tables.Categories.CreateCommand().WithFilter(Categories.ID, Category) - .Read(Categories.UserOverrides, Categories.RoleOverrides); - - foreach (long CatUserOveride in crow.Item1) + (long, ServerPermission, ServerPermission)[] CatUserOverrides = Tables.CategoryUserOverrides.CreateCommand() + .WithFilter(CategoryUserOverrides.Category, Category) + .ReadColumns(CategoryUserOverrides.UserOverride, CategoryUserOverrides.GoodPermissions, CategoryUserOverrides.BadPermissions); + (long, ServerPermission, ServerPermission)[] CatRoleOverrides = Tables.CategoryRoleOverrides.CreateCommand() + .WithFilter(CategoryRoleOverrides.Category, Category) + .ReadColumns(CategoryRoleOverrides.RoleOverride, + CategoryRoleOverrides.GoodPermissions, CategoryRoleOverrides.BadPermissions); + + foreach ((long, ServerPermission, ServerPermission) CatUserOverride in CatUserOverrides) { - if (!Tables.UserRoleOverrides.TryReadRow(out UserRoleOverrideRow row, UserRoleOverrides.ID.CreateParameter(CatUserOveride), UserRoleOverrides.UserID.CreateParameter(User))) continue; - if (!row.BadPermissions.HasPermission(ServerPermission.ViewThis)) + if (CatUserOverride.Item1 != User) continue; + if (!CatUserOverride.Item3.HasPermission(ServerPermission.ViewThis)) { missing = ServerPermission.ViewThis; return false; } - - BadPermissions |= row.BadPermissions; - GoodPerms |= row.GoodPermissions; } - + int bad_index = -1; int good_index = -1; - - foreach (long CatRoleOveride in crow.Item2) + + foreach (var CatRoleOverride in CatRoleOverrides) { - 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)) + if (!UserRoleIDList.Contains(CatRoleOverride.Item1)) continue; + int i = Tables.Roles.Read(Roles.Index, Roles.ID.CreateParameter(CatRoleOverride.Item1)); + if (!CatRoleOverride.Item3.HasPermission(ServerPermission.ViewThis) && !GoodPerms.HasPermission(ServerPermission.ViewThis)) { if (bad_index < i) bad_index = i; } else good_index = i; - BadPermissions |= row.BadPermissions; - GoodPerms |= row.GoodPermissions; + BadPermissions |= CatRoleOverride.Item3; + GoodPerms |= CatRoleOverride.Item2; } if (bad_index > good_index) @@ -258,44 +247,46 @@ public static class LuskiFunctions } return true; } - 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)); - + long[] UserRoleIDList = Tables.RoleMembers.ReadColumn(RoleMembers.Role, RoleMembers.User.CreateParameter(User)); + (long, ServerPermission, ServerPermission)[] CatUserOverrides = Tables.CategoryUserOverrides.CreateCommand() + .WithFilter(CategoryUserOverrides.Category, Category) + .ReadColumns(CategoryUserOverrides.UserOverride, CategoryUserOverrides.GoodPermissions, CategoryUserOverrides.BadPermissions); + (long, ServerPermission, ServerPermission)[] CatRoleOverrides = Tables.CategoryRoleOverrides.CreateCommand() + .WithFilter(CategoryRoleOverrides.Category, Category) + .ReadColumns(CategoryRoleOverrides.RoleOverride, + CategoryRoleOverrides.GoodPermissions, CategoryRoleOverrides.BadPermissions); + RequiredPerms |= ServerPermission.ViewThis; - ServerPermission GoodPerms = ServerPermission.None; - - (long[], long[]) crow = Tables.Categories.CreateCommand().WithFilter(Categories.ID, Category) - .Read(Categories.UserOverrides, Categories.RoleOverrides); - - foreach (long CatUserOveride in crow.Item1) + + foreach ((long, ServerPermission, ServerPermission) CatUserOverride in CatUserOverrides) { - if (!Tables.UserRoleOverrides.TryReadRow(out UserRoleOverrideRow row, UserRoleOverrides.ID.CreateParameter(CatUserOveride), UserRoleOverrides.UserID.CreateParameter(User))) continue; - if ((row.BadPermissions & RequiredPerms) > ServerPermission.None) return false; + if (CatUserOverride.Item1 != User) continue; + if ((CatUserOverride.Item3 & RequiredPerms) > ServerPermission.None) return false; - GoodPerms |= row.GoodPermissions; + GoodPerms |= CatUserOverride.Item2; } - + int bad_index = -1; int good_index = -1; - - foreach (long CatRoleOveride in crow.Item2) + + foreach ((long, ServerPermission, ServerPermission) CatRoleOverride in CatRoleOverrides) { - 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 & RequiredPerms) ^ GoodPerms) > ServerPermission.None) + if (!UserRoleIDList.Contains(CatRoleOverride.Item1)) continue; + int i = Tables.Roles.Read(Roles.Index, Roles.ID.CreateParameter(CatRoleOverride.Item1)); + if (((CatRoleOverride.Item3 & RequiredPerms) ^ GoodPerms) > ServerPermission.None) { if (bad_index < i) bad_index = i; } else good_index = i; - GoodPerms |= row.GoodPermissions; + GoodPerms |= CatRoleOverride.Item2; } + if (bad_index > good_index) return false; foreach (long RoleID in UserRoleIDList) { @@ -305,42 +296,46 @@ public static class LuskiFunctions return GoodPerms.HasPermission(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)); + long[] UserRoleIDList = Tables.RoleMembers.ReadColumn(RoleMembers.Role, RoleMembers.User.CreateParameter(User)); RequiredPerms |= ServerPermission.ViewThis; ServerPermission GoodPerms = ServerPermission.None; - - (long[], long[]) crow = Tables.Channels.CreateCommand().WithFilter(Channels.ID, Channel) - .Read(Channels.UserOverrides, Channels.RoleOverrides); - foreach (long CatUserOveride in crow.Item1) + (long, ServerPermission, ServerPermission)[] ChanUserOverrides = Tables.ChannelUserOverrides.CreateCommand() + .WithFilter(ChannelUserOverrides.Channel, Channel) + .ReadColumns(ChannelUserOverrides.UserOverride, ChannelUserOverrides.GoodPermissions, ChannelUserOverrides.BadPermissions); + (long, ServerPermission, ServerPermission)[] ChanRoleOverrides = Tables.ChannelRoleOverrides.CreateCommand() + .WithFilter(ChannelRoleOverrides.Channel, Channel) + .ReadColumns(ChannelRoleOverrides.RoleOverride, + ChannelRoleOverrides.GoodPermissions, ChannelRoleOverrides.BadPermissions); + + foreach ((long, ServerPermission, ServerPermission) ChanUserOverride in ChanUserOverrides) { - if (!Tables.UserRoleOverrides.TryReadRow(out UserRoleOverrideRow row, UserRoleOverrides.ID.CreateParameter(CatUserOveride), UserRoleOverrides.UserID.CreateParameter(User))) continue; - if ((row.BadPermissions & RequiredPerms) > ServerPermission.None) return false; + if (ChanUserOverride.Item1 != User) continue; + if ((ChanUserOverride.Item3 & RequiredPerms) > ServerPermission.None) return false; - GoodPerms |= row.GoodPermissions; + GoodPerms |= ChanUserOverride.Item2; } - + int bad_index = -1; int good_index = -1; - - foreach (long CatRoleOveride in crow.Item2) + + foreach ((long, ServerPermission, ServerPermission) ChanRoleOverride in ChanRoleOverrides) { - 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 & RequiredPerms) ^ GoodPerms) > ServerPermission.None) + if (!UserRoleIDList.Contains(ChanRoleOverride.Item1)) continue; + int i = Tables.Roles.Read(Roles.Index, Roles.ID.CreateParameter(ChanRoleOverride.Item1)); + if (((ChanRoleOverride.Item3 & RequiredPerms) ^ GoodPerms) > ServerPermission.None) { if (bad_index < i) bad_index = i; } else good_index = i; - GoodPerms |= row.GoodPermissions; + GoodPerms |= ChanRoleOverride.Item2; } + if (bad_index > good_index) return false; foreach (long RoleID in UserRoleIDList) { diff --git a/LuskiServer/Classes/ServerComs/CilentMessageSendEvent.cs b/LuskiServer/Classes/ServerComs/CilentMessageSendEvent.cs deleted file mode 100644 index 75ea67a..0000000 --- a/LuskiServer/Classes/ServerComs/CilentMessageSendEvent.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Text.Json.Serialization; -using LuskiServer.Enums.ServerComs; - -namespace LuskiServer.Classes.ServerComs; - -public class CilentMessageSendEvent -{ - [JsonPropertyName("type")] - [JsonInclude] - public DataType? Type { get; set; } = DataType.Token!; - [JsonPropertyName("error")] - [JsonInclude] - public string Error { get; set; } = default!; -} \ No newline at end of file diff --git a/LuskiServer/Classes/ServerComs/MessageEvent.cs b/LuskiServer/Classes/ServerComs/MessageEvent.cs deleted file mode 100644 index 9f61ee8..0000000 --- a/LuskiServer/Classes/ServerComs/MessageEvent.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System.Text.Json.Serialization; -using JacobTechEncryption.Enums; -using Luski.Shared.PublicServers.V1.ServerToClient.HTTP; -using LuskiServer.Interfaces.ServerComs; - -namespace LuskiServer.Classes.ServerComs; - -public class MessageEvent : IServerEvent -{ - [JsonInclude] - [JsonPropertyName("author_id")] - public long UserID { get; set; } - [JsonInclude] - [JsonPropertyName("channel_id")] - public long ChannelID { get; set; } - [JsonInclude] - [JsonPropertyName("context")] - public string Base64Context { get; set; } - [JsonInclude] - [JsonPropertyName("id")] - public long ID { get; set; } - [JsonInclude] - [JsonPropertyName("files")] - public ServerFileInfoSTC[] Files { get; set; } - - [JsonInclude] - [JsonPropertyName("encryption_key")] - public long EncryptionKey { get; set; } = default!; - [JsonInclude] - [JsonPropertyName("encoder_type")] - public EncoderType EncoderType { get; set; } = default!; - [JsonInclude] - [JsonPropertyName("is_channel_profile")] - public bool IsProfile { get; set; } -} - -[JsonSerializable(typeof(MessageEvent))] -[JsonSourceGenerationOptions( - GenerationMode = JsonSourceGenerationMode.Default, - PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase, - WriteIndented = false)] -internal partial class MessageEventContext : JsonSerializerContext -{ - -} \ No newline at end of file diff --git a/LuskiServer/Classes/ServerComs/ServerEvent.cs b/LuskiServer/Classes/ServerComs/ServerEvent.cs deleted file mode 100644 index e87d555..0000000 --- a/LuskiServer/Classes/ServerComs/ServerEvent.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Text.Json.Serialization; -using LuskiServer.Enums.ServerComs; -using LuskiServer.Interfaces.ServerComs; - -namespace LuskiServer.Classes.ServerComs; - -public class ServerEvent -{ - [JsonInclude] - [JsonPropertyName("type")] - public DataType Type { get; set; } - - [JsonInclude] - [JsonPropertyName("data")] - public object Data { get; set; } -} - -[JsonSerializable(typeof(ServerEvent))] -[JsonSourceGenerationOptions( - GenerationMode = JsonSourceGenerationMode.Default, - PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase, - WriteIndented = false)] -internal partial class ServerEventContext : JsonSerializerContext -{ - -} \ No newline at end of file diff --git a/LuskiServer/Classes/ServerComs/ServerSendSendEvent.cs b/LuskiServer/Classes/ServerComs/ServerSendSendEvent.cs index b2ba6a4..92c5a91 100644 --- a/LuskiServer/Classes/ServerComs/ServerSendSendEvent.cs +++ b/LuskiServer/Classes/ServerComs/ServerSendSendEvent.cs @@ -1,4 +1,5 @@ using System.Text.Json.Serialization; +using Luski.Shared.PublicServers.V1.Shared; using LuskiServer.Enums.ServerComs; namespace LuskiServer.Classes.ServerComs; diff --git a/LuskiServer/Classes/ServerComs/TokenEvent.cs b/LuskiServer/Classes/ServerComs/TokenEvent.cs index 6e8bf63..7ce82ad 100644 --- a/LuskiServer/Classes/ServerComs/TokenEvent.cs +++ b/LuskiServer/Classes/ServerComs/TokenEvent.cs @@ -1,9 +1,10 @@ using System.Text.Json.Serialization; +using Luski.Shared.PublicServers.V1.ServerToClient.WSS; using LuskiServer.Interfaces.ServerComs; namespace LuskiServer.Classes.ServerComs; -public class TokenEvent : CilentMessageSendEvent, IServerEvent +public class TokenEvent : WebsocketMessageSendEventSTC, IServerEvent { [JsonInclude] [JsonPropertyName("token")] diff --git a/LuskiServer/Classes/ServerComs/WSS.cs b/LuskiServer/Classes/ServerComs/WSS.cs index e9a0ac8..22c3655 100644 --- a/LuskiServer/Classes/ServerComs/WSS.cs +++ b/LuskiServer/Classes/ServerComs/WSS.cs @@ -1,11 +1,10 @@ using System.Net; -using System.Runtime.InteropServices.JavaScript; using System.Text; using System.Text.Json; -using System.Text.Json.Serialization; +using Luski.Shared.PublicServers.V1.Enums; +using Luski.Shared.PublicServers.V1.Shared; using LuskiServer.Classes.TableDef; using LuskiServer.Enums.ServerComs; -using LuskiServer.Interfaces.ServerComs; using WebSocketSharp; using WebSocketSharp.Server; @@ -26,6 +25,24 @@ public static class WSS { Tables.Keys.DeleteRow(Keys.ID.CreateParameter(id.SessionKey)); } + + if (!Tables.Sessions.TryReadRow(out var r, TableDef.Sessions.ID.CreateParameter(id.ID))) + { + UserStatus before = Tables.Users.Read(Users.Status, Users.ID.CreateParameter(id.User)); + Tables.Users.CreateCommand().WithFilter(Users.ID, id.User).WithValue(Users.Status, UserStatus.Offline).Update(); + WSS.SendData(SendType.All, new ServerEvent() + { + Type = DataType.StatusUpdate, + Data = new StatusEvent() + { + User = id.User, + Before = (before == UserStatus.Invisible ? UserStatus.Offline : before), + After = UserStatus.Offline, + } + }); + } + + } catch (Exception exception) { @@ -77,6 +94,8 @@ public static class WSS TableDef.Sessions.LoginToken.CreateParameter(te.Token))) { 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.CreateCommand() @@ -112,6 +131,7 @@ public static class WSS { ServerIPv4 = new WebSocketServer(IPAddress.Parse(IPv4), IPv4_Port, IPv4_Secure); ServerIPv4.AddWebSocketService($"{IPv4_URL}v1"); + ServerIPv4.WaitTime = TimeSpan.FromSeconds(5); path = $"{IPv4_URL}v1"; ServerIPv4.Start(); if (IPv6 is not null) @@ -150,6 +170,10 @@ public static class WSS } } } + else if (SendType == SendType.All) + { + ServerIPv4.WebSocketServices[path].Sessions.Broadcast(JsonSerializer.Serialize(Event)); + } //TODO Start work on server send code } diff --git a/LuskiServer/Classes/TableDef/AltServers.cs b/LuskiServer/Classes/TableDef/AltServers.cs index cdf7b70..854f63f 100644 --- a/LuskiServer/Classes/TableDef/AltServers.cs +++ b/LuskiServer/Classes/TableDef/AltServers.cs @@ -11,5 +11,4 @@ public static class AltServers } [TableRow(typeof(AltServers))] -public partial class AltServerRow -{} \ No newline at end of file +public partial class AltServerRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Categories.cs b/LuskiServer/Classes/TableDef/Categories.cs index ef7fe49..47d8b59 100644 --- a/LuskiServer/Classes/TableDef/Categories.cs +++ b/LuskiServer/Classes/TableDef/Categories.cs @@ -1,5 +1,6 @@ using System.Text; using JacobTechEncryption.Enums; +using Luski.Shared.PublicServers.V1.Enums; using ServerDatabase; using ServerDatabase.SourceGenerator; @@ -9,16 +10,29 @@ 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 ColorType { get; } = new("color_type") { DefaultValue = Luski.Shared.PublicServers.V1.Enums.ColorType.Full}; 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 TitleEncryptionKey { get; } = new("title_encryption_key") + { + DefaultValue = 0, + ForeignKey = new ForeignKey() + { + Table = Tables.Keys, + Column = Keys.ID + } + }; + public static TableColumn DescriptionEncryptionKey { get; } = new("description_encryption_key") + { + DefaultValue = 0, + ForeignKey = new ForeignKey() + { + Table = Tables.Keys, + Column = Keys.ID + } + }; 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 -{} \ No newline at end of file +public partial class CategoryRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/CategoryParents.cs b/LuskiServer/Classes/TableDef/CategoryParents.cs new file mode 100644 index 0000000..0c06c5a --- /dev/null +++ b/LuskiServer/Classes/TableDef/CategoryParents.cs @@ -0,0 +1,28 @@ +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class CategoryParents +{ + public static TableColumn ID { get; } = new("id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Categories, + Column = Categories.ID + } + }; + public static TableColumn Parent { get; } = new("parent") + { + DefaultValue = 0 , + ForeignKey = new ForeignKey() + { + Table = Tables.Categories, + Column = Categories.ID + } + }; +} + +[TableRow(typeof(CategoryParents))] +public partial class CategoryParentRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/CategoryProfiles.cs b/LuskiServer/Classes/TableDef/CategoryProfiles.cs new file mode 100644 index 0000000..ff75f2d --- /dev/null +++ b/LuskiServer/Classes/TableDef/CategoryProfiles.cs @@ -0,0 +1,28 @@ +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class CategoryProfiles +{ + public static TableColumn Profile { get; } = new("id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Profiles, + Column = Profiles.ID + } + }; + + public static TableColumn Category { get; } = new("category_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Categories, + Column = Categories.ID + } + }; +} + +[TableRow(typeof(CategoryProfiles))] +public partial class CategoryProfileRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/CategoryRoleOverrides.cs b/LuskiServer/Classes/TableDef/CategoryRoleOverrides.cs new file mode 100644 index 0000000..a09c4ee --- /dev/null +++ b/LuskiServer/Classes/TableDef/CategoryRoleOverrides.cs @@ -0,0 +1,30 @@ +using Luski.Shared.PublicServers.V1.Enums; +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class CategoryRoleOverrides +{ + public static TableColumn Category { get; } = new("category", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Categories, + Column = Categories.ID + } + }; + public static TableColumn RoleOverride { get; } = new("override", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Roles, + Column = Roles.ID + } + }; + public static TableColumn BadPermissions { get; } = new("bad_permissions"); + public static TableColumn GoodPermissions { get; } = new("good_permissions"); +} + +[TableRow(typeof(CategoryRoleOverrides))] +public partial class CategoryRoleOverrideRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/CategoryUserOverrides.cs b/LuskiServer/Classes/TableDef/CategoryUserOverrides.cs new file mode 100644 index 0000000..3fb9579 --- /dev/null +++ b/LuskiServer/Classes/TableDef/CategoryUserOverrides.cs @@ -0,0 +1,30 @@ +using Luski.Shared.PublicServers.V1.Enums; +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class CategoryUserOverrides +{ + public static TableColumn Category { get; } = new("category", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Categories, + Column = Categories.ID + } + }; + public static TableColumn UserOverride { get; } = new("override", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Users, + Column = Users.ID + } + }; + public static TableColumn BadPermissions { get; } = new("bad_permissions"); + public static TableColumn GoodPermissions { get; } = new("good_permissions"); +} + +[TableRow(typeof(CategoryUserOverrides))] +public partial class CategoryUserOverrideRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/ChannelKeys.cs b/LuskiServer/Classes/TableDef/ChannelKeys.cs new file mode 100644 index 0000000..623bcdc --- /dev/null +++ b/LuskiServer/Classes/TableDef/ChannelKeys.cs @@ -0,0 +1,28 @@ +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class ChannelKeys +{ + public static TableColumn Key { get; } = new("key_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Keys, + Column = Keys.ID + } + }; + + public static TableColumn Channel { get; } = new("channel_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Channels, + Column = Channels.ID + } + }; +} + +[TableRow(typeof(ChannelKeys))] +public partial class ChannelKeyRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/ChannelProfiles.cs b/LuskiServer/Classes/TableDef/ChannelProfiles.cs index 6b662d3..3da1051 100644 --- a/LuskiServer/Classes/TableDef/ChannelProfiles.cs +++ b/LuskiServer/Classes/TableDef/ChannelProfiles.cs @@ -1,20 +1,28 @@ -using Luski.Shared.PublicServers.V1.Enums; using ServerDatabase; using ServerDatabase.SourceGenerator; -using bob = Luski.Shared.PublicServers.V1.Enums.PictureType; namespace LuskiServer.Classes.TableDef; -public class ChannelProfiles +public static 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 Profile { get; } = new("id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Profiles, + Column = Profiles.ID + } + }; + + public static TableColumn Channel { get; } = new("channel_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Channels, + Column = Channels.ID + } + }; } [TableRow(typeof(ChannelProfiles))] -public partial class ChannelProfileRow -{} \ No newline at end of file +public partial class ChannelProfileRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/ChannelRoleOverrides.cs b/LuskiServer/Classes/TableDef/ChannelRoleOverrides.cs new file mode 100644 index 0000000..c659480 --- /dev/null +++ b/LuskiServer/Classes/TableDef/ChannelRoleOverrides.cs @@ -0,0 +1,30 @@ +using Luski.Shared.PublicServers.V1.Enums; +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class ChannelRoleOverrides +{ + public static TableColumn Channel { get; } = new("channel", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Channels, + Column = Channels.ID + } + }; + public static TableColumn RoleOverride { get; } = new("override", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Roles, + Column = Roles.ID + } + }; + public static TableColumn BadPermissions { get; } = new("bad_permissions"); + public static TableColumn GoodPermissions { get; } = new("good_permissions"); +} + +[TableRow(typeof(ChannelRoleOverrides))] +public partial class ChannelRoleOverrideRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/ChannelUserOverrides.cs b/LuskiServer/Classes/TableDef/ChannelUserOverrides.cs new file mode 100644 index 0000000..a193455 --- /dev/null +++ b/LuskiServer/Classes/TableDef/ChannelUserOverrides.cs @@ -0,0 +1,30 @@ +using Luski.Shared.PublicServers.V1.Enums; +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class ChannelUserOverrides +{ + public static TableColumn Channel { get; } = new("channel", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Channels, + Column = Channels.ID + } + }; + public static TableColumn UserOverride { get; } = new("override", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Users, + Column = Users.ID + } + }; + public static TableColumn BadPermissions { get; } = new("bad_permissions"); + public static TableColumn GoodPermissions { get; } = new("good_permissions"); +} + +[TableRow(typeof(ChannelUserOverrides))] +public partial class ChannelUserOverrideRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Channels.cs b/LuskiServer/Classes/TableDef/Channels.cs index 9119b1e..5a59994 100644 --- a/LuskiServer/Classes/TableDef/Channels.cs +++ b/LuskiServer/Classes/TableDef/Channels.cs @@ -11,17 +11,39 @@ 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 Parent { get; } = new("parent") + { + DefaultValue = 0 , + ForeignKey = new ForeignKey() + { + Table = Tables.Categories, + Column = Categories.ID + } + }; + public static TableColumn ColorType { get; } = new("color_type") { DefaultValue = Luski.Shared.PublicServers.V1.Enums.ColorType.Full}; 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 TitleEncryptionKey { get; } = new("title_encryption_key") + { + DefaultValue = 0, + ForeignKey = new ForeignKey() + { + Table = Tables.Keys, + Column = Keys.ID + } + }; + public static TableColumn DescriptionEncryptionKey { get; } = new("description_encryption_key") + { + DefaultValue = 0, + ForeignKey = new ForeignKey() + { + Table = Tables.Keys, + Column = Keys.ID + } + }; 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 }; @@ -32,10 +54,7 @@ public static class Channels EncoderType.UTF32, EncoderType.ASCII, EncoderType.Latin1, EncoderType.BigEndianUnicode } }; - - public static TableColumn Profiles { get; } = new("profiles") { DefaultValue = Array.Empty() }; } [TableRow(typeof(Channels))] -public partial class ChannelRow -{} \ No newline at end of file +public partial class ChannelRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/FileChannels.cs b/LuskiServer/Classes/TableDef/FileChannels.cs new file mode 100644 index 0000000..730f06b --- /dev/null +++ b/LuskiServer/Classes/TableDef/FileChannels.cs @@ -0,0 +1,27 @@ +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class FileChannels +{ + public static TableColumn FileID { get; } = new("file_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Files, + Column = Files.ID + } + }; + public static TableColumn ChannelID { get; } = new("channel_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Channels, + Column = Channels.ID + } + }; +} + +[TableRow(typeof(FileChannels))] +public partial class FileChannelRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Files.cs b/LuskiServer/Classes/TableDef/Files.cs index a1f038e..c07e52e 100644 --- a/LuskiServer/Classes/TableDef/Files.cs +++ b/LuskiServer/Classes/TableDef/Files.cs @@ -7,20 +7,38 @@ 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 Owner { get; } = new("owner") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Users, + Column = Users.ID + } + }; 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 EncryptionKey { get; } = new("encryption_key") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Keys, + Column = Keys.ID + } + }; public static TableColumn EncoderType { get; } = new("encoder_type"); - public static TableColumn NameEncryptionKey { get; } = new("name_encryption_key"); + public static TableColumn NameEncryptionKey { get; } = new("name_encryption_key") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Keys, + Column = Keys.ID + } + }; public static TableColumn NameEncoderType { get; } = new("name_encoder_type"); } [TableRow(typeof(Files))] -public partial class FileRow -{ -} \ No newline at end of file +public partial class FileRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Keys.cs b/LuskiServer/Classes/TableDef/Keys.cs index 7d1c13e..3b26d85 100644 --- a/LuskiServer/Classes/TableDef/Keys.cs +++ b/LuskiServer/Classes/TableDef/Keys.cs @@ -7,12 +7,9 @@ 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"); } [TableRow(typeof(Keys))] -public partial class KeyRow -{ -} \ No newline at end of file +public partial class KeyRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Logs.cs b/LuskiServer/Classes/TableDef/Logs.cs index d02c18b..ab54448 100644 --- a/LuskiServer/Classes/TableDef/Logs.cs +++ b/LuskiServer/Classes/TableDef/Logs.cs @@ -1,3 +1,4 @@ +using Luski.Shared.PublicServers.V1.Shared; using LuskiServer.Enums; using ServerDatabase; using ServerDatabase.SourceGenerator; @@ -12,5 +13,4 @@ public static class Logs } [TableRow(typeof(Logs))] -public partial class LogRow -{} \ No newline at end of file +public partial class LogRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/MessageFiles.cs b/LuskiServer/Classes/TableDef/MessageFiles.cs new file mode 100644 index 0000000..9f19676 --- /dev/null +++ b/LuskiServer/Classes/TableDef/MessageFiles.cs @@ -0,0 +1,28 @@ +using JacobTechEncryption.Enums; +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class MessageFiles +{ + public static TableColumn MessageID { get; } = new("message_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Messages, + Column = Messages.ID + } + }; + public static TableColumn FileID { get; } = new("file_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Files, + Column = Files.ID + } + }; +} + +[TableRow(typeof(MessageFiles))] +public partial class MessageFileRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Messages.cs b/LuskiServer/Classes/TableDef/Messages.cs index 2b5aca7..7ba59e1 100644 --- a/LuskiServer/Classes/TableDef/Messages.cs +++ b/LuskiServer/Classes/TableDef/Messages.cs @@ -7,16 +7,43 @@ 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 Timestamp { get; } = new("message_timestamp"); + public static TableColumn ChannelID { get; } = new("channel_id") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Channels, + Column = Channels.ID + } + }; + public static TableColumn AuthorID { get; } = new("author_id") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Users, + Column = Users.ID + } + }; + public static TableColumn ProfileID { get; } = new("profile_id") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Profiles, + Column = Profiles.ID + } + }; public static TableColumn Context { get; } = new("context"); - public static TableColumn EncryptionKey { get; } = new("encryption_key"); + public static TableColumn EncryptionKey { get; } = new("encryption_key") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Keys, + Column = Keys.ID + } + }; 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))] -public partial class MessageRow -{} \ No newline at end of file +public partial class MessageRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/OfflineData.cs b/LuskiServer/Classes/TableDef/OfflineData.cs new file mode 100644 index 0000000..b968347 --- /dev/null +++ b/LuskiServer/Classes/TableDef/OfflineData.cs @@ -0,0 +1,20 @@ +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class OfflineData +{ + public static TableColumn StorageID { get; } = new("id") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Storage, + Column = Storage.ID + } + }; + public static TableColumn Data { get; } = new("data"); +} + +[TableRow(typeof(OfflineData))] +public partial class OfflineDataRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/ProfileColors.cs b/LuskiServer/Classes/TableDef/ProfileColors.cs new file mode 100644 index 0000000..ec3fb7b --- /dev/null +++ b/LuskiServer/Classes/TableDef/ProfileColors.cs @@ -0,0 +1,22 @@ +using Luski.Shared.PublicServers.V1.Enums; +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class ProfileColors +{ + public static TableColumn Profile { get; } = new("id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Profiles, + Column = Profiles.ID + } + }; + public static TableColumn ColorType { get; } = new("color_type") { DefaultValue = Luski.Shared.PublicServers.V1.Enums.ColorType.Full}; + public static TableColumn Color { get; } = new("color") { DefaultValue = new byte[]{255,255,255,255}}; +} + +[TableRow(typeof(ProfileColors))] +public partial class ProfileColorRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/ProfileControllers.cs b/LuskiServer/Classes/TableDef/ProfileControllers.cs new file mode 100644 index 0000000..56681a0 --- /dev/null +++ b/LuskiServer/Classes/TableDef/ProfileControllers.cs @@ -0,0 +1,28 @@ +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class ProfileControllers +{ + public static TableColumn Profile { get; } = new("id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Profiles, + Column = Profiles.ID + } + }; + + public static TableColumn User { get; } = new("user_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Users, + Column = Users.ID + } + }; +} + +[TableRow(typeof(ProfileControllers))] +public partial class ProfileControllerRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/ProfileRoleControllers.cs b/LuskiServer/Classes/TableDef/ProfileRoleControllers.cs new file mode 100644 index 0000000..8c23fed --- /dev/null +++ b/LuskiServer/Classes/TableDef/ProfileRoleControllers.cs @@ -0,0 +1,28 @@ +using ServerDatabase; +using ServerDatabase.SourceGenerator; + +namespace LuskiServer.Classes.TableDef; + +public static class ProfileRoleControllers +{ + public static TableColumn Profile { get; } = new("id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Profiles, + Column = Profiles.ID + } + }; + + public static TableColumn Role { get; } = new("role_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Roles, + Column = Roles.ID + } + }; +} + +[TableRow(typeof(ProfileRoleControllers))] +public partial class ProfileRoleControllerRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Profiles.cs b/LuskiServer/Classes/TableDef/Profiles.cs new file mode 100644 index 0000000..b7aa7b6 --- /dev/null +++ b/LuskiServer/Classes/TableDef/Profiles.cs @@ -0,0 +1,18 @@ +using Luski.Shared.PublicServers.V1.Enums; +using ServerDatabase; +using ServerDatabase.SourceGenerator; +using bob = Luski.Shared.PublicServers.V1.Enums.PictureType; + +namespace LuskiServer.Classes.TableDef; + +public class Profiles +{ + public static TableColumn ID { get; } = new("id", true); + public static TableColumn DisplayName { get; } = new("displayname"); + public static TableColumn PictureType { get; } = new("picture_type") {DefaultValue = bob.png }; + public static TableColumn Picture { get; } = new("picture"); + public static TableColumn CanUpdateName { get; } = new("update_name"); +} + +[TableRow(typeof(Profiles))] +public partial class ProfileRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/RoleMembers.cs b/LuskiServer/Classes/TableDef/RoleMembers.cs new file mode 100644 index 0000000..70502d9 --- /dev/null +++ b/LuskiServer/Classes/TableDef/RoleMembers.cs @@ -0,0 +1,28 @@ +using ServerDatabase; +using ServerDatabase.SourceGenerator; +using ServerDatabase.Utils.Enums; + +namespace LuskiServer.Classes.TableDef; + +public class RoleMembers +{ + public static TableColumn Role { get; } = new("role", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Roles, + Column = Roles.ID + } + }; + public static TableColumn User { get; } = new("user_id", true) + { + ForeignKey = new ForeignKey() + { + Table = Tables.Users, + Column = Users.ID + } + }; +} + +[TableRow(typeof(RoleMembers))] +public partial class RoleMemberRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Roles.cs b/LuskiServer/Classes/TableDef/Roles.cs index 7816cde..d29e255 100644 --- a/LuskiServer/Classes/TableDef/Roles.cs +++ b/LuskiServer/Classes/TableDef/Roles.cs @@ -2,21 +2,21 @@ using Luski.Shared.PublicServers.V1.Enums; using LuskiServer.Enums; using ServerDatabase; using ServerDatabase.SourceGenerator; +using ServerDatabase.Utils; +using ServerDatabase.Utils.Enums; 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 ColorType { get; } = new("color_type") { DefaultValue = Luski.Shared.PublicServers.V1.Enums.ColorType.Full}; public static TableColumn Color { get; } = new("color") {DefaultValue = new byte[]{255,255,255,255}}; - public static TableColumn Description { get; } = new("description"); + public static TableColumn Description { get; } = new("description") {DefaultValue = string.Empty}; public static TableColumn ServerPermissions { get; } = new("server_perms"); - public static TableColumn MembersList { get; } = new("members_list") {DefaultValue = Array.Empty()}; } [TableRow(typeof(Roles))] -public partial class RoleRow -{} \ No newline at end of file +public partial class RoleRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Server.cs b/LuskiServer/Classes/TableDef/Server.cs index 6143038..ebf1f23 100644 --- a/LuskiServer/Classes/TableDef/Server.cs +++ b/LuskiServer/Classes/TableDef/Server.cs @@ -18,5 +18,4 @@ public static class Server } [TableRow(typeof(Server))] -public partial class ServerRow -{} \ No newline at end of file +public partial class ServerRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/ServerRoleOverides.cs b/LuskiServer/Classes/TableDef/ServerRoleOverides.cs deleted file mode 100644 index f61f0ad..0000000 --- a/LuskiServer/Classes/TableDef/ServerRoleOverides.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Luski.Shared.PublicServers.V1.Enums; -using ServerDatabase; -using ServerDatabase.SourceGenerator; - -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"); -} - -[TableRow(typeof(ServerRoleOverrides))] -public partial class ServerRoleOverrideRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/SessionTokens.cs b/LuskiServer/Classes/TableDef/SessionTokens.cs index 91f2f5e..033ce9e 100644 --- a/LuskiServer/Classes/TableDef/SessionTokens.cs +++ b/LuskiServer/Classes/TableDef/SessionTokens.cs @@ -6,12 +6,18 @@ 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 AccountID { get; } = new("account_id") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Users, + Column = Users.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))] -public partial class SessionTokenRow -{} \ No newline at end of file +public partial class SessionTokenRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Sessions.cs b/LuskiServer/Classes/TableDef/Sessions.cs index 4a00fef..39b1c48 100644 --- a/LuskiServer/Classes/TableDef/Sessions.cs +++ b/LuskiServer/Classes/TableDef/Sessions.cs @@ -8,14 +8,27 @@ namespace LuskiServer.Classes.TableDef; public static class Sessions { public static TableColumn ID { get; } = new("id", true); - public static TableColumn User { get; } = new("userid"); + public static TableColumn User { get; } = new("userid") + { + ForeignKey = 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"); + public static TableColumn SessionKey { get; } = new("session_key") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Keys, + Column = Keys.ID + } + }; public static TableColumn StorageID { get; } = new("storage_id"); } [TableRow(typeof(Sessions))] -public partial class SessionsRow -{} +public partial class SessionsRow; diff --git a/LuskiServer/Classes/TableDef/Storage.cs b/LuskiServer/Classes/TableDef/Storage.cs index de20fa2..c3050e6 100644 --- a/LuskiServer/Classes/TableDef/Storage.cs +++ b/LuskiServer/Classes/TableDef/Storage.cs @@ -6,14 +6,24 @@ 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 AccountID { get; } = new("account_id") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Users, + Column = Users.ID + } + }; public static TableColumn Password { get; } = new("password"); - public static TableColumn OffileKey { get; } = new("offline_key"); + public static TableColumn OfflineKey { get; } = new("offline_key") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Keys, + Column = Keys.ID + } + }; } [TableRow(typeof(Storage))] -public partial class StorageRow -{ - -} \ No newline at end of file +public partial class StorageRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/UserRoleOverides.cs b/LuskiServer/Classes/TableDef/UserRoleOverides.cs deleted file mode 100644 index 5c76fd0..0000000 --- a/LuskiServer/Classes/TableDef/UserRoleOverides.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Luski.Shared.PublicServers.V1.Enums; -using LuskiServer.Enums; -using ServerDatabase; -using ServerDatabase.SourceGenerator; - -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"); -} - -[TableRow(typeof(UserRoleOverrides))] -public partial class UserRoleOverrideRow; \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Users.cs b/LuskiServer/Classes/TableDef/Users.cs index fa045bd..700d23c 100644 --- a/LuskiServer/Classes/TableDef/Users.cs +++ b/LuskiServer/Classes/TableDef/Users.cs @@ -1,8 +1,8 @@ using Luski.Shared.PublicServers.V1.Enums; -using LuskiServer.Enums; using ServerDatabase; using ServerDatabase.SourceGenerator; using ServerDatabase.Utils; +using ServerDatabase.Utils.Enums; using bob = Luski.Shared.PublicServers.V1.Enums.PictureType; @@ -11,17 +11,29 @@ 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 ServerProfile { get; } = new("server_profile") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Profiles, + Column = Profiles.ID, + OnDelete = ConstraintAction.None + } + }; + public static TableColumn SelectedChannel { get; } = new("selected_channel") + { + ForeignKey = new ForeignKey() + { + Table = Tables.Channels, + Column = Channels.ID, + OnDelete = ConstraintAction.Restrict + } + }; 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))] -public partial class UserRow -{} \ No newline at end of file +public partial class UserRow; \ No newline at end of file diff --git a/LuskiServer/Classes/Tables.cs b/LuskiServer/Classes/Tables.cs index 6e0e66a..da129c5 100644 --- a/LuskiServer/Classes/Tables.cs +++ b/LuskiServer/Classes/Tables.cs @@ -5,20 +5,33 @@ namespace LuskiServer.Classes; public static class Tables { - public static Table Users { get; } = new("users", null!); public static Table AltServers { get; } = new("alt_servers", null!); - public static Table Server { get; } = new("server", null!); - public static Table Roles { get; } = new("roles", null!); - public static Table Logs { get; } = new("logs", null!); - public static Table Files { get; } = new("files", null!); public static Table Categories { get; } = new("categories", null!); + public static Table CategoryParents { get; } = new("categories_parents", null!); + public static Table CategoryProfiles { get; } = new("categories_profiles", null!); + public static Table CategoryRoleOverrides { get; } = new("category_role_overrides", null!); + public static Table CategoryUserOverrides { get; } = new("category_user_overrides", null!); + public static Table ChannelKeys { get; } = new("channel_keys", null!); + public static Table ChannelProfiles { get; } = new("channel_profiles", null!); + public static Table ChannelRoleOverrides { get; } = new("channel_role_overrides", null!); public static Table Channels { get; } = new("channels", null!); + public static Table ChannelUserOverrides { get; } = new("channel_user_overrides", null!); + public static Table FileChannels { get; } = new("file_channels", null!); + public static Table Files { get; } = new("files", null!); + public static Table Keys { get; } = new("keys", null!); + public static Table Logs { get; } = new("logs", null!); + public static Table MessageFiles { get; } = new("message_files", null!); public static Table Messages { get; } = new("messages", null!); - public static Table ServerRoleOverrides { get; } = new("role_overrides", null!); - public static Table Storage { get; } = new("storage", null!); - public static Table UserRoleOverrides { get; } = new("user_overrides", null!); + public static Table OfflineData { get; } = new("offline_data", null!); + public static Table ProfileColors { get; } = new("profile_colors", null!); + public static Table ProfileControllers { get; } = new("profile_controllers", null!); + public static Table ProfileRoleControllers { get; } = new("profiles_role_controllers", null!); + public static Table Profiles { get; } = new("profiles", null!); + public static Table RoleMembers { get; } = new("role_members", null!); + public static Table Roles { get; } = new("roles", null!); + public static Table Server { get; } = new("server", null!); public static Table Sessions { get; } = new("sessions", null!); public static Table SessionTokens { get; } = new("session_tokens", null!); - public static Table Keys { get; } = new("keys", null!); - public static Table ChannelProfiles { get; } = new("channel_profiles", null!); + public static Table Storage { get; } = new("storage", null!); + public static Table Users { get; } = new("users", null!); } \ No newline at end of file diff --git a/LuskiServer/Controllers/v1/KeysController.cs b/LuskiServer/Controllers/v1/KeysController.cs index 761156f..cdceb1f 100644 --- a/LuskiServer/Controllers/v1/KeysController.cs +++ b/LuskiServer/Controllers/v1/KeysController.cs @@ -46,7 +46,7 @@ public class KeysController : ControllerBase try { if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; - if (!Tables.Keys.TryRead(Keys.Owner, out long Owner, Keys.ID.CreateParameter(keyid)) || (Owner != ID || !LuskiFunctions.HasPermissions(ID, ServerPermission.DeleteKeys))) + if (!LuskiFunctions.HasPermissions(ID, ServerPermission.DeleteKeys)) return this.ResponseCodeToResult(ErrorCode.Forbidden); Tables.Keys.DeleteRow(Keys.ID.CreateParameter(keyid)); @@ -77,10 +77,9 @@ public class KeysController : ControllerBase if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; LuskiFunctions.Snowflake sf = LuskiFunctions.Snowflake.GenerateSnowflake(LuskiFunctions.Config.ServerEpoch); - Console.WriteLine("P"); Tables.Keys.Insert( Keys.ID.CreateParameter(sf.ID), - Keys.Owner.CreateParameter(ID), + //Keys.Owner.CreateParameter(ID), Keys.EncryptionType.CreateParameter(keyreq.EncryptionType), Keys.KeyData.CreateParameter(Convert.FromBase64String(keyreq.Data))); return StatusCode(202); @@ -104,24 +103,9 @@ public class KeysController : ControllerBase try { if (!Tables.Users.TryRead(Users.ID, out _, Users.ID.CreateParameter(userid))) return this.ResponseCodeToResult(ErrorCode.Forbidden); - bool UserOnline = Tables.Sessions.TryReadRows(out SessionsRow[] usersessions, Sessions.User.CreateParameter(userid)); + bool UserOnline = Tables.Sessions.TryReadRows(out SessionsRow[]? usersessions, Sessions.User.CreateParameter(userid)); List req = new(); - if (!UserOnline) - { - foreach (StorageRow StorageRow in Tables.Storage.ReadRows(uint.MaxValue, Storage.AccountID.CreateParameter(userid))) - { - KeyRow Row = Tables.Keys.ReadRow(Keys.ID.CreateParameter(StorageRow.OffileKey)); - req.Add(new KeyGetSTC() - { - ID = Row.ID, - Owner = Row.Owner, - EncryptionType = Row.EncryptionType, - Data = Convert.ToBase64String(Row.KeyData) - }); - } - - } - else + if (UserOnline) { List b = new(); foreach (SessionsRow sess in usersessions) @@ -131,7 +115,6 @@ public class KeysController : ControllerBase req.Add(new KeyGetSTC() { ID = Row.ID, - Owner = Row.Owner, EncryptionType = Row.EncryptionType, Data = Convert.ToBase64String(Row.KeyData) }); @@ -140,11 +123,23 @@ public class KeysController : ControllerBase foreach (StorageRow StorageRow in Tables.Storage.ReadRows(uint.MaxValue, Storage.AccountID.CreateParameter(userid))) { if (b.Contains(StorageRow.ID)) continue; - KeyRow Row = Tables.Keys.ReadRow(Keys.ID.CreateParameter(StorageRow.OffileKey)); + KeyRow Row = Tables.Keys.ReadRow(Keys.ID.CreateParameter(StorageRow.OfflineKey)); + req.Add(new KeyGetSTC() + { + ID = Row.ID, + EncryptionType = Row.EncryptionType, + Data = Convert.ToBase64String(Row.KeyData) + }); + } + } + else + { + foreach (StorageRow StorageRow in Tables.Storage.ReadRows(uint.MaxValue, Storage.AccountID.CreateParameter(userid))) + { + KeyRow Row = Tables.Keys.ReadRow(Keys.ID.CreateParameter(StorageRow.OfflineKey)); req.Add(new KeyGetSTC() { ID = Row.ID, - Owner = Row.Owner, EncryptionType = Row.EncryptionType, Data = Convert.ToBase64String(Row.KeyData) }); @@ -177,7 +172,6 @@ public class KeysController : ControllerBase return this.ResponseToResult(new KeyGetSTC() { ID = Row.ID, - Owner = Row.Owner, EncryptionType = Row.EncryptionType, Data = Convert.ToBase64String(Row.KeyData) }); @@ -206,21 +200,19 @@ public class KeysController : ControllerBase try { if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; - bool f = Tables.Storage.TryRead(Storage.Data, out byte[][]? data, Storage.ID.CreateParameter(StorageID)); + bool f = Tables.OfflineData.TryRead(OfflineData.Data, out byte[]? data, OfflineData.StorageID.CreateParameter(StorageID)); if (f && data!.Any()) return this.ShowError(ErrorCode.Forbidden, "you cant change your key until you download your data"); long k = 0; - if (Tables.Storage.TryRead(Storage.OffileKey, out k, Storage.ID.CreateParameter(StorageID)) && k !=0) + if (Tables.Storage.TryRead(Storage.OfflineKey, out k, Storage.ID.CreateParameter(StorageID)) && k !=0) { Tables.Keys.DeleteRow(Keys.ID.CreateParameter(k)); } LuskiFunctions.Snowflake sf = LuskiFunctions.Snowflake.GenerateSnowflake(LuskiFunctions.Config.ServerEpoch); - Console.WriteLine("OO"); Tables.Keys.Insert( Keys.ID.CreateParameter(sf.ID), - Keys.Owner.CreateParameter(ID), Keys.EncryptionType.CreateParameter(keyreq.EncryptionType), Keys.KeyData.CreateParameter(Convert.FromBase64String(keyreq.Data))); - Tables.Storage.CreateCommand().WithFilter(Storage.ID, StorageID).WithValue(Storage.OffileKey, sf.ID); + Tables.Storage.CreateCommand().WithFilter(Storage.ID, StorageID).WithValue(Storage.OfflineKey, sf.ID); return StatusCode(202); } catch (Exception ex) diff --git a/LuskiServer/Controllers/v1/OfflineDataController.cs b/LuskiServer/Controllers/v1/OfflineDataController.cs index 001052b..2948827 100644 --- a/LuskiServer/Controllers/v1/OfflineDataController.cs +++ b/LuskiServer/Controllers/v1/OfflineDataController.cs @@ -18,18 +18,21 @@ public class OfflineDataController : ControllerBase { try { - Console.WriteLine("Storage GET 1: " +SID.ToString()); if (!this.CanTokenRequest(out long UID, out long SSID, out IActionResult? toc) && toc != null) return toc; - Console.WriteLine("Storage GET 1: " +SID.ToString()); 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); List bbb = new(); - foreach (byte[]? blob in row.Data) + if (Tables.OfflineData.TryReadRows(out var rows, OfflineData.StorageID.CreateParameter(SID))) { - bbb.Add(Convert.ToBase64String(blob)); + foreach (var blob in rows) + { + bbb.Add(Convert.ToBase64String(blob.Data)); + } } - Tables.Storage.CreateCommand().WithFilter(Storage.ID, SID).WithValue(Storage.Data, Array.Empty()).Update(); + + Tables.OfflineData.DeleteRow(OfflineData.StorageID.CreateParameter(SID)); + //Tables.Storage.CreateCommand().WithFilter(Storage.ID, SID).WithValue(Storage.Data, Array.Empty()).Update(); return this.ResponseToResult(new OfflineDataBlobSTC() { Data = bbb.ToArray() @@ -47,16 +50,7 @@ public class OfflineDataController : ControllerBase { try { - foreach (var h in HttpContext.Request.Headers) - { - foreach (var v in h.Value) - { - Console.WriteLine(h.Key + ": " + v); - } - } - Console.WriteLine("Storage GET: " +SID.ToString()); - if (!this.CanTokenRequest(out long UID, out long SSID, out IActionResult? toc) && toc != null) return toc; - Console.WriteLine("Storage GET: " +SID.ToString()); + if (!this.CanTokenRequest(out long UID, out long SSID, out IActionResult? toc) && toc != null) return toc; 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); @@ -96,9 +90,7 @@ public class OfflineDataController : ControllerBase Console.WriteLine(h.Key + ": " + v); } } - Console.WriteLine("Storage Patch: " +SID.ToString()); if (!this.CanTokenRequest(out long UID, out long SSID, out IActionResult? toc) && toc != null) return toc; - Console.WriteLine("Storage Patch: " +SID.ToString()); 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); @@ -130,8 +122,7 @@ public class OfflineDataController : ControllerBase Storage.ID.CreateParameter(sf.ID), Storage.Password.CreateParameter(Convert.FromBase64String(si.Password)), Storage.AccountID.CreateParameter(UID), - Storage.Data.CreateParameter(Array.Empty()), - Storage.OffileKey.CreateParameter(0)); + Storage.OfflineKey.CreateParameter(0)); 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 5d69fcd..f1c80e4 100644 --- a/LuskiServer/Controllers/v1/SocketAccountController.cs +++ b/LuskiServer/Controllers/v1/SocketAccountController.cs @@ -79,7 +79,6 @@ public class SocketAccountController : Controller Tables.Keys.Insert( Keys.ID.CreateParameter(kid), Keys.EncryptionType.CreateParameter(EncryptionType.RSA), - Keys.Owner.CreateParameter(ID), Keys.KeyData.CreateParameter(Encoding.UTF8.GetBytes(KeyRaw))); Thread t = new(o => RegToken((string?)o, kid)); t.Start(Token); @@ -147,7 +146,6 @@ public class SocketAccountController : Controller Tables.Keys.Insert( Keys.ID.CreateParameter(kid), Keys.EncryptionType.CreateParameter(EncryptionType.RSA), - Keys.Owner.CreateParameter(ID), Keys.KeyData.CreateParameter(Encoding.UTF8.GetBytes(KeyRaw))); Thread t = new(o => RegToken((string?)o, kid)); t.Start(Token); @@ -227,10 +225,43 @@ public class SocketAccountController : Controller int num = new Random().Next(1000, 1000000000); int num2 = new Random().Next(1000, 1000000000); LuskiFunctions.Snowflake id = LuskiFunctions.Snowflake.GenerateSnowflake(LuskiFunctions.Config.ServerEpoch); + bool owner = false; if (Tables.Server.Read(Server.Owner, Server.ID.CreateParameter(0)) == -1) { id = new(0); Tables.Server.CreateCommand().WithValue(Server.Owner, id.ID).Update(); + if (!Tables.Keys.TryRead(Keys.ID, out _, Keys.ID.CreateParameter(0))) + { + Tables.Keys.Insert( + Keys.ID.CreateParameter(0), + Keys.EncryptionType.CreateParameter(EncryptionType.None), + Keys.KeyData.CreateParameter(Array.Empty())); + } + if (!Tables.Categories.TryRead(Categories.ID, out _, Categories.ID.CreateParameter(0))) + { + Tables.Categories.Insert( + Categories.ID.CreateParameter(0), + Categories.Name.CreateParameter(Encoding.UTF8.GetBytes("server")), + Categories.Description.CreateParameter( + Encoding.UTF8.GetBytes("The default category for the server. Everybody will see this category.")) + ); + Tables.Channels.Insert( + Channels.ID.CreateParameter(0), + Channels.Type.CreateParameter(ChannelType.TextAndVoice), + Channels.Description.CreateParameter(Encoding.UTF8.GetBytes("Default chat for you to use in your new server")), + Channels.Name.CreateParameter(Encoding.UTF8.GetBytes("Default Channel")), + Channels.Epoch.CreateParameter(DateTime.UtcNow.Date), + Channels.TitleEncryptionKey.CreateParameter(0), + Channels.Parent.CreateParameter(0), + Channels.DescriptionEncryptionKey.CreateParameter(0), + Channels.TitleEncoderType.CreateParameter(EncoderType.UTF8), + Channels.DescriptionEncoderType.CreateParameter(EncoderType.UTF8), + Channels.PictureType.CreateParameter(PictureType.none), + Channels.Picture.CreateParameter(Array.Empty()), + Channels.EncoderTypes.CreateParameter(new [] { EncoderType.UTF8 })); + Tables.ChannelKeys.Insert(ChannelKeys.Channel.CreateParameter(0), ChannelKeys.Key.CreateParameter(0)); + } + owner = true; } byte[] ID = Encoding.UTF8.GetBytes(id.ID.ToString()); byte[] Timestamp = Encoding.UTF8.GetBytes(DateTime.UtcNow.ToString()); @@ -241,25 +272,31 @@ public class SocketAccountController : Controller pfp = GetProfilePictureType(Encoding.UTF8.GetString(Body).ToUpper()); long uid = id.ID; long kid = LuskiFunctions.Snowflake.GenerateSnowflake(LuskiFunctions.Config.ServerEpoch).ID; + long pid = LuskiFunctions.Snowflake.GenerateSnowflake(LuskiFunctions.Config.ServerEpoch).ID; + Tables.Profiles.Insert( + Profiles.DisplayName.CreateParameter(DisplayName!.Replace("'", "\'")), + Profiles.ID.CreateParameter(pid), + Profiles.PictureType.CreateParameter(pfp), + Profiles.Picture.CreateParameter(Body), + Profiles.CanUpdateName.CreateParameter(true)); Tables.Users.Insert( Users.ID.CreateParameter(uid), - Users.DisplayName.CreateParameter(DisplayName!.Replace("'", "\'")), + Users.ServerProfile.CreateParameter(pid), Users.SelectedChannel.CreateParameter(0), //TODO set to default channel Users.Status.CreateParameter(UserStatus.Online), - Users.PictureType.CreateParameter(pfp), - Users.Picture.CreateParameter(Body), - Users.Roles.CreateParameter(new long[] {0}), Users.Username.CreateParameter(Username), Users.Password.CreateParameter(PasBytes), Users.Salt.CreateParameter(salt)); - List old = Tables.Roles.Read(Roles.MembersList, Roles.ID.CreateParameter(0)).ToList(); - old.Add(uid); - Tables.Roles.CreateCommand().WithFilter(Roles.ID, 0).WithValue(Roles.MembersList,old.ToArray()).Update(); - Console.WriteLine("A"); + Tables.RoleMembers.Insert(RoleMembers.Role.CreateParameter(0), RoleMembers.User.CreateParameter(uid)); + Tables.ProfileControllers.Insert( + ProfileControllers.Profile.CreateParameter(pid), + ProfileControllers.User.CreateParameter(uid)); + Tables.CategoryProfiles.Insert( + CategoryProfiles.Profile.CreateParameter(pid), + CategoryProfiles.Category.CreateParameter(0)); Tables.Keys.Insert( Keys.ID.CreateParameter(kid), Keys.EncryptionType.CreateParameter(EncryptionType.RSA), - Keys.Owner.CreateParameter(uid), Keys.KeyData.CreateParameter(Encoding.UTF8.GetBytes(KeyRaw))); Thread t = new(o => RegToken((string?)o, kid)); t.Start(Token); diff --git a/LuskiServer/Controllers/v1/SocketBulkMessageController.cs b/LuskiServer/Controllers/v1/SocketBulkMessageController.cs index 8ee771c..a95162a 100644 --- a/LuskiServer/Controllers/v1/SocketBulkMessageController.cs +++ b/LuskiServer/Controllers/v1/SocketBulkMessageController.cs @@ -51,13 +51,12 @@ public class SocketBulkMessageController : ControllerBase } SocketBulkMessageSTC all = new(); List mmmm = new List(); - if (MostRecentID != null) + if (MostRecentID != null && Tables.Messages.CreateCommand() + .WithFilter(Messages.ID, long.Parse(MostRecentID), sign) + .WithFilter(Messages.ChannelID, Channel_Id) + .DescendBy(Messages.Timestamp) + .TryReadRows(out MessageRow[]? rawmsgs)) { - MessageRow[] rawmsgs = Tables.Messages.ReadRows((uint)MessagesToDownload, - Messages.ID.GetDecendingOrder(), - Messages.ID.CreateParameter(long.Parse(MostRecentID), sign), - Messages.ChannelID.CreateParameter(Channel_Id)); - foreach (MessageRow Row in rawmsgs) { MessageSTC temp = new() @@ -66,26 +65,28 @@ public class SocketBulkMessageController : ControllerBase EncoderType = Row.EncoderType, EncryptionKey = Row.EncryptionKey, ChannelID = Row.ChannelID, + ProfileID = Row.ProfileID, AuthorID = Row.AuthorID, ID = Row.ID, Files = Array.Empty(), - IsProfile = Row.IsChannelProfile, + Timestamp = Row.Timestamp }; - if (Row.Files.Any()) + + if (Tables.MessageFiles.CreateCommand().WithFilter(MessageFiles.MessageID, Row.ID) + .WithCrossTableCheck(MessageFiles.FileID, Tables.Files, Files.ID).TryReadRows(out FileRow[]? rows)) { List list = new(); - foreach (long b in Row.Files) + foreach (FileRow b in rows) { - FileRow fileraw = Tables.Files.ReadRow(Files.ID.CreateParameter(b)); ServerFileInfoSTC file = new() { - ID = b, - Name = Convert.ToBase64String(fileraw.Name), - Size = fileraw.Size, - NameEncoder = fileraw.NameEncoderType, - NameKey = fileraw.NameEncryptionKey, - Encoder = fileraw.EncoderType, - Key = fileraw.EncryptionKey, + ID = b.ID, + Name = Convert.ToBase64String(b.Name), + Size = b.Size, + NameEncoder = b.NameEncoderType, + NameKey = b.NameEncryptionKey, + Encoder = b.EncoderType, + Key = b.EncryptionKey, }; list.Add(file); } diff --git a/LuskiServer/Controllers/v1/SocketCategoryController.cs b/LuskiServer/Controllers/v1/SocketCategoryController.cs index 2ba150b..892f208 100644 --- a/LuskiServer/Controllers/v1/SocketCategoryController.cs +++ b/LuskiServer/Controllers/v1/SocketCategoryController.cs @@ -22,58 +22,82 @@ public class SocketCategoryController : ControllerBase if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; if (!LuskiFunctions.HasAccessToCategory(ID, ChanReq.Parent, out ServerPermission opt, ServerPermission.CreateCategories)) return this.ResponseCodeToResult(ErrorCode.Forbidden); DateTime epoch = LuskiFunctions.Config.ServerEpoch; - List RoleOverides = new(), UserOverides = new(); + + epoch = DateTime.UtcNow.Date; + LuskiFunctions.Snowflake chanSnowflake = LuskiFunctions.Snowflake.GenerateSnowflake(epoch); + Tables.Categories.Insert( + Categories.ColorType.CreateParameter(ChanReq.ColorType), + Categories.ID.CreateParameter(chanSnowflake.ID), + Categories.Name.CreateParameter(Convert.FromBase64String(ChanReq.Name)), + Categories.Description.CreateParameter(Convert.FromBase64String(ChanReq.Description)), + Categories.TitleEncryptionKey.CreateParameter(ChanReq.TitleEncryptionKey), + Categories.DescriptionEncryptionKey.CreateParameter(ChanReq.DescriptionEncryptionKey), + Categories.TitleEncoderType.CreateParameter(ChanReq.TitleEncoderType), + Categories.DescriptionEncoderType.CreateParameter(ChanReq.DescriptionEncoderType)); + Tables.CategoryParents.Insert(CategoryParents.Parent.CreateParameter(ChanReq.Parent), CategoryParents.ID.CreateParameter(chanSnowflake.ID)); + if (ChanReq.RoleOverrides.Length > 0) { - foreach (UserRoleOverrideCTS over in ChanReq.RoleOverrides) + foreach (RoleOverrideCTS over in ChanReq.RoleOverrides) { - LuskiFunctions.Snowflake overSnowflake = LuskiFunctions.Snowflake.GenerateSnowflake(epoch); - Tables.ServerRoleOverrides.Insert( - ServerRoleOverrides.ID.CreateParameter(overSnowflake.ID), - ServerRoleOverrides.RoleID.CreateParameter(over.RoleID), - ServerRoleOverrides.GoodPermissions.CreateParameter(over.GoodPermissions), - ServerRoleOverrides.BadPermissions.CreateParameter(over.BadPermissions)); - RoleOverides.Add(overSnowflake.ID); + Tables.CategoryRoleOverrides.Insert( + CategoryRoleOverrides.Category.CreateParameter(chanSnowflake.ID), + CategoryRoleOverrides.RoleOverride.CreateParameter(over.RoleID), + CategoryRoleOverrides.GoodPermissions.CreateParameter(over.GoodPermissions), + CategoryRoleOverrides.BadPermissions.CreateParameter(over.BadPermissions)); } } if (ChanReq.UserOverrides.Length > 0) { foreach (UserOverrideCTS over in ChanReq.UserOverrides) { - LuskiFunctions.Snowflake overSnowflake = LuskiFunctions.Snowflake.GenerateSnowflake(epoch); - Tables.UserRoleOverrides.Insert( - UserRoleOverrides.ID.CreateParameter(overSnowflake.ID), - UserRoleOverrides.UserID.CreateParameter(over.UserID), - UserRoleOverrides.GoodPermissions.CreateParameter(over.GoodPermissions), - UserRoleOverrides.BadPermissions.CreateParameter(over.BadPermissions)); - UserOverides.Add(overSnowflake.ID); + Tables.CategoryUserOverrides.Insert( + CategoryUserOverrides.Category.CreateParameter(chanSnowflake.ID), + CategoryUserOverrides.UserOverride.CreateParameter(over.UserID), + CategoryUserOverrides.GoodPermissions.CreateParameter(over.GoodPermissions), + CategoryUserOverrides.BadPermissions.CreateParameter(over.BadPermissions)); } - } - - epoch = DateTime.UtcNow.Date; - LuskiFunctions.Snowflake chanSnowflake = LuskiFunctions.Snowflake.GenerateSnowflake(epoch); - Tables.Categories.Insert( - Categories.ID.CreateParameter(chanSnowflake.ID), - Categories.Parent.CreateParameter(ChanReq.Parent), - Categories.Name.CreateParameter(Convert.FromBase64String(ChanReq.Name)), - Categories.Description.CreateParameter(Convert.FromBase64String(ChanReq.Description)), - Categories.RoleOverrides.CreateParameter(RoleOverides.ToArray()), - Categories.UserOverrides.CreateParameter(UserOverides.ToArray()), - Categories.TitleEncryptionKey.CreateParameter(ChanReq.TitleEncryptionKey), - Categories.DescriptionEncryptionKey.CreateParameter(ChanReq.DescriptionEncryptionKey), - Categories.TitleEncoderType.CreateParameter(ChanReq.TitleEncoderType), - Categories.DescriptionEncoderType.CreateParameter(ChanReq.DescriptionEncoderType)); + } + CategoryRow chan = Tables.Categories.ReadRow(Categories.ID.CreateParameter(chanSnowflake.ID)); long[] ic = Array.Empty(); long[] c = Array.Empty(); if (!opt.HasPermission(ServerPermission.ViewCategories)) { - ic = Tables.Categories.ReadColumn(Categories.ID, Categories.Parent.CreateParameter(chanSnowflake.ID)); + ic = Tables.CategoryParents.ReadColumn(CategoryParents.ID, CategoryParents.Parent.CreateParameter(chanSnowflake.ID)); } if (!opt.HasPermission(ServerPermission.ViewChannels)) { c = LuskiFunctions.GetCategoryChannels(chanSnowflake.ID, ID); } + List RO = new(); + List UO = new(); + foreach (var over in Tables.CategoryRoleOverrides.ReadRows(CategoryRoleOverrides.Category.CreateParameter(chanSnowflake.ID))) + { + RO.Add(new() + { + RoleID = over.RoleOverride, + BadPermissions = over.BadPermissions, + GoodPermissions = over.GoodPermissions + }); + } + foreach (var over in Tables.CategoryUserOverrides.ReadRows(CategoryUserOverrides.Category.CreateParameter(chanSnowflake.ID))) + { + UO.Add(new() + { + UserID = over.UserOverride, + BadPermissions = over.BadPermissions, + GoodPermissions = over.GoodPermissions + }); + } + + long Parent = -1; + if (Tables.CategoryParents.TryRead(CategoryParents.Parent, out long s, + CategoryParents.ID.CreateParameter(chan.ID))) + { + Parent = s; + } + return this.ResponseToResult(new CategorySTC() { Name = Convert.ToBase64String(chan.Name), @@ -81,13 +105,122 @@ public class SocketCategoryController : ControllerBase ID = chanSnowflake.ID, Channels = c, InnerCategories = ic, - Parent = chan.Parent, + Parent = Parent, TitleEncryptionKey = chan.TitleEncryptionKey, DescriptionEncryptionKey = chan.DescriptionEncryptionKey, TitleEncoderType = chan.TitleEncoderType, DescriptionEncoderType = chan.DescriptionEncoderType, - UserOverrides = chan.UserOverrides, - RoleOverrides = chan.RoleOverrides, + UserOverrides = UO.ToArray(), + RoleOverrides = RO.ToArray(), + ColorType = chan.ColorType, + Color = Convert.ToHexString(chan.Color) + }); + } + catch (Exception e) + { + return this.ShowError(e); + } + } + + [HttpPost] + [Route(LuskiFunctions.Info.Routes.Default.Base + "/Upload/Matrix")] + public IActionResult PostMatrix([FromHeader(Name = "channel")]CategoryPostCTS ChanReq) + { + try + { + if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; + if (!LuskiFunctions.HasAccessToCategory(ID, ChanReq.Parent, out ServerPermission opt, ServerPermission.CreateCategories)) return this.ResponseCodeToResult(ErrorCode.Forbidden); + DateTime epoch = LuskiFunctions.Config.ServerEpoch; + + epoch = DateTime.UtcNow.Date; + LuskiFunctions.Snowflake chanSnowflake = LuskiFunctions.Snowflake.GenerateSnowflake(epoch); + Tables.Categories.Insert( + Categories.ID.CreateParameter(chanSnowflake.ID), + Categories.Name.CreateParameter(Convert.FromBase64String(ChanReq.Name)), + Categories.Description.CreateParameter(Convert.FromBase64String(ChanReq.Description)), + Categories.TitleEncryptionKey.CreateParameter(ChanReq.TitleEncryptionKey), + Categories.DescriptionEncryptionKey.CreateParameter(ChanReq.DescriptionEncryptionKey), + Categories.TitleEncoderType.CreateParameter(ChanReq.TitleEncoderType), + Categories.DescriptionEncoderType.CreateParameter(ChanReq.DescriptionEncoderType)); + Tables.CategoryParents.Insert(CategoryParents.Parent.CreateParameter(ChanReq.Parent), CategoryParents.ID.CreateParameter(chanSnowflake.ID)); + + if (ChanReq.RoleOverrides.Length > 0) + { + foreach (RoleOverrideCTS over in ChanReq.RoleOverrides) + { + Tables.CategoryRoleOverrides.Insert( + CategoryRoleOverrides.Category.CreateParameter(chanSnowflake.ID), + CategoryRoleOverrides.RoleOverride.CreateParameter(over.RoleID), + CategoryRoleOverrides.GoodPermissions.CreateParameter(over.GoodPermissions), + CategoryRoleOverrides.BadPermissions.CreateParameter(over.BadPermissions)); + } + } + if (ChanReq.UserOverrides.Length > 0) + { + foreach (UserOverrideCTS over in ChanReq.UserOverrides) + { + Tables.CategoryUserOverrides.Insert( + CategoryUserOverrides.Category.CreateParameter(chanSnowflake.ID), + CategoryUserOverrides.UserOverride.CreateParameter(over.UserID), + CategoryUserOverrides.GoodPermissions.CreateParameter(over.GoodPermissions), + CategoryUserOverrides.BadPermissions.CreateParameter(over.BadPermissions)); + } + } + + CategoryRow chan = Tables.Categories.ReadRow(Categories.ID.CreateParameter(chanSnowflake.ID)); + long[] ic = Array.Empty(); + long[] c = Array.Empty(); + if (!opt.HasPermission(ServerPermission.ViewCategories)) + { + ic = Tables.CategoryParents.ReadColumn(CategoryParents.ID, CategoryParents.Parent.CreateParameter(chanSnowflake.ID)); + } + if (!opt.HasPermission(ServerPermission.ViewChannels)) + { + c = LuskiFunctions.GetCategoryChannels(chanSnowflake.ID, ID); + } + List RO = new(); + List UO = new(); + foreach (var over in Tables.CategoryRoleOverrides.ReadRows(CategoryRoleOverrides.Category.CreateParameter(chanSnowflake.ID))) + { + RO.Add(new() + { + RoleID = over.RoleOverride, + BadPermissions = over.BadPermissions, + GoodPermissions = over.GoodPermissions + }); + } + foreach (var over in Tables.CategoryUserOverrides.ReadRows(CategoryUserOverrides.Category.CreateParameter(chanSnowflake.ID))) + { + UO.Add(new() + { + UserID = over.UserOverride, + BadPermissions = over.BadPermissions, + GoodPermissions = over.GoodPermissions + }); + } + + long Parent = -1; + if (Tables.CategoryParents.TryRead(CategoryParents.Parent, out long s, + CategoryParents.ID.CreateParameter(chan.ID))) + { + Parent = s; + } + + return this.ResponseToResult(new CategorySTC() + { + Name = Convert.ToBase64String(chan.Name), + Description = Convert.ToBase64String(chan.Description), + ID = chanSnowflake.ID, + Channels = c, + InnerCategories = ic, + Parent = Parent, + TitleEncryptionKey = chan.TitleEncryptionKey, + DescriptionEncryptionKey = chan.DescriptionEncryptionKey, + TitleEncoderType = chan.TitleEncoderType, + DescriptionEncoderType = chan.DescriptionEncoderType, + UserOverrides = UO.ToArray(), + RoleOverrides = RO.ToArray(), + ColorType = chan.ColorType, Color = Convert.ToHexString(chan.Color) }); } @@ -135,7 +268,7 @@ public class SocketCategoryController : ControllerBase long[] c = Array.Empty(); if (!opt.HasPermission(ServerPermission.ViewCategories)) { - ic = Tables.Categories.ReadColumn(Categories.ID, Categories.Parent.CreateParameter(Channel)).ToList(); + ic = Tables.CategoryParents.ReadColumn(CategoryParents.ID, CategoryParents.Parent.CreateParameter(Channel)).ToList(); } if (!opt.HasPermission(ServerPermission.ViewChannels)) { @@ -146,6 +279,32 @@ public class SocketCategoryController : ControllerBase { if (!LuskiFunctions.HasAccessToChannel(ID, cc)) ic.Remove(cc); } + List RO = new(); + List UO = new(); + foreach (var over in Tables.CategoryRoleOverrides.ReadRows(CategoryRoleOverrides.Category.CreateParameter(chan.ID))) + { + RO.Add(new() + { + RoleID = over.RoleOverride, + BadPermissions = over.BadPermissions, + GoodPermissions = over.GoodPermissions + }); + } + foreach (var over in Tables.CategoryUserOverrides.ReadRows(CategoryUserOverrides.Category.CreateParameter(chan.ID))) + { + UO.Add(new() + { + UserID = over.UserOverride, + BadPermissions = over.BadPermissions, + GoodPermissions = over.GoodPermissions + }); + } + long Parent = -1; + if (Tables.CategoryParents.TryRead(CategoryParents.Parent, out long s, + CategoryParents.ID.CreateParameter(chan.ID))) + { + Parent = s; + } return this.ResponseToResult(new CategorySTC() { Name = Convert.ToBase64String(chan.Name), @@ -153,13 +312,14 @@ public class SocketCategoryController : ControllerBase ID = Channel, Channels = c, InnerCategories = ic.ToArray(), - Parent = chan.Parent, + Parent = Parent, TitleEncryptionKey = chan.TitleEncryptionKey, DescriptionEncryptionKey = chan.DescriptionEncryptionKey, TitleEncoderType = chan.TitleEncoderType, DescriptionEncoderType = chan.DescriptionEncoderType, - UserOverrides = chan.UserOverrides, - RoleOverrides = chan.RoleOverrides, + UserOverrides = UO.ToArray(), + RoleOverrides = RO.ToArray(), + ColorType = chan.ColorType, Color = Convert.ToHexString(chan.Color) }); } diff --git a/LuskiServer/Controllers/v1/SocketChannelController.cs b/LuskiServer/Controllers/v1/SocketChannelController.cs index 4642b02..035f77a 100644 --- a/LuskiServer/Controllers/v1/SocketChannelController.cs +++ b/LuskiServer/Controllers/v1/SocketChannelController.cs @@ -21,57 +21,80 @@ public class SocketChannelController : ControllerBase if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; if (!LuskiFunctions.HasAccessToCategory(ID, ChanReq.Parent, ServerPermission.CreateChannels)) return this.ResponseCodeToResult(ErrorCode.Forbidden); DateTime epoch = LuskiFunctions.Config.ServerEpoch; - List RoleOverides = new(), UserOverides = new(); - if (ChanReq.RoleOverrides.Length > 0) - { - foreach (UserRoleOverrideCTS over in ChanReq.RoleOverrides) - { - LuskiFunctions.Snowflake overSnowflake = LuskiFunctions.Snowflake.GenerateSnowflake(epoch); - Tables.ServerRoleOverrides.Insert( - ServerRoleOverrides.ID.CreateParameter(overSnowflake.ID), - ServerRoleOverrides.RoleID.CreateParameter(over.RoleID), - ServerRoleOverrides.GoodPermissions.CreateParameter(over.GoodPermissions), - ServerRoleOverrides.BadPermissions.CreateParameter(over.BadPermissions)); - RoleOverides.Add(overSnowflake.ID); - } - } - if (ChanReq.UserOverrides.Length > 0) - { - foreach (UserOverrideCTS over in ChanReq.UserOverrides) - { - LuskiFunctions.Snowflake overSnowflake = LuskiFunctions.Snowflake.GenerateSnowflake(epoch); - Tables.UserRoleOverrides.Insert( - UserRoleOverrides.ID.CreateParameter(overSnowflake.ID), - UserRoleOverrides.UserID.CreateParameter(over.UserID), - UserRoleOverrides.GoodPermissions.CreateParameter(over.GoodPermissions), - UserRoleOverrides.BadPermissions.CreateParameter(over.BadPermissions)); - UserOverides.Add(overSnowflake.ID); - } - } + //List RoleOverides = new(), UserOverides = new(); + epoch = DateTime.UtcNow.Date; LuskiFunctions.Snowflake chanSnowflake = LuskiFunctions.Snowflake.GenerateSnowflake(epoch); Tables.Channels.Insert( Channels.ID.CreateParameter(chanSnowflake.ID), Channels.Parent.CreateParameter(ChanReq.Parent), + Channels.ColorType.CreateParameter(ChanReq.ColorType), Channels.Color.CreateParameter(Convert.FromHexString(ChanReq.Color)), Channels.Type.CreateParameter(ChanReq.Type), Channels.Epoch.CreateParameter(epoch.Date), Channels.Name.CreateParameter(Convert.FromBase64String(ChanReq.Name)), Channels.Description.CreateParameter(Convert.FromBase64String(ChanReq.Description)), - Channels.RoleOverrides.CreateParameter(RoleOverides.ToArray()), - Channels.UserOverrides.CreateParameter(UserOverides.ToArray()), Channels.TitleEncryptionKey.CreateParameter(ChanReq.TitleEncryptionKey), Channels.DescriptionEncryptionKey.CreateParameter(ChanReq.DescriptionEncryptionKey), - Channels.EncryptionKeys.CreateParameter(ChanReq.EncryptionKeys), Channels.TitleEncoderType.CreateParameter(ChanReq.TitleEncoderType), Channels.DescriptionEncoderType.CreateParameter(ChanReq.DescriptionEncoderType), Channels.PictureType.CreateParameter(PictureType.none), Channels.Picture.CreateParameter(Array.Empty()), - Channels.EncoderTypes.CreateParameter(ChanReq.EncoderTypes), - Channels.Profiles.CreateParameter(Array.Empty())); + Channels.EncoderTypes.CreateParameter(ChanReq.EncoderTypes)); + foreach (long ek in ChanReq.EncryptionKeys) + { + Tables.ChannelKeys.Insert(ChannelKeys.Channel.CreateParameter(chanSnowflake.ID), ChannelKeys.Key.CreateParameter(ek)); + } + + if (ChanReq.RoleOverrides.Length > 0) + { + foreach (RoleOverrideCTS over in ChanReq.RoleOverrides) + { + Tables.ChannelRoleOverrides.Insert( + ChannelRoleOverrides.Channel.CreateParameter(chanSnowflake.ID), + ChannelRoleOverrides.RoleOverride.CreateParameter(over.RoleID), + ChannelRoleOverrides.GoodPermissions.CreateParameter(over.GoodPermissions), + ChannelRoleOverrides.BadPermissions.CreateParameter(over.BadPermissions)); + } + } + if (ChanReq.UserOverrides.Length > 0) + { + foreach (UserOverrideCTS over in ChanReq.UserOverrides) + { + Tables.ChannelUserOverrides.Insert( + ChannelUserOverrides.Channel.CreateParameter(chanSnowflake.ID), + ChannelUserOverrides.UserOverride.CreateParameter(over.UserID), + ChannelUserOverrides.GoodPermissions.CreateParameter(over.GoodPermissions), + ChannelUserOverrides.BadPermissions.CreateParameter(over.BadPermissions)); + } + } + + + ChannelRow chan = Tables.Channels.ReadRow(Channels.ID.CreateParameter(chanSnowflake.ID)); + List RO = new(); + List UO = new(); + foreach (var over in Tables.ChannelRoleOverrides.ReadRows(ChannelRoleOverrides.Channel.CreateParameter(chanSnowflake.ID))) + { + RO.Add(new() + { + RoleID = over.RoleOverride, + BadPermissions = over.BadPermissions, + GoodPermissions = over.GoodPermissions + }); + } + foreach (var over in Tables.ChannelUserOverrides.ReadRows(ChannelUserOverrides.Channel.CreateParameter(chanSnowflake.ID))) + { + UO.Add(new() + { + UserID = over.UserOverride, + BadPermissions = over.BadPermissions, + GoodPermissions = over.GoodPermissions + }); + } + return this.ResponseToResult(new ChannelSTC() { Name = Convert.ToBase64String(chan.Name), @@ -82,13 +105,14 @@ public class SocketChannelController : ControllerBase Epoch = chan.Epoch, TitleEncryptionKey = chan.TitleEncryptionKey, DescriptionEncryptionKey = chan.DescriptionEncryptionKey, - EncryptionKeys = chan.EncryptionKeys, + EncryptionKeys = Tables.ChannelKeys.ReadColumn(ChannelKeys.Key, ChannelKeys.Channel.CreateParameter(chanSnowflake.ID)), TitleEncoderType = chan.TitleEncoderType, DescriptionEncoderType = chan.DescriptionEncoderType, EncoderTypes = chan.EncoderTypes, - UserOverrides = chan.UserOverrides, - RoleOverrides = chan.RoleOverrides, + UserOverrides = UO.ToArray(), + RoleOverrides = RO.ToArray(), PictureType = chan.PictureType, + ColorType = chan.ColorType, Color = Convert.ToHexString(chan.Color) }); } @@ -160,6 +184,26 @@ public class SocketChannelController : ControllerBase if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; if (!LuskiFunctions.HasAccessToChannel(ID, Channel, ServerPermission.ViewChannels)) return this.ResponseCodeToResult(ErrorCode.Forbidden); ChannelRow chan = Tables.Channels.ReadRow(Channels.ID.CreateParameter(Channel)); + List RO = new(); + List UO = new(); + foreach (var over in Tables.ChannelRoleOverrides.ReadRows(ChannelRoleOverrides.Channel.CreateParameter(chan.ID))) + { + RO.Add(new() + { + RoleID = over.RoleOverride, + BadPermissions = over.BadPermissions, + GoodPermissions = over.GoodPermissions + }); + } + foreach (var over in Tables.ChannelUserOverrides.ReadRows(ChannelUserOverrides.Channel.CreateParameter(chan.ID))) + { + UO.Add(new() + { + UserID = over.UserOverride, + BadPermissions = over.BadPermissions, + GoodPermissions = over.GoodPermissions + }); + } return this.ResponseToResult(new ChannelSTC() { Name = Convert.ToBase64String(chan.Name), @@ -170,13 +214,14 @@ public class SocketChannelController : ControllerBase Epoch = chan.Epoch, TitleEncryptionKey = chan.TitleEncryptionKey, DescriptionEncryptionKey = chan.DescriptionEncryptionKey, - EncryptionKeys = chan.EncryptionKeys, + EncryptionKeys = Tables.ChannelKeys.ReadColumn(ChannelKeys.Key, ChannelKeys.Channel.CreateParameter(Channel)), TitleEncoderType = chan.TitleEncoderType, DescriptionEncoderType = chan.DescriptionEncoderType, EncoderTypes = chan.EncoderTypes, - UserOverrides = chan.UserOverrides, - RoleOverrides = chan.RoleOverrides, + UserOverrides = UO.ToArray(), + RoleOverrides = RO.ToArray(), PictureType = chan.PictureType, + ColorType = chan.ColorType, Color = Convert.ToHexString(chan.Color) }); } diff --git a/LuskiServer/Controllers/v1/SocketChannelProfileController.cs b/LuskiServer/Controllers/v1/SocketChannelProfileController.cs deleted file mode 100644 index 1651728..0000000 --- a/LuskiServer/Controllers/v1/SocketChannelProfileController.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System.Net.Mime; -using Asp.Versioning; -using Luski.Shared.PublicServers.V1.Enums; -using Luski.Shared.PublicServers.V1.ServerToClient.HTTP; -using LuskiServer.Classes; -using LuskiServer.Classes.TableDef; -using Microsoft.AspNetCore.Mvc; - -namespace LuskiServer.Controllers.v1; - -[ApiVersion(1)] -[ApiController] -public class SocketChannelProfileController : ControllerBase -{ - /// - /// Returns the Avatar for the channel profile. - /// - /// The ID of the requested profile - /// - [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(typeof(STC), StatusCodes.Status403Forbidden)] - [Produces(MediaTypeNames.Image.Jpeg, MediaTypeNames.Image.Gif, MediaTypeNames.Image.Tiff, "image/png", MediaTypeNames.Application.Json)] - [Route(LuskiFunctions.Info.Routes.Default.Base + "/Avatar/{id:long}")] - public IActionResult? Avatar(long id) - { - if (Tables.ChannelProfiles.TryRead(ChannelProfiles.Picture, out byte[]? image, ChannelProfiles.ID.CreateParameter(id))) - { - return Tables.ChannelProfiles.Read(ChannelProfiles.PictureType, ChannelProfiles.ID.CreateParameter(id)) switch - { - PictureType.png => File(image, "image/png"), - PictureType.jpeg => File(image, "image/jpeg"), - PictureType.bmp => File(image, "image/bmp"), - PictureType.gif => File(image, "image/gif"), - PictureType.ico => File(image, "image/vnd.microsoft.icon"), - PictureType.svg => File(image, "image/svg+xml"), - PictureType.tif => File(image, "image/tiff"), - PictureType.webp => File(image, "image/webp"), - //should never happen - _ => File(image, "image/png"), - }; - } - else - { - return StatusCode(403, new STC() - { - Error = ErrorCode.Forbidden, - ErrorMessage = "the user you have given does not exist" - }); - } - } - - [HttpGet] - [Route(LuskiFunctions.Info.Routes.Default.Base)] - public IActionResult Get([FromHeader(Name = "id")]long Person) - { - try - { - if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; - if (Person != ID && !Tables.ChannelProfiles.TryRead(ChannelProfiles.ID, out _, ChannelProfiles.ID.CreateParameter(Person))) return this.ShowError(ErrorCode.Forbidden, "Profile does not exist"); - return this.ResponseToResult(new ChannelProfileSTC() - { - ID = Person, - DisplayName = Tables.ChannelProfiles.Read(ChannelProfiles.DisplayName, ChannelProfiles.ID.CreateParameter(Person)), - PictureType = Tables.ChannelProfiles.Read(ChannelProfiles.PictureType, ChannelProfiles.ID.CreateParameter(Person)), - Controllers = Tables.ChannelProfiles.Read(ChannelProfiles.Controllers, ChannelProfiles.ID.CreateParameter(Person)), - Color = Convert.ToHexString(Tables.ChannelProfiles.Read(ChannelProfiles.Color, ChannelProfiles.ID.CreateParameter(Person))), - }); - } - catch (Exception e) - { - return this.ShowError(e); - } - } -} \ No newline at end of file diff --git a/LuskiServer/Controllers/v1/SocketFileController.cs b/LuskiServer/Controllers/v1/SocketFileController.cs index 8019009..70e2c43 100644 --- a/LuskiServer/Controllers/v1/SocketFileController.cs +++ b/LuskiServer/Controllers/v1/SocketFileController.cs @@ -42,7 +42,7 @@ public class SocketFileController : ControllerBase return this.ShowError(e); } } - + [HttpDelete] [Route(LuskiFunctions.Info.Routes.Default.Base)] public IActionResult Delete([FromHeader(Name = "id")] long File_id) @@ -70,12 +70,17 @@ public class SocketFileController : ControllerBase [HttpPost] [Route(LuskiFunctions.Info.Routes.Default.Base)] - public IActionResult Post([FromBody] byte[] data, [FromHeader(Name = "name_encoder")] EncoderType nameEncoderNum, [FromHeader(Name = "name_encryption")]long nameEncryptionRaw, [FromHeader(Name = "encoder")] EncoderType EncoderNum, [FromHeader(Name = "encryption")]long EncryptionRaw, [FromHeader(Name = "name")]string name) + public async Task Post([FromHeader(Name = "name_encoder")] EncoderType nameEncoderNum, [FromHeader(Name = "name_encryption")]long nameEncryptionRaw, [FromHeader(Name = "encoder")] EncoderType EncoderNum, [FromHeader(Name = "encryption")]long EncryptionRaw, [FromHeader(Name = "name")]string name) { try { if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; - + byte[] data; + using (MemoryStream reader = new()) + { + await Request.Body.CopyToAsync(reader); + data = reader.ToArray(); + } byte[] hash = Encryption.Hashing.SHA256(data); if (Tables.Files.TryReadRow(out FileRow ido, Files.Hash.CreateParameter(hash))) return this.ResponseToResult(new ServerFileInfoSTC() @@ -88,9 +93,7 @@ public class SocketFileController : ControllerBase NameKey = ido.NameEncryptionKey, Size = ido.Size }); - long ido2 = LuskiFunctions.Snowflake.GenerateSnowflake(LuskiFunctions.Config.ServerEpoch).ID; - Tables.Files.Insert( Files.ID.CreateParameter(ido2), Files.Size.CreateParameter(data.Length), @@ -102,17 +105,16 @@ public class SocketFileController : ControllerBase Files.EncryptionKey.CreateParameter(EncryptionRaw), Files.Hash.CreateParameter(hash), Files.Owner.CreateParameter(ID), - Files.Public.CreateParameter(false), - Files.AllowedChannels.CreateParameter(Array.Empty())); + Files.Public.CreateParameter(false)); return this.ResponseToResult(new ServerFileInfoSTC() { ID = ido2, Name = name, - Encoder = ido.EncoderType, - NameEncoder = ido.NameEncoderType, - Key = ido.EncryptionKey, - NameKey = ido.NameEncryptionKey, - Size = ido.Size + Encoder = EncoderNum, + NameEncoder = nameEncoderNum, + Key = EncryptionRaw, + NameKey = nameEncryptionRaw, + Size = data.Length }); } catch (Exception e) diff --git a/LuskiServer/Controllers/v1/SocketMessageController.cs b/LuskiServer/Controllers/v1/SocketMessageController.cs index 52692c6..f9308d1 100644 --- a/LuskiServer/Controllers/v1/SocketMessageController.cs +++ b/LuskiServer/Controllers/v1/SocketMessageController.cs @@ -3,12 +3,12 @@ using Asp.Versioning; using Luski.Shared.PublicServers.V1.ClientToServer.HTTP; using Luski.Shared.PublicServers.V1.Enums; using Luski.Shared.PublicServers.V1.ServerToClient.HTTP; +using Luski.Shared.PublicServers.V1.Shared; using LuskiServer.Classes; using LuskiServer.Classes.ServerComs; using LuskiServer.Classes.TableDef; using LuskiServer.Enums.ServerComs; using Microsoft.AspNetCore.Mvc; -using DataType = LuskiServer.Enums.ServerComs.DataType; namespace LuskiServer.Controllers.v1; @@ -23,30 +23,28 @@ public class SocketMessageController : ControllerBase { AuthorID = msgraw.AuthorID, Context = Convert.ToBase64String(msgraw.Context), - ID = MSG_id, - ChannelID = msgraw.ChannelID + ID = msgraw.ID, + ChannelID = msgraw.ChannelID, + ProfileID = msgraw.ProfileID }; List list = new(); - if (msgraw.Files.Any()) + if (Tables.MessageFiles.CreateCommand().WithFilter(MessageFiles.MessageID, msgraw.ID) + .WithCrossTableCheck(MessageFiles.FileID, Tables.Files, Files.ID).TryReadRows(out FileRow[]? files)) { - - foreach (long b in msgraw.Files) + foreach (FileRow b in files) { - FileRow fileraw = Tables.Files.ReadRow(Files.ID.CreateParameter(b)); ServerFileInfoSTC file = new() { - ID = b, - Name = Convert.ToBase64String(fileraw.Name), - Size = fileraw.Size, - NameEncoder = fileraw.NameEncoderType, - NameKey = fileraw.NameEncryptionKey, - Encoder = fileraw.EncoderType, - Key = fileraw.EncryptionKey + ID = b.ID, + Name = Convert.ToBase64String(b.Name), + Size = b.Size, + NameEncoder = b.NameEncoderType, + NameKey = b.NameEncryptionKey, + Encoder = b.EncoderType, + Key = b.EncryptionKey, }; list.Add(file); } - - } msg.Files = list.ToArray(); @@ -68,30 +66,29 @@ public class SocketMessageController : ControllerBase AuthorID = msgraw.AuthorID, Context = Convert.ToBase64String(msgraw.Context), ID = MSG_id, - ChannelID = Channel_Id + ChannelID = Channel_Id, + ProfileID = msgraw.ProfileID }; - if (msgraw.Files.Any()) + List list = new(); + if (Tables.MessageFiles.CreateCommand().WithFilter(MessageFiles.MessageID, msgraw.ID) + .WithCrossTableCheck(MessageFiles.FileID, Tables.Files, Files.ID).TryReadRows(out FileRow[]? files)) { - List list = new(); - foreach (long b in msgraw.Files) + foreach (FileRow b in files) { - FileRow fileraw = Tables.Files.ReadRow(Files.ID.CreateParameter(b)); ServerFileInfoSTC file = new() { - ID = b, - Name = Convert.ToBase64String(fileraw.Name), - Size = fileraw.Size, - NameEncoder = fileraw.NameEncoderType, - NameKey = fileraw.NameEncryptionKey, - Encoder = fileraw.EncoderType, - Key = fileraw.EncryptionKey + ID = b.ID, + Name = Convert.ToBase64String(b.Name), + Size = b.Size, + NameEncoder = b.NameEncoderType, + NameKey = b.NameEncryptionKey, + Encoder = b.EncoderType, + Key = b.EncryptionKey, }; list.Add(file); } - - msg.Files = list.ToArray(); } - + msg.Files = list.ToArray(); return this.ResponseToResult(msg); } catch (Exception e) @@ -110,34 +107,61 @@ public class SocketMessageController : ControllerBase { if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; if (!LuskiFunctions.HasAccessToChannel(ID, data.ChannelID, ServerPermission.SendMessages)) return this.ResponseCodeToResult(ErrorCode.Forbidden); - LuskiFunctions.Snowflake Id = LuskiFunctions.Snowflake.GenerateSnowflake(Tables.Channels.Read(Channels.Epoch, Channels.ID.CreateParameter(data.ChannelID))); + LuskiFunctions.Snowflake Id = LuskiFunctions.Snowflake.GenerateSnowflake(); ChannelType type = Tables.Channels.Read(Channels.Type, Channels.ID.CreateParameter(data.ChannelID)); bool Fake = data.Profile.HasValue; - if (Fake) + long profile = Tables.Users.Read(Users.ServerProfile, Users.ID.CreateParameter(ID)); + if (Fake) //TODO check to make sure the profile can be used by them { - ID = data.Profile!.Value; + profile = data.Profile!.Value; } MessageEvent MessageEvent = new() { - UserID = ID, + AuthorID = ID, + ProfileID = profile, ChannelID = data.ChannelID, Base64Context = data.Base64Context, ID = Id.ID, EncoderType = data.Encoding, EncryptionKey = data.EncryptionKey, Files = Array.Empty(), - IsProfile = Fake, + Timestamp = LuskiFunctions.Info.GetTimestampFromEpoch(Tables.Channels.Read(Channels.Epoch, Channels.ID.CreateParameter(data.ChannelID))) }; + Tables.Messages.Insert( Messages.ChannelID.CreateParameter(data.ChannelID), Messages.ID.CreateParameter(Id.ID), + Messages.Timestamp.CreateParameter(MessageEvent.Timestamp), Messages.AuthorID.CreateParameter(ID), + Messages.ProfileID.CreateParameter(profile), Messages.Context.CreateParameter(Convert.FromBase64String(data.Base64Context)), - Messages.Files.CreateParameter(data.Files), Messages.EncoderType.CreateParameter(data.Encoding), Messages.EncryptionKey.CreateParameter(data.EncryptionKey), - Messages.ReplyTo.CreateParameter(Id.ID), - Messages.IsChannelProfile.CreateParameter(Fake)); + Messages.ReplyTo.CreateParameter(Id.ID)); + if (data.Files.Length > 0) + { + List SFI = new(); + foreach (long file in data.Files) + { + if (Tables.Files.TryReadRow(out FileRow ido, Files.ID.CreateParameter(file))) + { + Tables.MessageFiles.Insert(MessageFiles.MessageID.CreateParameter(Id.ID), MessageFiles.FileID.CreateParameter(file)); + SFI.Add(new ServerFileInfoSTC() + { + ID = ido.ID, + Name = Convert.ToBase64String(ido.Name), + Encoder = ido.EncoderType, + NameEncoder = ido.NameEncoderType, + Key = ido.EncryptionKey, + NameKey = ido.NameEncryptionKey, + Size = ido.Size + }); + } + + } + + MessageEvent.Files = SFI.ToArray(); + } WSS.SendData(SendType.ID_Group, new ServerEvent() { Type = DataType.MessageCreate, diff --git a/LuskiServer/Controllers/v1/SocketOverridesController.cs b/LuskiServer/Controllers/v1/SocketOverridesController.cs deleted file mode 100644 index 3b92446..0000000 --- a/LuskiServer/Controllers/v1/SocketOverridesController.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Asp.Versioning; -using Luski.Shared.PublicServers.V1.Enums; -using Luski.Shared.PublicServers.V1.ServerToClient.HTTP; -using Luski.Shared.PublicServers.V1.Shared; -using LuskiServer.Classes; -using LuskiServer.Classes.TableDef; -using Microsoft.AspNetCore.Mvc; - -namespace LuskiServer.Controllers.v1; - -[ApiVersion(1)] -[ApiController] -public class SocketOverridesController : ControllerBase -{ - [HttpGet] - [Route(LuskiFunctions.Info.Routes.Default.Base + "/UserOverride/{id:long}")] - 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"); - return this.ResponseToResult(new UserOverrideSTC() - { - Id = row.ID, - UserID = row.UserID, - GoodPermissions = row.GoodPermissions, - BadPermissions = row.BadPermissions - }); - } - - [HttpGet] - [Route(LuskiFunctions.Info.Routes.Default.Base + "/RoleOverride/{id:long}")] - 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"); - return this.ResponseToResult(new UserRoleOverrideSTC() - { - Id = row.ID, - RoleID = row.RoleID, - GoodPermissions = row.GoodPermissions, - BadPermissions = row.BadPermissions - }); - } -} \ No newline at end of file diff --git a/LuskiServer/Controllers/v1/SocketProfileController.cs b/LuskiServer/Controllers/v1/SocketProfileController.cs new file mode 100644 index 0000000..801fcba --- /dev/null +++ b/LuskiServer/Controllers/v1/SocketProfileController.cs @@ -0,0 +1,169 @@ +using System.Net.Mime; +using Asp.Versioning; +using Luski.Shared.PublicServers.V1.Enums; +using Luski.Shared.PublicServers.V1.ServerToClient.HTTP; +using LuskiServer.Classes; +using LuskiServer.Classes.TableDef; +using Microsoft.AspNetCore.Mvc; + +namespace LuskiServer.Controllers.v1; + +[ApiVersion(1)] +[ApiController] +public class SocketProfileController : ControllerBase +{ + /// + /// Returns the Avatar for the channel profile. + /// + /// The ID of the requested profile + /// + [HttpGet] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(typeof(STC), StatusCodes.Status403Forbidden)] + [Produces(MediaTypeNames.Image.Jpeg, MediaTypeNames.Image.Gif, MediaTypeNames.Image.Tiff, "image/png", MediaTypeNames.Application.Json)] + [Route(LuskiFunctions.Info.Routes.Default.Base + "/Avatar/{id:long}")] + public IActionResult? Avatar(long id) + { + if (Tables.Profiles.TryRead(Profiles.Picture, out byte[]? image, Profiles.ID.CreateParameter(id))) + { + return Tables.Profiles.Read(Profiles.PictureType, Profiles.ID.CreateParameter(id)) switch + { + PictureType.png => File(image, "image/png"), + PictureType.jpeg => File(image, "image/jpeg"), + PictureType.bmp => File(image, "image/bmp"), + PictureType.gif => File(image, "image/gif"), + PictureType.ico => File(image, "image/vnd.microsoft.icon"), + PictureType.svg => File(image, "image/svg+xml"), + PictureType.tif => File(image, "image/tiff"), + PictureType.webp => File(image, "image/webp"), + //should never happen + _ => File(image, "image/png"), + }; + } + else + { + return StatusCode(403, new STC() + { + Error = ErrorCode.Forbidden, + ErrorMessage = "the user you have given does not exist" + }); + } + } + + [HttpGet] + [Route(LuskiFunctions.Info.Routes.Default.Base)] + public IActionResult Get([FromHeader(Name = "id")]long Person) + { + try + { + if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; + if (!Tables.Profiles.TryReadRow(out ProfileRow PR, Profiles.ID.CreateParameter(Person))) return this.ShowError(ErrorCode.Forbidden, "Profile does not exist"); + string? color = null; + ColorType? ct = null; + if (Tables.ProfileColors.TryReadRow(out var b, + ProfileColors.Profile.CreateParameter(PR.ID))) + { + color = Convert.ToHexString(b.Color); + ct = b.ColorType; + } + return this.ResponseToResult(new ProfileSTC() + { + ID = PR.ID, + DisplayName = PR.DisplayName, + PictureType = PR.PictureType, + Controllers = Tables.ProfileControllers.ReadColumn(ProfileControllers.User, ProfileControllers.Profile.CreateParameter(Person)), + ColorType = ct, + Color = color, + RoleControllers = Tables.ProfileRoleControllers.ReadColumn(ProfileRoleControllers.Role, ProfileRoleControllers.Profile.CreateParameter(Person)), + Channels = Tables.ChannelProfiles.ReadColumn(ChannelProfiles.Channel, ChannelProfiles.Profile.CreateParameter(Person)), + Categories = Tables.CategoryProfiles.ReadColumn(CategoryProfiles.Category, CategoryProfiles.Profile.CreateParameter(Person)), + }); + } + catch (Exception e) + { + return this.ShowError(e); + } + } + + [HttpGet] + [Route(LuskiFunctions.Info.Routes.Default.Base + "/myprofiles")] + public IActionResult GetMyProfiles() + { + try + { + if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; + Dictionary Vals = new(); + if (Tables.ProfileControllers.CreateCommand() + .WithFilter(ProfileControllers.User, ID) + .WithCrossTableCheck(ProfileControllers.Profile, Tables.Profiles, Classes.TableDef.Profiles.ID) + .TryReadRows(out ProfileRow[]? PcRs)) + { + foreach (ProfileRow PR in PcRs) + { + string? color = null; + ColorType? ct = null; + if (Tables.ProfileColors.TryReadRow(out ProfileColorRow b, + ProfileColors.Profile.CreateParameter(PR.ID))) + { + color = Convert.ToHexString(b.Color); + ct = b.ColorType; + } + Vals.Add(PR.ID, new() + { + ID = PR.ID, + DisplayName = PR.DisplayName, + PictureType = PR.PictureType, + Controllers = Tables.ProfileControllers.ReadColumn(ProfileControllers.User, ProfileControllers.Profile.CreateParameter(PR.ID)), + ColorType = ct, + Color = color, + RoleControllers = Tables.ProfileRoleControllers.ReadColumn(ProfileRoleControllers.Role, ProfileRoleControllers.Profile.CreateParameter(PR.ID)), + Channels = Tables.ChannelProfiles.ReadColumn(ChannelProfiles.Channel, ChannelProfiles.Profile.CreateParameter(PR.ID)), + Categories = Tables.CategoryProfiles.ReadColumn(CategoryProfiles.Category, CategoryProfiles.Profile.CreateParameter(PR.ID)), + }); + } + } + if (Tables.RoleMembers.CreateCommand() + .WithFilter(RoleMembers.User, ID) + .WithCrossTableCheck(RoleMembers.Role, Tables.ProfileRoleControllers, ProfileRoleControllers.Role) + .WithCrossTableCheck(ProfileRoleControllers.Profile, Tables.Profiles, Classes.TableDef.Profiles.ID) + .TryReadRows(out ProfileRow[]? rows)) + { + foreach (var PR in rows) + { + if (!Vals.ContainsKey(PR.ID)) + { + string? color = null; + ColorType? ct = null; + if (Tables.ProfileColors.TryReadRow(out var b, + ProfileColors.Profile.CreateParameter(PR.ID))) + { + color = Convert.ToHexString(b.Color); + ct = b.ColorType; + } + Vals.Add(PR.ID, new() + { + ID = PR.ID, + DisplayName = PR.DisplayName, + PictureType = PR.PictureType, + Controllers = Tables.ProfileControllers.ReadColumn(ProfileControllers.User, ProfileControllers.Profile.CreateParameter(PR.ID)), + ColorType = ct, + Color = color, + RoleControllers = Tables.ProfileRoleControllers.ReadColumn(ProfileRoleControllers.Role, ProfileRoleControllers.Profile.CreateParameter(PR.ID)), + Channels = Tables.ChannelProfiles.ReadColumn(ChannelProfiles.Channel, ChannelProfiles.Profile.CreateParameter(PR.ID)), + Categories = Tables.CategoryProfiles.ReadColumn(CategoryProfiles.Category, CategoryProfiles.Profile.CreateParameter(PR.ID)), + }); + } + } + } + + return this.ResponseToResult(new ProfileListSTC() + { + Profiles = Vals.Values.ToList() + }); + } + catch (Exception e) + { + return this.ShowError(e); + } + } +} \ No newline at end of file diff --git a/LuskiServer/Controllers/v1/SocketRoleController.cs b/LuskiServer/Controllers/v1/SocketRoleController.cs index b578ab1..42129eb 100644 --- a/LuskiServer/Controllers/v1/SocketRoleController.cs +++ b/LuskiServer/Controllers/v1/SocketRoleController.cs @@ -1,9 +1,15 @@ using Asp.Versioning; +using Luski.Shared.PublicServers.V1.ClientToServer.HTTP; using Luski.Shared.PublicServers.V1.Enums; using Luski.Shared.PublicServers.V1.ServerToClient.HTTP; +using Luski.Shared.PublicServers.V1.ServerToClient.WSS; +using Luski.Shared.PublicServers.V1.Shared; using LuskiServer.Classes; +using LuskiServer.Classes.ServerComs; using LuskiServer.Classes.TableDef; +using LuskiServer.Enums.ServerComs; using Microsoft.AspNetCore.Mvc; +using ServerDatabase; namespace LuskiServer.Controllers.v1; @@ -11,6 +17,156 @@ namespace LuskiServer.Controllers.v1; [ApiController] public class SocketRoleController : ControllerBase { + [HttpPost] + [Route(LuskiFunctions.Info.Routes.Default.Base)] + public IActionResult Post([FromBody]RolePostCTS Role) + { + if (!this.CanTokenRequest(out long ID, out long SID, out IActionResult? toc) && toc != null) return toc; + LuskiFunctions.Snowflake sf = LuskiFunctions.Snowflake.GenerateSnowflake(); + Tables.Roles.Insert( + Roles.ID.CreateParameter(sf.ID), + Roles.Description.CreateParameter(Role.Description), + Roles.DisplayName.CreateParameter(Role.DisplayName), + Roles.ColorType.CreateParameter(Role.ColorType), + Roles.Color.CreateParameter(Convert.FromHexString(Role.Color)), + Roles.ServerPermissions.CreateParameter(Role.ServerPermissions), + Roles.Index.CreateParameter(Role.Index)); + WSS.SendData(SendType.All, new ServerEvent() + { + Type = DataType.Role, + Data = new RoleEvent() + { + ID = sf.ID, + ServerPermissions = Role.ServerPermissions, + Description = Role.Description, + DisplayName = Role.DisplayName, + Index = Role.Index, + ColorType = Role.ColorType, + Color = Role.Color + } + }); + return this.ResponseToResult(new RoleSTC() + { + ID = sf.ID, + ServerPermissions = Role.ServerPermissions, + Description = Role.Description, + DisplayName = Role.DisplayName, + Index = Role.Index, + Members = Array.Empty(), + ColorType = Role.ColorType, + Color = Role.Color + }); + } + + [HttpPatch] + [Route(LuskiFunctions.Info.Routes.Default.Base)] + public IActionResult Patch([FromBody]RolePatchCTS Role) + { + 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(Role.ID))) return this.ShowError(ErrorCode.Forbidden, "Role does not exist"); + CommandHandler command = Tables.Roles.CreateCommand().WithFilter(Roles.ID, Role.ID); + RoleEvent re = new() + { + ID = row.ID + }; + if (Role.ServerPermissions is not null) + { + command = command.WithValue(Roles.ServerPermissions, Role.ServerPermissions.Value); + row.ServerPermissions = Role.ServerPermissions.Value; + re.ServerPermissions = Role.ServerPermissions.Value; + } + if (Role.Description is not null) + { + command = command.WithValue(Roles.Description, Role.Description); + row.Description = Role.Description; + re.Description = Role.Description; + } + if (Role.Index is not null) + { + command = command.WithValue(Roles.Index, Role.Index.Value); + row.Index = Role.Index.Value; + re.Index = Role.Index.Value; + } + if (Role.DisplayName is not null) + { + command = command.WithValue(Roles.DisplayName, Role.DisplayName); + row.DisplayName = Role.DisplayName; + re.DisplayName = Role.DisplayName; + } + if (Role.ColorType is not null) + { + command = command.WithValue(Roles.ColorType, Role.ColorType.Value); + row.ColorType = Role.ColorType.Value; + re.ColorType = Role.ColorType.Value; + } + if (Role.Color is not null) + { + command = command.WithValue(Roles.Color, Convert.FromHexString(Role.Color)); + row.Color = Convert.FromHexString(Role.Color); + re.Color = Role.Color; + } + command.Update(); + WSS.SendData(SendType.All, new ServerEvent() + { + Type = DataType.Role, + Data = re + }); + return this.ResponseToResult(new RoleSTC() + { + ID = row.ID, + ServerPermissions = row.ServerPermissions, + Description = row.Description, + DisplayName = row.DisplayName, + Index = row.Index, + Members = Tables.RoleMembers.ReadColumn(RoleMembers.User, RoleMembers.Role.CreateParameter(row.ID)), + ColorType = row.ColorType, + Color = Convert.ToHexString(row.Color) + }); + } + + [HttpPatch] + [Route(LuskiFunctions.Info.Routes.Default.Base + "/Members")] + public IActionResult MemberPatch([FromBody]RoleMembersPatchCTS Role) + { + 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(Role.ID))) return this.ShowError(ErrorCode.Forbidden, "Role does not exist"); + LuskiFunctions.Database.ExecuteNonQuery($"DELETE FROM {Tables.RoleMembers.Name} WHERE {RoleMembers.Role.Name} = {Role.ID} AND {RoleMembers.User.Name} IN ({string.Join(", ", Role.RemovedMembers)})"); + foreach (long am in Role.AddedMembers) + { + try + { + Tables.RoleMembers.Insert(RoleMembers.Role.CreateParameter(Role.ID), RoleMembers.User.CreateParameter(am)); + } + catch + { + //ignore + } + } + WSS.SendData(SendType.All, new ServerEvent() + { + Type = DataType.RoleMember, + Data = new RoleEvent() + { + ID = row.ID, + ServerPermissions = row.ServerPermissions, + Description = row.Description, + DisplayName = row.DisplayName, + Index = row.Index, + Color = Convert.ToHexString(row.Color) + } + }); + return this.ResponseToResult(new RoleSTC() + { + ID = row.ID, + ServerPermissions = row.ServerPermissions, + Description = row.Description, + DisplayName = row.DisplayName, + Index = row.Index, + Members = Tables.RoleMembers.ReadColumn(RoleMembers.User, RoleMembers.Role.CreateParameter(row.ID)), + Color = Convert.ToHexString(row.Color) + }); + } + [HttpGet] [Route(LuskiFunctions.Info.Routes.Default.Base)] public IActionResult Get([FromQuery(Name = "id")]long id) @@ -24,8 +180,8 @@ public class SocketRoleController : ControllerBase Description = row.Description, DisplayName = row.DisplayName, Index = row.Index, - Name = row.Name, - Members = row.MembersList, + Members = Tables.RoleMembers.ReadColumn(RoleMembers.User, RoleMembers.Role.CreateParameter(row.ID)), + ColorType = row.ColorType, Color = Convert.ToHexString(row.Color) }); } @@ -47,8 +203,8 @@ public class SocketRoleController : ControllerBase Description = rows[i].Description, DisplayName = rows[i].DisplayName, Index = rows[i].Index, - Name = rows[i].Name, - Members = rows[i].MembersList, + Members = Tables.RoleMembers.ReadColumn(RoleMembers.User, RoleMembers.Role.CreateParameter(rows[i].ID)), + ColorType = rows[i].ColorType, Color = Convert.ToHexString(rows[i].Color) }); } diff --git a/LuskiServer/Controllers/v1/SocketServerController.cs b/LuskiServer/Controllers/v1/SocketServerController.cs index 7314f23..e094bae 100644 --- a/LuskiServer/Controllers/v1/SocketServerController.cs +++ b/LuskiServer/Controllers/v1/SocketServerController.cs @@ -29,6 +29,7 @@ public class SocketServerController : ControllerBase ? $"{(LuskiFunctions.Config.IPv4SecureWSS ? "wss" : "ws")}://{LuskiFunctions.Config.IPv4WSS}:{LuskiFunctions.Config.IPv4PortWSS}{LuskiFunctions.Config.IPv4_URL_WSS}v1" : LuskiFunctions.Config.IPv4_Overode_WSS + "v1"), Name = sr.Name, + PictureType = sr.PictureType, Description = sr.Description, Owner = sr.Owner }; diff --git a/LuskiServer/Controllers/v1/SocketUserController.cs b/LuskiServer/Controllers/v1/SocketUserController.cs index b4bc6ab..dee196d 100644 --- a/LuskiServer/Controllers/v1/SocketUserController.cs +++ b/LuskiServer/Controllers/v1/SocketUserController.cs @@ -23,19 +23,17 @@ public class SocketUserController : ControllerBase if (Person == ID) return this.ResponseToResult(new SocketUserSTC() { ID = Person, - DisplayName = UR.DisplayName, - PictureType = UR.PictureType, - RoleIds = UR.Roles, + RoleIds = Tables.RoleMembers.ReadColumn(RoleMembers.Role, RoleMembers.User.CreateParameter(Person)), Status = UR.Status, - SelectedChannel = UR.SelectedChannel + SelectedChannel = UR.SelectedChannel, + ServerProfile = UR.ServerProfile }); return this.ResponseToResult(new SocketUserSTC() { ID = Person, - DisplayName = UR.DisplayName, - PictureType = UR.PictureType, - RoleIds = UR.Roles, - Status = UR.Status + RoleIds = Tables.RoleMembers.ReadColumn(RoleMembers.Role, RoleMembers.User.CreateParameter(Person)), + Status = UR.Status, + ServerProfile = UR.ServerProfile }); } catch (Exception e) diff --git a/LuskiServer/Controllers/v1/SocketUserProfileController.cs b/LuskiServer/Controllers/v1/SocketUserProfileController.cs index 0e59086..875ffa7 100644 --- a/LuskiServer/Controllers/v1/SocketUserProfileController.cs +++ b/LuskiServer/Controllers/v1/SocketUserProfileController.cs @@ -3,9 +3,12 @@ using Asp.Versioning; using Luski.Shared.PublicServers.V1.ClientToServer.HTTP; using Luski.Shared.PublicServers.V1.Enums; using Luski.Shared.PublicServers.V1.ServerToClient.HTTP; +using Luski.Shared.PublicServers.V1.Shared; using LuskiServer.Classes; using LuskiServer.Classes.ActionFilters; +using LuskiServer.Classes.ServerComs; using LuskiServer.Classes.TableDef; +using LuskiServer.Enums.ServerComs; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; @@ -31,45 +34,7 @@ public class SocketUserProfileController : ControllerBase return status; } - /// - /// Returns the Avatar for the user. - /// - /// The ID of the requested user - /// - [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(typeof(STC), StatusCodes.Status403Forbidden)] - [Produces(MediaTypeNames.Image.Jpeg, MediaTypeNames.Image.Gif, MediaTypeNames.Image.Tiff, "image/png", MediaTypeNames.Application.Json)] - [Route(LuskiFunctions.Info.Routes.Default.Base + "/Avatar/{id:long}")] - public IActionResult? Avatar(long id) - { - if (Tables.Users.TryRead(Users.Picture, out byte[]? image, Users.ID.CreateParameter(id))) - { - return Tables.Users.Read(Users.PictureType, Users.ID.CreateParameter(id)) switch - { - PictureType.png => File(image, "image/png"), - PictureType.jpeg => File(image, "image/jpeg"), - PictureType.bmp => File(image, "image/bmp"), - PictureType.gif => File(image, "image/gif"), - PictureType.ico => File(image, "image/vnd.microsoft.icon"), - PictureType.svg => File(image, "image/svg+xml"), - PictureType.tif => File(image, "image/tiff"), - PictureType.webp => File(image, "image/webp"), - //should never happen - _ => File(image, "image/png"), - }; - } - else - { - return StatusCode(403, new STC() - { - Error = ErrorCode.Forbidden, - ErrorMessage = "the user you have givven does not exist" - }); - //return File(Encoding.UTF8.GetBytes(obj.ToString()), "application/json"); - } - } - + /// /// Make a post to this endpoint to change the status of you account. /// @@ -94,15 +59,18 @@ public class SocketUserProfileController : ControllerBase UserStatus OldStatus = Tables.Users.Read(Users.Status, Users.ID.CreateParameter(ID)); if (OldStatus != NewStatus && (int)NewStatus < (int)UserStatus.MAX && (int)NewStatus >= 0) { - // JObject @out = new() - // { - // { "id", ID }, - // { "before", (int)OldStatus }, - // { "after", (int)NewStatus }, - // { "type", (int)DataType.Status_Update } - // }; Tables.Users.CreateCommand().WithFilter(Users.ID, ID).WithValue(Users.Status, NewStatus).Update(); if (NewStatus == UserStatus.Invisible) NewStatus = UserStatus.Offline; + WSS.SendData(SendType.All, new ServerEvent() + { + Type = DataType.StatusUpdate, + Data = new StatusEvent() + { + User = ID, + Before = (OldStatus == UserStatus.Invisible ? UserStatus.Offline : OldStatus), + After = NewStatus, + } + }); // WSS.SendData(SendType.All, @out); } diff --git a/LuskiServer/Converters/Matrix/Matrix.cs b/LuskiServer/Converters/Matrix/Matrix.cs index c927c13..c9339eb 100644 --- a/LuskiServer/Converters/Matrix/Matrix.cs +++ b/LuskiServer/Converters/Matrix/Matrix.cs @@ -10,7 +10,7 @@ namespace LuskiServer.Converters.Matrix; public static class Matrix { - public static void ZipJsonChatExport(Stream Zip, long Channel, Dictionary UserMap, + public static void ZipJsonChatExport(Stream Zip, long Channel, long defaultuser, Dictionary UserMap, Dictionary ChannelProfilesIdList, List> Profiles, List IgnoredUsers, EncoderType Encoder, long Encryption, bool remove = true) @@ -34,14 +34,16 @@ public static class Matrix { long id2 = LuskiFunctions.Snowflake.GenerateSnowflake().ID; - Tables.ChannelProfiles.Insert( - ChannelProfiles.ID.CreateParameter(id2), - ChannelProfiles.Controllers.CreateDefaultParameter(), - ChannelProfiles.PictureType.CreateParameter(Profiles[ChannelProfilesIdList[id]].Item3), - ChannelProfiles.Picture.CreateParameter(Profiles[ChannelProfilesIdList[id]].Item2), - ChannelProfiles.DisplayName.CreateParameter(Profiles[ChannelProfilesIdList[id]].Item1), - ChannelProfiles.Color.CreateParameter(Profiles[ChannelProfilesIdList[id]].Item4)); + Tables.Profiles.Insert( + Classes.TableDef.Profiles.ID.CreateParameter(id2), + Classes.TableDef.Profiles.PictureType.CreateParameter(Profiles[ChannelProfilesIdList[id]].Item3), + Classes.TableDef.Profiles.Picture.CreateParameter(Profiles[ChannelProfilesIdList[id]].Item2), + Classes.TableDef.Profiles.DisplayName.CreateParameter(Profiles[ChannelProfilesIdList[id]].Item1)); + Tables.ProfileColors.Insert( + ProfileColors.Profile.CreateParameter(id2), + ProfileColors.Color.CreateParameter(Profiles[ChannelProfilesIdList[id]].Item4)); IdConverter.Add(ChannelProfilesIdList[id], id2); + Tables.ChannelProfiles.Insert(ChannelProfiles.Channel.CreateParameter(Channel), ChannelProfiles.Profile.CreateParameter(id2)); foreach (KeyValuePair v in ChannelProfilesIdList.Where(s => s.Value == ChannelProfilesIdList[id])) { cps.Add(v.Key, id2); @@ -53,32 +55,27 @@ public static class Matrix try { - //TODO REMOVE FOR LAST VERSION - foreach (long i in Tables.Channels.Read(Channels.Profiles, Channels.ID.CreateParameter(Channel))) - { - Tables.ChannelProfiles.DeleteRow(ChannelProfiles.ID.CreateParameter(i)); - } - 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(); + int inow = 0; + int imax = export.Messages.Length; foreach (Message msg in export.Messages) { + inow++; + Console.WriteLine(inow + " of " + imax); if (msg.Type != "m.room.message") continue; if (!UserMap.ContainsKey(msg.Sender) && !ChannelProfilesIdList.ContainsKey(msg.Sender)) @@ -103,18 +100,18 @@ public static class Matrix Events.Add(msg.Event, sf.ID); cur = cur.ToLocalTime(); - bool chanp; long id; + long profile = 0; if (ChannelProfilesIdList.ContainsKey(msg.Sender)) { - chanp = true; checkFakeUser(msg.Sender); - id = IdConverter[ChannelProfilesIdList[msg.Sender]]; + profile = IdConverter[ChannelProfilesIdList[msg.Sender]]; + id = defaultuser; } else { - chanp = false; id = UserMap[msg.Sender]; + profile = Tables.Users.Read(Users.ServerProfile, Users.ID.CreateParameter(id)); } if (msg.Context.Relations is not null) @@ -207,11 +204,10 @@ public static class Matrix Messages.Context.CreateParameter(body.ToDB(Encoder, Encryption)), Messages.ChannelID.CreateParameter(Channel), Messages.EncoderType.CreateParameter(Encoder), - Messages.Files.CreateParameter(Array.Empty()), Messages.EncryptionKey.CreateParameter(Encryption), Messages.AuthorID.CreateParameter(id), - Messages.IsChannelProfile.CreateParameter(chanp), - Messages.ReplyTo.CreateParameter(reply)); + Messages.ReplyTo.CreateParameter(reply), + Messages.ProfileID.CreateParameter(profile)); break; case "m.image" or "m.video" or "m.audio" or "m.file": int h = cur.Hour; @@ -253,27 +249,24 @@ public static class Matrix Files.EncryptionKey.CreateParameter(Encryption), Files.Hash.CreateParameter(JacobTechEncryption.Encryption.Hashing.SHA256(d)), Files.Owner.CreateParameter(id), - Files.AllowedChannels.CreateParameter(new long[] { Channel }), Files.Public.CreateParameter(true), Files.Size.CreateParameter(d.LongLength), Files.NameEncoderType.CreateParameter(Encoder), Files.NameEncryptionKey.CreateParameter(Encryption)); + Tables.FileChannels.Insert(FileChannels.ChannelID.CreateParameter(Channel), FileChannels.FileID.CreateParameter(sf.ID)); Tables.Messages.Insert( Messages.ID.CreateParameter(sf.ID), Messages.Context.CreateParameter(Array.Empty()), Messages.ChannelID.CreateParameter(Encryption), Messages.EncoderType.CreateParameter(Encoder), - Messages.Files.CreateParameter(new[] { sf.ID }), Messages.EncryptionKey.CreateParameter(Encryption), Messages.AuthorID.CreateParameter(id), - Messages.IsChannelProfile.CreateParameter(chanp), Messages.ReplyTo.CreateParameter(reply)); + Tables.MessageFiles.Insert(MessageFiles.FileID.CreateParameter(sf.ID), MessageFiles.MessageID.CreateParameter(sf.ID)); } break; } } - - Tables.Channels.CreateCommand().WithFilter(Channels.ID, Channel).WithValue(Channels.Profiles, IdConverter.Values.ToArray()).Update(); } catch (Exception e) { diff --git a/LuskiServer/Enums/ServerComs/DataType.cs b/LuskiServer/Enums/ServerComs/DataType.cs deleted file mode 100644 index bf3f206..0000000 --- a/LuskiServer/Enums/ServerComs/DataType.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace LuskiServer.Enums.ServerComs; - -public enum DataType -{ - Token, - MessageCreate -} \ No newline at end of file diff --git a/LuskiServer/LuskiServer.csproj b/LuskiServer/LuskiServer.csproj index b99cda3..2fc5382 100644 --- a/LuskiServer/LuskiServer.csproj +++ b/LuskiServer/LuskiServer.csproj @@ -5,7 +5,7 @@ enable enable true - 1.0.1.6 + 1.0.0.0 @@ -21,12 +21,12 @@ - - + + - + diff --git a/LuskiServer/Program.cs b/LuskiServer/Program.cs index fbf2bec..902f6ad 100644 --- a/LuskiServer/Program.cs +++ b/LuskiServer/Program.cs @@ -1,6 +1,8 @@ using System.Reflection; using System.Text; using Asp.Versioning.ApiExplorer; +using BenchmarkDotNet.Running; +using JacobTechEncryption; using JacobTechEncryption.Enums; using Luski.Shared.PublicServers.V1.Enums; using Luski.Shared.PublicServers.V1.ServerToClient.HTTP; @@ -8,6 +10,7 @@ using LuskiServer; using LuskiServer.Classes; using LuskiServer.Classes.ServerComs; using LuskiServer.Classes.TableDef; +using LuskiServer.Converters.Matrix; using LuskiServer.Converters.Matrix.Types; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; @@ -29,22 +32,6 @@ 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, @@ -59,15 +46,7 @@ LuskiFunctions.Database = new Database(LuskiFunctions.Config.Address, Dictionary> fff = new(); -try -{ - LuskiFunctions.Database.ExecuteNonQuery($"CREATE DATABASE {LuskiFunctions.Config.Database} WITH OWNER = {LuskiFunctions.Config.Username} ENCODING = 'UTF8' CONNECTION LIMIT = -1 IS_TEMPLATE = False;"); - Console.WriteLine("Database Created"); -} -catch -{ - Console.WriteLine("Database Found"); -} +LuskiFunctions.Database.TestDatabase(); foreach (PropertyInfo prop in typeof(Tables).GetProperties()) { @@ -83,12 +62,40 @@ foreach (PropertyInfo prop in typeof(Tables).GetProperties()) LuskiFunctions.Database.RegisterTables(); +//Tables.ProfileColors.CreateCommand().WithFilter(ProfileColors.Profile, 0).WithValue(ProfileColors.ColorType, ColorType.LeftToRightGradient).WithValue(ProfileColors.Color, Convert.FromHexString("E54D24FFDDB249FF")).Update(); + +if (!Tables.Server.TryRead(Server.ID, out _, Server.ID.CreateParameter(0))) +{ + Tables.Server.Insert(); +} + +if (!Tables.Profiles.TryRead(Profiles.ID, out _, Profiles.ID.CreateParameter(0))) +{ + Tables.Profiles.Insert( + Profiles.ID.CreateParameter(0), + Profiles.DisplayName.CreateParameter("Server"), + Profiles.PictureType.CreateParameter(PictureType.none), + Profiles.Picture.CreateParameter(Array.Empty())); + Tables.ProfileColors.Insert(ProfileColors.Profile.CreateParameter(0), ProfileColors.Color.CreateParameter((new byte[] {255,255,255,255}))); +} + +if (!LuskiFunctions.Database.VersionsTable.TryRead(LuskiFunctions.Database.VersionsTable.ID, out _, + LuskiFunctions.Database.VersionsTable.ID.CreateParameter(0))) +{ + LuskiFunctions.Database.VersionsTable.Insert(LuskiFunctions.Database.VersionsTable.ID.CreateParameter(0)); +} + -//Tables.Channels.Update(Channels.ID, 0, Channels.PictureType.CreateParameter(PictureType.png), Channels.Picture.CreateParameter(File.ReadAllBytes("/home/jacob/Pictures/Logo.png"))); /* Dictionary AMap = new() { - {"@jacobtech:matrix.org", 0} + {"@jacobtech:matrix.org", 0}, + //{"@c4tz:matrix.org", 2}, + //{"@themagicalcats:matrix.org", 2}, + //{"@captainleader:matrix.org", 1}, + //{"@kaizenash:matrix.org", 1}, + //{"@quadro:matrix.org", 4}, + //{"@bubs_cooper:matrix.org", 3} }; Dictionary BMap = new() @@ -128,191 +135,19 @@ List> BMapL = new() new("JacobTech Bot", Array.Empty(), PictureType.none, new byte[] { 114, 213, 174, 255 }) }; */ +//Matrix.ZipJsonChatExport(File.OpenRead("/home/jacob/Downloads/matrix - Luski Project Discussion - Chat Export - 2024-04-13T18-14-08.180Z.zip"), 2, 0, AMap, BMap, BMapL, new(), EncoderType.UTF16, 0); -// -//Matrix.ZipJsonChatExport(File.OpenRead("/run/media/jacob/F69D-7CBA/Matrix Keys/l.zip"), 0, AMap, BMap, BMapL, new(), EncoderType.UTF16, 0); -//Matrix.ZipJsonChatExport(File.OpenRead("/home/jacob/Downloads/matrix - Luski Project Discussion - Chat Export - 2023-08-08T20-10-12.315Z.zip"), 0, AMap, BMap, BMapL, new(), EncoderType.UTF16, 0); -// -//Tables.Channels.Update(Channels.ID, 0, ">=", Channels.Color.CreateDefaultParameter()); -//Tables.Categories.Update(Categories.ID, 0, ">=", Categories.Color.CreateDefaultParameter()); - -//Console.WriteLine(Convert.ToHexString(Tables.Channels.Read(Channels.Color, Channels.ID.CreateParameter(3)))); - -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"))); -/* -Tables.Channels.Insert( - Channels.ID.CreateParameter(1), - Channels.Parent.CreateParameter(0), - Channels.Type.CreateParameter(ChannelType.TextAndVoice), - Channels.Description.CreateParameter(Encoding.UTF8.GetBytes("A nother test Chat")), - Channels.Name.CreateParameter(Encoding.UTF8.GetBytes("Chat 1")), - Channels.RoleOverides.CreateParameter(Array.Empty()), - Channels.UserOverides.CreateParameter(Array.Empty()), - Channels.Epoch.CreateParameter(DateTime.UtcNow.Date), - Channels.TitleEncryptionKey.CreateParameter(0), - Channels.DescriptionEncryptionKey.CreateParameter(0), - Channels.EncryptionKeys.CreateParameter(new long[]{0}), - Channels.TitleEncoderType.CreateParameter(EncoderType.UTF8), - Channels.DescriptionEncoderType.CreateParameter(EncoderType.UTF8), - Channels.PictureType.CreateParameter(PictureType.png), - Channels.Picture.CreateParameter(File.ReadAllBytes("/home/jacob/Downloads/4ba.png")), - Channels.EncoderTypes.CreateParameter(new [] { EncoderType.UTF8 })); -Tables.Channels.Insert( - Channels.ID.CreateParameter(2), - Channels.Parent.CreateParameter(1), - Channels.Type.CreateParameter(ChannelType.TextAndVoice), - Channels.Description.CreateParameter(Encoding.UTF8.GetBytes("A nother test Chat")), - Channels.Name.CreateParameter(Encoding.UTF8.GetBytes("Chat 2")), - Channels.RoleOverides.CreateParameter(Array.Empty()), - Channels.UserOverides.CreateParameter(Array.Empty()), - Channels.Epoch.CreateParameter(DateTime.UtcNow.Date), - Channels.TitleEncryptionKey.CreateParameter(0), - Channels.DescriptionEncryptionKey.CreateParameter(0), - Channels.EncryptionKeys.CreateParameter(new long[]{0}), - Channels.TitleEncoderType.CreateParameter(EncoderType.UTF8), - Channels.DescriptionEncoderType.CreateParameter(EncoderType.UTF8), - Channels.PictureType.CreateParameter(PictureType.png), - Channels.Picture.CreateParameter(File.ReadAllBytes("/home/jacob/Downloads/4ba.png")), - Channels.EncoderTypes.CreateParameter(new [] { EncoderType.UTF8 })); -Tables.Channels.Insert( - Channels.ID.CreateParameter(3), - Channels.Parent.CreateParameter(2), - Channels.Type.CreateParameter(ChannelType.TextAndVoice), - Channels.Description.CreateParameter(Encoding.UTF8.GetBytes("A nother test Chat")), - Channels.Name.CreateParameter(Encoding.UTF8.GetBytes("Chat 3")), - Channels.RoleOverides.CreateParameter(Array.Empty()), - Channels.UserOverides.CreateParameter(Array.Empty()), - Channels.Epoch.CreateParameter(DateTime.UtcNow.Date), - Channels.TitleEncryptionKey.CreateParameter(0), - Channels.DescriptionEncryptionKey.CreateParameter(0), - Channels.EncryptionKeys.CreateParameter(new long[]{0}), - Channels.TitleEncoderType.CreateParameter(EncoderType.UTF8), - Channels.DescriptionEncoderType.CreateParameter(EncoderType.UTF8), - Channels.PictureType.CreateParameter(PictureType.png), - Channels.Picture.CreateParameter(File.ReadAllBytes("/home/jacob/Downloads/4ba.png")), - Channels.EncoderTypes.CreateParameter(new [] { EncoderType.UTF8 })); -Tables.Categories.Insert( - Categories.ID.CreateParameter(1), - Categories.Name.CreateParameter(Encoding.UTF8.GetBytes("Cat lol")), - Categories.Parent.CreateParameter(0), - Categories.Description.CreateParameter( - Encoding.UTF8.GetBytes("Test cat")), - Categories.RoleOverides.CreateParameter(Array.Empty()) -); -Tables.Categories.Insert( - Categories.ID.CreateParameter(2), - Categories.Name.CreateParameter(Encoding.UTF8.GetBytes("Cat lol")), - Categories.Parent.CreateParameter(1), - Categories.Description.CreateParameter( - Encoding.UTF8.GetBytes("Test cat")), - Categories.RoleOverides.CreateParameter(Array.Empty()) -); -*/ -if (!LuskiFunctions.Database.VersionsTable.TryRead(LuskiFunctions.Database.VersionsTable.ID, out _, - LuskiFunctions.Database.VersionsTable.ID.CreateParameter(0))) -{ - LuskiFunctions.Database.VersionsTable.Insert(LuskiFunctions.Database.VersionsTable.ID.CreateParameter(0)); -} - -//Tables.Roles.Update(Roles.ID, 1, Roles.Color.CreateParameter(new byte[]{1,143,243,255})); - -/* -Tables.Roles.Insert( - Roles.ID.CreateParameter(1), - Roles.Name.CreateParameter("Mod"), - Roles.DisplayName.CreateParameter("Moderators"), - Roles.Color.CreateDefaultParameter(), - Roles.Description.CreateParameter("Mods for the server"), - Roles.ServerPermission.CreateParameter(new[] - { - 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 - }) -); -*/ if (!Tables.Roles.TryRead(Roles.ID, out _, Roles.ID.CreateParameter(0))) { Tables.Roles.Insert( Roles.ID.CreateParameter(0), - Roles.Name.CreateParameter("server"), Roles.DisplayName.CreateParameter("Members"), Roles.Color.CreateDefaultParameter(), Roles.Description.CreateParameter("The default role for the server. Everybody will have this role."), Roles.ServerPermissions.CreateParameter( ServerPermission.ViewChannels | ServerPermission.ViewCategories | - ServerPermission.Nickname | ServerPermission.SendMessages | ServerPermission.SendFiles | ServerPermission.ChannelPings | @@ -326,43 +161,6 @@ if (!Tables.Roles.TryRead(Roles.ID, out _, Roles.ID.CreateParameter(0))) ); } -if (!Tables.Keys.TryRead(Keys.ID, out _, Keys.ID.CreateParameter(0))) -{ - Tables.Keys.Insert( - Keys.ID.CreateParameter(0), - Keys.EncryptionType.CreateParameter(EncryptionType.None), - Keys.KeyData.CreateParameter(Array.Empty())); -} - -if (!Tables.Categories.TryRead(Categories.ID, out _, Categories.ID.CreateParameter(0))) -{ - Tables.Categories.Insert( - Categories.ID.CreateParameter(0), - Categories.Name.CreateParameter(Encoding.UTF8.GetBytes("server")), - Categories.Parent.CreateParameter(-1), - Categories.Description.CreateParameter( - Encoding.UTF8.GetBytes("The default category for the server. Everybody will see this category.")), - Categories.RoleOverrides.CreateParameter(Array.Empty()) - ); - Tables.Channels.Insert( - Channels.ID.CreateParameter(0), - Channels.Type.CreateParameter(ChannelType.TextAndVoice), - Channels.Description.CreateParameter(Encoding.UTF8.GetBytes("Default chat for you to use in your new server")), - Channels.Name.CreateParameter(Encoding.UTF8.GetBytes("Default Channel")), - Channels.RoleOverrides.CreateParameter(Array.Empty()), - Channels.UserOverrides.CreateParameter(Array.Empty()), - Channels.Epoch.CreateParameter(DateTime.UtcNow.Date), - Channels.TitleEncryptionKey.CreateParameter(0), - Channels.Parent.CreateParameter(0), - Channels.DescriptionEncryptionKey.CreateParameter(0), - Channels.EncryptionKeys.CreateParameter(new long[]{0}), - Channels.TitleEncoderType.CreateParameter(EncoderType.UTF8), - Channels.DescriptionEncoderType.CreateParameter(EncoderType.UTF8), - Channels.PictureType.CreateParameter(PictureType.none), - Channels.Picture.CreateParameter(Array.Empty()), - Channels.EncoderTypes.CreateParameter(new [] { EncoderType.UTF8 })); -} - long[] keys = Tables.Sessions.ReadColumn(Sessions.SessionKey); foreach (long key in keys) { @@ -372,6 +170,7 @@ foreach (long key in keys) Tables.Sessions.DeleteRows(); +Tables.Users.CreateCommand().WithValue(Users.Status, UserStatus.Offline).Update(); foreach (AltServerRow Server in Tables.AltServers.ReadRows()) @@ -379,6 +178,8 @@ foreach (AltServerRow Server in Tables.AltServers.ReadRows()) //TODO add code to open a live WSS connection with all other servers on the network } + + WSS.Init(LuskiFunctions.Config.IPv4WSS, LuskiFunctions.Config.IPv4PortWSS, LuskiFunctions.Config.IPv4_URL_WSS!, LuskiFunctions.Config.IPv4SecureWSS, LuskiFunctions.Config.IPv6WSS, LuskiFunctions.Config.IPv6_URL_WSS, LuskiFunctions.Config.IPv6PortWSS, LuskiFunctions.Config.IPv6SecureWSS); WebApplicationBuilder builder = WebApplication.CreateBuilder( args );