From bddcd96ec62836caffc80aa8c6324a6d2e80b008 Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Mon, 26 May 2025 17:37:19 -0400 Subject: [PATCH 01/14] Add files via upload --- .../CastleLibrary/XI5/Reader/TicketReader.cs | 142 ++ .../CastleLibrary/XI5/StreamExtensions.cs | 106 +- .../XI5/Types/Parsers/TicketParser21.cs | 36 + .../XI5/Types/Parsers/TicketParser30.cs | 51 + .../CastleLibrary/XI5/Types/TicketData.cs | 20 + .../XI5/Types/TicketDataSection.cs | 22 + .../XI5/Types/TicketDataSectionType.cs | 16 + .../CastleLibrary/XI5/Types/TicketDataType.cs | 20 + .../CastleLibrary/XI5/Types/TicketVersion.cs | 25 + .../XI5/Verification/ITicketSigningKey.cs | 20 + .../Keys/Games/DefaultSigningKey.cs | 14 + .../Keys/Games/WarhawkSigningKey.cs | 14 + .../XI5/Verification/Keys/PsnSigningKey.cs | 21 + .../XI5/Verification/Keys/RpcnSigningKey.cs | 23 + .../XI5/Verification/SigningKeyResolver.cs | 43 + .../TicketSignatureMessageTypes.cs | 14 + .../XI5/Verification/TicketVerifier.cs | 81 ++ .../CastleLibrary/XI5/XI5Ticket.cs | 359 ++--- .../XI5/obj/Debug/net6.0/XI5.AssemblyInfo.cs | 24 + .../Debug/net6.0/XI5.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 17 + .../XI5/obj/Debug/net6.0/XI5.assets.cache | Bin 0 -> 14520 bytes .../net6.0/XI5.csproj.AssemblyReference.cache | Bin 0 -> 14099 bytes .../obj/Debug/net6.0/XI5.csproj.CopyComplete | 0 .../net6.0/XI5.csproj.CoreCompileInputs.cache | 1 + .../net6.0/XI5.csproj.FileListAbsolute.txt | 38 + .../XI5/obj/Debug/net6.0/XI5.csproj.Up2Date | 0 .../XI5/obj/Debug/net6.0/XI5.dll | Bin 0 -> 13312 bytes .../XI5/obj/Debug/net6.0/XI5.pdb | Bin 0 -> 14092 bytes .../XI5/obj/Debug/net6.0/ref/XI5.dll | Bin 0 -> 6144 bytes .../XI5/obj/Debug/net6.0/refint/XI5.dll | Bin 0 -> 6144 bytes .../obj/Release/net6.0/XI5.AssemblyInfo.cs | 24 + .../net6.0/XI5.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 17 + .../XI5/obj/Release/net6.0/XI5.assets.cache | Bin 0 -> 14520 bytes .../net6.0/XI5.csproj.AssemblyReference.cache | Bin 0 -> 14111 bytes .../Release/net6.0/XI5.csproj.CopyComplete | 0 .../net6.0/XI5.csproj.CoreCompileInputs.cache | 1 + .../net6.0/XI5.csproj.FileListAbsolute.txt | 19 + .../XI5/obj/Release/net6.0/XI5.dll | Bin 0 -> 12800 bytes .../XI5/obj/Release/net6.0/XI5.pdb | Bin 0 -> 13528 bytes .../XI5/obj/Release/net6.0/ref/XI5.dll | Bin 0 -> 6144 bytes .../XI5/obj/Release/net6.0/refint/XI5.dll | Bin 0 -> 6144 bytes .../XI5/obj/XI5.csproj.nuget.dgspec.json | 335 +++++ .../XI5/obj/XI5.csproj.nuget.g.props | 23 + .../XI5/obj/XI5.csproj.nuget.g.targets | 9 + .../CastleLibrary/XI5/obj/project.assets.json | 1230 +++++++++++++++++ .../CastleLibrary/XI5/obj/project.nuget.cache | 29 + 48 files changed, 2531 insertions(+), 265 deletions(-) create mode 100644 BackendServices/CastleLibrary/XI5/Reader/TicketReader.cs create mode 100644 BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser21.cs create mode 100644 BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs create mode 100644 BackendServices/CastleLibrary/XI5/Types/TicketData.cs create mode 100644 BackendServices/CastleLibrary/XI5/Types/TicketDataSection.cs create mode 100644 BackendServices/CastleLibrary/XI5/Types/TicketDataSectionType.cs create mode 100644 BackendServices/CastleLibrary/XI5/Types/TicketDataType.cs create mode 100644 BackendServices/CastleLibrary/XI5/Types/TicketVersion.cs create mode 100644 BackendServices/CastleLibrary/XI5/Verification/ITicketSigningKey.cs create mode 100644 BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs create mode 100644 BackendServices/CastleLibrary/XI5/Verification/Keys/Games/WarhawkSigningKey.cs create mode 100644 BackendServices/CastleLibrary/XI5/Verification/Keys/PsnSigningKey.cs create mode 100644 BackendServices/CastleLibrary/XI5/Verification/Keys/RpcnSigningKey.cs create mode 100644 BackendServices/CastleLibrary/XI5/Verification/SigningKeyResolver.cs create mode 100644 BackendServices/CastleLibrary/XI5/Verification/TicketSignatureMessageTypes.cs create mode 100644 BackendServices/CastleLibrary/XI5/Verification/TicketVerifier.cs create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfo.cs create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfoInputs.cache create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.assets.cache create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.AssemblyReference.cache create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CopyComplete create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CoreCompileInputs.cache create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.FileListAbsolute.txt create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.Up2Date create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.dll create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.pdb create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/ref/XI5.dll create mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/refint/XI5.dll create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfo.cs create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfoInputs.cache create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.assets.cache create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.AssemblyReference.cache create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.CopyComplete create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.CoreCompileInputs.cache create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.FileListAbsolute.txt create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.dll create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.pdb create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/ref/XI5.dll create mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/refint/XI5.dll create mode 100644 BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.dgspec.json create mode 100644 BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.props create mode 100644 BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.targets create mode 100644 BackendServices/CastleLibrary/XI5/obj/project.assets.json create mode 100644 BackendServices/CastleLibrary/XI5/obj/project.nuget.cache diff --git a/BackendServices/CastleLibrary/XI5/Reader/TicketReader.cs b/BackendServices/CastleLibrary/XI5/Reader/TicketReader.cs new file mode 100644 index 000000000..b3ddd6de9 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Reader/TicketReader.cs @@ -0,0 +1,142 @@ +using System; +using System.Buffers.Binary; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using XI5.Types; + +namespace XI5.Reader +{ + public class TicketReader : BinaryReader + { + public TicketReader(Stream input) : base(input) + { } + + #region Big Endian Shenanigans + + // credit where credit is due: https://stackoverflow.com/a/71048495 + + public override short ReadInt16() => BinaryPrimitives.ReadInt16BigEndian(ReadBytes(2)); + public override int ReadInt32() => BinaryPrimitives.ReadInt32BigEndian(ReadBytes(4)); + public override long ReadInt64() => BinaryPrimitives.ReadInt64BigEndian(ReadBytes(8)); + + public override ushort ReadUInt16() => BinaryPrimitives.ReadUInt16BigEndian(ReadBytes(2)); + public override uint ReadUInt32() => BinaryPrimitives.ReadUInt32BigEndian(ReadBytes(4)); + public override ulong ReadUInt64() => BinaryPrimitives.ReadUInt64BigEndian(ReadBytes(8)); + + #endregion + + internal TicketVersion ReadTicketVersion() => new TicketVersion((byte)(ReadByte() >> 4), ReadByte()); + + internal ushort ReadTicketHeader() + { + // Ticket header + ReadBytes(4); // Header + return ReadUInt16(); // Ticket length + } + + public void DetermineTicketFormat() + { + TicketVersion version = ReadTicketVersion(); + Console.Write($"Ticket version {version.Major}.{version.Minor}"); + ushort length = ReadTicketHeader(); + Console.WriteLine($", length is {length} bytes"); + + while (this.BaseStream.Position <= length) + { + DetermineSectionFormat(); + } + + long unreadBytes = this.BaseStream.Length - this.BaseStream.Position; + if (unreadBytes != 0) + { + Console.WriteLine($"!!! Unread bytes: {unreadBytes} !!!"); + } + } + + private void DetermineSectionFormat() + { + TicketDataSection section = ReadTicketSectionHeader(); + Console.WriteLine($" {section.Type} Section, length is {section.Length} @ offset {section.Position}"); + + if (section.Type == TicketDataSectionType.DateOfBirth) + { + this.BaseStream.Position += section.Length; + } + + int endSpot = section.Length + section.Position; + while (this.BaseStream.Position <= endSpot) + { + DetermineData(); + } + } + + private void DetermineData() + { + TicketData data = ReadTicketData(TicketDataType.Empty); + if ((ushort)data.Type >> 8 == 0x30) // if data type starts with section header + { + this.BaseStream.Position -= sizeof(ushort) * 2; // roll back read from data + DetermineSectionFormat(); // read the section + return; + } + this.ReadBytes(data.Length); + Console.WriteLine($" {data.Type}, length is {data.Length}"); + } + + internal TicketDataSection ReadTicketSectionHeader() + { + long position = this.BaseStream.Position; + + byte sectionHeader = this.ReadByte(); + if (sectionHeader != 0x30) + { + throw new FormatException($"Expected 0x30 for section header, was {sectionHeader}. Offset is {this.BaseStream.Position}"); + } + + TicketDataSectionType type = (TicketDataSectionType)this.ReadByte(); + ushort length = this.ReadUInt16(); + + return new TicketDataSection(type, length, position); + } + + private TicketData ReadTicketData(TicketDataType expectedType) + { + TicketData data = new TicketData((TicketDataType)ReadUInt16(), ReadUInt16()); + if (data.Type != expectedType && expectedType != TicketDataType.Empty) + throw new FormatException($"Expected data type to be {expectedType}, was really {data.Type} ({(int)data.Type})"); + + return data; + } + + internal byte[] ReadTicketBinaryData(TicketDataType type = TicketDataType.Binary) + => ReadBytes(ReadTicketData(type).Length); + internal string ReadTicketStringData(TicketDataType type = TicketDataType.String) + => Encoding.Default.GetString(ReadTicketBinaryData(type)).TrimEnd('\0'); + + internal uint ReadTicketUInt32Data() + { + ReadTicketData(TicketDataType.UInt32); + return ReadUInt32(); + } + + internal ulong ReadTicketUInt64Data() + { + ReadTicketData(TicketDataType.UInt64); + return ReadUInt64(); + } + + internal DateTimeOffset ReadTicketTimestampData() + { + ReadTicketData(TicketDataType.Timestamp); + return DateTimeOffset.FromUnixTimeMilliseconds((long)ReadUInt64()); + } + + internal void SkipTicketEmptyData(int sections = 1) + { + for (int i = 0; i < sections; i++) ReadTicketData(TicketDataType.Empty); + } + } +} diff --git a/BackendServices/CastleLibrary/XI5/StreamExtensions.cs b/BackendServices/CastleLibrary/XI5/StreamExtensions.cs index cd340543a..d7c28e000 100644 --- a/BackendServices/CastleLibrary/XI5/StreamExtensions.cs +++ b/BackendServices/CastleLibrary/XI5/StreamExtensions.cs @@ -1,51 +1,55 @@ -using System; -using System.IO; - -namespace XI5 -{ - internal static class StreamExtensions - { - public static uint ReadUInt(this Stream stream) - { - byte[] buffer = new byte[4]; - stream.Read(buffer, 0, 4); - if (BitConverter.IsLittleEndian) - Array.Reverse(buffer); - return BitConverter.ToUInt32(buffer, 0); - } - - public static ulong ReadULong(this Stream stream) - { - byte[] buffer = new byte[8]; - stream.Read(buffer, 0, 8); - if (BitConverter.IsLittleEndian) - Array.Reverse(buffer); - return BitConverter.ToUInt64(buffer, 0); - } - - public static ushort ReadUShort(this Stream stream) - { - byte[] buffer = new byte[2]; - stream.Read(buffer, 0, 2); - if (BitConverter.IsLittleEndian) - Array.Reverse(buffer); - return BitConverter.ToUInt16(buffer, 0); - } - - public static bool ReadAll(this Stream stream, byte[] buffer, int startIndex, int count) - { - if (stream == null) - return false; - - int offset = 0; - while (offset < count) - { - int readCount = stream.Read(buffer, startIndex + offset, count - offset); - if (readCount == 0) - return false; - offset += readCount; - } - return true; - } - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5 +{ + internal static class StreamExtensions + { + public static uint ReadUInt(this Stream stream) + { + byte[] buffer = new byte[4]; + stream.Read(buffer, 0, 4); + if (BitConverter.IsLittleEndian) + Array.Reverse(buffer); + return BitConverter.ToUInt32(buffer, 0); + } + + public static ulong ReadULong(this Stream stream) + { + byte[] buffer = new byte[8]; + stream.Read(buffer, 0, 8); + if (BitConverter.IsLittleEndian) + Array.Reverse(buffer); + return BitConverter.ToUInt64(buffer, 0); + } + + public static ushort ReadUShort(this Stream stream) + { + byte[] buffer = new byte[2]; + stream.Read(buffer, 0, 2); + if (BitConverter.IsLittleEndian) + Array.Reverse(buffer); + return BitConverter.ToUInt16(buffer, 0); + } + + public static bool ReadAll(this Stream stream, byte[] buffer, int startIndex, int count) + { + if (stream == null) + return false; + + int offset = 0; + while (offset < count) + { + int readCount = stream.Read(buffer, startIndex + offset, count - offset); + if (readCount == 0) + return false; + offset += readCount; + } + return true; + } + } +} diff --git a/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser21.cs b/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser21.cs new file mode 100644 index 000000000..d675f811e --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser21.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using XI5.Reader; + +namespace XI5.Types.Parsers +{ + internal static class TicketParser21 + { + internal static void ParseTicket(XI5Ticket ticket, TicketReader reader) + { + ticket.SerialId = reader.ReadTicketStringData(TicketDataType.Binary); + + ticket.IssuerId = reader.ReadTicketUInt32Data(); + + ticket.IssuedDate = reader.ReadTicketTimestampData(); + ticket.ExpiryDate = reader.ReadTicketTimestampData(); + + ticket.UserId = reader.ReadTicketUInt64Data(); + ticket.Username = reader.ReadTicketStringData(); + + ticket.Country = reader.ReadTicketStringData(TicketDataType.Binary); // No I am not going to brazil + ticket.Domain = reader.ReadTicketStringData(); + + ticket.ServiceId = reader.ReadTicketStringData(TicketDataType.Binary); + ticket.TitleId = XI5Ticket.ServiceIdRegex.Matches(ticket.ServiceId)[0].ToString(); + + ticket.Status = reader.ReadUInt32(); + + // Skip padding section in ticket + reader.SkipTicketEmptyData(3); + } + } +} diff --git a/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs b/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs new file mode 100644 index 000000000..30b9c33f8 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using XI5.Reader; + +namespace XI5.Types.Parsers +{ + internal static class TicketParser30 + { + internal static void ParseTicket(XI5Ticket ticket, TicketReader reader) + { + ticket.SerialId = reader.ReadTicketStringData(TicketDataType.Binary); + + ticket.IssuerId = reader.ReadTicketUInt32Data(); + + ticket.IssuedDate = reader.ReadTicketTimestampData(); + ticket.ExpiryDate = reader.ReadTicketTimestampData(); + + ticket.UserId = reader.ReadTicketUInt64Data(); + ticket.Username = reader.ReadTicketStringData(); + + ticket.Country = reader.ReadTicketStringData(TicketDataType.Binary); + ticket.Domain = reader.ReadTicketStringData(); + + ticket.ServiceId = reader.ReadTicketStringData(TicketDataType.Binary); + ticket.TitleId = XI5Ticket.ServiceIdRegex.Matches(ticket.ServiceId)[0].ToString(); + + TicketDataSection header = reader.ReadTicketSectionHeader(); + if (header.Type != TicketDataSectionType.DateOfBirth) + { + throw new FormatException($"Expected section to be {nameof(TicketDataSectionType.DateOfBirth)}, " + + $"was really {header.Type} ({(int)header.Type})"); + } + + reader.ReadUInt32(); // Birthdate + reader.SkipTicketEmptyData(2); // Padding? + + Console.WriteLine(reader.BaseStream.Position); + header = reader.ReadTicketSectionHeader(); + if (header.Type != TicketDataSectionType.Age) + { + throw new FormatException($"Expected section to be {nameof(TicketDataSectionType.Age)}, " + + $"was really {header.Type} ({(int)header.Type})"); + } + + reader.SkipTicketEmptyData(); + } + } +} diff --git a/BackendServices/CastleLibrary/XI5/Types/TicketData.cs b/BackendServices/CastleLibrary/XI5/Types/TicketData.cs new file mode 100644 index 000000000..9e5901f73 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Types/TicketData.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Types +{ + public readonly struct TicketData + { + public readonly TicketDataType Type; + public readonly ushort Length; + + public TicketData(TicketDataType type, ushort length) + { + Type = type; + Length = length; + } + } +} diff --git a/BackendServices/CastleLibrary/XI5/Types/TicketDataSection.cs b/BackendServices/CastleLibrary/XI5/Types/TicketDataSection.cs new file mode 100644 index 000000000..67eabd136 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Types/TicketDataSection.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Types +{ + public readonly struct TicketDataSection + { + public TicketDataSectionType Type { get; } + public ushort Length { get; } + public int Position { get; } + + public TicketDataSection(TicketDataSectionType type, ushort length, long position) + { + Type = type; + Length = length; + Position = (int)position; + } + } +} diff --git a/BackendServices/CastleLibrary/XI5/Types/TicketDataSectionType.cs b/BackendServices/CastleLibrary/XI5/Types/TicketDataSectionType.cs new file mode 100644 index 000000000..4f351283e --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Types/TicketDataSectionType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Types +{ + public enum TicketDataSectionType : byte + { + Body = 0, + Footer = 2, + Age = 16, + DateOfBirth = 17, + } +} diff --git a/BackendServices/CastleLibrary/XI5/Types/TicketDataType.cs b/BackendServices/CastleLibrary/XI5/Types/TicketDataType.cs new file mode 100644 index 000000000..13d618f52 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Types/TicketDataType.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Types +{ + public enum TicketDataType : ushort + { + Empty = 0, + UInt32 = 1, + UInt64 = 2, + + String = 4, + + Timestamp = 7, + Binary = 8, + } +} diff --git a/BackendServices/CastleLibrary/XI5/Types/TicketVersion.cs b/BackendServices/CastleLibrary/XI5/Types/TicketVersion.cs new file mode 100644 index 000000000..94f53d743 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Types/TicketVersion.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Types +{ + public readonly struct TicketVersion + { + public byte Major { get; } + public byte Minor { get; } + + internal TicketVersion(byte major, byte minor) + { + Major = major; + Minor = minor; + } + + public override string ToString() + { + return Major + "." + Minor; + } + } +} diff --git a/BackendServices/CastleLibrary/XI5/Verification/ITicketSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/ITicketSigningKey.cs new file mode 100644 index 000000000..ee88a8479 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Verification/ITicketSigningKey.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Verification +{ + /// + /// Defines the parameters for a key used for verification. + /// + public interface ITicketSigningKey + { + string HashAlgorithm { get; } + string CurveTable { get; } + TicketSignatureMessageType MessageType { get; } + string PublicKeyX { get; } + string PublicKeyY { get; } + } +} diff --git a/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs new file mode 100644 index 000000000..27e04f571 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Verification.Keys.Games +{ + public class DefaultSigningKey : PsnSigningKey + { + public override string PublicKeyX => "39c62d061d4ee35c5f3f7531de0af3cf918346526edac727"; + public override string PublicKeyY => "a5d578b55113e612bf1878d4cc939d61a41318403b5bdf86"; + } +} diff --git a/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/WarhawkSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/WarhawkSigningKey.cs new file mode 100644 index 000000000..018da0e4c --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/WarhawkSigningKey.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Verification.Keys.Games +{ + public class WarhawkSigningKey : PsnSigningKey + { + public override string PublicKeyX => "39c62d061d4ee35c5f3f7531de0af3cf918346526edac727"; + public override string PublicKeyY => "a5d578b55113e612bf1878d4cc939d61a41318403b5bdf86"; + } +} diff --git a/BackendServices/CastleLibrary/XI5/Verification/Keys/PsnSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/Keys/PsnSigningKey.cs new file mode 100644 index 000000000..901a4b725 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Verification/Keys/PsnSigningKey.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Verification.Keys +{ + /// + /// A public signing key used when PS3/PSVita clients connect via official PSN. + /// Since each game series has a different set of curves, you must provide them yourself in a new class. + /// + public abstract class PsnSigningKey : ITicketSigningKey + { + public string HashAlgorithm => "SHA-1"; + public string CurveTable => "secp192r1"; + public TicketSignatureMessageType MessageType => TicketSignatureMessageType.Ticket; + public abstract string PublicKeyX { get; } + public abstract string PublicKeyY { get; } + } +} diff --git a/BackendServices/CastleLibrary/XI5/Verification/Keys/RpcnSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/Keys/RpcnSigningKey.cs new file mode 100644 index 000000000..ec2888cfe --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Verification/Keys/RpcnSigningKey.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Verification.Keys +{ + /// + /// The public signing key used when RPCS3 clients connect via RPCN. + /// + public class RpcnSigningKey : ITicketSigningKey + { + public static readonly RpcnSigningKey Instance = new RpcnSigningKey(); + private RpcnSigningKey() { } + + public string HashAlgorithm => "SHA-224"; + public string CurveTable => "secp224k1"; + public TicketSignatureMessageType MessageType => TicketSignatureMessageType.Body; + public string PublicKeyX => "b07bc0f0addb97657e9f389039e8d2b9c97dc2a31d3042e7d0479b93"; + public string PublicKeyY => "d81c42b0abdf6c42191a31e31f93342f8f033bd529c2c57fdb5a0a7d"; + } +} diff --git a/BackendServices/CastleLibrary/XI5/Verification/SigningKeyResolver.cs b/BackendServices/CastleLibrary/XI5/Verification/SigningKeyResolver.cs new file mode 100644 index 000000000..3a55ab000 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Verification/SigningKeyResolver.cs @@ -0,0 +1,43 @@ +using CustomLogger; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using XI5.Verification.Keys; +using XI5.Verification.Keys.Games; + +namespace XI5.Verification +{ + public static class SigningKeyResolver + { + // Map Title IDs to PSN signing keys + private static readonly Dictionary PsnKeys = new(StringComparer.OrdinalIgnoreCase) + { + { "NPUA80093", new WarhawkSigningKey() }, // US public beta + { "NPUA80077", new WarhawkSigningKey() }, // US digital + { "NPEA00017", new WarhawkSigningKey() }, // EU digital + { "BCUS98117", new WarhawkSigningKey() }, // US disc + { "BCES00008", new WarhawkSigningKey() }, // EU disc + { "BCAS20015", new WarhawkSigningKey() }, // Asia disc + }; + + /// + /// Returns the appropriate signing key based on the issuer and title ID. + /// + public static ITicketSigningKey GetSigningKey(string issuer, string titleId) + { + // rpcn signing key + if (issuer.Equals("RPCN", StringComparison.OrdinalIgnoreCase)) + return RpcnSigningKey.Instance; + + // psn game signing key + if (!string.IsNullOrWhiteSpace(titleId) && PsnKeys.TryGetValue(titleId, out var psnKey)) + return psnKey; + + // default signing key + LoggerAccessor.LogInfo($"No signing key found for TitleID '{titleId}'. Using default key."); + return new DefaultSigningKey(); + } + } +} diff --git a/BackendServices/CastleLibrary/XI5/Verification/TicketSignatureMessageTypes.cs b/BackendServices/CastleLibrary/XI5/Verification/TicketSignatureMessageTypes.cs new file mode 100644 index 000000000..4442290f6 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Verification/TicketSignatureMessageTypes.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Verification +{ + public enum TicketSignatureMessageType : byte + { + Ticket = 0, + Body = 1, + } +} diff --git a/BackendServices/CastleLibrary/XI5/Verification/TicketVerifier.cs b/BackendServices/CastleLibrary/XI5/Verification/TicketVerifier.cs new file mode 100644 index 000000000..616eba9a4 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Verification/TicketVerifier.cs @@ -0,0 +1,81 @@ +using Org.BouncyCastle.Asn1.X9; +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Security; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace XI5.Verification +{ + public class TicketVerifier + { + private readonly TicketSignatureMessageType _messageType; + private readonly XI5Ticket _ticket; + private readonly byte[] _ticketData; + private readonly ISigner _signer; + + public TicketVerifier(byte[] ticketData, XI5Ticket ticket, ITicketSigningKey key) + { + this._messageType = key.MessageType; + this._ticketData = ticketData; + this._ticket = ticket; + + X9ECParameters xParams = ECNamedCurveTable.GetByName(key.CurveTable); + ECDomainParameters domainParams = new ECDomainParameters(xParams.Curve, xParams.G, xParams.N, xParams.H, xParams.GetSeed()); + Org.BouncyCastle.Math.EC.ECPoint ecPoint = domainParams.Curve.CreatePoint(new Org.BouncyCastle.Math.BigInteger(key.PublicKeyX, 16), new Org.BouncyCastle.Math.BigInteger(key.PublicKeyY, 16)); + + ECPublicKeyParameters publicKey = new ECPublicKeyParameters(ecPoint, domainParams); + this._signer = SignerUtilities.GetSigner(key.HashAlgorithm + "withECDSA"); + this._signer.Init(false, publicKey); + } + + // https://github.com/LBPUnion/ProjectLighthouse/blob/80cfb24d6f72ecdf45c8389b29a89fd1c13d0a96/ProjectLighthouse/Tickets/Signature/TicketSignatureVerifier.cs#L30 + // Sometimes psn signatures have one or two extra empty bytes + // This is slow but it's better than carelessly chopping 0's + private static byte[] TrimSignature(byte[] signature) + { + for (int i = 0; i <= 2; i++) + { + try + { + Asn1Object.FromByteArray(signature); + break; + } + catch + { + signature = signature.SkipLast(1).ToArray(); + } + } + + return signature; + } + + public bool IsTicketValid() + { + int inOff; + int inLen; + + switch (this._messageType) + { + case TicketSignatureMessageType.Body: + inOff = this._ticket.BodySection.Position; + inLen = this._ticket.BodySection.Length + 4; + break; + case TicketSignatureMessageType.Ticket: + inOff = 0; + inLen = this._ticketData.Length - this._ticket.SignatureData.Length; + break; + default: + throw new NotImplementedException(this._messageType.ToString()); + } + + this._signer.BlockUpdate(this._ticketData, inOff, inLen); + + return this._signer.VerifySignature(TrimSignature(this._ticket.SignatureData)); + } + } +} diff --git a/BackendServices/CastleLibrary/XI5/XI5Ticket.cs b/BackendServices/CastleLibrary/XI5/XI5Ticket.cs index a12da3131..99ab2011d 100644 --- a/BackendServices/CastleLibrary/XI5/XI5Ticket.cs +++ b/BackendServices/CastleLibrary/XI5/XI5Ticket.cs @@ -1,229 +1,160 @@ +using Microsoft.VisualBasic; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto.Signers; using Org.BouncyCastle.OpenSsl; using System; +using System.Diagnostics; + #if NET6_0_OR_GREATER using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; + #endif using System.IO; +using System.Linq; using System.Text; +using System.Text.RegularExpressions; +using XI5.Reader; +using XI5.Types; +using XI5.Types.Parsers; +using XI5.Verification; namespace XI5 { - //https://www.psdevwiki.com/ps3/X-I-5-Ticket - //https://github.com/RipleyTom/rpcn/blob/master/src/server/client/ticket.rs - public class XI5Ticket - { - const uint XI5_VER_2_0 = 553648128; - const uint XI5_VER_2_1 = 553713664; - const uint XI5_VER_3_0 = 822083584; - const uint XI5_VER_4_0 = 1090519040; - - private static ECDsaSigner ECDsaRPCN; - - static XI5Ticket() - { - PemReader pr = new PemReader(new StringReader("-----BEGIN PUBLIC KEY-----\r\nME4wEAYHKoZIzj0CAQYFK4EEACADOgAEsHvA8K3bl2V+nziQOejSucl9wqMdMELn\r\n0Eebk9gcQrCr32xCGRox4x+TNC+PAzvVKcLFf9taCn0=\r\n-----END PUBLIC KEY-----")); - ECDsaRPCN = new ECDsaSigner(); - ECDsaRPCN.Init(false, (ECPublicKeyParameters)pr.ReadObject()); - } - - public string TicketVersion { get; private set; } - public string Serial { get; private set; } - public uint IssuerId { get; private set; } - public DateTime? Issued { get; private set; } - public DateTime? Expires { get; private set; } - public ulong UserId { get; private set; } - public string OnlineId { get; private set; } - public string Region { get; private set; } - public string Domain { get; private set; } - public string ServiceId { get; private set; } - public uint Status { get; private set; } - public string IssuerName { get; private set; } - - private byte[] _fullBodyData; - private byte[] _signature; - - public XI5Ticket(byte[] data) - { - using (MemoryStream ms = new MemoryStream(data)) - { - uint version = ms.ReadUInt(); - - if (version != XI5_VER_2_0 && version != XI5_VER_2_1 && version != XI5_VER_3_0 && version != XI5_VER_4_0) - throw new NotSupportedException("Invalid ticket version: " + version); //invalid version - - TicketVersion = version == XI5_VER_2_0 ? "XI5_VER_2_0" : version == XI5_VER_2_1 ? "XI5_VER_2_1" : version == XI5_VER_3_0 ? "XI5_VER_3_0" : version == XI5_VER_4_0 ? "XI5_VER_4_0" : "UNKNOWN"; - if (version != XI5_VER_2_1) - { - Directory.CreateDirectory("bad_xi5"); - File.WriteAllBytes("bad_xi5/" + DateTime.Now.Ticks + ".bin", data); - throw new NotImplementedException("Reading " + TicketVersion + " ticket is not yet implemented."); - } - - uint size = ms.ReadUInt(); - if (size != ms.Length - 8) //invalid data - throw new ArgumentException($"Specified ticket size: {size} | Actual ticket size : {ms.Length - 8}"); - - ParseTicketV2_1(ms); - } - } - -#if NET5_0_OR_GREATER - [MemberNotNull(nameof(Serial), nameof(OnlineId), nameof(Region), nameof(Domain), nameof(ServiceId), nameof(IssuerName), nameof(_signature), nameof(_fullBodyData))] -#endif - private void ParseTicketV2_1(MemoryStream ms) - { - _fullBodyData = ReadFullBody(ms); - byte[] footer = ReadFooter(ms); - - using (MemoryStream bodyStream = new MemoryStream(_fullBodyData)) - { - bodyStream.Seek(4, SeekOrigin.Begin); //skip existing dt and size - - Serial = ReadBinaryAsString(bodyStream); - IssuerId = ReadUInt(bodyStream); - Issued = ReadTime(bodyStream); - Expires = ReadTime(bodyStream); - UserId = ReadULong(bodyStream); - OnlineId = ReadString(bodyStream); - Region = ReadBinaryAsString(bodyStream); - Domain = ReadString(bodyStream); - ServiceId = ReadBinaryAsString(bodyStream); - Status = ReadUInt(bodyStream); - } - - using (MemoryStream footerStream = new MemoryStream(footer)) - { - IssuerName = ReadBinaryAsString(footerStream); - _signature = ReadBinary(footerStream); - } - - //TODO: check out this later - //optionally there is also cookie (Binary Data type) - //and 2 empty entries (Empty data type) - } - - public bool SignedByOfficialRPCN { - get - { - using (Asn1InputStream decoder = new Asn1InputStream(_signature)) - { - if (decoder.ReadObject() is DerSequence seq) - return ECDsaRPCN.VerifySignature(NetHasher.DotNetHasher.ComputeSHA224(_fullBodyData), ((DerInteger)seq[0]).Value, ((DerInteger)seq[1]).Value); - } - - return false; - } - } - - private static byte[] ReadFullField(Stream stream, Datatype expected) - { - Datatype dt = (Datatype)stream.ReadUShort(); - if (dt != expected) - throw new InvalidDataException($"Expected datatype: {expected} | Actual datatype: {dt}"); - - ushort size = stream.ReadUShort(); - byte[] data = new byte[size + 4]; //with datatype and size included - stream.Seek(-4, SeekOrigin.Current); - if (!stream.ReadAll(data, 0, data.Length)) - throw new EndOfStreamException($"Failed to read {size} bytes from stream"); - return data; - } - - private static byte[] ReadField(Stream stream, Datatype expected) - { - Datatype dt = (Datatype)stream.ReadUShort(); - if (dt != expected) - throw new InvalidDataException($"Expected datatype: {expected} | Actual datatype: {dt}"); - - ushort size = stream.ReadUShort(); - byte[] data = new byte[size]; - if (!stream.ReadAll(data, 0, size)) - throw new EndOfStreamException($"Failed to read {size} bytes from stream"); - return data; - } - - private static byte[] ReadBody(Stream stream) => ReadField(stream, Datatype.Body); - private static byte[] ReadFullBody(Stream stream) => ReadFullField(stream, Datatype.Body); - private static byte[] ReadFooter(Stream stream) => ReadField(stream, Datatype.Footer); - private static byte[] ReadFullFooter(Stream stream) => ReadFullField(stream, Datatype.Footer); - private static byte[] ReadBinary(Stream stream) => ReadField(stream, Datatype.Binary); - private static byte[] ReadFullBinary(Stream stream) => ReadFullField(stream, Datatype.Binary); - - private static string ReadBinaryAsString(Stream stream) - { - byte[] data = ReadBinary(stream); - int inx = Array.FindIndex(data, 0, (x) => x == 0);//search for 0 - if (inx >= 0) - return Encoding.UTF8.GetString(data, 0, inx); - return Encoding.UTF8.GetString(data); - } - - private static uint ReadUInt(Stream stream) - { - byte[] data = ReadField(stream, Datatype.UInt); - if (BitConverter.IsLittleEndian) - Array.Reverse(data); - return BitConverter.ToUInt32(data, 0); - } - - private static DateTime ReadTime(Stream stream) - { - byte[] data = ReadField(stream, Datatype.Time); - if (BitConverter.IsLittleEndian) - Array.Reverse(data); - return DateTimeOffset.FromUnixTimeMilliseconds((long)BitConverter.ToUInt64(data, 0)).UtcDateTime; - } - - private static ulong ReadULong(Stream stream) - { - byte[] data = ReadField(stream, Datatype.ULong); - if (BitConverter.IsLittleEndian) - Array.Reverse(data); - return BitConverter.ToUInt64(data, 0); - } - - private static string ReadString(Stream stream) - { - byte[] data = ReadField(stream, Datatype.String); - int inx = Array.FindIndex(data, 0, (x) => x == 0);//search for 0 - if (inx >= 0) - return Encoding.UTF8.GetString(data, 0, inx); - return Encoding.UTF8.GetString(data); - } - - public override string ToString() - { - StringBuilder builder = new StringBuilder(); - builder.AppendLine("{"); - builder.AppendLine(" TicketVersion = " + TicketVersion); - builder.AppendLine(" Serial = " + Serial); - builder.AppendLine(" IssuerId = " + IssuerId); - builder.AppendLine(" Issued = " + Issued); - builder.AppendLine(" Expires = " + Expires); - builder.AppendLine(" UserId = " + UserId); - builder.AppendLine(" OnlineId = " + OnlineId); - builder.AppendLine(" Region = " + Region); - builder.AppendLine(" Domain = " + Domain); - builder.AppendLine(" ServiceId = " + ServiceId); - builder.AppendLine(" Status = " + Status); - builder.AppendLine(" IssuerName = " + IssuerName); - builder.AppendLine("}"); - return builder.ToString(); - } - - enum Datatype : ushort - { - Empty = 0, - UInt = 1, - ULong = 2, - String = 4, - Time = 7, - Binary = 8, - Body = 0x3000, - Footer = 0x3002 - } + // https://www.psdevwiki.com/ps3/X-I-5-Ticket + // https://github.com/RipleyTom/rpcn/blob/master/src/server/client/ticket.rs + // https://github.com/LittleBigRefresh/NPTicket/tree/main + + public class XI5Ticket + { + // constructor + public XI5Ticket() { } + + // fields + public TicketVersion Version { get; set; } + public string SerialId { get; set; } + public uint IssuerId { get; set; } + + public DateTimeOffset IssuedDate { get; set; } + public DateTimeOffset ExpiryDate { get; set; } + + public ulong UserId { get; set; } + public string Username { get; set; } + + public string Country { get; set; } + public string Domain { get; set; } + + public string ServiceId { get; set; } + public string TitleId { get; set; } + + public uint Status { get; set; } + public ushort TicketLength { get; set; } + public TicketDataSection BodySection { get; set; } + + public bool SignedByOfficialRPCN { get { return true; } } + public string SignatureIdentifier { get; set; } + public byte[] SignatureData { get; set; } + public bool Valid { get; protected set; } + + // TODO: Use GeneratedRegex, this is not in netstandard yet + internal static readonly Regex ServiceIdRegex = new Regex("(?<=-)[A-Z0-9]{9}(?=_)", RegexOptions.Compiled); + + [Pure] + public static XI5Ticket ReadFromBytes(byte[] ticketData) + { + using (var ms = new MemoryStream(ticketData)) + { + return ReadFromStream(ms); + } + } + + public static XI5Ticket ReadFromStream(Stream ticketStream) + { + byte[] ticketData; + if (ticketStream is MemoryStream ms && ms.TryGetBuffer(out ArraySegment buffer)) + ticketData = buffer.Array.Take((int)ms.Length).ToArray(); + + else + { + using (var tempMs = new MemoryStream()) + { + ticketStream.CopyTo(tempMs); + ticketData = tempMs.ToArray(); + } + + // reset stream position + ticketStream.Position = 0; + } + + // ticket version (2 bytes), header (4 bytes), ticket length (2 bytes) = 8 bytes + const int headerLength = sizeof(byte) + sizeof(byte) + sizeof(uint) + sizeof(ushort); + Debug.Assert(headerLength == 8, "Header length mismatch."); + + XI5Ticket ticket = new XI5Ticket(); + + using (var reader = new TicketReader(ticketStream)) + { + ticket.Version = reader.ReadTicketVersion(); + ticket.TicketLength = reader.ReadTicketHeader(); + + long actualLength = ticketStream.Length - headerLength; + if (ticket.TicketLength != actualLength) + throw new FormatException($"Expected ticket length to be {ticket.TicketLength} bytes, but was {actualLength} bytes."); + + ticket.BodySection = reader.ReadTicketSectionHeader(); + if (ticket.BodySection.Type != TicketDataSectionType.Body) + throw new FormatException($"Expected first section to be {nameof(TicketDataSectionType.Body)}, but was {ticket.BodySection.Type} ({(int)ticket.BodySection.Type})."); + + // ticket 2.1 + if (ticket.Version.Major == 2 && ticket.Version.Minor == 1) + TicketParser21.ParseTicket(ticket, reader); + + // ticket 3.0 + else if (ticket.Version.Major == 3 && ticket.Version.Minor == 0) + TicketParser30.ParseTicket(ticket, reader); + + // unhandled ticket version + else + throw new FormatException($"Unknown/unhandled ticket version {ticket.Version.Major}.{ticket.Version.Minor}."); + + var footer = reader.ReadTicketSectionHeader(); + if (footer.Type != TicketDataSectionType.Footer) + throw new FormatException($"Expected last section to be {nameof(TicketDataSectionType.Footer)}, but was {footer.Type} ({(int)footer.Type})."); + + ticket.SignatureIdentifier = reader.ReadTicketStringData(TicketDataType.Binary); + ticket.SignatureData = reader.ReadTicketBinaryData(); + } + + ITicketSigningKey signingKey = SigningKeyResolver.GetSigningKey(ticket.SignatureIdentifier, ticket.TitleId); + TicketVerifier ticketVerifier = new TicketVerifier(ticketData, ticket, signingKey); + ticket.Valid = ticketVerifier.IsTicketValid(); + + return ticket; + } + + public override string ToString() + { + var sb = new StringBuilder(); + + sb.AppendLine($"Version: {Version}"); + sb.AppendLine($"SerialId: {SerialId}"); + sb.AppendLine($"IssuerId: {IssuerId}"); + sb.AppendLine($"IssuedDate: {IssuedDate}"); + sb.AppendLine($"ExpiryDate: {ExpiryDate}"); + sb.AppendLine($"UserId: {UserId}"); + sb.AppendLine($"Username: {Username}"); + sb.AppendLine($"Country: {Country}"); + sb.AppendLine($"Domain: {Domain}"); + sb.AppendLine($"ServiceId: {ServiceId}"); + sb.AppendLine($"TitleId: {TitleId}"); + sb.AppendLine($"Status: {Status}"); + sb.AppendLine($"TicketLength: {TicketLength}"); + sb.AppendLine($"SignatureIdentifier: {SignatureIdentifier}"); + sb.AppendLine($"SignatureData: {(SignatureData != null ? BitConverter.ToString(SignatureData) : "null")}"); + sb.AppendLine($"Valid: {Valid}"); + + return sb.ToString(); + } } } \ No newline at end of file diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfo.cs b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfo.cs new file mode 100644 index 000000000..aa70e6d89 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyMetadata("IsTrimmable", "True")] +[assembly: System.Reflection.AssemblyCompanyAttribute("XI5")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("XI5")] +[assembly: System.Reflection.AssemblyTitleAttribute("XI5")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfoInputs.cache b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfoInputs.cache new file mode 100644 index 000000000..4e6f2fadb --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +267b49fed0d3c9b3cb7bb2e5d97c480ea83ca5e30a57302b958adc3bb5e5f5f5 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 000000000..dfa4ce073 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,17 @@ +is_global = true +build_property.EnableAotAnalyzer = +build_property.EnableSingleFileAnalyzer = +build_property.EnableTrimAnalyzer = true +build_property.IncludeAllContentForSelfExtract = +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = XI5 +build_property.ProjectDir = C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.assets.cache b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..0f72cc85376ec0d1a463616fdf35baeb0c83fff1 GIT binary patch literal 14520 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 literal 0 HcmV?d00001 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CopyComplete b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CopyComplete new file mode 100644 index 000000000..e69de29bb diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CoreCompileInputs.cache b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CoreCompileInputs.cache new file mode 100644 index 000000000..da368760f --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +99cd161f66b00417da097ceeaebe58348b1192b89971fd4516cfb5f29b12bcd4 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.FileListAbsolute.txt b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.FileListAbsolute.txt new file mode 100644 index 000000000..fafba24d5 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.FileListAbsolute.txt @@ -0,0 +1,38 @@ +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\XI5.deps.json +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\XI5.dll +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\XI5.pdb +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\CastleLibrary.dll +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\CustomLogger.dll +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\EndianTools.dll +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\CastleLibrary.pdb +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\CustomLogger.pdb +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\EndianTools.pdb +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.AssemblyReference.cache +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.AssemblyInfoInputs.cache +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.AssemblyInfo.cs +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.CoreCompileInputs.cache +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.Up2Date +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.dll +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\refint\XI5.dll +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.pdb +C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\ref\XI5.dll +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\XI5.deps.json +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\XI5.dll +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\XI5.pdb +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\CastleLibrary.dll +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\CustomLogger.dll +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\EndianTools.dll +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\CastleLibrary.pdb +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\CustomLogger.pdb +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\EndianTools.pdb +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.AssemblyReference.cache +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.AssemblyInfoInputs.cache +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.AssemblyInfo.cs +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.CoreCompileInputs.cache +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.CopyComplete +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.dll +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\refint\XI5.dll +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.pdb +C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\ref\XI5.dll diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.Up2Date b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.Up2Date new file mode 100644 index 000000000..e69de29bb diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.dll b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.dll new file mode 100644 index 0000000000000000000000000000000000000000..8c5aceec357d9ce878b6890ce18207dede436182 GIT binary patch literal 13312 zcmeHN3vgU#bw2;y-MbH2vUX+5!q1guJBwv+^okQF@k3906Iqfi$##NMX{EiAuf5t` z-@B3}yEZc5%w$p+QUWAxCUpZ-V1`Gafd(2%Oq;|&cmxsx!wi@GTz{&MZWQPYm*tn9dzoQRGlGns5YI$}hv$xPJDL_2!>qZ8Sb5ic(fZE#KZ zbrN+e4_z29|Cd5pOf?W~0Y`VZBX{5##XXFhs8Vpv@tYa!zg!mp!RO0E!{=F* z|Ia;Ll3BPaVYio&VWP`!J0^?QEYT7W%MwHbMdt5;M2P|=Y5~xDOXzssn9hSfx)}g6 z8S8@n!5)rVwlxZ|_%;lL2O7s+a_z=+#VsS9g(CY(v$)w-6Yi30H&I&&DQE}B6&L%a zk&n9J&!x3QO1OVGsA}+vduSh~m2Z#2Qb^OQS7tE>p-pGQfMxzIemw?-deW<7Rp2bC zrvUmbw1w+oT3c+p_PTACEpF@Kwl&4JHP>ysytJ*4+A&mwHcZ;Gs|p@^tC!TbREO%< zljia2hkg28VyQe>eN|O?!(LIS(u0RXr2DRVt9)VK))!Ye1F358P&4fL*q()f=Im

~HfK!@lp~bbZ(X~+RScvhOB34 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 literal 0 HcmV?d00001 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.pdb b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ae1184514630d388ecc245e0f460c84b437f99bd GIT binary patch literal 14092 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�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 literal 0 HcmV?d00001 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/ref/XI5.dll b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/ref/XI5.dll new file mode 100644 index 0000000000000000000000000000000000000000..d2e81ad0323fd307f7e5a6c76287f07db8c20f00 GIT binary patch literal 6144 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 R@8f$;y)WxKMz`4v{2Q_5<3Rub literal 0 HcmV?d00001 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/refint/XI5.dll b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/refint/XI5.dll new file mode 100644 index 0000000000000000000000000000000000000000..d2e81ad0323fd307f7e5a6c76287f07db8c20f00 GIT binary patch literal 6144 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 R@8f$;y)WxKMz`4v{2Q_5<3Rub literal 0 HcmV?d00001 diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfo.cs b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfo.cs new file mode 100644 index 000000000..457391a63 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyMetadata("IsTrimmable", "True")] +[assembly: System.Reflection.AssemblyCompanyAttribute("XI5")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("XI5")] +[assembly: System.Reflection.AssemblyTitleAttribute("XI5")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfoInputs.cache b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfoInputs.cache new file mode 100644 index 000000000..fa15ef187 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +15e97e16d15ebd00982545a7d4a698b35bbc869313285017b7041db1447222cf diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 000000000..dfa4ce073 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,17 @@ +is_global = true +build_property.EnableAotAnalyzer = +build_property.EnableSingleFileAnalyzer = +build_property.EnableTrimAnalyzer = true +build_property.IncludeAllContentForSelfExtract = +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = XI5 +build_property.ProjectDir = C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.assets.cache b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..acfe789301b38e9ebecc6853892a83b9430ac012 GIT binary patch literal 14520 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 literal 0 HcmV?d00001 diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.AssemblyReference.cache b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..a59e76fec1be6856b866b14441015ac214468865 GIT binary patch literal 14111 zcmdU$dvFuS9mjQzA%T=vFmb{=#7$y~@8lQw5!W@s27+JpgOV9duyk6Bvrl*8?&Mf* z8faonUS$YvGMOY0rVvQt0O^pD2O*(N(w4D-hNg6QIKw!2nm#5>$5Xj_VpI*Fp6G0GD3|+{d!V3%!)PmRqpRzW?7w})A zpXgv%P)<>lqnwhRp^!6_;tXZV87jgV%3uivouL$GsE{+p3y?FiH8x^}q2-c=YhiR5 zo~tY%?dZ>vg$@|pfB-5v5Re2HyJTTgz|AuB8W3#dVLU6j0PG7nCXWz7Ol=8@67Z4D z0Zw9kfS8Cr#60Avp!ZQ!;PXxJ>5Z!On`ZoFa=HA5{6rA*l>Qt%%K}=0wuz*J=jebS z08X;p{dA@K)(rx1c^J-XxyQSe9$Nskk&%L=LkRjM-YdBL8-iq$!1x%6=?0?ZFS;c< zGM4+CrS#bVq*R)kqjnqc0fC`KaxEN6Ua%em)!x;O5DK4P03xC{p)kDF>s)(#@ukQ0 z(A}=st3XVy<|KjPL}+KVrJS!&OiQ;S>!)>(e*A%6*df?-QU_#yDIKE5iPMsoX`oY8| zsQHy_<3v}7b^TZK3DkU%XRY=pkJ#kyVwl^C>_r7-aG=PBnpOudfNHGm&%+f*+rgJBl!_xho6!YFUwR4-ou$}%L-)C^+;He8mz8Q`5}IqNuQu}P z8Cu{)zC$8wdL#fPAJrR33t(wLR=Y)51BHqZxnPm!e#8^5usQHfurzP@U^}{0Rft;} zngPv+`>utPM;40jsMny2l?SfRvqPsYPYUkZiY`(6%#CTjI)zZFg?r$>1!s9`rzAm4 ztYy4j=smJ&0{kn#&>0wMm->>mY*NJ!~=Q>k>i^oJ8V-N#{_E2(`&)w#IY6AitLMb_pJFT^8hkvW~6IF-|VtP{EA zy0@)poU8#B7xjGm;B30dG|88=#ui;|1; zxCBojT$P8kA`FeK;Ki#~uAE29@mMkv%}W!086Gl+Qq7@4=1{UZ6f_5|r*-B~nmLLH zSBBov#$9fj$V%E6P#e(`J7B(W#)3N^YQ~~@4q6@%Txh}UEJaIsHJE5?11p#?J!oyT z03W;Lyz~486yQbin?yP@xcozh1mKl8kGa%APTr{BHt@wq#< zEI^wcceo;)v3H$yD_U5LordbDkJFJ!O7~jH-Ekt4Aim=`lA-zh!DI$4 zO}Gn5EX)1jles3r){gROih7*SQ51CnHXK?TleqR;Sf6VinFLd_E<+h~#|e6xa9bA} zH%>qYz0|r24XCq#EYyxSpgZ!>hru+cI$z&fw?+QNftfR7_>!>Q97oZnQnIP~8|>ql zY9=#YzhR>Y&;*)3gSM>vW!rv|o_RV(u;K-XB2eNafwSUkaXxq!2*uMJ1BSj6T zj#ZY9l|Q@c=)Njj|AOPi7xpd4osres_2|eQ(`Qz-{OZ6bYya_?Jn7Vfb3|LTCmJBK z+h%T{dzR8P4M4FS-bOD2rORycLx1$jMs&mmL=638LV~%Kgtu(ulhPvjAaF-3k#c6N z6O8eBgVBqT6bdGZ-${Y{T~hXw7yXM z?vdFQx7kK2zWvSNf0fy!tXWI zdls>sKVLSv?$0-TmA$HqdvDSGTlST%oX`Ddluq}IK$I8Zv*OKixPOu&8(_W%4YbD1{O{JA~B#*t? z+03kLuT6~Hgd~(h>a-jPG?avtKn`h1IM9TUa+0=z=0KF?f|T}hS=oR$T-ohO}$0=VCNljvzY`PwV^%V8Gk+I7#= z(q|$sH9f6*UuqgYYPpG`V^2BR>BK~~P_RphaWmn}6cSb;(KV1sOxrm#wRCCpYTxu= zH&L(Bss5g8zg=nVBCSu|I=x z|Ia;rmPNRRV0VCtF`|opJ!Y%dEYT7$!~1Yog}(-oAPUbb76#8HEUwer<=JQP7?K{N} zje<0MEr_*5ik1I^Yk6ycno$q+W2@e~21Had>Q~vzh@#DBF%Z$~3?m6`i&3A9gGImR z*I8Swv-a|JmM^Z;P_5H&`8ros>IB6%geInK*6KIaM_X2EdcZgoG!9G6nh=YP(4nXi z-1^E&@lB^T^hZY>2W}VL6)@)31ETIq;A{|Ma+aaqup1yKHKEh?TR?4EtDQmm1~#qN z^gD!rAXE_u0YSJT5CVcoMIZzO(TYF_2x=+p?hm8dMuV>B*~^Uj<%E8ZhKs zS5dhep*ijKZb`Uc*v;VA9y^@c7Z0x6(vZ9cY&_`XxqMRSa1zPY0@;IevTC&?k_fsa z(kkk<08VQLJ8DRt1?WYD4~Z1h#3kbnOpkz`gb#*xhG{?8tB%#%SOKEVsC_MzN#uzE z8di)XGJ+7!Z$4hs< zS{)l*Pa>IH;=1$GIho%;e1T*cUY1Da`C z>7|A4B=kyJ=%FOWm7Cc+C-cl-&*sCM#P0|H&;0hi4%dhNw~lVr61=VO95Oal7|bkT zwD}rgM6+I7>y>9hB;GjnqQ6-5FixB@80NEB4+0xEuWUYxR0_OdVAKtF2O_j_mNh&( zTWUh}TWga$AvEek_KkRM@;Lh@rkA&Bgvzr2Xe*`J=oPjd#9WhY7xO2kHD10fQZ$-; zE1(7o*Dh{>eV^Ax!&-sl_y?X76C*jB{v6EWg$ED%2-Vwf_bahhAAE440&8rzG3K)g|pR#)3M zqn!mdUXw!DVSZVmXn@_qCSxp#YstNr+GrLvmb-=S^@tc7`9kryh_M?l6rU9_){}+e zheV8x>+*ekR@B&?7S_55u@?sE@urlEG&g2BMX|%nKDen~uYW`NNFABCbtwM?g^1CK z?Wxw(w$^QJ$W~tA^T4kl(i_ea?ZkqeXF5}ItiqJbCH@r4@At5vY#7PVz3>*Xq7C~- z(p`8y0RAYJwGAD4o7Yvou;r**8$TL}zz+RfZ6m}314Ni4yq^$KijZM)_SuUk`*Z_t zF3#n!MG#hYIWjU2dvasC;aYF73_YgNz#UTj;>-I{KJ8Fk2RE5xfByqyL~!C`Es(Jr0}|+^T&Hbg%X);J*m2(w+iM zqJ2W}0l`-k*CL(E=R~qeJp=k#{TXE#>(v+3!P$xE^S}!c#wUY}j|$$UGrdQ&&4R7r z=hY7SS9(F!QzyL$RKURm_x=6!mBu1t`&k zYIJ|Y+rqD@Fuh&4yTgBFoWovX3U@C2vQY=F;Ol-GJVy~a;p-H15qhVud#`#OnQ@P= z`;htxxbwd51@$vkLl5}63rf>!=wV;?c=%^(2|ecPo(^l;68f~SJE@jvOX(S3_j{@i z++X{;x2tnhOJDYN$1v)(^s=ve9DP_u-}ZG+!Ovy%im!VQbanItU-y3K>gcDwt{paG z^oFk+fXx_%utDSPE_^2Px{A{>;m(Ecj{F2%gRdLX&(U&9_`0lK2ktsg*U%L{gKWEZ z16w(V%v+(Yps}kxn{U!;t)4CjcRw}g>%iTMV=6|4zNOY_4bpQ{1K zjVT&4E{7Vu7~;3Z02bE(eLccuGFXIv6Sz~conK(J^;*~Hagnem^XV)3_Up-)!gEDS zqY>gb#DGEU4oo)zqj($c3fE!v=?br)cA?XP2LulbW(6(5cLNoD4!D}i^l{Zp-=}vN zDf$t8NpA!FY1$2Zk-C82pj+r?QtM&h5o8|MeV87JOo0AUWQuMV$z#AX^cKaV*re`{ zyo;_?>{Xk}MBhUnq#sBAkTLuLYOj|0V@j*P34fFhNXat28vFn~2|JGgmta0UNuO1p z0^S=sM~D3~KMKBp-LfnEGFgzE0X`D>4wcpC=@mMsri_21`&BylWBB&C{-5-))Ot+t zD%9GbendZyT&tc`-=UqrM}m68egM3Meh$n~NKeu4hq0rKP(0powhO(F+|} zcO$auFK|DDyH;grxw0X{wQJ9fqoX%$9c`suLuNMT9f|jh`?5pn>qifE4~??ELT{T# zZ|8b!VaLvjg$}Ebb;|AToF&l>W*yfYwkD37rGr~X+p5->?w`r$v*USltc?a8GiOa? zOH2hMnrZ7?N%(|t#nQC_nZ8U6;qzk2OTdC8YF3yz9%>MSRTeth-9oyNk&$R8J zDYG;>GTgJ1ouplTc5Wtb?xF6^E;l`&Xv2er7YzbcI}z)ESSy-Yr;(D$VGdZD#xu46!KP~qN+0DmuotH zl@X6*Y1(yXs`4tsLqq1NqB&7AbJSienuT1C?M!D&%vbAq4oIyWah)E^%;#uV)ulbh zM@Kud6UXt|N1@w&5G{Agq`E`r5+1V z9SrHPWP}$n?!OGmumwUgpfrJG!mI%AC*06Xp~S2=#Jxxz;(RNWizXdJs3yytu5j5g zY1FNfL*@ze9MxRcoF31Y`^-|7Q?$K=SKM*T5}7S<&)H`dOb3nT=2Ttg_{`K4_h3#| zF*Iyp;?0SNvkn~Z!B0)*N!vL-r|3horqgeicrMS0yHAzO0*}a?sA8Feg&tjAnJ!F9 zcB5uCf5lRrc45+*nn8CKw7?64l^5ZVna`dQ%3bWipo8^bqO@4S2C{|noWdU!k(aD- zD{qzNX*3q=M~~ea7`<9Gx^4R6iPs&dfBW-CnDN^y)6; ztZYG?@@Bm_<&*61fMZQrUIB0VO97u`(+eiQC>Kg9lgpgUV+BRBP`ZG1-OBOY>OM7L z7Db5kO-~o|=CoPB1X&=@%oK~Zvp@>B2PVC4&J}HUre?VMoTLlu&O`|j;hbI^#ZISO zEZNlrXfNbC^Jdl|7)Fk8ikJ=!n$tctjGr)l(ksz1W97NX_{`)a9v#*cc1LpxB-W`4 z*>9FOJ485{oynJ2;S_C564T%E_h$<^EDzq^C|jZ<;@DOjg?o$IsmdCN5?>_X1HbZU6>mRDEVPF?hX7bb)O z8@K67g81vWjB$m&)v-z@QkCan)#yA2Qk|&Yj)kP`TAmfo4wt4;Skkk)O1W1WpOhDo zE9-H*!J3F@xRma+iU{>QNq6Vq%y{0KxWz2blXBvEyN~q7ClOX0e`Hb(j2}bhNa%eM zbJ0s|-V|itz@Y_a4y3c?738xKP2kYvvzepF+Df1~c_fPc_DO73g!5DhM``NE zQFo9=@GE&QxK41lKy$cSZZnS6QG5{SrtNeR*bd!(l(FeHls`?!s1>!^=>X(CkZ(sB zF2%Ag{F%WNp55f4&IwREQDPf@9LwY5>_KXw0xVdlJ3uBZWoU*bpt}(*-HtYM(rzzG zu@9}VW1{YH=%-Nb06A#IfxWGC3e-Nls@R~m<8HwVV?Sgq=vzD5IDyt~L7iUsIEnft z%0gR!&D~S@(|*8J&nS%Zg@TlzenNEV)?c!$hSg{UyBymVL9w98;5r}(5K)9esYT~ z)3^)JnXrPNH@9RU zHxUsF@wP;IsYQ;?X=o%mZ3%h@?6;#v30c5#y;AvvSL2#)^vr9+Yc+wEv#8B?Su|q# z+RItKY{_*!sB1}Yyb-nGg98saGKk5>1mabeK5{H3p|jEN1R_)N%T42b_6!l)^!^RQ zUL`9I!qQw$B#?Qqxw=v^BU%e>anD7!uA)n$1s74_`f2fHVcj`B`zgA{N?k8XmiWhB zFRVENyO&t4wmN|E#N}G$oSA~2GyGD!T@o3NW>wcz@yP4x35m?*Eob~uoPl?~ z%`;Gr~{+sM%G=z;JDRH<(yo zd^gH!K|M*exFg}DZx2ijZY`kDC49xir)gYk`3J3Gt^QUgTkN+B)#K;zQO7>%DwIR# zaqU*rkm~Oq?z9~f@0i#5uOqup>`1l3KVblxOM#ws(4Z7dx4&|Y`Oc3Pwh;Zci!~XL$94iZz|XOm`+rBX#C+6j&m6ty1YYO1{>!9wy9A(`*HLfkaB++_~9E^szCG2m-ocq zmdM3xjElR&0-_(!Pdz~t~55+No=%yU5#(e{MWh;N))hd=JDhsDR0i+^+e!% zXa>K@$zjDi=qsaPDUW~bw}$e) za#Z1x+=C(xaqQ6)em5$iOak{#u{+?)IXYar(huhNfO|Rn+}}aev(YBMzLe&9Qz_4W zV^g`L+@-yp>ubfIc0`X4Xww*lJiJaI1Lhwh7sm%K{`UG+5!mbfJ+h!)KE>yYroyoo%!GHjHpT1_hxY@J}D45EjEC z*^%ymWguF}Jn)bJl4Xd12lF0*^o9oLGz7WU8$lvqS-4Uzl*B7wxs4WrfMUclG90l3 z&z|s^6Y0wW-y%SZ=zwO3q)=G){@2IG8S47xEN+=1bJOdaoNZnSvXN-BQe9m=1hdKw z&_E4h4w4f{)*yL;1Z{N%39w;&2H<-rNK}G`-!K7{*dKVtD~VJSIg2qnp-h+{7V3c* z6tGIc(?;;U1AO^91DiR95dElFZSdO6}Q6S9$X~h^Sas;FmW2wk$kP1O60ci(F z)gbKy=`cutf^-(7DSaeo^guEMX$VN>AX$TC50VQ=3qkq^ zq#q#B?WxFAkhmZTL7D@S3Zw-fEd!|xq(dNG1?f3RTEO%8AHdN8j!r>(fx6&sfqn)0 zLF%M?0UC0^KUhu!6s;TG8_>F-Y%oZ@!M_$!?g(h;du@W&#-2NA9YDjRUJm7uG%SN{ zOVSYEM~#N%un(x0!#+ULu)MDt4e|ZdXjtA~jfUlhYBVe#phm-TBQ+Y94^*RJxv?4z z%Ll2^upIhG-M%4eG%SaGP`%tljfUl>YBZETOpS)+W@DO$z?P+8{S{gX|J<=0SW1qto;koIfC>ShV2qmdNC>TGNY%}W(jTjlr zQ~EAhTQ%qtFZ9=w+E)#8!jWUaTc{eI13*xT0P+d>sG`>t-|gS?WMM349qqa+0Ng7w6&)6&9b@c^?`^8A&{yBI6V@Vo@4QB?JXAn_~y2M z7X z55Hfna+^BxwDs!;!>ty)BwOAI;Y-Cbp$L`RlUXiwH@btpE8WR?ysH!4ajYxPb^Js( zM}C|$PcYuef#)^><-4E)2M3hzIDP`(jmLL!LtRiFBH~KoleqCH!n8yb(j++_wT}am z?fF>uaY3X>N?DT9K2azUAS{)HD;Dy(B9SUUC`m*G0YaXfD_0>>nNlbg&gCj$zm((7 zMPwqbGEOQNBVG~}QDK2 zW|BfF6$eP;<54-m`nu5iC9)ZWTJQ94R9;B(DKm;Zpf$j@A6p_2awQQ`sYpR^hL3m3 zft;uAoaN4|4)?0?cs^h6^7n_{!uWU*N-#x4AKr!>(?+%!ofp*lbo+lCZ)p_3LSYPcCb>YlH@a2@LkOF4a)$pt#73eA6Sa z7q%O6B!X&gz=kqL@}fznSpO*!hd#}>SpuD!W0d{W+y0{OmhA;QSF zlfiO>qaELFJ_&nWV?lpOpX$EMYAyHuMzK56JJC@>MG{xU;3|ZCPzgCXXdgfKc#Bw2 z5aXzrX*)v=1NNq#998sci@jzbt}HMvs~C>lk@o9SZ@;r)XR&GH^ViOJ(}{@|N}QeO zJ*Ersy`macMYsKGihI^N|HaWc&hNjiiUw=ALdlf~xN-r(xts1< zf*hkDHXlZvNb!5bUf?+R=oGsFdxFAHzLZY(d~dMI5rCMX4-UbOy1@B1$FD8GyW;c4 zILD?>;o&NU5*5=ySOEHk5(GB{|D(xM@?k|QD((z#Ow9Bz{ucaZI{O33&%lB*vh7+% zkJtp6*Bif1`%lwRT%6ZKEOD}->SR3yTu2CVn-ljL$#LMp1ASWymLV|-w~&Bue$ zL0k2w)m}H&uh4+S+wRQD+$PxR%^Y%9uI_usC!=Q9^|sf^mKp%QVsVm^%jN1`?ob3pg~dz2=h=m=xexI-P+CAQgi&q#l{`>6+yMm68)KJ zo@X>*!(}L6$Q6MAmu#*R8B;I8N}BZ3EtZ|(aH`G(Ma8~L=~OJ1NhQE1fl>h~qI*ds zQYE%dkPe=2DYyh%Pc-7P8`tv;v!?R4#pq1RhYsak@GKBt_mokyHz5Ny(rv0v;cdr> zto5q4`Qh0g-)WYCSNhE==~{@nGtx{ow`PuC7CQPkk7+hiGlrcEssP3(D)3UMB&6fk zEHll4GPYTs*+Zwc`)qy9u9@F#c3-oM9wSb~6O}>NZFB9#Iq!bLKkuMTQt{1lea-L) zl?(+P8H9{rUqQ6o_|hX!;8P8rSCFET6 zTZV~ATpA;*=){|Rdv6nh6SffG#$_KF`jzS#b1A@ z10X6KRrZ+4ZMe6$z&b>2ZO|E-K7m;Hh+GPGbYzut zh8Mhtnx!^RYH8=Z*lQ;3REFIPS)~COt^}LH2oUFyvv5MxxFYE3#>eyQVv1&QvRRwi zzaIY6R0B2w%*D}iA?U`KfB>+Z!1;)%zJr0{JG6e->K6L1!_WC_EL-<}5q+hDCP8XZ z@M}iwUI;6786TUecPB90O#A9}MvJn607wQkHkCX>Kfdx~M(+49>5M841P z+;9T1_Zertj>O@cKYAFxjU&u&7u;L}mEHO-yghvLaj$x}M6*AJzoQc%Z?OO4DivV! zD{&+c_P2c>Lr>i=eRt;C_k7O2R(tJ5O8a^O!2##XaCyMD0!*$5M9^G0*}s;zayLVD zLlgVCKK*n%pq9Uwcf3?@u9kznS zjgXJ^!Y=+3vybP2=F)w%jsIG8@~N5S#fOsvjGp9D5#g7^Y}-e$jv2RuV=OaGf@)S( zt45!_t))=_u5;FA00BC;|2A>ZUgUyz=8wz^+3g|wH9}Z&5IL(&X4gO4Ve3_^;+;t3 zJDs!JYh$lORpxh%;2xtQ|3~-^sCvc1^}Olr?^u-5Qr4nQs4rM4xk^+Ju9V8b84Tf|=?vYE5cj2E<>{ExJ^|a} z#fJNPm5@OJ=yQRnSSnWqa%D190KH8Pk9%Q8SD>-G(q^nW`FvR5;?eq_j?&EhIyHs} zWq?~#v$QDpVs83wWPL7rU~lj2xV{cY#?B1rj>TKVs=%xP+Bo^SIQ-Thj$T_UvMlZeNN5r&SE+@}Zy$^(hnVS~ zlQy;gC19-Pd;E59^(8TZ!7EP4pZH_?KDdSRzDU_KG3Sa;<=R-Ex_iCe6TCs-AQLwv z+IqxR=$nl#5pEj``UWh?)Vca&Srtu<(MPEyk6Fz8=&Rtas8uje+rDrObBQd)#M^!Y zr8~Euq9blPlXmDhRN(k}jyTbI9IJZ8B=oj(xMDO61p^=nZoP@h z2SpUrLfh8u^EwrKww6`8Q~$cn{QjTRai}syDo=z19Ih>$*pY$$-=WU=ulpbR@v_S6 zz~$-Je&o9kQNxCGu9B4%df391cx?97wzJOpeR1x^+@2SXo(p>vW@1z7R$#td>Cy9l;=%2m_%x%rO%hx86I^vkDG)wG18 zV9zI1lDlD<*5qw)sh5p8_r;s-;IpjYMB5&*TXGi!c8ne(6?SYCZ!GnF4gHoqEVGc4 z|B|!FC)Dz?EVGLqDLgGF4HMQp`3}|mW#6YNWy(dbax~BSNS&dbnwn^o#}o-WH>2$1 z!HZ!JFq(O%Eh}Z7*S>*N6PF4-avp`X2M{0d>H(E^?rKR#c-a&|1LtRGH%#67(Qnr? zr?2;tuC{j72ZG5|(h-dbKG*?bL@sI_S2c`XAs9JoX6u9rT@m3#t-4ssaj|+2m0A5z zeHKd&u$JBb6nyUWltY@KcuQ4flvcpnIdE4$bx*G0EE>RAu`oG^oc@B6#Bje$y6@#Y z-(08x4f1KZcK*0`UBC-@<=ew7QUl2y1-ACmj_9RPr@9IDpX>f7pIIvNgZCCEr}iZ4DQZh??$-$?_ z&j!a+M8nqkJZOSF+@-u^@NwRmpq(xrMcOf^8+)3FfqVn7lLPf}`}Ca!w($#$O={cz zSB`IaZF6;ELdvUd*`~qlC;U6I6a|(sFDlc%@I1=wf%1)7F0yXIli!A+(5sa z^5%Z~+D?*jp_;FHL=@xaFy6tQR_($6l*_K;9AH*?r@py(p{Gu`Veb)<7M?W4c9k3V zW{RXsihYl~46t1p@m$dX$KT>8z*GcBB4O`=-wc+(ikeTJc0YoW$j;c%yUP9RwN58@ zqVT6cZ1E=HNBI42CZ;*QyEjRmLYxSug@09Y&x$t~9kS{oZluKnDKEnHNlkesl80f4mIc$4Hex8|;uy=hQ z+tkGW0VeivJ=f5P7Y9y2V|qWYdzoxw9Z$%rUDEct70ip>P{2>vDWm#CpwMR{|U~nGx`m3&a;yL zgyK6`;Cr&F;nN>s#}u=gzwX>|Cf9H4esNwHBeU{9rKp8pFa1W{ht=k$)oSN8G%>RS zD&9_$l}!9ke2+=w!@yyfl=~sPaiNr2&!s~aMIAr>eDQxunIb0RGZ!lN8eCZNcEocm zOhOo0mZQfkDsWd3@Q#>7(?-GNMdA%O<2Uy&JN)>|V6UTxC+%%HYkRaimMP*2#iZ9x z3^=nEDjfZIiR0aIPW}z3&FdM_Tga8HLm^YHk}0L}a;_{vMfVcLgR2C}gbpbm43EEu zQOmpQjI6MHk$3h;lSihlgUNxZSqih`tmQ9*_>0g8#`))|O6g6{tQ4P^fsG%@`RFHb z1sQ8E*>oH`s(HJ#Pq5SV7Vpe82`4T3UnD~_&2YAaFBNo#o%?tu3rDL5q6+i_Om9{SVyu78@LU6>;SSGYZlR?10BCf zI{*zSh@9dv+jm{i3atn0*p)&_k5*J~kSXIGCNjbCu`mwY0)V$6@L6c@-(Ye17eU-+ z)h#wEna{|3w#3xZ{3W?z?XU>vu3Ipu9NNFAWKb$=Ml0vQ^(F#`eaj```8+jk`Q6-zG?`kJPqwsKx?vJaPjuFyWR9 ztdh^r;3c;1f6immy^l=zZO%=HqvRHYn992zp!WULgsoG9&7^-dZ87y;E!BVbf$}@K zuZ9Po^o}mY1aCw_z!saVVdTtY%*@OOrxZ)CF7;a}>^CwdEryIryMpn?i2J$(d-3s= z>bt6U+gSD&CuHx3#yZCzn&@b)(c=RewReM1u(#0DLn zx$a!B1-{n3YM3(l=%iAw^)_kohx2~9rH)gZGE>_|-9x}t#RHSt-GnZ`arV`0$(Q{3 zPo6qEc&V5q;>vrT1q8VzXTw47*!tX+{xKoo@ct2RE9GmANN@tYECrjInZT7u(2h$H zbFxga_jdBTb3N8S)b*=fFsnCB*hY@_hz=a?$f!S;+=Xh2kGQQs#0S`!$+^ovv?ew8 zP!kN^zlgAt8={+RpLXv&>?V~GtG!K*8+;Dheyn)&NA&m}$Ox_?Q9*~VG~z_k6at;S zRQv+!t-N*b!MCxVf!VoBqareXjr<83H}?E2-)5*%x$20*GbYq;uS;RZ)vJ!=p>t>5 zaFspUy^i+!A;fE?*-V^fn(dQ|rqmYBNWc6OrQMEN-Z_su4bkPN|L)z#ZYp!%qcHzN zEng=0L}NZCD%xJ~t`zn)*>GR4(CCuja-q}FP+kZ*?Wx&}p+dmPK7rJ4J9rf8yQ4$~ zeO(n1wE35@(~BKuZ|JEHTu&k+-u=S{VaJ?KXLLo281<}@n<+NbtVjw8l5;_j+U1T4 zZOticxTl%MFBGi$;+f;Y+<$1)nGUC_BLbx078PNh`GVKjOnjo=&9z8pl2_*M>=d(_ zk5>pyQCv|H8j&RHcu_n4!cc6;Qhx++O~dZ9>OBslc6;uZ5&WH_Y_%L*`3Ci_M~|3{ ztDPHkbRpaJd}~^Y8Y4VOic|_ko#zi)tm1VL6qZfpibnWx_AQK??la&Cp9FQ8Qh$jp z{sS`m{1{siI>eKGFn_|8hDUXC2j9j3iJ4nxewTXRl#LC+CLdov=UptAE8`%e1HH?AoUWo5GUv!H&M;v}Me?-w(nu_pQIn zdsE9j0Xt^&`dvCSHclNP7Igz%`eA`BUj_U69-8_*h`IKq^fS}&nqyZGX<VAVwM? zSkW+zMULS5tdW&LFT{YVLq+=0RDh-;zFInc5hE(NO^am@q^fAhpcL?--xnDKZq}yX zH8tpu42QN&roy|&RF!eCJf6+~7ajR3{H`7Lo@!)|Ts$bH!)Z*6!mWV$&sf5R@!&nA zVn~m2B7`$1JizLBaSLA?3s5f!SEN!16@7?uxb6<2R9vT2yr5L}rBu?PzbZMvWt7Tz zEd<=>w-^n-^ex~IH4xee3yd0Jg;67MY9vlsT4H6E@aG)}ZPX}?8fA-7R^}LGg=NyL zM`DyUCYm-HmogfcVuMpQIAx2=w8dqP8IIw`V41YBxQ4N|fi!Th-9c9iv8Cx~BW5(v zA%rx<0%1{g1|#W5Xeth33QkZEE1FIpgh>Urt$9>%QQkyLh4mo=1f}Y5kbyKng2tNO z8{BFSG|)%P;Z5yHpj{Cw*qAo(3G_C7*tUkS6#LLeM#4NB_<@yzpJ-q#`p9@15CDEf zp^sR@4~m`&*3ERbp#k1?Cec)V5b!IFzDRl@RmTl6psDEE;1xs)=#8L*(U7TBonMiW z&@P}&7a0Y9W`ck_-3Ew1RmT<4r>e$4_Vgt^`OV;{u!Q_1E8s*d(sL%k?@{Twli~Ns z^gMU?ZJoZ_6Q|b@biSu4xNScoeLWEELtRM7RUsH#C=1ddBDHPFFF-#|F} ztU)&TamKjxiZ0n)oZBINPnT@K4HY=1H-PM(3c|q8I_%OL4Zz)e=(%60;LbkydCFh} t3`ukNWQB}_AK=Lx<`JbBi!(u*Bje!{CIHM7uzp(Ug|7JbLHN6%{{uL6RpS5v literal 0 HcmV?d00001 diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/ref/XI5.dll b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/ref/XI5.dll new file mode 100644 index 0000000000000000000000000000000000000000..a00937c16a43857f62e0d8e3cd788b23410de3f7 GIT binary patch literal 6144 zcmeHLUu+yl8UJ?o?tHeB!*=Wt6q2rS5Ec!mbDgG5lQehs+3BV6pZdSZY&Mxo)6*NSQ*({FUNLOj@%6IM-KMRZww|9W>UF0o();)K9BaFtpCY=b#OTOFkK77J zyG@_cdzB2)K1h;*^yrglv#2^MQJ-wpAZ`|L{IYBV+l)r5SJ;&QJ8hd~5z4PG5X~{M zN^~3k_LQw4jO(!b4QGj z8wli_BtS=sj_A{_=T;z-Ijn+UUjwL-l7-8(D=Y_wJhili%HtkHjg&0Ljj;F0dw2#u zc<{#2rT5;=zmuR>d#8?Gy@yl1pW5AKfX`JFKATjEQz=XI#U3Jsh5twC8T=AW6faCD zZ4Z3TY@A4E(&L%&u~Y0YP8RSzoKGWPCd$N#-oXoKr0Bb*UGv!DuQ>Dh_!?O((mz1+ z898!(v5;qFH{wHZBNLWWW*!AcnDX?IZKa#fvVSS#e4cUqL#S{s&$>aha7C$h`v6+D z+25{Ab7dDq-%^<-O3<=$SWD0?iI1sF4=PFR0G&q62}(%GIb~T*(4Xkfz+si~4TW)C z;#Vd9P2#9TS9=56ZFLDA{z>d}h*)w%;!jnkb;s@)#l=) zf&Bv{PeC_G+HfD$!JVZZaEZh!ouQ?zH??!XuSmSCGVM$J88Q7MDSut!2aunn3{7Gp zd+9t-0nTUPlDq-`>SNx687oMaTPbRCh?#E=NWOVVc#Xad ze397ZSJLK&#HN(2Yi$1$N$2Q$^3>CS37i!w=BEpoKP(ghRxR2Kj`~hGJ zPpt~+$ANvklDKXirq~v*al9;ce{SBhrM7S)N?+}fI1F%4^BesY$IEzcMA zbYYG*467+tR;X(D20B-QKEmBFE22=9+?;KhcE~Jx!fne7p4Z&X1onY^)~E~0Be0SQ zqCMb3)ApH#-0)isK{?M8^|IBP5x&78N@$7YkVNJBkIdCR|}xL>Oa76-wB*VYfPp_FPN3 zZ_vG-|fv z`DVonMeRJ(;f5&&o7baYn;<1T4#JZoPi;0#7jzKy&K?MqMeNC@M|0(85eFw2#2L&( z!S<=*VEYDa@si{E$l7rIf?XAxG~rZRG-29?+oGv@!*9vwm}t)(TGL61>57t!1Nw)U zOvQCoNu`q4&#heU|9#J6croCPp{k_DNX3zp#QBj?)r^|x(h~iBT4G=@kr*0SRN`?` zx(9N=UWr`;xo(Q71GyvdWD*0VP`i^l4fPk4{uwa6Jm`@)C{-JUdKBu>P(4b$5U4Re zqLK>EIW9-}dQnmjKJ6NfS;wB*tcV6LQt6WGJnt#6Q>EQmg$|`>r%IEKD{_s-@%HMT z-8h-fz(Hzo=NZhKUc)k4d_E+(hYpJ&g?bBK$u;YBeyn39w<%;08lP#j4{tF%Fv9R4 zWo8VQM*I==C={2B3?c&Z+d0C&k8kv_q{80|LP4}`-+2Sk3ew42)(mgrx>rGNLhgFj z-uX0TgHQBm_j{LCWU_~XUj`y+2Df>v#a2WJGI-NH0cv@b=%rwrNRyXTzPT<@kye0H zv;eArUs`6t7l6~juP*d%?C<{${Dg1KpgkwO1m6J>w^GXA0SdetxF=4NiSG#kpEj+L zBlX8{+afAKYe4EjZ;%f=2V79D$Nqw06vX7i%7naj7f&~(O$Ilp;O_*LK@p9@zk(Z) zgIjh(j?qF!1~_b8lx0MN9SvKy3nR=!>*2n{<2820)3HxR?3ZBgqDLq0G2F&7JC*&j zJ!kGqTN^Q0kw^l+X{tiX-&}a`VSf>}HEGEiG^iybs^MnJzccBmk4nFDZ8^^l`wjD8 zF35DRf6jLv{Tz(hM6P}$n&`YF_SpS*ww+wVcygEv53$#=3KpW)u>*F`P^S;i)BW<1 UW*{4UAM2+-lJ$L~du#^&1FGEMPyhe` literal 0 HcmV?d00001 diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/refint/XI5.dll b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/refint/XI5.dll new file mode 100644 index 0000000000000000000000000000000000000000..a00937c16a43857f62e0d8e3cd788b23410de3f7 GIT binary patch literal 6144 zcmeHLUu+yl8UJ?o?tHeB!*=Wt6q2rS5Ec!mbDgG5lQehs+3BV6pZdSZY&Mxo)6*NSQ*({FUNLOj@%6IM-KMRZww|9W>UF0o();)K9BaFtpCY=b#OTOFkK77J zyG@_cdzB2)K1h;*^yrglv#2^MQJ-wpAZ`|L{IYBV+l)r5SJ;&QJ8hd~5z4PG5X~{M zN^~3k_LQw4jO(!b4QGj z8wli_BtS=sj_A{_=T;z-Ijn+UUjwL-l7-8(D=Y_wJhili%HtkHjg&0Ljj;F0dw2#u zc<{#2rT5;=zmuR>d#8?Gy@yl1pW5AKfX`JFKATjEQz=XI#U3Jsh5twC8T=AW6faCD zZ4Z3TY@A4E(&L%&u~Y0YP8RSzoKGWPCd$N#-oXoKr0Bb*UGv!DuQ>Dh_!?O((mz1+ z898!(v5;qFH{wHZBNLWWW*!AcnDX?IZKa#fvVSS#e4cUqL#S{s&$>aha7C$h`v6+D z+25{Ab7dDq-%^<-O3<=$SWD0?iI1sF4=PFR0G&q62}(%GIb~T*(4Xkfz+si~4TW)C z;#Vd9P2#9TS9=56ZFLDA{z>d}h*)w%;!jnkb;s@)#l=) zf&Bv{PeC_G+HfD$!JVZZaEZh!ouQ?zH??!XuSmSCGVM$J88Q7MDSut!2aunn3{7Gp zd+9t-0nTUPlDq-`>SNx687oMaTPbRCh?#E=NWOVVc#Xad ze397ZSJLK&#HN(2Yi$1$N$2Q$^3>CS37i!w=BEpoKP(ghRxR2Kj`~hGJ zPpt~+$ANvklDKXirq~v*al9;ce{SBhrM7S)N?+}fI1F%4^BesY$IEzcMA zbYYG*467+tR;X(D20B-QKEmBFE22=9+?;KhcE~Jx!fne7p4Z&X1onY^)~E~0Be0SQ zqCMb3)ApH#-0)isK{?M8^|IBP5x&78N@$7YkVNJBkIdCR|}xL>Oa76-wB*VYfPp_FPN3 zZ_vG-|fv z`DVonMeRJ(;f5&&o7baYn;<1T4#JZoPi;0#7jzKy&K?MqMeNC@M|0(85eFw2#2L&( z!S<=*VEYDa@si{E$l7rIf?XAxG~rZRG-29?+oGv@!*9vwm}t)(TGL61>57t!1Nw)U zOvQCoNu`q4&#heU|9#J6croCPp{k_DNX3zp#QBj?)r^|x(h~iBT4G=@kr*0SRN`?` zx(9N=UWr`;xo(Q71GyvdWD*0VP`i^l4fPk4{uwa6Jm`@)C{-JUdKBu>P(4b$5U4Re zqLK>EIW9-}dQnmjKJ6NfS;wB*tcV6LQt6WGJnt#6Q>EQmg$|`>r%IEKD{_s-@%HMT z-8h-fz(Hzo=NZhKUc)k4d_E+(hYpJ&g?bBK$u;YBeyn39w<%;08lP#j4{tF%Fv9R4 zWo8VQM*I==C={2B3?c&Z+d0C&k8kv_q{80|LP4}`-+2Sk3ew42)(mgrx>rGNLhgFj z-uX0TgHQBm_j{LCWU_~XUj`y+2Df>v#a2WJGI-NH0cv@b=%rwrNRyXTzPT<@kye0H zv;eArUs`6t7l6~juP*d%?C<{${Dg1KpgkwO1m6J>w^GXA0SdetxF=4NiSG#kpEj+L zBlX8{+afAKYe4EjZ;%f=2V79D$Nqw06vX7i%7naj7f&~(O$Ilp;O_*LK@p9@zk(Z) zgIjh(j?qF!1~_b8lx0MN9SvKy3nR=!>*2n{<2820)3HxR?3ZBgqDLq0G2F&7JC*&j zJ!kGqTN^Q0kw^l+X{tiX-&}a`VSf>}HEGEiG^iybs^MnJzccBmk4nFDZ8^^l`wjD8 zF35DRf6jLv{Tz(hM6P}$n&`YF_SpS*ww+wVcygEv53$#=3KpW)u>*F`P^S;i)BW<1 UW*{4UAM2+-lJ$L~du#^&1FGEMPyhe` literal 0 HcmV?d00001 diff --git a/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.dgspec.json b/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.dgspec.json new file mode 100644 index 000000000..9483b0f40 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.dgspec.json @@ -0,0 +1,335 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj": {} + }, + "projects": { + "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj", + "projectName": "CastleLibrary", + "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj", + "packagesPath": "C:\\Users\\Mack\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\Mack\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": { + "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\CustomLogger.csproj": { + "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\CustomLogger.csproj" + }, + "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\EndianTools.csproj": { + "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\EndianTools.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "Microsoft.NET.ILLink.Analyzers": { + "suppressParent": "All", + "target": "Package", + "version": "[7.0.100-1.23211.1, )", + "autoReferenced": true + }, + "Microsoft.NET.ILLink.Tasks": { + "suppressParent": "All", + "target": "Package", + "version": "[7.0.100-1.23211.1, )", + "autoReferenced": true + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.102\\RuntimeIdentifierGraph.json" + } + } + }, + "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\CustomLogger.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\CustomLogger.csproj", + "projectName": "CustomLogger", + "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\CustomLogger.csproj", + "packagesPath": "C:\\Users\\Mack\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\Mack\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "Figgle": { + "target": "Package", + "version": "[0.5.1, )" + }, + "Microsoft.Extensions.Logging": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Extensions.Logging.Console": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.NET.ILLink.Analyzers": { + "suppressParent": "All", + "target": "Package", + "version": "[7.0.100-1.23211.1, )", + "autoReferenced": true + }, + "Microsoft.NET.ILLink.Tasks": { + "suppressParent": "All", + "target": "Package", + "version": "[7.0.100-1.23211.1, )", + "autoReferenced": true + }, + "NReco.Logging.File": { + "target": "Package", + "version": "[1.2.1, )" + }, + "System.Security.Principal.Windows": { + "target": "Package", + "version": "[5.0.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.102\\RuntimeIdentifierGraph.json" + } + } + }, + "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\EndianTools.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\EndianTools.csproj", + "projectName": "EndianTools", + "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\EndianTools.csproj", + "packagesPath": "C:\\Users\\Mack\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\Mack\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "Microsoft.NET.ILLink.Analyzers": { + "suppressParent": "All", + "target": "Package", + "version": "[7.0.100-1.23211.1, )", + "autoReferenced": true + }, + "Microsoft.NET.ILLink.Tasks": { + "suppressParent": "All", + "target": "Package", + "version": "[7.0.100-1.23211.1, )", + "autoReferenced": true + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.102\\RuntimeIdentifierGraph.json" + } + } + }, + "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj", + "projectName": "XI5", + "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj", + "packagesPath": "C:\\Users\\Mack\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\Mack\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": { + "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj": { + "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "Microsoft.NET.ILLink.Analyzers": { + "suppressParent": "All", + "target": "Package", + "version": "[7.0.100-1.23211.1, )", + "autoReferenced": true + }, + "Microsoft.NET.ILLink.Tasks": { + "suppressParent": "All", + "target": "Package", + "version": "[7.0.100-1.23211.1, )", + "autoReferenced": true + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.102\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.props b/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.props new file mode 100644 index 000000000..3274d1b22 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.props @@ -0,0 +1,23 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Mack\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + PackageReference + 6.8.1 + + + + + + + + + + + C:\Users\Mack\.nuget\packages\microsoft.net.illink.tasks\7.0.100-1.23211.1 + + \ No newline at end of file diff --git a/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.targets b/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.targets new file mode 100644 index 000000000..5d2332546 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.targets @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/BackendServices/CastleLibrary/XI5/obj/project.assets.json b/BackendServices/CastleLibrary/XI5/obj/project.assets.json new file mode 100644 index 000000000..362217035 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/project.assets.json @@ -0,0 +1,1230 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "Figgle/0.5.1": { + "type": "package", + "compile": { + "lib/netstandard2.0/Figgle.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Figgle.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Extensions.Configuration/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.Configuration.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.Configuration.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.Configuration.Abstractions/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.Configuration.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.Configuration.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.Configuration.Binder/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.Configuration.Binder.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.Configuration.Binder.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netstandard2.0/Microsoft.Extensions.Configuration.Binder.targets": {} + } + }, + "Microsoft.Extensions.DependencyInjection/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.DependencyInjection.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.DependencyInjection.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": { + "type": "package", + "compile": { + "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.Logging/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.Logging.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.Logging.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.Logging.Abstractions/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets": {} + } + }, + "Microsoft.Extensions.Logging.Configuration/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.Logging.Configuration.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.Logging.Configuration.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.Logging.Console/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Configuration": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.Logging.Console.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.Logging.Console.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.Options/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.Options.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.Options.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/Microsoft.Extensions.Options.targets": {} + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.Binder": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.Extensions.Primitives/8.0.0": { + "type": "package", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "compile": { + "lib/net6.0/Microsoft.Extensions.Primitives.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/Microsoft.Extensions.Primitives.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Microsoft.NET.ILLink.Analyzers/7.0.100-1.23211.1": { + "type": "package", + "build": { + "build/Microsoft.NET.ILLink.Analyzers.props": {} + } + }, + "Microsoft.NET.ILLink.Tasks/7.0.100-1.23211.1": { + "type": "package", + "build": { + "build/Microsoft.NET.ILLink.Tasks.props": {} + } + }, + "NReco.Logging.File/1.2.1": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" + }, + "compile": { + "lib/net6.0/NReco.Logging.File.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/NReco.Logging.File.dll": { + "related": ".xml" + } + } + }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { + "type": "package", + "compile": { + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/netcoreapp3.1/_._": {} + } + }, + "System.Security.Principal.Windows/5.0.0": { + "type": "package", + "compile": { + "ref/netcoreapp3.0/System.Security.Principal.Windows.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Security.Principal.Windows.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": { + "assetType": "runtime", + "rid": "unix" + }, + "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Text.Encodings.Web/8.0.0": { + "type": "package", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "compile": { + "lib/net6.0/System.Text.Encodings.Web.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Text.Encodings.Web.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.dll": { + "assetType": "runtime", + "rid": "browser" + } + } + }, + "System.Text.Json/8.0.0": { + "type": "package", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "8.0.0" + }, + "compile": { + "lib/net6.0/System.Text.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/System.Text.Json.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/System.Text.Json.targets": {} + } + }, + "CastleLibrary/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v6.0", + "dependencies": { + "CustomLogger": "1.0.0", + "EndianTools": "1.0.0" + }, + "compile": { + "bin/placeholder/CastleLibrary.dll": {} + }, + "runtime": { + "bin/placeholder/CastleLibrary.dll": {} + } + }, + "CustomLogger/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v6.0", + "dependencies": { + "Figgle": "0.5.1", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Console": "8.0.0", + "NReco.Logging.File": "1.2.1", + "System.Security.Principal.Windows": "5.0.0" + }, + "compile": { + "bin/placeholder/CustomLogger.dll": {} + }, + "runtime": { + "bin/placeholder/CustomLogger.dll": {} + } + }, + "EndianTools/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v6.0", + "compile": { + "bin/placeholder/EndianTools.dll": {} + }, + "runtime": { + "bin/placeholder/EndianTools.dll": {} + } + } + } + }, + "libraries": { + "Figgle/0.5.1": { + "sha512": "F21k9oOGRgSb+1dCX0kFDYRBbShSMFvL49xjNmF/dsJwiN5M7zBaSWsYKpi/KZWXVIIxNzTbNTq9ZciucaHYMQ==", + "type": "package", + "path": "figgle/0.5.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "figgle.0.5.1.nupkg.sha512", + "figgle.nuspec", + "lib/netstandard2.0/Figgle.dll", + "lib/netstandard2.0/Figgle.xml", + "logo-square-256px.png" + ] + }, + "Microsoft.Extensions.Configuration/8.0.0": { + "sha512": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", + "type": "package", + "path": "microsoft.extensions.configuration/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Configuration.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Configuration.targets", + "lib/net462/Microsoft.Extensions.Configuration.dll", + "lib/net462/Microsoft.Extensions.Configuration.xml", + "lib/net6.0/Microsoft.Extensions.Configuration.dll", + "lib/net6.0/Microsoft.Extensions.Configuration.xml", + "lib/net7.0/Microsoft.Extensions.Configuration.dll", + "lib/net7.0/Microsoft.Extensions.Configuration.xml", + "lib/net8.0/Microsoft.Extensions.Configuration.dll", + "lib/net8.0/Microsoft.Extensions.Configuration.xml", + "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll", + "lib/netstandard2.0/Microsoft.Extensions.Configuration.xml", + "microsoft.extensions.configuration.8.0.0.nupkg.sha512", + "microsoft.extensions.configuration.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Configuration.Abstractions/8.0.0": { + "sha512": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "type": "package", + "path": "microsoft.extensions.configuration.abstractions/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Configuration.Abstractions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Configuration.Abstractions.targets", + "lib/net462/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/net462/Microsoft.Extensions.Configuration.Abstractions.xml", + "lib/net6.0/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/net6.0/Microsoft.Extensions.Configuration.Abstractions.xml", + "lib/net7.0/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/net7.0/Microsoft.Extensions.Configuration.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml", + "microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512", + "microsoft.extensions.configuration.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Configuration.Binder/8.0.0": { + "sha512": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", + "type": "package", + "path": "microsoft.extensions.configuration.binder/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/cs/Microsoft.Extensions.Configuration.Binder.SourceGeneration.dll", + "analyzers/dotnet/cs/cs/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/de/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/es/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/fr/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/it/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/ja/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/ko/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/pl/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/pt-BR/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/ru/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/tr/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/zh-Hans/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "analyzers/dotnet/cs/zh-Hant/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", + "buildTransitive/netstandard2.0/Microsoft.Extensions.Configuration.Binder.targets", + "lib/net462/Microsoft.Extensions.Configuration.Binder.dll", + "lib/net462/Microsoft.Extensions.Configuration.Binder.xml", + "lib/net6.0/Microsoft.Extensions.Configuration.Binder.dll", + "lib/net6.0/Microsoft.Extensions.Configuration.Binder.xml", + "lib/net7.0/Microsoft.Extensions.Configuration.Binder.dll", + "lib/net7.0/Microsoft.Extensions.Configuration.Binder.xml", + "lib/net8.0/Microsoft.Extensions.Configuration.Binder.dll", + "lib/net8.0/Microsoft.Extensions.Configuration.Binder.xml", + "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll", + "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.xml", + "microsoft.extensions.configuration.binder.8.0.0.nupkg.sha512", + "microsoft.extensions.configuration.binder.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.DependencyInjection/8.0.0": { + "sha512": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "type": "package", + "path": "microsoft.extensions.dependencyinjection/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.targets", + "lib/net462/Microsoft.Extensions.DependencyInjection.dll", + "lib/net462/Microsoft.Extensions.DependencyInjection.xml", + "lib/net6.0/Microsoft.Extensions.DependencyInjection.dll", + "lib/net6.0/Microsoft.Extensions.DependencyInjection.xml", + "lib/net7.0/Microsoft.Extensions.DependencyInjection.dll", + "lib/net7.0/Microsoft.Extensions.DependencyInjection.xml", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.xml", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.dll", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.xml", + "microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512", + "microsoft.extensions.dependencyinjection.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": { + "sha512": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", + "type": "package", + "path": "microsoft.extensions.dependencyinjection.abstractions/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", + "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", + "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", + "microsoft.extensions.dependencyinjection.abstractions.8.0.0.nupkg.sha512", + "microsoft.extensions.dependencyinjection.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Logging/8.0.0": { + "sha512": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", + "type": "package", + "path": "microsoft.extensions.logging/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Logging.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.targets", + "lib/net462/Microsoft.Extensions.Logging.dll", + "lib/net462/Microsoft.Extensions.Logging.xml", + "lib/net6.0/Microsoft.Extensions.Logging.dll", + "lib/net6.0/Microsoft.Extensions.Logging.xml", + "lib/net7.0/Microsoft.Extensions.Logging.dll", + "lib/net7.0/Microsoft.Extensions.Logging.xml", + "lib/net8.0/Microsoft.Extensions.Logging.dll", + "lib/net8.0/Microsoft.Extensions.Logging.xml", + "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", + "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", + "lib/netstandard2.1/Microsoft.Extensions.Logging.dll", + "lib/netstandard2.1/Microsoft.Extensions.Logging.xml", + "microsoft.extensions.logging.8.0.0.nupkg.sha512", + "microsoft.extensions.logging.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Logging.Abstractions/8.0.0": { + "sha512": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "type": "package", + "path": "microsoft.extensions.logging.abstractions/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll", + "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", + "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", + "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", + "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net7.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net7.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", + "microsoft.extensions.logging.abstractions.8.0.0.nupkg.sha512", + "microsoft.extensions.logging.abstractions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Logging.Configuration/8.0.0": { + "sha512": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", + "type": "package", + "path": "microsoft.extensions.logging.configuration/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Logging.Configuration.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Configuration.targets", + "lib/net462/Microsoft.Extensions.Logging.Configuration.dll", + "lib/net462/Microsoft.Extensions.Logging.Configuration.xml", + "lib/net6.0/Microsoft.Extensions.Logging.Configuration.dll", + "lib/net6.0/Microsoft.Extensions.Logging.Configuration.xml", + "lib/net7.0/Microsoft.Extensions.Logging.Configuration.dll", + "lib/net7.0/Microsoft.Extensions.Logging.Configuration.xml", + "lib/net8.0/Microsoft.Extensions.Logging.Configuration.dll", + "lib/net8.0/Microsoft.Extensions.Logging.Configuration.xml", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Configuration.dll", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Configuration.xml", + "microsoft.extensions.logging.configuration.8.0.0.nupkg.sha512", + "microsoft.extensions.logging.configuration.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Logging.Console/8.0.0": { + "sha512": "e+48o7DztoYog+PY430lPxrM4mm3PbA6qucvQtUDDwVo4MO+ejMw7YGc/o2rnxbxj4isPxdfKFzTxvXMwAz83A==", + "type": "package", + "path": "microsoft.extensions.logging.console/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Logging.Console.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Console.targets", + "lib/net462/Microsoft.Extensions.Logging.Console.dll", + "lib/net462/Microsoft.Extensions.Logging.Console.xml", + "lib/net6.0/Microsoft.Extensions.Logging.Console.dll", + "lib/net6.0/Microsoft.Extensions.Logging.Console.xml", + "lib/net7.0/Microsoft.Extensions.Logging.Console.dll", + "lib/net7.0/Microsoft.Extensions.Logging.Console.xml", + "lib/net8.0/Microsoft.Extensions.Logging.Console.dll", + "lib/net8.0/Microsoft.Extensions.Logging.Console.xml", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Console.dll", + "lib/netstandard2.0/Microsoft.Extensions.Logging.Console.xml", + "microsoft.extensions.logging.console.8.0.0.nupkg.sha512", + "microsoft.extensions.logging.console.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Options/8.0.0": { + "sha512": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "type": "package", + "path": "microsoft.extensions.options/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Options.SourceGeneration.dll", + "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Options.SourceGeneration.resources.dll", + "buildTransitive/net461/Microsoft.Extensions.Options.targets", + "buildTransitive/net462/Microsoft.Extensions.Options.targets", + "buildTransitive/net6.0/Microsoft.Extensions.Options.targets", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.targets", + "buildTransitive/netstandard2.0/Microsoft.Extensions.Options.targets", + "lib/net462/Microsoft.Extensions.Options.dll", + "lib/net462/Microsoft.Extensions.Options.xml", + "lib/net6.0/Microsoft.Extensions.Options.dll", + "lib/net6.0/Microsoft.Extensions.Options.xml", + "lib/net7.0/Microsoft.Extensions.Options.dll", + "lib/net7.0/Microsoft.Extensions.Options.xml", + "lib/net8.0/Microsoft.Extensions.Options.dll", + "lib/net8.0/Microsoft.Extensions.Options.xml", + "lib/netstandard2.0/Microsoft.Extensions.Options.dll", + "lib/netstandard2.0/Microsoft.Extensions.Options.xml", + "lib/netstandard2.1/Microsoft.Extensions.Options.dll", + "lib/netstandard2.1/Microsoft.Extensions.Options.xml", + "microsoft.extensions.options.8.0.0.nupkg.sha512", + "microsoft.extensions.options.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": { + "sha512": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", + "type": "package", + "path": "microsoft.extensions.options.configurationextensions/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Options.ConfigurationExtensions.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.ConfigurationExtensions.targets", + "lib/net462/Microsoft.Extensions.Options.ConfigurationExtensions.dll", + "lib/net462/Microsoft.Extensions.Options.ConfigurationExtensions.xml", + "lib/net6.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll", + "lib/net6.0/Microsoft.Extensions.Options.ConfigurationExtensions.xml", + "lib/net7.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll", + "lib/net7.0/Microsoft.Extensions.Options.ConfigurationExtensions.xml", + "lib/net8.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll", + "lib/net8.0/Microsoft.Extensions.Options.ConfigurationExtensions.xml", + "lib/netstandard2.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll", + "lib/netstandard2.0/Microsoft.Extensions.Options.ConfigurationExtensions.xml", + "microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512", + "microsoft.extensions.options.configurationextensions.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.Extensions.Primitives/8.0.0": { + "sha512": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", + "type": "package", + "path": "microsoft.extensions.primitives/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/Microsoft.Extensions.Primitives.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Primitives.targets", + "lib/net462/Microsoft.Extensions.Primitives.dll", + "lib/net462/Microsoft.Extensions.Primitives.xml", + "lib/net6.0/Microsoft.Extensions.Primitives.dll", + "lib/net6.0/Microsoft.Extensions.Primitives.xml", + "lib/net7.0/Microsoft.Extensions.Primitives.dll", + "lib/net7.0/Microsoft.Extensions.Primitives.xml", + "lib/net8.0/Microsoft.Extensions.Primitives.dll", + "lib/net8.0/Microsoft.Extensions.Primitives.xml", + "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", + "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", + "microsoft.extensions.primitives.8.0.0.nupkg.sha512", + "microsoft.extensions.primitives.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.NET.ILLink.Analyzers/7.0.100-1.23211.1": { + "sha512": "0GvbEgDGcUQA9KuWcQU1WwYHXt1tBzNr1Nls/M57rM7NA/AndFwCaCEoJpJkmxRY7xLlPDBnmGp8h5+FNqUngg==", + "type": "package", + "path": "microsoft.net.illink.analyzers/7.0.100-1.23211.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "analyzers/dotnet/cs/ILLink.CodeFixProvider.dll", + "analyzers/dotnet/cs/ILLink.RoslynAnalyzer.dll", + "build/Microsoft.NET.ILLink.Analyzers.props", + "microsoft.net.illink.analyzers.7.0.100-1.23211.1.nupkg.sha512", + "microsoft.net.illink.analyzers.nuspec" + ] + }, + "Microsoft.NET.ILLink.Tasks/7.0.100-1.23211.1": { + "sha512": "tvG8XZYLjT0o3WicCyKBZysVWo1jC9HdCFmNRmddx3WbAz0UCsd0qKZqpiEo99VLA8Re+FzWK51OcRldQPbt2Q==", + "type": "package", + "path": "microsoft.net.illink.tasks/7.0.100-1.23211.1", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "Sdk/Sdk.props", + "build/6.0_suppressions.xml", + "build/Microsoft.NET.ILLink.Tasks.props", + "build/Microsoft.NET.ILLink.targets", + "microsoft.net.illink.tasks.7.0.100-1.23211.1.nupkg.sha512", + "microsoft.net.illink.tasks.nuspec", + "tools/net472/ILLink.Tasks.dll", + "tools/net472/Mono.Cecil.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net7.0/ILLink.Tasks.deps.json", + "tools/net7.0/ILLink.Tasks.dll", + "tools/net7.0/Mono.Cecil.Pdb.dll", + "tools/net7.0/Mono.Cecil.dll", + "tools/net7.0/illink.deps.json", + "tools/net7.0/illink.dll", + "tools/net7.0/illink.runtimeconfig.json" + ] + }, + "NReco.Logging.File/1.2.1": { + "sha512": "DuGBOw5uIvrT/iH0pTBJaUxn6Y0kGGj83HMMwPgt+3B6HGUz3l+NjFgP6LgMdNLU72G4C8E6e7lB0qIoLz+/RQ==", + "type": "package", + "path": "nreco.logging.file/1.2.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net6.0/NReco.Logging.File.dll", + "lib/net6.0/NReco.Logging.File.xml", + "lib/net8.0/NReco.Logging.File.dll", + "lib/net8.0/NReco.Logging.File.xml", + "lib/netstandard2.0/NReco.Logging.File.dll", + "lib/netstandard2.0/NReco.Logging.File.xml", + "nreco.logging.file.1.2.1.nupkg.sha512", + "nreco.logging.file.nuspec" + ] + }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { + "sha512": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", + "type": "package", + "path": "system.runtime.compilerservices.unsafe/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.Runtime.CompilerServices.Unsafe.dll", + "lib/net461/System.Runtime.CompilerServices.Unsafe.xml", + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll", + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.xml", + "lib/netcoreapp3.1/System.Runtime.CompilerServices.Unsafe.dll", + "lib/netcoreapp3.1/System.Runtime.CompilerServices.Unsafe.xml", + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", + "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", + "system.runtime.compilerservices.unsafe.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Security.Principal.Windows/5.0.0": { + "sha512": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==", + "type": "package", + "path": "system.security.principal.windows/5.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net46/System.Security.Principal.Windows.dll", + "lib/net461/System.Security.Principal.Windows.dll", + "lib/net461/System.Security.Principal.Windows.xml", + "lib/netstandard1.3/System.Security.Principal.Windows.dll", + "lib/netstandard2.0/System.Security.Principal.Windows.dll", + "lib/netstandard2.0/System.Security.Principal.Windows.xml", + "lib/uap10.0.16299/_._", + "ref/net46/System.Security.Principal.Windows.dll", + "ref/net461/System.Security.Principal.Windows.dll", + "ref/net461/System.Security.Principal.Windows.xml", + "ref/netcoreapp3.0/System.Security.Principal.Windows.dll", + "ref/netcoreapp3.0/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/System.Security.Principal.Windows.dll", + "ref/netstandard1.3/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", + "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", + "ref/netstandard2.0/System.Security.Principal.Windows.dll", + "ref/netstandard2.0/System.Security.Principal.Windows.xml", + "ref/uap10.0.16299/_._", + "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.dll", + "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.xml", + "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll", + "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.xml", + "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", + "runtimes/win/lib/net461/System.Security.Principal.Windows.dll", + "runtimes/win/lib/net461/System.Security.Principal.Windows.xml", + "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.dll", + "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.xml", + "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll", + "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.xml", + "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll", + "runtimes/win/lib/uap10.0.16299/_._", + "system.security.principal.windows.5.0.0.nupkg.sha512", + "system.security.principal.windows.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Text.Encodings.Web/8.0.0": { + "sha512": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", + "type": "package", + "path": "system.text.encodings.web/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Text.Encodings.Web.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Text.Encodings.Web.targets", + "lib/net462/System.Text.Encodings.Web.dll", + "lib/net462/System.Text.Encodings.Web.xml", + "lib/net6.0/System.Text.Encodings.Web.dll", + "lib/net6.0/System.Text.Encodings.Web.xml", + "lib/net7.0/System.Text.Encodings.Web.dll", + "lib/net7.0/System.Text.Encodings.Web.xml", + "lib/net8.0/System.Text.Encodings.Web.dll", + "lib/net8.0/System.Text.Encodings.Web.xml", + "lib/netstandard2.0/System.Text.Encodings.Web.dll", + "lib/netstandard2.0/System.Text.Encodings.Web.xml", + "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.dll", + "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.xml", + "runtimes/browser/lib/net7.0/System.Text.Encodings.Web.dll", + "runtimes/browser/lib/net7.0/System.Text.Encodings.Web.xml", + "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll", + "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.xml", + "system.text.encodings.web.8.0.0.nupkg.sha512", + "system.text.encodings.web.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Text.Json/8.0.0": { + "sha512": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", + "type": "package", + "path": "system.text.json/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/roslyn3.11/cs/System.Text.Json.SourceGeneration.dll", + "analyzers/dotnet/roslyn3.11/cs/cs/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/de/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/es/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/fr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/it/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ja/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ko/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pl/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ru/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/tr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/System.Text.Json.SourceGeneration.dll", + "analyzers/dotnet/roslyn4.0/cs/cs/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/de/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/es/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/fr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/it/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ja/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ko/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pl/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ru/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/tr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/System.Text.Json.SourceGeneration.dll", + "analyzers/dotnet/roslyn4.4/cs/cs/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/de/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/es/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/fr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/it/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ja/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ko/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pl/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/ru/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/tr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.4/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", + "buildTransitive/net461/System.Text.Json.targets", + "buildTransitive/net462/System.Text.Json.targets", + "buildTransitive/net6.0/System.Text.Json.targets", + "buildTransitive/netcoreapp2.0/System.Text.Json.targets", + "buildTransitive/netstandard2.0/System.Text.Json.targets", + "lib/net462/System.Text.Json.dll", + "lib/net462/System.Text.Json.xml", + "lib/net6.0/System.Text.Json.dll", + "lib/net6.0/System.Text.Json.xml", + "lib/net7.0/System.Text.Json.dll", + "lib/net7.0/System.Text.Json.xml", + "lib/net8.0/System.Text.Json.dll", + "lib/net8.0/System.Text.Json.xml", + "lib/netstandard2.0/System.Text.Json.dll", + "lib/netstandard2.0/System.Text.Json.xml", + "system.text.json.8.0.0.nupkg.sha512", + "system.text.json.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "CastleLibrary/1.0.0": { + "type": "project", + "path": "../CastleLibrary/CastleLibrary.csproj", + "msbuildProject": "../CastleLibrary/CastleLibrary.csproj" + }, + "CustomLogger/1.0.0": { + "type": "project", + "path": "../CustomLogger/CustomLogger.csproj", + "msbuildProject": "../CustomLogger/CustomLogger.csproj" + }, + "EndianTools/1.0.0": { + "type": "project", + "path": "../EndianTools/EndianTools.csproj", + "msbuildProject": "../EndianTools/EndianTools.csproj" + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "CastleLibrary >= 1.0.0", + "Microsoft.NET.ILLink.Analyzers >= 7.0.100-1.23211.1", + "Microsoft.NET.ILLink.Tasks >= 7.0.100-1.23211.1" + ] + }, + "packageFolders": { + "C:\\Users\\Mack\\.nuget\\packages\\": {}, + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj", + "projectName": "XI5", + "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj", + "packagesPath": "C:\\Users\\Mack\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\Mack\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": { + "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj": { + "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "Microsoft.NET.ILLink.Analyzers": { + "suppressParent": "All", + "target": "Package", + "version": "[7.0.100-1.23211.1, )", + "autoReferenced": true + }, + "Microsoft.NET.ILLink.Tasks": { + "suppressParent": "All", + "target": "Package", + "version": "[7.0.100-1.23211.1, )", + "autoReferenced": true + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.102\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/BackendServices/CastleLibrary/XI5/obj/project.nuget.cache b/BackendServices/CastleLibrary/XI5/obj/project.nuget.cache new file mode 100644 index 000000000..c9a70c8d0 --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/obj/project.nuget.cache @@ -0,0 +1,29 @@ +{ + "version": 2, + "dgSpecHash": "49k8UCaSTGH6VC6GKMPkXtbJto18oMnarnPxyRYOs3Kyq4wKaWy+4wVwyeU/Iw9qbyNQ/HrJr5zn6NQQAdhIWQ==", + "success": true, + "projectFilePath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Mack\\.nuget\\packages\\figgle\\0.5.1\\figgle.0.5.1.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.configuration\\8.0.0\\microsoft.extensions.configuration.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\8.0.0\\microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.configuration.binder\\8.0.0\\microsoft.extensions.configuration.binder.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\8.0.0\\microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\8.0.0\\microsoft.extensions.dependencyinjection.abstractions.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.logging\\8.0.0\\microsoft.extensions.logging.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\8.0.0\\microsoft.extensions.logging.abstractions.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.logging.configuration\\8.0.0\\microsoft.extensions.logging.configuration.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.logging.console\\8.0.0\\microsoft.extensions.logging.console.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.options\\8.0.0\\microsoft.extensions.options.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.options.configurationextensions\\8.0.0\\microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.primitives\\8.0.0\\microsoft.extensions.primitives.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.net.illink.analyzers\\7.0.100-1.23211.1\\microsoft.net.illink.analyzers.7.0.100-1.23211.1.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\microsoft.net.illink.tasks\\7.0.100-1.23211.1\\microsoft.net.illink.tasks.7.0.100-1.23211.1.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\nreco.logging.file\\1.2.1\\nreco.logging.file.1.2.1.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\6.0.0\\system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\system.security.principal.windows\\5.0.0\\system.security.principal.windows.5.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\system.text.encodings.web\\8.0.0\\system.text.encodings.web.8.0.0.nupkg.sha512", + "C:\\Users\\Mack\\.nuget\\packages\\system.text.json\\8.0.0\\system.text.json.8.0.0.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file From 9e48d415d81a433d4e26d091fae5bb7f7d7b574b Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Mon, 26 May 2025 18:22:18 -0400 Subject: [PATCH 02/14] Add files via upload --- Servers/SSFWServer/SSFWLogin.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Servers/SSFWServer/SSFWLogin.cs b/Servers/SSFWServer/SSFWLogin.cs index e30010d0e..453fc4585 100644 --- a/Servers/SSFWServer/SSFWLogin.cs +++ b/Servers/SSFWServer/SSFWLogin.cs @@ -166,7 +166,7 @@ public SSFWLogin(string XHomeClientVersion, string generalsecret, string homeCli extractedData[i] = 0x48; } - XI5Ticket ticket = new XI5Ticket(ticketBuffer); + XI5Ticket ticket = XI5Ticket.ReadFromBytes(ticketBuffer); if (ByteUtils.FindBytePattern(ticketBuffer, new byte[] { 0x52, 0x50, 0x43, 0x4E }, 184) != -1) { @@ -233,7 +233,7 @@ public SSFWLogin(string XHomeClientVersion, string generalsecret, string homeCli if (!string.IsNullOrEmpty(UserNames.Item1) && !SSFWServerConfiguration.SSFWCrossSave) // RPCN confirmed. { - SSFWUserSessionManager.RegisterUser(UserNames.Item1, SessionIDs.Item1!, ResultStrings.Item1!, ticket.OnlineId.Length); + SSFWUserSessionManager.RegisterUser(UserNames.Item1, SessionIDs.Item1!, ResultStrings.Item1!, ticket.Username.Length); if (SSFWAccountManagement.AccountExists(UserNames.Item2, SessionIDs.Item2)) SSFWAccountManagement.CopyAccountProfile(UserNames.Item2, UserNames.Item1, SessionIDs.Item2, SessionIDs.Item1!, key); @@ -244,7 +244,7 @@ public SSFWLogin(string XHomeClientVersion, string generalsecret, string homeCli { IsRPCN = false; - SSFWUserSessionManager.RegisterUser(UserNames.Item2, SessionIDs.Item2, ResultStrings.Item2, ticket.OnlineId.Length); + SSFWUserSessionManager.RegisterUser(UserNames.Item2, SessionIDs.Item2, ResultStrings.Item2, ticket.Username.Length); } int logoncount = SSFWAccountManagement.ReadOrMigrateAccount(extractedData, IsRPCN ? UserNames.Item1 : UserNames.Item2, IsRPCN ? SessionIDs.Item1 : SessionIDs.Item2, key); From 13230cef5f80166524fcffc76ae98e6f4f177f2e Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Mon, 26 May 2025 18:23:12 -0400 Subject: [PATCH 03/14] Add files via upload --- Servers/Horizon/SERVER/Medius/MAS.cs | 6659 +++++++++++++------------- 1 file changed, 3316 insertions(+), 3343 deletions(-) diff --git a/Servers/Horizon/SERVER/Medius/MAS.cs b/Servers/Horizon/SERVER/Medius/MAS.cs index 559e289f9..1a7a80986 100644 --- a/Servers/Horizon/SERVER/Medius/MAS.cs +++ b/Servers/Horizon/SERVER/Medius/MAS.cs @@ -1,3343 +1,3316 @@ -using CustomLogger; -using DotNetty.Transport.Channels; -using Horizon.RT.Common; -using Horizon.RT.Cryptography; -using Horizon.RT.Cryptography.RSA; -using Horizon.RT.Models; -using Horizon.LIBRARY.Common; -using Horizon.SERVER.Config; -using Horizon.SERVER.PluginArgs; -using Horizon.PluginManager; -using System.Net; -using Horizon.LIBRARY.Database.Models; -using Newtonsoft.Json.Linq; -using System.Globalization; -using System.Text; -using Horizon.HTTPSERVICE; -using System.Buffers; -using NetworkLibrary.Extension; -using XI5; -using EndianTools; -using Horizon.MUM.Models; -using Horizon.SERVER.Extension.PlayStationHome; - -namespace Horizon.SERVER.Medius -{ - public class MAS : BaseMediusComponent - { - public override int TCPPort => MediusClass.Settings.MASPort; - public override int UDPPort => 00000; - - public static ServerSettings Settings = new(); - - public MAS() - { - - } - - public static void ReserveClient(ClientObject client) - { - MediusClass.Manager.AddClient(client); - } - - protected override async Task ProcessMessage(BaseScertMessage message, IChannel clientChannel, ChannelData data) - { - // Get ScertClient data - var scertClient = clientChannel.GetAttribute(LIBRARY.Pipeline.Constants.SCERT_CLIENT).Get(); - var enableEncryption = MediusClass.GetAppSettingsOrDefault(data.ApplicationId).EnableEncryption; - if (scertClient.CipherService != null) - scertClient.CipherService.EnableEncryption = enableEncryption; - - switch (message) - { - case RT_MSG_CLIENT_HELLO clientHello: - { - // send hello - Queue(new RT_MSG_SERVER_HELLO() { RsaPublicKey = enableEncryption ? MediusClass.Settings.DefaultKey.N : Org.BouncyCastle.Math.BigInteger.Zero }, clientChannel); - break; - } - case RT_MSG_CLIENT_CRYPTKEY_PUBLIC clientCryptKeyPublic: - { - if (clientCryptKeyPublic.PublicKey != null) - { - // generate new client session key - scertClient.CipherService?.GenerateCipher(CipherContext.RSA_AUTH, clientCryptKeyPublic.PublicKey.Reverse().ToArray()); - scertClient.CipherService?.GenerateCipher(CipherContext.RC_CLIENT_SESSION); - - Queue(new RT_MSG_SERVER_CRYPTKEY_PEER() { SessionKey = scertClient.CipherService?.GetPublicKey(CipherContext.RC_CLIENT_SESSION) }, clientChannel); - } - break; - } - case RT_MSG_CLIENT_CONNECT_TCP clientConnectTcp: - { - #region Check if AppId from Client matches Server - if (!MediusClass.Manager.IsAppIdSupported(clientConnectTcp.AppId)) - { - LoggerAccessor.LogError($"Client {clientChannel.RemoteAddress} attempting to authenticate with incompatible app id {clientConnectTcp.AppId}"); - await clientChannel.CloseAsync(); - return; - } - #endregion - - List pre108ServerComplete = new() { 10114, 10130, 10164, 10190, 10124, 10284, 10330, 10334, 10414, 10421, 10442, 10538, 10540, 10550, 10582, 10584, 10680, 10681, 10683, 10684, 10724 }; - - ///

- /// Some do not post-108 so we have to account for those too! - /// tmheadon 10694 does not for initial - /// - List post108ServerComplete = new() { 10694 }; - - data.ApplicationId = clientConnectTcp.AppId; - scertClient.ApplicationID = clientConnectTcp.AppId; - - Channel? targetChannel = MediusClass.Manager.GetChannelByChannelId(clientConnectTcp.TargetWorldId, data.ApplicationId); - - if (targetChannel == null) - { - Channel DefaultChannel = MediusClass.Manager.GetOrCreateDefaultLobbyChannel(data.ApplicationId, scertClient.MediusVersion ?? 0); - - if (DefaultChannel.Id == clientConnectTcp.TargetWorldId) - targetChannel = DefaultChannel; - - if (targetChannel == null) - { - LoggerAccessor.LogError($"[MAS] - Client: {clientConnectTcp.AccessToken} tried to join, but targetted WorldId:{clientConnectTcp.TargetWorldId} doesn't exist!"); - await clientChannel.CloseAsync(); - break; - } - } - - // If booth are null, it means MAS client wants a new object. - if (!string.IsNullOrEmpty(clientConnectTcp.AccessToken) && !string.IsNullOrEmpty(clientConnectTcp.SessionKey)) - { - data.ClientObject = MediusClass.Manager.GetClientByAccessToken(clientConnectTcp.AccessToken, clientConnectTcp.AppId); - if (data.ClientObject == null) - data.ClientObject = MediusClass.Manager.GetClientBySessionKey(clientConnectTcp.SessionKey, clientConnectTcp.AppId); - - if (data.ClientObject != null) - LoggerAccessor.LogInfo($"[MAS] - Client Connected {clientChannel.RemoteAddress}!"); - else - { - data.Ignore = true; - LoggerAccessor.LogError($"[MAS] - ClientObject could not be granted for {clientChannel.RemoteAddress}: {clientConnectTcp}"); - break; - } - - data.ClientObject.MediusVersion = scertClient.MediusVersion ?? 0; - data.ClientObject.ApplicationId = clientConnectTcp.AppId; - data.ClientObject.OnConnected(); - } - else - { - LoggerAccessor.LogInfo($"[MAS] - Client Connected {clientChannel.RemoteAddress} with new ClientObject!"); - - data.ClientObject = new(scertClient.MediusVersion ?? 0) - { - ApplicationId = clientConnectTcp.AppId - }; - data.ClientObject.OnConnected(); - - ReserveClient(data.ClientObject); // ONLY RESERVE CLIENTS HERE! - } - - await data.ClientObject.JoinChannel(targetChannel); - - #region if PS3 - if (scertClient.IsPS3Client) - { - List ConnectAcceptTCPGames = new() { 20623, 20624, 21564, 21574, 21584, 21594, 22274, 22284, 22294, 22304, 20040, 20041, 20042, 20043, 20044 }; - - //CAC & Warhawk - if (ConnectAcceptTCPGames.Contains(scertClient.ApplicationID)) - { - Queue(new RT_MSG_SERVER_CONNECT_ACCEPT_TCP() - { - PlayerId = 0, - ScertId = GenerateNewScertClientId(), - PlayerCount = 0x0001, - IP = (clientChannel.RemoteAddress as IPEndPoint)?.Address - }, clientChannel); - } - else - Queue(new RT_MSG_SERVER_CONNECT_REQUIRE(), clientChannel); - } - #endregion - else if (scertClient.MediusVersion > 108 && scertClient.ApplicationID != 11484) - Queue(new RT_MSG_SERVER_CONNECT_REQUIRE(), clientChannel); - else - { - //Older Medius titles do NOT use CRYPTKEY_GAME, newer ones have this. - if (scertClient.CipherService != null && scertClient.CipherService.HasKey(CipherContext.RC_CLIENT_SESSION) && scertClient.MediusVersion >= 109) - Queue(new RT_MSG_SERVER_CRYPTKEY_GAME() { GameKey = scertClient.CipherService.GetPublicKey(CipherContext.RC_CLIENT_SESSION) }, clientChannel); - Queue(new RT_MSG_SERVER_CONNECT_ACCEPT_TCP() - { - PlayerId = 0, - ScertId = GenerateNewScertClientId(), - PlayerCount = 0x0001, - IP = (clientChannel.RemoteAddress as IPEndPoint)?.Address - }, clientChannel); - - if (pre108ServerComplete.Contains(data.ApplicationId) || post108ServerComplete.Contains(data.ApplicationId)) - Queue(new RT_MSG_SERVER_CONNECT_COMPLETE() { ClientCountAtConnect = 0x0001 }, clientChannel); - } - - if (MediusClass.Settings.HttpsSVOCheckPatcher) - { - switch (data.ApplicationId) - { - case 20371: - CheatQuery(0x10085d80, 6, clientChannel); // PS Home 1.50 Beta - break; - case 20384: - CheatQuery(0x008625b0, 6, clientChannel); // SingStar Vol3 Retail - CheatQuery(0x00b96850, 6, clientChannel); // SingStar Starter Pack - break; - case 21354: - CheatQuery(0x008625E0, 6, clientChannel); // SingStar Hits v1.00 - break; - case 21574: - CheatQuery(0x0070c068, 6, clientChannel); // Warhawk EU v1.50 - break; - case 21564: - CheatQuery(0x0070BFF8, 6, clientChannel); // Warhawk US v1.50 - break; - case 22924: - CheatQuery(0x00df0008, 6, clientChannel); // Starhawk v1.4 Retail - break; - } - } - - if (data.ApplicationId == 20371 || data.ApplicationId == 20374) - CheatQuery(0x00010000, 512000, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_SHA1_HASH, unchecked((int)0xDEADBEEF)); - - PokePatch(clientChannel, data); - - break; - } - - case RT_MSG_SERVER_CHEAT_QUERY clientCheatQuery: - { - byte[]? QueryData = clientCheatQuery.Data; - - if (QueryData != null) - { - LoggerAccessor.LogDebug($"[MAS] - QUERY CHECK - Client:{data.ClientObject?.IP} Has Data:{QueryData.ToHexString()} in offset: {clientCheatQuery.StartAddress}"); - - if (MediusClass.Settings.HttpsSVOCheckPatcher && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 6 - && QueryData.EqualsTo(new byte[] { 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A })) - PatchHttpsSVOCheck(clientCheatQuery.StartAddress + 4, clientChannel); - - if (data.ApplicationId == 20371 || data.ApplicationId == 20374) - { - if (data.ClientObject?.ClientHomeData != null) - { - switch (data.ClientObject.ClientHomeData.Type) - { - case "HDK With Offline": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.86.09": - switch (clientCheatQuery.StartAddress) - { - case 0x005478dc: - // 4096 character command line limit. - if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x83, 0x00, 0xfe })) - { - PokeAddress(0x005478dc, new byte[] { 0x2f, 0x83, 0x0f, 0xff }, clientChannel); - PokeAddress(0x00548378, new byte[] { 0x2b, 0x83, 0x0f, 0xff }, clientChannel); - } - break; - case 0x1054e5c0: - // Sets WorldCorePointer. - if (clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4) - data.ClientObject.SetWorldCorePointer(BitConverter.ToUInt32(BitConverter.IsLittleEndian ? EndianUtils.ReverseArray(QueryData) : QueryData)); - break; - case 0x0016cc6c: - // Patches out the forceInvite command. - if (MediusClass.Settings.PlaystationHomeForceInviteExploitPatch && MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x80, 0x00, 0x00 })) - PokeAddress(0x0016cc6c, new byte[] { 0x2f, 0x80, 0x00, 0x02 }, clientChannel); - break; - } - break; - default: - break; - } - break; - case "HDK Online Only": - switch (data.ClientObject.ClientHomeData.Version) - { - default: - break; - } - break; - case "HDK Online Only (Dbg Symbols)": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.82.09": - switch (clientCheatQuery.StartAddress) - { - case 0x00531370: - // 4096 character command line limit. - if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x83, 0x00, 0xfe })) - { - PokeAddress(0x00531370, new byte[] { 0x2f, 0x83, 0x0f, 0xff }, clientChannel); - PokeAddress(0x00531e08, new byte[] { 0x2b, 0x83, 0x0f, 0xff }, clientChannel); - } - break; - case 0x1053e160: - // Sets WorldCorePointer. - if (clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4) - data.ClientObject.SetWorldCorePointer(BitConverter.ToUInt32(BitConverter.IsLittleEndian ? EndianUtils.ReverseArray(QueryData) : QueryData)); - break; - case 0x0016b4d0: - // Patches out the forceInvite command. - if (MediusClass.Settings.PlaystationHomeForceInviteExploitPatch && MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x80, 0x00, 0x00 })) - PokeAddress(0x0016b4d0, new byte[] { 0x2f, 0x80, 0x00, 0x02 }, clientChannel); - break; - } - break; - default: - break; - } - break; - case "Online Debug": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.83.12": - switch (clientCheatQuery.StartAddress) - { - case 0x00548bc0: - // 4096 character command line limit. - if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x83, 0x00, 0xfe })) - { - PokeAddress(0x00548bc0, new byte[] { 0x2f, 0x83, 0x0f, 0xff }, clientChannel); - PokeAddress(0x0054964c, new byte[] { 0x2b, 0x83, 0x0f, 0xff }, clientChannel); - } - break; - case 0x1054e1c0: - // Sets WorldCorePointer. - if (clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4) - data.ClientObject.SetWorldCorePointer(BitConverter.ToUInt32(BitConverter.IsLittleEndian ? EndianUtils.ReverseArray(QueryData) : QueryData)); - break; - case 0x001709e0: - // Patches out the forceInvite command. - if (MediusClass.Settings.PlaystationHomeForceInviteExploitPatch && MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x80, 0x00, 0x00 })) - PokeAddress(0x001709e0, new byte[] { 0x2f, 0x80, 0x00, 0x02 }, clientChannel); - break; - } - break; - case "01.86.09": - switch (clientCheatQuery.StartAddress) - { - case 0x00555cb4: - // 4096 character command line limit. - if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x83, 0x00, 0xfe })) - { - PokeAddress(0x00555cb4, new byte[] { 0x2f, 0x83, 0x0f, 0xff }, clientChannel); - PokeAddress(0x00556740, new byte[] { 0x2b, 0x83, 0x0f, 0xff }, clientChannel); - } - break; - case 0x1054e358: - // Sets WorldCorePointer. - if (clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4) - data.ClientObject.SetWorldCorePointer(BitConverter.ToUInt32(BitConverter.IsLittleEndian ? EndianUtils.ReverseArray(QueryData) : QueryData)); - break; - case 0x0016dac0: - // Patches out the forceInvite command. - if (MediusClass.Settings.PlaystationHomeForceInviteExploitPatch && MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x80, 0x00, 0x00 })) - PokeAddress(0x0016dac0, new byte[] { 0x2f, 0x80, 0x00, 0x02 }, clientChannel); - break; - } - break; - default: - break; - } - break; - case "Retail": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.86.09": - switch (clientCheatQuery.StartAddress) - { - case 0x006f59b8: - // Grant PS Plus for 1.86 retail. - if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x54, 0x63, 0xd9, 0x7e })) - { - byte[] liPatch = new byte[] { 0x38, 0x60, 0x00, 0x01 }; - PokeAddress(0x006f59b8, liPatch, clientChannel); - PokeAddress(0x0073bdb0, liPatch, clientChannel); - } - break; - case 0x002aa960: - // Disable SSFW Reward check for 1.86 retail. - if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x7c, 0x65, 0x1b, 0x78 })) - PokeAddress(0x002aa960, new byte[] { 0x48, 0x40, 0xe2, 0x2c }, clientChannel); - break; - case 0x105c24c8: - // Sets WorldCorePointer. - if (clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4) - data.ClientObject.SetWorldCorePointer(BitConverter.ToUInt32(BitConverter.IsLittleEndian ? EndianUtils.ReverseArray(QueryData) : QueryData)); - break; - } - break; - default: - break; - } - break; - } - } - - switch (clientCheatQuery.SequenceId) - { - case int.MinValue: - if (data.ClientObject != null) - data.ClientObject.SSFWid = Encoding.ASCII.GetString(clientCheatQuery.Data); - break; - case -559038737: - switch (clientCheatQuery.StartAddress) - { - case 65536: - if (data.ClientObject != null) - { - if (data.ClientObject.ClientHomeData == null) - data.ClientObject.ClientHomeData = MediusClass.HomeOffsetsList.Where(x => !string.IsNullOrEmpty(x.Sha1Hash) && x.Sha1Hash[..^8] - .Equals(clientCheatQuery.Data.ToHexString(), StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); - - if (data.ClientObject.ClientHomeData != null) - { - switch (data.ClientObject.ClientHomeData.Type) - { - case "HDK With Offline": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.86.09": - CheatQuery(0x10244430, 36, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int.MinValue); - break; - default: - break; - } - break; - case "HDK Online Only": - switch (data.ClientObject.ClientHomeData.Version) - { - default: - break; - } - break; - case "HDK Online Only (Dbg Symbols)": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.82.09": - CheatQuery(0x10234440, 36, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int.MinValue); - break; - default: - break; - } - break; - case "Online Debug": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.83.12": - CheatQuery(0x10244439, 36, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int.MinValue); - break; - case "01.86.09": - CheatQuery(0x10244428, 36, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int.MinValue); - break; - default: - break; - } - break; - case "Retail": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.86.09": - CheatQuery(0x101555f0, 36, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int.MinValue); - break; - default: - break; - } - break; - } - } - else if (!MediusClass.Settings.PlaystationHomeAllowAnyEboot) - { - string anticheatMsg = $"[SECURITY] - HOME ANTI-CHEAT - DETECTED UNKNOWN EBOOT - User:{data.ClientObject.IP + ":" + data.ClientObject.AccountName} CID:{data.MachineId}"; - - _ = data.ClientObject.CurrentChannel?.BroadcastSystemMessage(data.ClientObject.CurrentChannel.LocalClients.Where(x => x != data.ClientObject), anticheatMsg, byte.MaxValue); - - LoggerAccessor.LogError(anticheatMsg); - - await HorizonServerConfiguration.Database.BanIp(data.ClientObject.IP).ContinueWith((r) => - { - if (r.IsCompletedSuccessfully && r.Result) - { - // Banned - QueueBanMessage(data); - } - data.ClientObject.ForceDisconnect(); - _ = data.ClientObject.Logout(); - }); - } - } - break; - } - break; - } - } - } - break; - } - - case RT_MSG_CLIENT_CONNECT_READY_REQUIRE clientConnectReadyRequire: - { - if (scertClient.CipherService != null && scertClient.CipherService.HasKey(CipherContext.RC_CLIENT_SESSION) && !scertClient.IsPS3Client) - Queue(new RT_MSG_SERVER_CRYPTKEY_GAME() { GameKey = scertClient.CipherService.GetPublicKey(CipherContext.RC_CLIENT_SESSION) }, clientChannel); - Queue(new RT_MSG_SERVER_CONNECT_ACCEPT_TCP() - { - PlayerId = 0, - ScertId = GenerateNewScertClientId(), - PlayerCount = 0x0001, - IP = (clientChannel.RemoteAddress as IPEndPoint)?.Address - }, clientChannel); - break; - } - - case RT_MSG_CLIENT_CONNECT_READY_TCP clientConnectReadyTcp: - { - Queue(new RT_MSG_SERVER_CONNECT_COMPLETE() { ClientCountAtConnect = 0x0001 }, clientChannel); - - if (scertClient.MediusVersion > 108) - Queue(new RT_MSG_SERVER_ECHO(), clientChannel); - break; - } - - #region Echos - case RT_MSG_SERVER_ECHO serverEchoReply: - { - - break; - } - case RT_MSG_CLIENT_ECHO clientEcho: - { - Queue(new RT_MSG_CLIENT_ECHO() { Value = clientEcho.Value }, clientChannel); - break; - } - #endregion - - case RT_MSG_CLIENT_APP_TOSERVER clientAppToServer: - { - if (clientAppToServer.Message != null) - await ProcessMediusMessage(clientAppToServer.Message, clientChannel, data); - break; - } - - #region Client Disconnect - case RT_MSG_CLIENT_DISCONNECT _: - { - //Medius 1.08 (Used on WRC 4) haven't a state - if (scertClient.MediusVersion > 108) - data.State = ClientState.DISCONNECTED; - - await clientChannel.CloseAsync(); - - LoggerAccessor.LogInfo($"[MAS] - Client disconnected by request with no specific reason\n"); - break; - } - case RT_MSG_CLIENT_DISCONNECT_WITH_REASON clientDisconnectWithReason: - { - if (clientDisconnectWithReason.Reason <= RT_MSG_CLIENT_DISCONNECT_REASON.RT_MSG_CLIENT_DISCONNECT_LENGTH_MISMATCH) - LoggerAccessor.LogInfo($"[MAS] - Disconnected by request with reason of {clientDisconnectWithReason.Reason}\n"); - else - LoggerAccessor.LogInfo($"[MAS] - Disconnected by request with (application specified) reason of {clientDisconnectWithReason.Reason}\n"); - - data.State = ClientState.DISCONNECTED; - await clientChannel.CloseAsync(); - break; - } - #endregion - - default: - { - LoggerAccessor.LogWarn($"UNHANDLED RT MESSAGE: {message}"); - break; - } - } - - return; - } - - protected virtual async Task ProcessMediusMessage(BaseMediusMessage message, IChannel clientChannel, ChannelData data) - { - var scertClient = clientChannel.GetAttribute(LIBRARY.Pipeline.Constants.SCERT_CLIENT).Get(); - if (message == null) - return; - - var appSettings = MediusClass.GetAppSettingsOrDefault(data.ApplicationId); - - switch (message) - { - #region MGCL - Dme - - case MediusServerSessionBeginRequest serverSessionBeginRequest: - { - List nonSecure = new() { 10010, 10031 }; - - if (data.ClientObject != null) - { - // MGCL_SEND_FAILED, MGCL_UNSUCCESSFUL - if (!data.ClientObject.IsConnected) - { - data.ClientObject.Queue(new MediusServerSessionBeginResponse() - { - MessageID = serverSessionBeginRequest.MessageID, - Confirmation = MGCL_ERROR_CODE.MGCL_UNSUCCESSFUL - }); - } - else - { - IPHostEntry host = Dns.GetHostEntry(MediusClass.Settings.NATIp ?? "natservice.pdonline.scea.com"); - - data.ClientObject.LocationId = serverSessionBeginRequest.LocationID; - data.ClientObject.ServerType = serverSessionBeginRequest.ServerType; - data.ClientObject.ServerVersion = serverSessionBeginRequest.ServerVersion; - data.ClientObject.Port = serverSessionBeginRequest.Port; - data.ClientObject.SetIp(((IPEndPoint)clientChannel.RemoteAddress).Address.ToString().Trim(new char[] { ':', 'f', '{', '}' })); - data.ClientObject.BeginServerSession(); - - if (nonSecure.Contains(data.ClientObject.ApplicationId)) - { - // TM:BO Reply unencrypted - data.ClientObject.Queue(new MediusServerSessionBeginResponse() - { - MessageID = serverSessionBeginRequest.MessageID, - Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = new RSA_KEY(), - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() { Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService }, - new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerUDP - } - }); - } - else - { - // Default Reply - data.ClientObject.Queue(new MediusServerSessionBeginResponse() - { - MessageID = serverSessionBeginRequest.MessageID, - Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = MediusClass.GlobalAuthPublic, - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() { Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService }, - new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerUDP - } - }); - } - - data.ClientObject.KeepAliveUntilNextConnection(); - } - } - break; - } - - case MediusServerSessionBeginRequest1 serverSessionBeginRequest1: - { - if (data.ClientObject != null) - { - IPHostEntry host = Dns.GetHostEntry(MediusClass.Settings.NATIp ?? "natservice.pdonline.scea.com"); - - data.ClientObject.LocationId = serverSessionBeginRequest1.LocationID; - data.ClientObject.ServerType = serverSessionBeginRequest1.ServerType; - data.ClientObject.Port = serverSessionBeginRequest1.Port; - data.ClientObject.SetIp(((IPEndPoint)clientChannel.RemoteAddress).Address.ToString().Trim(new char[] { ':', 'f', '{', '}' })); - data.ClientObject.BeginServerSession(); - - LoggerAccessor.LogInfo($"[MAS] - Registered MGCL client for appid {data.ClientObject.ApplicationId} with access token {data.ClientObject.AccessToken}"); - - //Send NAT Service - data.ClientObject.Queue(new MediusServerSessionBeginResponse() - { - MessageID = serverSessionBeginRequest1.MessageID, - Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = MediusClass.GlobalAuthPublic, - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() { Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService }, - new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerUDP - } - }); - } - - break; - } - - case MediusServerSessionBeginRequest2 serverSessionBeginRequest2: - { - if (data.ClientObject != null) - { - IPHostEntry host = Dns.GetHostEntry(MediusClass.Settings.NATIp ?? "natservice.pdonline.scea.com"); - - data.ClientObject.LocationId = serverSessionBeginRequest2.LocationID; - data.ClientObject.ServerType = serverSessionBeginRequest2.ServerType; - data.ClientObject.Port = serverSessionBeginRequest2.Port; - data.ClientObject.SetIp(((IPEndPoint)clientChannel.RemoteAddress).Address.ToString().Trim(new char[] { ':', 'f', '{', '}' })); - data.ClientObject.BeginServerSession(); - - //Send NAT Service - data.ClientObject.Queue(new MediusServerSessionBeginResponse() - { - MessageID = serverSessionBeginRequest2.MessageID, - Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = MediusClass.GlobalAuthPublic, - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() { Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService }, - new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerUDP - } - }); - } - - break; - } - - case MediusServerAuthenticationRequest mgclAuthRequest: - { - List nonSecure = new() { 10010, 10031, 10190 }; - - if (data.ClientObject != null) - { - data.ClientObject.MGCL_TRUST_LEVEL = mgclAuthRequest.TrustLevel; - data.ClientObject.NetConnectionType = NetConnectionType.NetConnectionTypeClientServerTCP; - - if (mgclAuthRequest.AddressList.AddressList[0].AddressType == NetAddressType.NetAddressTypeBinaryExternal) - data.ClientObject.SetIp(ConvertFromIntegerToIpAddress(mgclAuthRequest.AddressList.AddressList[0].BinaryAddress)); - else if (mgclAuthRequest.AddressList.AddressList[0].AddressType == NetAddressType.NetAddressTypeBinaryExternalVport - || mgclAuthRequest.AddressList.AddressList[0].AddressType == NetAddressType.NetAddressTypeBinaryInternalVport) - { - data.ClientObject.SetIp(mgclAuthRequest.AddressList.AddressList[0].IPBinaryBitOne + "." + - mgclAuthRequest.AddressList.AddressList[0].IPBinaryBitTwo + "." + - mgclAuthRequest.AddressList.AddressList[0].IPBinaryBitThree + "." + - mgclAuthRequest.AddressList.AddressList[0].IPBinaryBitFour); - } - else - // NetAddressTypeExternal - data.ClientObject.SetIp(mgclAuthRequest.AddressList.AddressList[0].Address ?? "0.0.0.0"); - - if (nonSecure.Contains(data.ClientObject.ApplicationId)) - { - data.ClientObject.Queue(new MediusServerAuthenticationResponse() - { - MessageID = mgclAuthRequest.MessageID, - Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = new RSA_KEY(), - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, - new NetAddress() { AddressType = NetAddressType.NetAddressNone } - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerTCP - } - }); - - // Keep the client alive until the dme objects connects to MPS or times out - data.ClientObject.OnConnected(); - data.ClientObject.KeepAliveUntilNextConnection(); - } - else - { - data.ClientObject.Queue(new MediusServerAuthenticationResponse() - { - MessageID = mgclAuthRequest.MessageID, - Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = MediusClass.GlobalAuthPublic, - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, - new NetAddress() { AddressType = NetAddressType.NetAddressNone }, - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerTCP - } - }); - - // Keep the client alive until the dme objects connects to MPS or times out - data.ClientObject.OnConnected(); - data.ClientObject.KeepAliveUntilNextConnection(); - } - } - - break; - } - - case MediusServerSetAttributesRequest mgclSetAttrRequest: - { - ClientObject? dmeObject = data.ClientObject; - if (dmeObject == null) - { - LoggerAccessor.LogError($"[MAS] - Non-DME Client sending MGCL messages."); - break; - } - - dmeObject.MGCL_SERVER_ATTRIBUTES = mgclSetAttrRequest.Attributes; - dmeObject.SetIpPort(mgclSetAttrRequest.ListenServerAddress); - - // Reply with success - dmeObject.Queue(new MediusServerSetAttributesResponse() - { - MessageID = mgclSetAttrRequest.MessageID, - Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS - }); - break; - } - - case MediusServerSessionEndRequest sessionEndRequest: - { - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} is trying to end server session without an Client Object"); - break; - } - - data.ClientObject.EndServerSession(); - - Queue(new RT_MSG_SERVER_APP() - { - Message = new MediusServerSessionEndResponse() - { - MessageID = sessionEndRequest.MessageID, - ErrorCode = MGCL_ERROR_CODE.MGCL_SUCCESS - } - }, clientChannel); - - break; - } - - case MediusServerReport serverReport: - { - data.ClientObject?.OnServerReport(serverReport); - break; - } - - #endregion - - #region Session - - case MediusExtendedSessionBeginRequest extendedSessionBeginRequest: - { - if (data.ClientObject != null) - { - data.ClientObject.MediusConnectionType = extendedSessionBeginRequest.ConnectionClass; - - await HorizonServerConfiguration.Database.GetServerFlags().ContinueWith((r) => - { - if (r.IsCompletedSuccessfully && r.Result != null && r.Result.MaintenanceMode != null) - { - // Ensure that maintenance is active - // Ensure that we're past the from date - // Ensure that we're before the to date (if set) - if (r.Result.MaintenanceMode.IsActive - && DateTimeUtils.GetHighPrecisionUtcTime() > r.Result.MaintenanceMode.FromDt - && (!r.Result.MaintenanceMode.ToDt.HasValue - || r.Result.MaintenanceMode.ToDt > DateTimeUtils.GetHighPrecisionUtcTime())) - QueueBanMessage(data, "Server in maintenance mode."); - else - { - // Reply - data.ClientObject.Queue(new MediusSessionBeginResponse() - { - MessageID = extendedSessionBeginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - SessionKey = data.ClientObject.SessionKey - }); - } - } - }); - } - break; - } - case MediusSessionBeginRequest sessionBeginRequest: - { - if (data.ClientObject != null) - { - data.ClientObject.MediusConnectionType = sessionBeginRequest.ConnectionClass; - - LoggerAccessor.LogInfo($"Retrieved ApplicationID {data.ClientObject.ApplicationId} from client connection"); - - await HorizonServerConfiguration.Database.GetServerFlags().ContinueWith((r) => - { - if (r.IsCompletedSuccessfully && r.Result != null && r.Result.MaintenanceMode != null) - { - #region Maintenance Mode? - // Ensure that maintenance is active - // Ensure that we're past the from date - // Ensure that we're before the to date (if set) - if (r.Result.MaintenanceMode.IsActive - && DateTimeUtils.GetHighPrecisionUtcTime() > r.Result.MaintenanceMode.FromDt - && (!r.Result.MaintenanceMode.ToDt.HasValue - || r.Result.MaintenanceMode.ToDt > DateTimeUtils.GetHighPrecisionUtcTime())) - QueueBanMessage(data, "Server in maintenance mode."); - #endregion - - #region Send Response - else - { - // Reply - data.ClientObject.Queue(new MediusSessionBeginResponse() - { - MessageID = sessionBeginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - SessionKey = data.ClientObject.SessionKey - }); - } - #endregion - } - }); - } - - break; - } - - case MediusSessionBeginRequest1 sessionBeginRequest1: - { - if (data.ClientObject != null) - { - data.ClientObject.MediusConnectionType = sessionBeginRequest1.ConnectionClass; - - LoggerAccessor.LogInfo($"Retrieved ApplicationID {data.ClientObject.ApplicationId} from client connection"); - - #region SystemMessageSingleTest Disabled? - if (MediusClass.Settings.SystemMessageSingleTest) - { - await QueueBanMessage(data, "MAS.Notification Test:\nYou have been banned from this server."); - - await data.ClientObject.Logout(); - } - #endregion - else - { - await HorizonServerConfiguration.Database.GetServerFlags().ContinueWith((r) => - { - if (r.IsCompletedSuccessfully && r.Result != null && r.Result.MaintenanceMode != null) - { - #region Maintenance Mode? - // Ensure that maintenance is active - // Ensure that we're past the from date - // Ensure that we're before the to date (if set) - if (r.Result.MaintenanceMode.IsActive - && DateTimeUtils.GetHighPrecisionUtcTime() > r.Result.MaintenanceMode.FromDt - && (!r.Result.MaintenanceMode.ToDt.HasValue - || r.Result.MaintenanceMode.ToDt > DateTimeUtils.GetHighPrecisionUtcTime())) - QueueBanMessage(data, "Server in maintenance mode."); - - #endregion - - #region Send Response - else - { - // Reply - data.ClientObject.Queue(new MediusSessionBeginResponse() - { - MessageID = sessionBeginRequest1.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - SessionKey = data.ClientObject.SessionKey - }); - } - #endregion - } - }); - } - } - break; - } - - case MediusSessionEndRequest sessionEndRequest: - { - ClientObject? clientToEnd = MediusClass.Manager.GetClientBySessionKey(sessionEndRequest.SessionKey, data.ApplicationId); - - if (clientToEnd == null) - { - LoggerAccessor.LogError($"[MAS] - INVALID OPERATION: {clientChannel} is trying to end session of a non-existing Client Object with SessionKey: {sessionEndRequest.SessionKey}"); - break; - } - - clientToEnd.OnDisconnected(); - - Queue(new RT_MSG_SERVER_APP() - { - Message = new MediusSessionEndResponse() - { - MessageID = sessionEndRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - } - }, clientChannel); - - break; - } - - #endregion - - #region Localization - - case MediusSetLocalizationParamsRequest setLocalizationParamsRequest: - { - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {setLocalizationParamsRequest} without a session."); - break; - } - - data.ClientObject.CharacterEncoding = setLocalizationParamsRequest.CharacterEncoding; - data.ClientObject.LanguageType = setLocalizationParamsRequest.Language; - - data.ClientObject.Queue(new MediusStatusResponse() - { - Type = 0xA4, - Class = setLocalizationParamsRequest.PacketClass, - MessageID = setLocalizationParamsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess - }); - break; - } - - case MediusSetLocalizationParamsRequest1 setLocalizationParamsRequest1: - { - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {setLocalizationParamsRequest1} without a session."); - break; - } - - data.ClientObject.CharacterEncoding = setLocalizationParamsRequest1.CharacterEncoding; - data.ClientObject.LanguageType = setLocalizationParamsRequest1.Language; - data.ClientObject.TimeZone = setLocalizationParamsRequest1.TimeZone; - data.ClientObject.LocationId = setLocalizationParamsRequest1.LocationID; - - data.ClientObject.Queue(new MediusStatusResponse() - { - Type = 0xA4, - Class = (NetMessageClass)1, - MessageID = setLocalizationParamsRequest1.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess - }); - break; - } - case MediusSetLocalizationParamsRequest2 setLocalizationParamsRequest2: - { - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {setLocalizationParamsRequest2} without a session."); - break; - } - - data.ClientObject.CharacterEncoding = setLocalizationParamsRequest2.CharacterEncoding; - data.ClientObject.LanguageType = setLocalizationParamsRequest2.Language; - data.ClientObject.TimeZone = setLocalizationParamsRequest2.TimeZone; - - data.ClientObject.Queue(new MediusStatusResponse() - { - Type = 0xA4, - Class = (NetMessageClass)1, - MessageID = setLocalizationParamsRequest2.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess - }); - break; - } - - #endregion - - #region Game - - case MediusGetTotalGamesRequest getTotalGamesRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getTotalGamesRequest} without a session."); - break; - } - - // ERROR -- Need to be logged in - if (!data.ClientObject.IsLoggedIn) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getTotalGamesRequest} without being logged in."); - break; - } - - data.ClientObject.Queue(new MediusGetTotalGamesResponse() - { - MessageID = getTotalGamesRequest.MessageID, - Total = 0, - StatusCode = MediusCallbackStatus.MediusRequestDenied - }); - break; - } - - #endregion - - #region Channel - - case MediusGetTotalChannelsRequest getTotalChannelsRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getTotalChannelsRequest} without a session."); - break; - } - - // ERROR -- Need to be logged in - if (!data.ClientObject.IsLoggedIn) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getTotalChannelsRequest} without being logged in."); - break; - } - - data.ClientObject.Queue(new MediusGetTotalChannelsResponse() - { - MessageID = getTotalChannelsRequest.MessageID, - Total = 0, - StatusCode = MediusCallbackStatus.MediusRequestDenied, - }); - break; - } - - case MediusSetLobbyWorldFilterRequest setLobbyWorldFilterRequest: - { - //WRC 4 Sets LobbyWorldFilter Prior to making a session. - // ERROR - Need a session - /* - if (data.ClientObject == null) - throw new InvalidOperationException($"INVALID OPERATION: {clientChannel} sent {setLobbyWorldFilterRequest} without a session."); - */ - // ERROR -- Need to be logged in - /* - if (!data.ClientObject.IsLoggedIn) - throw new InvalidOperationException($"INVALID OPERATION: {clientChannel} sent {setLobbyWorldFilterRequest} without being logged in."); - */ - /* - data.ClientObject.Queue(new MediusSetLobbyWorldFilterResponse() - { - MessageID = setLobbyWorldFilterRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusRequestDenied, - }); - */ - Queue(new RT_MSG_SERVER_APP() - { - Message = new MediusSetLobbyWorldFilterResponse() - { - MessageID = setLobbyWorldFilterRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusRequestDenied - } - }); - - break; - } - #endregion - - #region DNAS CID Check - - case MediusMachineSignaturePost machineSignaturePost: - { - if (Settings.DnasEnablePost == true) - { - //Sets the CachedPlayer's MachineId - data.MachineId = BitConverter.ToString(machineSignaturePost.MachineSignature); - - LoggerAccessor.LogInfo($"Session Key {machineSignaturePost.SessionKey} | Posting Machine signatures"); - - // Then post to the Database if logged in - if (data.ClientObject?.IsLoggedIn ?? false) - await HorizonServerConfiguration.Database.PostMachineId(data.ClientObject.AccountId, data.MachineId); - } - else - { - //DnasEnablePost set to false; - } - - break; - } - - case MediusDnasSignaturePost dnasSignaturePost: - { - if (Settings.DnasEnablePost == true) - { - //If DNAS Signature Post is the PS2/PSP/PS3 Console ID then continue - if (dnasSignaturePost.DnasSignatureType == MediusDnasCategory.DnasConsoleID) - { - data.MachineId = BitConverter.ToString(dnasSignaturePost.DnasSignature); - - LoggerAccessor.LogInfo($"Posting ConsoleID - ConsoleSigSize={dnasSignaturePost.DnasSignatureLength}"); - - // Then post to the Database if logged in - if (data.ClientObject?.IsLoggedIn ?? false) - await HorizonServerConfiguration.Database.PostMachineId(data.ClientObject.AccountId, data.MachineId); - } - - if (dnasSignaturePost.DnasSignatureType == MediusDnasCategory.DnasTitleID) - LoggerAccessor.LogInfo($"DnasSignaturePost Error - Invalid SignatureType"); - - if (dnasSignaturePost.DnasSignatureType == MediusDnasCategory.DnasDiskID) - LoggerAccessor.LogInfo($"Posting DiskID - DiskSigSize={dnasSignaturePost.DnasSignatureLength}"); - } - else - { - //DnasEnablePost false, no Post; - } - break; - } - #endregion - - #region AccessLevel (2.12) - - case MediusGetAccessLevelInfoRequest getAccessLevelInfoRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getAccessLevelInfoRequest} without a session."); - break; - } - - // ERROR -- Need to be logged in - if (!data.ClientObject.IsLoggedIn) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getAccessLevelInfoRequest} without being logged in."); - break; - } - - //int adminAccessLevel = 4; - - data.ClientObject.Queue(new MediusGetAccessLevelInfoResponse() - { - MessageID = getAccessLevelInfoRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - AccessLevel = MediusAccessLevelType.MEDIUS_ACCESSLEVEL_MODERATOR, - }); - break; - } - - #endregion - - #region Version Server - case MediusVersionServerRequest mediusVersionServerRequest: - { - List appIdBeforeSession = new() { 10442, 10724 }; - - // ERROR - Need a session - if (data.ClientObject == null && !appIdBeforeSession.Contains(data.ApplicationId)) // KILLZONE PS2 GET VERSION SERVER INFO BEFORE SESSION - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {mediusVersionServerRequest} without a session."); - break; - } - - if (Settings.MediusServerVersionOverride == true) - { - #region F1 2005 PAL - List F12005AppIds = new List { 10952, 10954 }; - // F1 2005 PAL SCES / F1 2005 PAL TCES - if (F12005AppIds.Contains(data.ApplicationId)) - { - data.ClientObject?.Queue(new MediusVersionServerResponse() - { - MessageID = mediusVersionServerRequest.MessageID, - VersionServer = "Medius Authentication Server Version 2.9.0009", - StatusCode = MediusCallbackStatus.MediusSuccess, - }); - } - #endregion - - #region Socom 1 - else if (data.ApplicationId == 10274) - { - data.ClientObject?.Queue(new MediusVersionServerResponse() - { - MessageID = mediusVersionServerRequest.MessageID, - VersionServer = "Medius Authentication Server Version 1.40.PRE8", - StatusCode = MediusCallbackStatus.MediusSuccess, - }); - } - #endregion - - #region EyeToy Chat Beta - else if (data.ApplicationId == 10550) - { - data.ClientObject?.Queue(new MediusVersionServerResponse() - { - MessageID = mediusVersionServerRequest.MessageID, - VersionServer = "Medius Authentication Server Version 1.43.0000", - StatusCode = MediusCallbackStatus.MediusSuccess, - }); - } - #endregion - - #region Killzone Beta/Retail - else if (appIdBeforeSession.Contains(data.ApplicationId)) - { - //data.ClientObject = MediusClass.LobbyServer.ReserveClient(mediusVersionServerRequest); - - data.SendQueue.Enqueue(new RT_MSG_SERVER_APP() - { - Message = new MediusVersionServerResponse() - { - MessageID = mediusVersionServerRequest.MessageID, - VersionServer = "Medius Authentication Server Version 1.50.0009", - StatusCode = MediusCallbackStatus.MediusSuccess, - } - }); - } - else - #endregion - - //Default - { - data.ClientObject?.Queue(new MediusVersionServerResponse() - { - MessageID = mediusVersionServerRequest.MessageID, - VersionServer = "Medius Authentication Server Version 3.05.201109161400", - StatusCode = MediusCallbackStatus.MediusSuccess, - }); - } - } - else - { - // If MediusServerVersionOverride is false, we send our own Version String - // AND if its Killzone PS2 we make the ClientObject BEFORE SESSIONBEGIN - if (appIdBeforeSession.Contains(data.ApplicationId)) - { - //data.ClientObject = Program.LobbyServer.ReserveClient(mediusVersionServerRequest); - data.SendQueue.Enqueue(new RT_MSG_SERVER_APP() - { - Message = new MediusVersionServerResponse() - { - MessageID = mediusVersionServerRequest.MessageID, - VersionServer = "Medius Authentication Server Version 1.50.0009", - StatusCode = MediusCallbackStatus.MediusSuccess, - } - }); - } - else - { - data.ClientObject?.Queue(new MediusVersionServerResponse() - { - MessageID = mediusVersionServerRequest.MessageID, - VersionServer = Settings.MASVersion, - StatusCode = MediusCallbackStatus.MediusSuccess, - }); - } - } - - break; - } - - #endregion - - #region Co-Locations - case MediusGetLocationsRequest getLocationsRequest: - { - // ERROR - Need a session but doesn't need to be logged in - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getLocationsRequest} without a session."); - break; - } - - LoggerAccessor.LogInfo($"Get Locations Request Received Sessionkey: {getLocationsRequest.SessionKey}"); - await HorizonServerConfiguration.Database.GetLocations(data.ClientObject.ApplicationId).ContinueWith(r => - { - LocationDTO[]? locations = r.Result; - - if (r.IsCompletedSuccessfully) - { - if (locations?.Length == 0) - { - LoggerAccessor.LogInfo("No Locations found."); - - data.ClientObject.Queue(new MediusGetLocationsResponse() - { - MessageID = getLocationsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusNoResult, - EndOfList = true - }); - } - else - { - var responses = locations?.Select(x => new MediusGetLocationsResponse() - { - MessageID = getLocationsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - LocationId = x.Id, - LocationName = x.Name - }).ToList(); - - if (responses != null) - { - LoggerAccessor.LogInfo("GetLocationsRequest success"); - LoggerAccessor.LogInfo($"NumLocations returned[{responses.Count}]"); - - responses[responses.Count - 1].EndOfList = true; - data.ClientObject.Queue(responses); - } - } - } - else - { - LoggerAccessor.LogError($"GetLocationsRequest failed [{r.Exception}]"); - - data.ClientObject.Queue(new MediusGetLocationsResponse() - { - MessageID = getLocationsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusDBError, - LocationId = -1, - LocationName = "0", - EndOfList = true - }); - } - }); - break; - } - - case MediusPickLocationRequest pickLocationRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {pickLocationRequest} without a session."); - break; - } - - data.ClientObject.LocationId = pickLocationRequest.LocationID; - - data.ClientObject.Queue(new MediusPickLocationResponse() - { - MessageID = pickLocationRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess - }); - break; - } - - #endregion - - #region Account - - case MediusAccountRegistrationRequest accountRegRequest: - { - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountRegRequest} without a session."); - break; - } - - // Check that account creation is enabled - if (appSettings.DisableAccountCreation) - { - // Reply error - data.ClientObject.Queue(new MediusAccountRegistrationResponse() - { - MessageID = accountRegRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusFail - }); - - return; - } - - // validate name - if (!MediusClass.PassTextFilter(data.ApplicationId, TextFilterContext.ACCOUNT_NAME, accountRegRequest.AccountName)) - { - data.ClientObject.Queue(new MediusAccountRegistrationResponse() - { - MessageID = accountRegRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusFail, - }); - return; - } - - await HorizonServerConfiguration.Database.CreateAccount(new CreateAccountDTO() - { - AccountName = accountRegRequest.AccountName, - AccountPassword = ComputeSHA256(accountRegRequest.Password), - MachineId = data.MachineId, - MediusStats = Convert.ToBase64String(new byte[Constants.ACCOUNTSTATS_MAXLEN]), - AppId = data.ClientObject.ApplicationId - }, clientChannel).ContinueWith((r) => - { - if (r.IsCompletedSuccessfully && r.Result != null) - { - // Reply with account id - data.ClientObject.Queue(new MediusAccountRegistrationResponse() - { - MessageID = accountRegRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - AccountID = r.Result.AccountId - }); - } - else - { - // Reply error - data.ClientObject.Queue(new MediusAccountRegistrationResponse() - { - MessageID = accountRegRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusAccountAlreadyExists - }); - } - }); - break; - } - case MediusAccountGetIDRequest accountGetIdRequest: - { - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountGetIdRequest} without a session."); - break; - } - - await HorizonServerConfiguration.Database.GetAccountByName(accountGetIdRequest.AccountName, data.ClientObject.ApplicationId).ContinueWith((r) => - { - if (r.IsCompletedSuccessfully && r.Result != null) - { - // Success - data?.ClientObject?.Queue(new MediusAccountGetIDResponse() - { - MessageID = accountGetIdRequest.MessageID, - AccountID = r.Result.AccountId, - StatusCode = MediusCallbackStatus.MediusSuccess - }); - } - else - { - // Fail - data?.ClientObject?.Queue(new MediusAccountGetIDResponse() - { - MessageID = accountGetIdRequest.MessageID, - AccountID = -1, - StatusCode = MediusCallbackStatus.MediusAccountNotFound - }); - } - }); - - break; - } - case MediusAccountDeleteRequest accountDeleteRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountDeleteRequest} without a session."); - break; - } - - // ERROR -- Need to be logged in - if (!data.ClientObject.IsLoggedIn) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountDeleteRequest} without being logged in."); - break; - } - - if (!string.IsNullOrEmpty(data.ClientObject.AccountName)) - { - await HorizonServerConfiguration.Database.DeleteAccount(data.ClientObject.AccountName, data.ClientObject.ApplicationId).ContinueWith((r) => - { - if (r.IsCompletedSuccessfully && r.Result) - { - LoggerAccessor.LogInfo($"Logging out {data?.ClientObject?.AccountName}'s account\nDeleting from Medius Server"); - - data?.ClientObject?.Logout(); - - data?.ClientObject?.Queue(new MediusAccountDeleteResponse() - { - MessageID = accountDeleteRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess - }); - } - else - { - LoggerAccessor.LogWarn($"Logout FAILED for {data?.ClientObject?.AccountName}'s account\nData still persistent on Medius Server"); - - data?.ClientObject?.Queue(new MediusAccountDeleteResponse() - { - MessageID = accountDeleteRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusDBError - }); - } - }); - } - break; - } - case MediusAnonymousLoginRequest anonymousLoginRequest: - { - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {anonymousLoginRequest} without a session."); - break; - } - - await LoginAnonymous(anonymousLoginRequest, clientChannel, data); - break; - } - case MediusAccountLoginRequest accountLoginRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountLoginRequest} without a session."); - break; - } - - await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_ACCOUNT_LOGIN_REQUEST, new OnAccountLoginRequestArgs() - { - Player = data.ClientObject, - Request = accountLoginRequest - }); - - // Check the client isn't already logged in - if (MediusClass.Manager.GetClientByAccountName(accountLoginRequest.Username, data.ClientObject.ApplicationId)?.IsLoggedIn ?? false) - { - data.ClientObject.Queue(new MediusAccountLoginResponse() - { - MessageID = accountLoginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusAccountLoggedIn - }); - } - else - { - #region SystemMessageSingleTest Disabled? - if (MediusClass.Settings.SystemMessageSingleTest != false) - { - await QueueBanMessage(data, "MAS.Notification Test:\nYou have been banned from this server."); - - await data.ClientObject.Logout(); - } - #endregion - else - { - _ = HorizonServerConfiguration.Database.GetAccountByName(accountLoginRequest.Username, data.ClientObject.ApplicationId, true).ContinueWith(async (r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result != null && data != null && data.ClientObject != null && data.ClientObject.IsConnected) - { - - if (r.Result.IsBanned) - { - // Send ban message - //await QueueBanMessage(data); - - // Account is banned - // Temporary solution is to tell the client the login failed - data?.ClientObject?.Queue(new MediusAccountLoginResponse() - { - MessageID = accountLoginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusAccountBanned - }); - - } - else if (appSettings.EnableAccountWhitelist && !appSettings.AccountIdWhitelist.Contains(r.Result.AccountId)) - { - // Account not allowed to sign in - data?.ClientObject?.Queue(new MediusAccountLoginResponse() - { - MessageID = accountLoginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusFail - }); - } - else if (MediusClass.Manager.GetClientByAccountName(accountLoginRequest.Username, data.ClientObject.ApplicationId)?.IsLoggedIn ?? false) - { - data.ClientObject.Queue(new MediusAccountLoginResponse() - { - MessageID = accountLoginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusAccountLoggedIn - }); - } - - else if (ComputeSHA256(accountLoginRequest.Password) == r.Result.AccountPassword) - await Login(accountLoginRequest.MessageID, clientChannel, data, r.Result, false); - else - { - // Incorrect password - data?.ClientObject?.Queue(new MediusAccountLoginResponse() - { - MessageID = accountLoginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusInvalidPassword - }); - } - } - else if (appSettings.CreateAccountOnNotFound) - { - // Account not found, create new and login - // Check that account creation is enabled - if (appSettings.DisableAccountCreation) - { - // Reply error - data?.ClientObject?.Queue(new MediusAccountLoginResponse() - { - MessageID = accountLoginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusFail, - }); - return; - } - - // validate name - if (data != null && !MediusClass.PassTextFilter(data.ApplicationId, TextFilterContext.ACCOUNT_NAME, accountLoginRequest.Username)) - { - data.ClientObject?.Queue(new MediusAccountLoginResponse() - { - MessageID = accountLoginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusVulgarityFound, - }); - return; - } - - await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_PRE_ACCOUNT_CREATE_ON_NOT_FOUND, new OnAccountLoginRequestArgs() - { - Player = data?.ClientObject, - Request = accountLoginRequest - }); - - if (data != null && data.ClientObject != null) - { - _ = HorizonServerConfiguration.Database.CreateAccount(new CreateAccountDTO() - { - AccountName = accountLoginRequest.Username, - AccountPassword = ComputeSHA256(accountLoginRequest.Password), - MachineId = data.MachineId, - MediusStats = Convert.ToBase64String(new byte[Constants.ACCOUNTSTATS_MAXLEN]), - AppId = data.ClientObject.ApplicationId - }, clientChannel).ContinueWith(async (r) => - { - if (r.IsCompletedSuccessfully && r.Result != null) - { - await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_POST_ACCOUNT_CREATE_ON_NOT_FOUND, new OnAccountLoginRequestArgs() - { - Player = data.ClientObject, - Request = accountLoginRequest - }); - await Login(accountLoginRequest.MessageID, clientChannel, data, r.Result, false); - } - else - { - // Reply error - data.ClientObject.Queue(new MediusAccountLoginResponse() - { - MessageID = accountLoginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusInvalidPassword - }); - } - }); - } - } - else - { - // Account not found - data?.ClientObject?.Queue(new MediusAccountLoginResponse() - { - MessageID = accountLoginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusAccountNotFound, - }); - } - }); - } - } - break; - } - - case MediusAccountUpdatePasswordRequest accountUpdatePasswordRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountUpdatePasswordRequest} without a session."); - break; - } - - // ERROR -- Need to be logged in - if (!data.ClientObject.IsLoggedIn) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountUpdatePasswordRequest} without being logged in."); - break; - } - - // Post New Password to Database - await HorizonServerConfiguration.Database.PostAccountUpdatePassword(data.ClientObject.AccountId, accountUpdatePasswordRequest.OldPassword, accountUpdatePasswordRequest.NewPassword).ContinueWith((r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result) - { - data.ClientObject.Queue(new MediusAccountUpdatePasswordStatusResponse() - { - MessageID = accountUpdatePasswordRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess - }); - } - else - { - data.ClientObject.Queue(new MediusAccountUpdatePasswordStatusResponse() - { - MessageID = accountUpdatePasswordRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusDBError - }); - } - }); - break; - } - - case MediusAccountLogoutRequest accountLogoutRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountLogoutRequest} without a session."); - break; - } - - MediusCallbackStatus result = MediusCallbackStatus.MediusFail; - - // Check token - if (data.ClientObject.IsLoggedIn && accountLogoutRequest.SessionKey == data.ClientObject.SessionKey) - { - result = MediusCallbackStatus.MediusSuccess; - - // Logout - await data.ClientObject.Logout(); - } - - data.ClientObject.Queue(new MediusAccountLogoutResponse() - { - MessageID = accountLogoutRequest.MessageID, - StatusCode = result - }); - break; - } - - case MediusAccountUpdateStatsRequest accountUpdateStatsRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountUpdateStatsRequest} without a session."); - break; - } - - // ERROR -- Need to be logged in - if (!data.ClientObject.IsLoggedIn) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountUpdateStatsRequest} without being logged in."); - break; - } - - await HorizonServerConfiguration.Database.PostMediusStats(data.ClientObject.AccountId, Convert.ToBase64String(accountUpdateStatsRequest.Stats)).ContinueWith((r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result) - { - data.ClientObject.Queue(new MediusAccountUpdateStatsResponse() - { - MessageID = accountUpdateStatsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess - }); - } - else - { - data.ClientObject.Queue(new MediusAccountUpdateStatsResponse() - { - MessageID = accountUpdateStatsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusDBError - }); - } - }); - break; - } - - case MediusTicketLoginRequest ticketLoginRequest: - { - // ERROR - Need a session and XI5 Ticket - if (data.ClientObject == null || ticketLoginRequest.TicketData == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {ticketLoginRequest} without a session or XI5 Ticket."); - break; - } - - string accountLoggingMsg = string.Empty; - byte[] XI5TicketData = ByteUtils.CombineByteArrays(BitConverter.GetBytes( - BitConverter.IsLittleEndian ? EndianUtils.ReverseUint(ticketLoginRequest.Version) : ticketLoginRequest.Version), BitConverter.GetBytes( - BitConverter.IsLittleEndian ? EndianUtils.ReverseUint(ticketLoginRequest.Size) : ticketLoginRequest.Size), ticketLoginRequest.TicketData); - - // Extract the desired portion of the binary data for a npticket 4.0 - byte[] extractedData = new byte[0x63 - 0x54 + 1]; - - // Copy it - Array.Copy(XI5TicketData, 0x54, extractedData, 0, extractedData.Length); - - // Trim null bytes - int nullByteIndex = Array.IndexOf(extractedData, (byte)0x00); - if (nullByteIndex >= 0) - { - byte[] trimmedData = new byte[nullByteIndex]; - Array.Copy(extractedData, trimmedData, nullByteIndex); - extractedData = trimmedData; - } - - string UserOnlineId = Encoding.UTF8.GetString(extractedData); - XI5Ticket ticker = new XI5Ticket(XI5TicketData); - - if (ByteUtils.FindBytePattern(XI5TicketData, new byte[] { 0x52, 0x50, 0x43, 0x4E }, 184) != -1) - { - if (MediusClass.Settings.ForceOfficialRPCNSignature && !ticker.SignedByOfficialRPCN) - { - LoggerAccessor.LogError($"[MAS] - MediusTicketLoginRequest : User {UserOnlineId} was caught using an invalid RPCN signature!"); - - // Account is banned - // Temporary solution is to tell the client the login failed - data.ClientObject.Queue(new MediusTicketLoginResponse() - { - MessageID = ticketLoginRequest.MessageID, - StatusCodeTicketLogin = MediusCallbackStatus.MediusMachineBanned - }); - - break; - } - - accountLoggingMsg = $"[MAS] - MediusTicketLoginRequest : User {UserOnlineId} logged in and is on RPCN"; - data.ClientObject.IsOnRPCN = true; - UserOnlineId += "@RPCN"; - } - else if (UserOnlineId.EndsWith("@RPCN")) - { - LoggerAccessor.LogError($"[MAS] - MediusTicketLoginRequest : User {UserOnlineId} was caught using a RPCN suffix while not on it!"); - - // Account is banned - // Temporary solution is to tell the client the login failed - data.ClientObject.Queue(new MediusTicketLoginResponse() - { - MessageID = ticketLoginRequest.MessageID, - StatusCodeTicketLogin = MediusCallbackStatus.MediusMachineBanned - }); - - break; - } - else - accountLoggingMsg = $"[MAS] - MediusTicketLoginRequest : User {UserOnlineId} logged in and is on PSN"; - - _ = data.ClientObject.CurrentChannel?.BroadcastSystemMessage(data.ClientObject.CurrentChannel.LocalClients.Where(client => client != data.ClientObject), accountLoggingMsg, byte.MinValue); - - LoggerAccessor.LogInfo(accountLoggingMsg); - - ClientObject? ExsitingClient = MediusClass.Manager.GetClientByAccountName(UserOnlineId, data.ClientObject.ApplicationId); - - // Check the client isn't already logged in - if (ExsitingClient != null && ExsitingClient.IsLoggedIn) - { - data.ClientObject.Queue(new MediusTicketLoginResponse() - { - MessageID = ticketLoginRequest.MessageID, - StatusCodeTicketLogin = MediusCallbackStatus.MediusAccountLoggedIn - }); - - break; - } - - //Check if their MacBanned - await HorizonServerConfiguration.Database.GetIsMacBanned(data.MachineId ?? string.Empty).ContinueWith(async (r) => - { - if (r.IsCompletedSuccessfully && data != null && data.ClientObject != null && data.ClientObject.IsConnected) - { - data.IsBanned = r.IsCompletedSuccessfully && r.Result; - - #region isBanned? - LoggerAccessor.LogInfo($"Is Connected User MAC Banned: {data.IsBanned}"); - - if (data.IsBanned == true) - { - LoggerAccessor.LogError($"Account MachineID {data.MachineId} is BANNED!"); - - // Account is banned - // Temporary solution is to tell the client the login failed - data?.ClientObject?.Queue(new MediusTicketLoginResponse() - { - MessageID = ticketLoginRequest.MessageID, - StatusCodeTicketLogin = MediusCallbackStatus.MediusMachineBanned - }); - - // Send ban message - //await QueueBanMessage(data); - } - else - { - await HorizonServerConfiguration.Database.GetAccountByName(UserOnlineId, data.ClientObject.ApplicationId, true).ContinueWith(async (r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result != null && data != null && data.ClientObject != null && data.ClientObject.IsConnected) - { - bool isHomeRejected = !MediusClass.Settings.PlaystationHomeAllowAnyEboot && (data.ClientObject.ApplicationId == 20371 || data.ClientObject.ApplicationId == 20374) && data.ClientObject.ClientHomeData == null; - - LoggerAccessor.LogInfo($"Account found for AppId from Client: {data.ClientObject.ApplicationId}"); - - if (r.Result.IsBanned || isHomeRejected) - { - // Account is banned - // Respond with Statuscode MediusAccountBanned - data?.ClientObject?.Queue(new MediusTicketLoginResponse() - { - MessageID = ticketLoginRequest.MessageID, - StatusCodeTicketLogin = MediusCallbackStatus.MediusAccountBanned - }); - - // Then queue send ban message - await QueueBanMessage(data, isHomeRejected ? "You was caught using an anti Poke/Query eboot" : "Your CID has been banned"); - } - else - { - #region AccountWhitelist Check - if (appSettings.EnableAccountWhitelist && !appSettings.AccountIdWhitelist.Contains(r.Result.AccountId)) - { - LoggerAccessor.LogError($"AppId {data.ClientObject.ApplicationId} has EnableAccountWhitelist enabled or\n" + - $"Contains a AccountIdWhitelist!"); - - // Account not allowed to sign in - data?.ClientObject?.Queue(new MediusTicketLoginResponse() - { - MessageID = ticketLoginRequest.MessageID, - StatusCodeTicketLogin = MediusCallbackStatus.MediusFail - }); - } - #endregion - - if (data != null) - await Login(ticketLoginRequest.MessageID, clientChannel, data, r.Result, true); - } - - } - else - { - // Account not found, create new and login - #region AccountCreationDisabled? - // Check that account creation is enabled - if (appSettings.DisableAccountCreation) - { - LoggerAccessor.LogError($"AppId {data?.ClientObject?.ApplicationId} has DisableAllowCreation enabled!"); - - // Reply error - data?.ClientObject?.Queue(new MediusTicketLoginResponse() - { - MessageID = ticketLoginRequest.MessageID, - StatusCodeTicketLogin = MediusCallbackStatus.MediusFail, - }); - return; - } - #endregion - - if (data != null) - { - LoggerAccessor.LogInfo($"Account not found for AppId from Client: {data.ClientObject?.ApplicationId}"); - - if (data.ClientObject != null) - { - _ = HorizonServerConfiguration.Database.CreateAccount(new CreateAccountDTO() - { - AccountName = UserOnlineId, - AccountPassword = "UNSET", - MachineId = data.MachineId, - MediusStats = Convert.ToBase64String(new byte[Constants.ACCOUNTSTATS_MAXLEN]), - AppId = data.ClientObject.ApplicationId - }, clientChannel).ContinueWith(async (r) => - { - LoggerAccessor.LogInfo($"Creating New Account for user {UserOnlineId}!"); - - if (r.IsCompletedSuccessfully && r.Result != null) - await Login(ticketLoginRequest.MessageID, clientChannel, data, r.Result, true); - else - { - // Reply error - data.ClientObject.Queue(new MediusTicketLoginResponse() - { - MessageID = ticketLoginRequest.MessageID, - StatusCodeTicketLogin = MediusCallbackStatus.MediusDBError - }); - } - }); - } - } - } - }); - } - #endregion - } - else - { - // Reply error - data?.ClientObject?.Queue(new MediusTicketLoginResponse() - { - MessageID = ticketLoginRequest.MessageID, - StatusCodeTicketLogin = MediusCallbackStatus.MediusDBError, - }); - } - }); - break; - } - - #endregion - - #region Policy / Announcements - - case MediusGetAllAnnouncementsRequest getAllAnnouncementsRequest: - { - // Send to plugins - await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_PLAYER_ON_GET_ALL_ANNOUNCEMENTS, new OnPlayerRequestArgs() - { - Player = data.ClientObject, - Request = getAllAnnouncementsRequest - }); - - await HorizonServerConfiguration.Database.GetLatestAnnouncementsList(data.ApplicationId).ContinueWith((r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result != null && r.Result.Length > 0) - { - List responses = new List(); - foreach (var result in r.Result) - { - responses.Add(new MediusGetAnnouncementsResponse() - { - MessageID = getAllAnnouncementsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - Announcement = string.IsNullOrEmpty(result.AnnouncementTitle) ? $"{result.AnnouncementBody}" : $"{result.AnnouncementTitle}\n{result.AnnouncementBody}\n", - AnnouncementID = result.Id++, - EndOfList = false - }); - } - - responses[responses.Count - 1].EndOfList = true; - data.ClientObject.Queue(responses); - } - else - { - data.ClientObject.Queue(new MediusGetAnnouncementsResponse() - { - MessageID = getAllAnnouncementsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - Announcement = "", - AnnouncementID = 0, - EndOfList = true - }); - } - }); - break; - } - - case MediusGetAnnouncementsRequest getAnnouncementsRequest: - { - // Send to plugins - await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_PLAYER_ON_GET_ANNOUNCEMENTS, new OnPlayerRequestArgs() - { - Player = data.ClientObject, - Request = getAnnouncementsRequest - }); - - await HorizonServerConfiguration.Database.GetLatestAnnouncement(data.ApplicationId).ContinueWith((r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result != null) - { - data.ClientObject.Queue(new MediusGetAnnouncementsResponse() - { - MessageID = getAnnouncementsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - Announcement = string.IsNullOrEmpty(r.Result.AnnouncementTitle) ? $"{r.Result.AnnouncementBody}" : $"{r.Result.AnnouncementTitle}\n{r.Result.AnnouncementBody}\n", - AnnouncementID = r.Result.Id++, - EndOfList = true - }); - } - else - { - data.ClientObject.Queue(new MediusGetAnnouncementsResponse() - { - MessageID = getAnnouncementsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - Announcement = "", - AnnouncementID = 0, - EndOfList = true - }); - } - }); - break; - } - - case MediusGetPolicyRequest getPolicyRequest: - { - // Send to plugins - await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_PLAYER_ON_GET_POLICY, new OnPlayerRequestArgs() - { - Player = data.ClientObject, - Request = getPolicyRequest - }); - - switch (getPolicyRequest.Policy) - { - case MediusPolicyType.Privacy: - { - if (data.ClientObject != null) - { - await HorizonServerConfiguration.Database.GetPolicy((int)MediusPolicyType.Privacy, data.ClientObject.ApplicationId).ContinueWith((r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result != null) - { - string? txt = r.Result.EulaBody; - if (!string.IsNullOrEmpty(r.Result.EulaTitle)) - txt = r.Result.EulaTitle + "\n" + txt; - else - txt = string.Empty; - LoggerAccessor.LogInfo($"GetPolicy Succeeded:{getPolicyRequest.MessageID}"); - data.ClientObject.Queue(MediusClass.GetPolicyFromText(getPolicyRequest.MessageID, txt)); - } - else if (r.IsCompletedSuccessfully && r.Result == null) - { - LoggerAccessor.LogDebug($"Sending blank Policy since no chunks were found"); - data.ClientObject.Queue(new MediusGetPolicyResponse() { MessageID = getPolicyRequest.MessageID, StatusCode = MediusCallbackStatus.MediusSuccess, Policy = string.Empty, EndOfText = true }); - } - else - { - LoggerAccessor.LogError($"GetPolicy Failed = [{r.Exception}]"); - data.ClientObject.Queue(new MediusGetPolicyResponse() { MessageID = getPolicyRequest.MessageID, StatusCode = MediusCallbackStatus.MediusSuccess, Policy = "NONE", EndOfText = true }); - } - }); - } - break; - } - case MediusPolicyType.Usage: - { - if (data.ClientObject != null) - { - await HorizonServerConfiguration.Database.GetPolicy((int)MediusPolicyType.Usage, data.ClientObject.ApplicationId).ContinueWith((r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result != null) - { - string? txt = r.Result.EulaBody; - if (!string.IsNullOrEmpty(r.Result.EulaTitle)) - txt = r.Result.EulaTitle + "\n" + txt; - else - txt = string.Empty; - LoggerAccessor.LogInfo($"GetPolicy Succeeded:{getPolicyRequest.MessageID}"); - data.ClientObject.Queue(MediusClass.GetPolicyFromText(getPolicyRequest.MessageID, txt)); - } - else if (r.IsCompletedSuccessfully && r.Result == null) - { - LoggerAccessor.LogDebug($"Sending blank Policy since no chunks were found"); - data.ClientObject.Queue(new MediusGetPolicyResponse() { MessageID = getPolicyRequest.MessageID, StatusCode = MediusCallbackStatus.MediusSuccess, Policy = string.Empty, EndOfText = true }); - } - else - { - LoggerAccessor.LogError($"GetPolicy Failed = [{r.Exception}]"); - data.ClientObject.Queue(new MediusGetPolicyResponse() { MessageID = getPolicyRequest.MessageID, StatusCode = MediusCallbackStatus.MediusSuccess, Policy = "NONE", EndOfText = true }); - } - }); - } - break; - } - } - break; - } - - #endregion - - #region Ladders - - case MediusGetLadderStatsRequest getLadderStatsRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getLadderStatsRequest} without a session."); - break; - } - - // ERROR -- Need to be logged in - if (!data.ClientObject.IsLoggedIn) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getLadderStatsRequest} without being logged in."); - break; - } - - switch (getLadderStatsRequest.LadderType) - { - case MediusLadderType.MediusLadderTypePlayer: - { - await HorizonServerConfiguration.Database.GetAccountById(getLadderStatsRequest.AccountID_or_ClanID).ContinueWith((r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result != null && r.Result.AccountStats != null) - { - data.ClientObject.Queue(new MediusGetLadderStatsResponse() - { - MessageID = getLadderStatsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - Stats = Array.ConvertAll(r.Result.AccountStats, Convert.ToInt32) - }); - } - else - { - data.ClientObject.Queue(new MediusGetLadderStatsResponse() - { - MessageID = getLadderStatsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusDBError - }); - } - }); - break; - } - case MediusLadderType.MediusLadderTypeClan: - { - await HorizonServerConfiguration.Database.GetClanById(getLadderStatsRequest.AccountID_or_ClanID, - data.ClientObject.ApplicationId) - .ContinueWith((r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result != null && r.Result.ClanStats != null) - { - data.ClientObject.Queue(new MediusGetLadderStatsResponse() - { - MessageID = getLadderStatsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - Stats = r.Result.ClanStats - }); - } - else - { - data.ClientObject.Queue(new MediusGetLadderStatsResponse() - { - MessageID = getLadderStatsRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusDBError - }); - } - }); - break; - } - default: - { - LoggerAccessor.LogWarn($"Unhandled MediusGetLadderStatsRequest {getLadderStatsRequest}"); - break; - } - } - break; - } - - case MediusGetLadderStatsWideRequest getLadderStatsWideRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getLadderStatsWideRequest} without a session."); - break; - } - - // ERROR -- Need to be logged in - if (!data.ClientObject.IsLoggedIn) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getLadderStatsWideRequest} without being logged in."); - break; - } - - switch (getLadderStatsWideRequest.LadderType) - { - case MediusLadderType.MediusLadderTypePlayer: - { - await HorizonServerConfiguration.Database.GetAccountById(getLadderStatsWideRequest.AccountID_or_ClanID).ContinueWith((r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result != null && r.Result.AccountWideStats != null) - { - data.ClientObject.Queue(new MediusGetLadderStatsWideResponse() - { - MessageID = getLadderStatsWideRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - AccountID_or_ClanID = r.Result.AccountId, - Stats = r.Result.AccountWideStats - }); - } - else - { - data.ClientObject.Queue(new MediusGetLadderStatsWideResponse() - { - MessageID = getLadderStatsWideRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusDBError - }); - } - }); - break; - } - case MediusLadderType.MediusLadderTypeClan: - { - await HorizonServerConfiguration.Database.GetClanById(getLadderStatsWideRequest.AccountID_or_ClanID, - data.ClientObject.ApplicationId) - .ContinueWith((r) => - { - if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) - return; - - if (r.IsCompletedSuccessfully && r.Result != null && r.Result.ClanWideStats != null) - { - data.ClientObject.Queue(new MediusGetLadderStatsWideResponse() - { - MessageID = getLadderStatsWideRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - AccountID_or_ClanID = r.Result.ClanId, - Stats = r.Result.ClanWideStats - }); - } - else - { - data.ClientObject.Queue(new MediusGetLadderStatsWideResponse() - { - MessageID = getLadderStatsWideRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusDBError - }); - } - }); - break; - } - default: - { - LoggerAccessor.LogWarn($"Unhandled MediusGetLadderStatsWideRequest {getLadderStatsWideRequest}"); - break; - } - } - break; - } - - #endregion - - #region Channels - - case MediusChannelListRequest channelListRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {channelListRequest} without a session."); - break; - } - - // ERROR -- Need to be logged in - if (!data.ClientObject.IsLoggedIn) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {channelListRequest} without being logged in."); - break; - } - - List channelResponses = new List(); - - var lobbyChannels = MediusClass.Manager.GetChannelList( - data.ClientObject.ApplicationId, - channelListRequest.PageID, - channelListRequest.PageSize, - ChannelType.Lobby - ); - - foreach (var channel in lobbyChannels) - { - channelResponses.Add(new MediusChannelListResponse() - { - MessageID = channelListRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - MediusWorldID = channel.Id, - LobbyName = channel.Name, - PlayerCount = channel.PlayerCount, - EndOfList = false - }); - } - - if (channelResponses.Count == 0) - { - // Return none - data.ClientObject.Queue(new MediusChannelListResponse() - { - MessageID = channelListRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusNoResult, - EndOfList = true - }); - } - else - { - // Ensure the end of list flag is set - channelResponses[channelResponses.Count - 1].EndOfList = true; - - // Add to responses - data.ClientObject.Queue(channelResponses); - } - - - break; - } - - #endregion - - #region Deadlocked No-op Messages (MAS) - - case MediusGetBuddyList_ExtraInfoRequest getBuddyList_ExtraInfoRequest: - { - Queue(new RT_MSG_SERVER_APP() - { - Message = new MediusGetBuddyList_ExtraInfoResponse() - { - MessageID = getBuddyList_ExtraInfoRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusNoResult, - EndOfList = true - } - }, clientChannel); - break; - } - - case MediusGetIgnoreListRequest getIgnoreListRequest: - { - Queue(new RT_MSG_SERVER_APP() - { - Message = new MediusGetIgnoreListResponse() - { - MessageID = getIgnoreListRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusNoResult, - EndOfList = true - } - }, clientChannel); - break; - } - - case MediusGetMyClansRequest getMyClansRequest: - { - Queue(new RT_MSG_SERVER_APP() - { - Message = new MediusGetMyClansResponse() - { - MessageID = getMyClansRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusNoResult, - EndOfList = true - } - }, clientChannel); - break; - } - - #endregion - - #region TextFilter - - case MediusTextFilterRequest textFilterRequest: - { - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {textFilterRequest} without a session."); - break; - } - - // Deny special characters - // Also trim any whitespace - switch (textFilterRequest.TextFilterType) - { - case MediusTextFilterType.MediusTextFilterPassFail: - { - // validate name - if (!MediusClass.PassTextFilter(data.ApplicationId, Config.TextFilterContext.ACCOUNT_NAME, textFilterRequest.Text)) - { - // Failed due to special characters - data.ClientObject.Queue(new MediusTextFilterResponse() - { - MessageID = textFilterRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusFail - }); - return; - } - else - { - data.ClientObject.Queue(new MediusTextFilterResponse() - { - MessageID = textFilterRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusPass, - Text = textFilterRequest.Text.Trim() - }); - } - break; - } - case MediusTextFilterType.MediusTextFilterReplace: - { - data.ClientObject.Queue(new MediusTextFilterResponse() - { - MessageID = textFilterRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusPass, - Text = MediusClass.FilterTextFilter(data.ApplicationId, TextFilterContext.ACCOUNT_NAME, textFilterRequest.Text).Trim() - }); - break; - } - } - break; - } - - #endregion - - #region Time - case MediusGetServerTimeRequest getServerTimeRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getServerTimeRequest} without a session."); - break; - } - - //Doesn't need to be logged in to get ServerTime - - var time = DateTime.Now; - - await GetTimeZone(time).ContinueWith((r) => - { - if (r.IsCompletedSuccessfully) - { - //Fetched - data.ClientObject.Queue(new MediusGetServerTimeResponse() - { - MessageID = getServerTimeRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - Local_server_timezone = r.Result, - }); - } - else - { - //default - data.ClientObject.Queue(new MediusGetServerTimeResponse() - { - MessageID = getServerTimeRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - Local_server_timezone = MediusTimeZone.MediusTimeZone_GMT, - }); - } - }); - break; - } - #endregion - - #region GetMyIP - //Syphon Filter - The Omega Strain Beta - - case MediusGetMyIPRequest getMyIpRequest: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getMyIpRequest} without a session."); - break; - } - - IPAddress? ClientIP = (clientChannel.RemoteAddress as IPEndPoint)?.Address; - - if (ClientIP == null) - { - LoggerAccessor.LogInfo($"Error: Retrieving Client IP address {clientChannel.RemoteAddress} = [{ClientIP}]"); - data.ClientObject.Queue(new MediusGetMyIPResponse() - { - MessageID = getMyIpRequest.MessageID, - IP = null, - StatusCode = MediusCallbackStatus.MediusDMEError - }); - } - else - { - data.ClientObject.Queue(new MediusGetMyIPResponse() - { - MessageID = getMyIpRequest.MessageID, - IP = ClientIP, - StatusCode = MediusCallbackStatus.MediusSuccess - }); - } - - break; - } - - #endregion - - #region UpdateUserState - case MediusUpdateUserState updateUserState: - { - // ERROR - Need a session - if (data.ClientObject == null) - { - LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {updateUserState} without a session."); - break; - } - - // ERROR - Needs to be logged in --Doesn't need to be logged in on older clients - - switch (updateUserState.UserAction) - { - case MediusUserAction.KeepAlive: - { - data.ClientObject.KeepAliveUntilNextConnection(); - break; - } - case MediusUserAction.JoinedChatWorld: - { - LoggerAccessor.LogInfo($"[MAS] - Successfully Joined ChatWorld [{data.ClientObject.CurrentChannel?.Id}] {data.ClientObject.AccountId}:{data.ClientObject.AccountName}"); - break; - } - case MediusUserAction.LeftGameWorld: - { - LoggerAccessor.LogInfo($"[MAS] - Successfully Left GameWorld {data.ClientObject.AccountId}:{data.ClientObject.AccountName}"); - MediusClass.AntiCheatPlugin.mc_anticheat_event_msg_UPDATEUSERSTATE(AnticheatEventCode.anticheatLEAVEGAME, data.ClientObject.MediusWorldID, data.ClientObject.AccountId, MediusClass.AntiCheatClient, updateUserState, 256); - break; - } - case MediusUserAction.LeftPartyWorld: - { - LoggerAccessor.LogInfo($"[MAS] - Successfully Left PartyWorld {data.ClientObject.AccountId}:{data.ClientObject.AccountName}"); - break; - } - default: - { - LoggerAccessor.LogWarn($"[MAS] - Requested a non-existant UserState {data.ClientObject.AccountId}:{data.ClientObject.AccountName}, please report to GITHUB."); - break; - } - } - - break; - } - - #endregion - - default: - { - LoggerAccessor.LogWarn($"Unhandled Medius Message: {message}"); - break; - } - } - } - - #region Login - private async Task Login(MessageId messageId, IChannel clientChannel, ChannelData data, AccountDTO accountDto, bool ticket) - { - var fac = new PS2CipherFactory(); - var rsa = fac.CreateNew(CipherContext.RSA_AUTH) as PS2_RSA; - IPHostEntry host = Dns.GetHostEntry(MediusClass.Settings.NATIp ?? "natservice.pdonline.scea.com"); - - List pre108Secure = new() { 10010, 10031, 10190, 10124, 10680, 10681, 10683, 10684 }; - - if (data.ClientObject!.IP == IPAddress.Any) - data.ClientObject!.SetIp(((IPEndPoint)clientChannel.RemoteAddress).Address.ToString().Trim(new char[] { ':', 'f', '{', '}' })); - - if ((data.ApplicationId == 20371 || data.ApplicationId == 20374) && data.ClientObject.ClientHomeData != null) - { - if (data.ClientObject.IsOnRPCN && data.ClientObject.ClientHomeData.VersionAsDouble >= 01.83) - { - if (!string.IsNullOrEmpty(data.ClientObject.ClientHomeData.Type) && (data.ClientObject.ClientHomeData.Type.Contains("HDK") || data.ClientObject.ClientHomeData.Type == "Online Debug")) - _ = HomeRTMTools.SendRemoteCommand(data.ClientObject, "lc Debug.System( 'mlaaenable 0' )"); - else - _ = HomeRTMTools.SendRemoteCommand(data.ClientObject, "mlaaenable 0"); - } - /*else if (data.ClientObject.ClientHomeData.VersionAsDouble >= 01.83) // MSAA PS3 Only for now: https://github.com/RPCS3/rpcs3/issues/15719 - { - if (!string.IsNullOrEmpty(data.ClientObject.ClientHomeData?.Type) && (data.ClientObject.ClientHomeData.Type.Contains("HDK") || data.ClientObject.ClientHomeData.Type == "Online Debug")) - _ = HomeRTMTools.SendRemoteCommand(data.ClientObject, "lc Debug.System( 'msaaenable 1' )"); - else - _ = HomeRTMTools.SendRemoteCommand(data.ClientObject, "msaaenable 1"); - }*/ - - switch (data.ClientObject.ClientHomeData.Type) - { - case "HDK With Offline": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.86.09": - if (MediusClass.Settings.PokePatchOn) - { - CheatQuery(0x005478dc, 4, clientChannel); - - CheatQuery(0x0016cc6c, 4, clientChannel); - } - - CheatQuery(0x1054e5c0, 4, clientChannel); - break; - default: - break; - } - break; - case "HDK Online Only": - switch (data.ClientObject.ClientHomeData.Version) - { - default: - break; - } - break; - case "HDK Online Only (Dbg Symbols)": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.82.09": - if (MediusClass.Settings.PokePatchOn) - { - CheatQuery(0x00531370, 4, clientChannel); - - CheatQuery(0x0016b4d0, 4, clientChannel); - } - - CheatQuery(0x1053e160, 4, clientChannel); - break; - default: - break; - } - break; - case "Online Debug": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.83.12": - if (MediusClass.Settings.PokePatchOn) - { - CheatQuery(0x00548bc0, 4, clientChannel); - - CheatQuery(0x001709e0, 4, clientChannel); - } - - CheatQuery(0x1054e1c0, 4, clientChannel); - break; - case "01.86.09": - if (MediusClass.Settings.PokePatchOn) - { - CheatQuery(0x00555cb4, 4, clientChannel); - - CheatQuery(0x0016dac0, 4, clientChannel); - } - - CheatQuery(0x1054e358, 4, clientChannel); - break; - default: - break; - } - break; - case "Retail": - switch (data.ClientObject.ClientHomeData.Version) - { - case "01.86.09": - if (MediusClass.Settings.PokePatchOn) - { - CheatQuery(0x006f59b8, 4, clientChannel); - CheatQuery(0x002aa960, 4, clientChannel); - } - - CheatQuery(0x105c24c8, 4, clientChannel); - break; - default: - break; - } - break; - } - } - - await data.ClientObject.Login(accountDto); - - #region Update DB IP and CID - await HorizonServerConfiguration.Database.PostAccountIp(accountDto.AccountId, ((IPEndPoint)clientChannel.RemoteAddress).Address.MapToIPv4().ToString()); - - CIDManager.CreateCIDPair(data.ClientObject.AccountName, data.MachineId); - - if (!string.IsNullOrEmpty(data.MachineId)) - await HorizonServerConfiguration.Database.PostMachineId(data.ClientObject.AccountId, data.MachineId); - #endregion - - // Add to logged in clients - MediusClass.Manager.AddOrUpdateLoggedInClient(data.ClientObject); - - LoggerAccessor.LogInfo($"LOGGING IN AS {data.ClientObject.AccountName} with access token {data.ClientObject.AccessToken}"); - - // Tell client - if (ticket) - { - #region IF PS3 Client - data.ClientObject.Queue(new MediusTicketLoginResponse() - { - //TicketLoginResponse - MessageID = messageId, - StatusCodeTicketLogin = MediusCallbackStatus.MediusSuccess, - PasswordType = MediusPasswordType.MediusPasswordNotSet, - - //AccountLoginResponse Wrapped - MessageID2 = messageId, - StatusCodeAccountLogin = MediusCallbackStatus.MediusSuccess, - AccountID = data.ClientObject.AccountId, - AccountType = MediusAccountType.MediusMasterAccount, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = new RSA_KEY(), //MediusStarter.GlobalAuthPublic, - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() {Address = !string.IsNullOrEmpty(MediusClass.Settings.NpMLSIpOverride) ? MediusClass.Settings.NpMLSIpOverride : MediusClass.LobbyServer.IPAddress.ToString(), Port = (MediusClass.Settings.NpMLSPortOverride != -1) ? MediusClass.Settings.NpMLSPortOverride : MediusClass.LobbyServer.TCPPort , AddressType = NetAddressType.NetAddressTypeExternal}, - new NetAddress() {Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService}, - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerTCP - }, - }); - #endregion - - // Prepare for transition to lobby server - data.ClientObject.KeepAliveUntilNextConnection(); - } - else - { - #region If PS2/PSP - - if (data.ClientObject.MediusVersion > 108) - { - data.ClientObject.Queue(new MediusAccountLoginResponse() - { - MessageID = messageId, - StatusCode = MediusCallbackStatus.MediusSuccess, - AccountID = data.ClientObject.AccountId, - AccountType = MediusAccountType.MediusMasterAccount, - WorldID = data.ClientObject.CurrentChannel!.Id, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = MediusClass.GlobalAuthPublic, - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() {Address = MediusClass.LobbyServer.IPAddress.ToString(), Port = MediusClass.LobbyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal}, - new NetAddress() {Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService}, - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerTCP - }, - }); - } - else if (pre108Secure.Contains(data.ClientObject.ApplicationId)) //10683 / 10684 - { - data.ClientObject.Queue(new MediusAccountLoginResponse() - { - MessageID = messageId, - StatusCode = MediusCallbackStatus.MediusSuccess, - AccountID = data.ClientObject.AccountId, - AccountType = MediusAccountType.MediusMasterAccount, - WorldID = data.ClientObject.CurrentChannel!.Id, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = new RSA_KEY(), - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() {Address = MediusClass.LobbyServer.IPAddress.ToString(), Port = MediusClass.LobbyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal}, - new NetAddress() {Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService}, - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerTCP - }, - }); - } - else - { - data.ClientObject.Queue(new MediusAccountLoginResponse() - { - MessageID = messageId, - StatusCode = MediusCallbackStatus.MediusSuccess, - AccountID = data.ClientObject.AccountId, - AccountType = MediusAccountType.MediusMasterAccount, - WorldID = data.ClientObject.CurrentChannel!.Id, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = MediusClass.GlobalAuthPublic, //Some Older Medius games don't set a RSA Key - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() {Address = MediusClass.LobbyServer.IPAddress.ToString(), Port = MediusClass.LobbyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal}, - new NetAddress() {Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService}, - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerTCP - }, - }); - } - - // Prepare for transition to lobby server - data.ClientObject.KeepAliveUntilNextConnection(); - #endregion - } - } - #endregion - - #region AnonymousLogin - private async Task LoginAnonymous(MediusAnonymousLoginRequest anonymousLoginRequest, IChannel clientChannel, ChannelData data) - { - IPHostEntry host = Dns.GetHostEntry(MediusClass.Settings.NATIp ?? "natservice.pdonline.scea.com"); - PS2CipherFactory fac = new(); - var rsa = fac.CreateNew(CipherContext.RSA_AUTH) as PS2_RSA; - - int iAccountID = MediusClass.Manager.AnonymousAccountIDGenerator(MediusClass.Settings.AnonymousIDRangeSeed); - LoggerAccessor.LogInfo($"AnonymousIDRangeSeedGenerator AccountID returned {iAccountID}"); - - if (data.ClientObject != null) - { - char[] charsToRemove = { ':', 'f', '{', '}' }; - if (data.ClientObject.IP == IPAddress.Any) - data.ClientObject.SetIp(((IPEndPoint)clientChannel.RemoteAddress).Address.ToString().Trim(charsToRemove)); - } - - if (data.ClientObject != null) - { - CIDManager.CreateCIDPair("AnonymousClient", data.MachineId); - - // Login - await data.ClientObject.LoginAnonymous(anonymousLoginRequest, iAccountID); - - #region Update DB IP and CID - - //We don't post to the database as anonymous... This ain't it chief - - #endregion - - // Add to logged in clients - MediusClass.Manager.AddOrUpdateLoggedInClient(data.ClientObject); - - LoggerAccessor.LogInfo($"LOGGING IN ANONYMOUSLY AS {data.ClientObject.AccountDisplayName} with access token {data.ClientObject.AccessToken}"); - - // Tell client - data.ClientObject.Queue(new MediusAnonymousLoginResponse() - { - MessageID = anonymousLoginRequest.MessageID, - StatusCode = MediusCallbackStatus.MediusSuccess, - AccountID = iAccountID, - AccountType = MediusAccountType.MediusMasterAccount, - WorldID = data.ClientObject.CurrentChannel!.Id, - ConnectInfo = new NetConnectionInfo() - { - AccessKey = data.ClientObject.AccessToken, - SessionKey = data.ClientObject.SessionKey, - TargetWorldID = data.ClientObject.CurrentChannel!.Id, - ServerKey = new RSA_KEY(), // Null for 108 clients - AddressList = new NetAddressList() - { - AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] - { - new NetAddress() {Address = MediusClass.LobbyServer.IPAddress.ToString(), Port = MediusClass.LobbyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal}, - new NetAddress() {Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService}, - } - }, - Type = NetConnectionType.NetConnectionTypeClientServerTCP - } - }); - - data.ClientObject.KeepAliveUntilNextConnection(); - } - } - #endregion - - #region TimeZone - public Task GetTimeZone(DateTime time) - { - var tz = TimeZoneInfo.Local; - var tzStanName = tz.StandardName; - - if (tzStanName == "CEST") - return Task.FromResult(MediusTimeZone.MediusTimeZone_CEST); - else if (tz.Id == "Swedish Standard Time") - return Task.FromResult(MediusTimeZone.MediusTimeZone_SWEDISHST); - else if (tz.Id == "FST") - return Task.FromResult(MediusTimeZone.MediusTimeZone_FST); - else if (tz.Id == "Central Africa Time") - return Task.FromResult(MediusTimeZone.MediusTimeZone_CAT); - else if (tzStanName == "South Africa Standard Time") - return Task.FromResult(MediusTimeZone.MediusTimeZone_SAST); - else if (tz.Id == "EET") - return Task.FromResult(MediusTimeZone.MediusTimeZone_EET); - else if (tz.Id == "Israel Standard Time") - return Task.FromResult(MediusTimeZone.MediusTimeZone_ISRAELST); - - return Task.FromResult(MediusTimeZone.MediusTimeZone_GMT); - } - #endregion - - #region ConvertFromIntegerToIpAddress - /// - /// Convert from Binary Ip Address to UInt - /// - /// Binary formatted IP Address - /// - public static string ConvertFromIntegerToIpAddress(uint ipAddress) - { - byte[] bytes = BitConverter.GetBytes(ipAddress); - - if (!BitConverter.IsLittleEndian) - Array.Reverse(bytes); - - return new IPAddress(bytes).ToString(); - } - #endregion - - #region ConvertFromIntegerToPort - /// - /// Convert from Binary Ip Address to UInt - /// - /// Binary formatted IP Address - /// - public static int ConvertFromIntegerToPort(string port) - { - int i = Convert.ToInt32(port, 2); - - // flip little-endian to big-endian(network order) - /* NOT NEEDED - if (BitConverter.IsLittleEndian) - { - Array.Reverse(bytes); - } - */ - return i; - } - #endregion - - #region ConvertFromIntegerToIpAddress - /// - /// Convert from Binary Ip Address to UInt - /// - /// Binary formatted IP Address - /// - public static uint ConvertFromIpAddressToBinary(IPAddress ipAddress) - { - uint Uint = (uint)BitConverter.ToInt32(ipAddress.GetAddressBytes()); - - // flip little-endian to big-endian(network order) - /* NOT NEEDED - if (BitConverter.IsLittleEndian) - { - Array.Reverse(bytes); - } - */ - return Uint; - } - #endregion - - #region PokeEngine - - private void PokePatch(IChannel clientChannel, ChannelData data) - { - if (MediusClass.Settings.PokePatchOn) - { - if (File.Exists(Directory.GetCurrentDirectory() + $"/static/poke_config.json")) - { - try - { - JObject? jsonObject = JObject.Parse(File.ReadAllText(Directory.GetCurrentDirectory() + $"/static/poke_config.json")); - - foreach (JProperty? appProperty in jsonObject.Properties()) - { - string? appId = appProperty.Name; - - if (!string.IsNullOrEmpty(appId) && appId == data.ApplicationId.ToString()) - { - if (appProperty.Value is JObject innerObject) - { - foreach (JProperty? offsetProperty in innerObject.Properties()) - { - string? offset = offsetProperty.Name; - string? valuestr = offsetProperty.Value.ToString(); - - if (!string.IsNullOrEmpty(offset) && !string.IsNullOrEmpty(valuestr) && uint.TryParse(offset.Replace("0x", string.Empty), NumberStyles.HexNumber, null, out uint offsetValue) && uint.TryParse(valuestr, NumberStyles.Any, null, out uint hexValue)) - { - LoggerAccessor.LogInfo($"[MAS] - MemoryPoke sent to appid {appId} with infos : offset:{offset} - value:{valuestr}"); - Queue(new RT_MSG_SERVER_MEMORY_POKE() - { - start_Address = offsetValue, - Payload = BitConverter.GetBytes(hexValue), - SkipEncryption = true - - }, clientChannel); - } - else - LoggerAccessor.LogWarn($"[MAS] - MemoryPoke failed to convert json properties! Check your Json syntax."); - } - } - } - } - } - catch (Exception ex) - { - LoggerAccessor.LogWarn($"[MAS] - MemoryPoke failed to initialise! {ex}."); - } - } - else - LoggerAccessor.LogWarn($"[MAS] - No MemoryPoke config found."); - } - } - - private bool CheatQuery(uint address, int Length, IChannel? clientChannel, CheatQueryType Type = CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int SequenceId = 1) - { - // address = 0, don't read - if (address == 0) - return false; - - // client channel is null, don't read - if (clientChannel == null) - return false; - - // read client memory - Queue(new RT_MSG_SERVER_CHEAT_QUERY() - { - QueryType = Type, - SequenceId = SequenceId, - StartAddress = address, - Length = Length, - }, clientChannel); - - // return read - return true; - } - - private bool PatchHttpsSVOCheck(uint patchLocation, IChannel? clientChannel) - { - // patch location = 0, don't patch - if (patchLocation == 0) - return false; - - // client channel is null, don't patch - if (clientChannel == null) - return false; - - // poke client memory - Queue(new RT_MSG_SERVER_MEMORY_POKE() - { - start_Address = patchLocation, - Payload = new byte[] { 0x3A, 0x2F }, // We patch to :/ instead of s: as the check only compare first 6 characters. - SkipEncryption = false, - }, clientChannel); - - // return patched - return true; - } - - private bool PokeAddress(uint patchLocation, byte[] Payload, IChannel? clientChannel) - { - // patch location = 0, don't patch - if (patchLocation == 0) - return false; - - // client channel is null, don't patch - if (clientChannel == null) - return false; - - // poke client memory - Queue(new RT_MSG_SERVER_MEMORY_POKE() - { - start_Address = patchLocation, - Payload = Payload, - SkipEncryption = false, - }, clientChannel); - - // return patched - return true; - } - #endregion - - #region SHA256 - - /// - /// Compute the SHA256 checksum of a string. - /// Calcul la somme des contr�les en SHA256 d'un string. - /// - /// The input string. - /// A string. - private static string ComputeSHA256(string input) - { - // ComputeHash - returns byte array - byte[] bytes = NetHasher.DotNetHasher.ComputeSHA256(Encoding.UTF8.GetBytes(input)); - - // Convert byte array to a string - StringBuilder builder = new(); - for (int i = 0; i < bytes.Length; i++) - builder.Append(bytes[i].ToString("x2")); - - return builder.ToString(); - } - #endregion - } -} +using CustomLogger; +using DotNetty.Transport.Channels; +using EndianTools; +using Horizon.HTTPSERVICE; +using Horizon.LIBRARY.Common; +using Horizon.LIBRARY.Database.Models; +using Horizon.MUM.Models; +using Horizon.PluginManager; +using Horizon.RT.Common; +using Horizon.RT.Cryptography; +using Horizon.RT.Cryptography.RSA; +using Horizon.RT.Models; +using Horizon.SERVER.Config; +using Horizon.SERVER.Extension.PlayStationHome; +using Horizon.SERVER.PluginArgs; +using NetworkLibrary.Extension; +using Newtonsoft.Json.Linq; +using System.Buffers; +using System.Globalization; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using XI5; + +namespace Horizon.SERVER.Medius +{ + public class MAS : BaseMediusComponent + { + public override int TCPPort => MediusClass.Settings.MASPort; + public override int UDPPort => 00000; + + public static ServerSettings Settings = new(); + + public MAS() + { + + } + + public static void ReserveClient(ClientObject client) + { + MediusClass.Manager.AddClient(client); + } + + protected override async Task ProcessMessage(BaseScertMessage message, IChannel clientChannel, ChannelData data) + { + // Get ScertClient data + var scertClient = clientChannel.GetAttribute(LIBRARY.Pipeline.Constants.SCERT_CLIENT).Get(); + var enableEncryption = MediusClass.GetAppSettingsOrDefault(data.ApplicationId).EnableEncryption; + if (scertClient.CipherService != null) + scertClient.CipherService.EnableEncryption = enableEncryption; + + switch (message) + { + case RT_MSG_CLIENT_HELLO clientHello: + { + // send hello + Queue(new RT_MSG_SERVER_HELLO() { RsaPublicKey = enableEncryption ? MediusClass.Settings.DefaultKey.N : Org.BouncyCastle.Math.BigInteger.Zero }, clientChannel); + break; + } + case RT_MSG_CLIENT_CRYPTKEY_PUBLIC clientCryptKeyPublic: + { + if (clientCryptKeyPublic.PublicKey != null) + { + // generate new client session key + scertClient.CipherService?.GenerateCipher(CipherContext.RSA_AUTH, clientCryptKeyPublic.PublicKey.Reverse().ToArray()); + scertClient.CipherService?.GenerateCipher(CipherContext.RC_CLIENT_SESSION); + + Queue(new RT_MSG_SERVER_CRYPTKEY_PEER() { SessionKey = scertClient.CipherService?.GetPublicKey(CipherContext.RC_CLIENT_SESSION) }, clientChannel); + } + break; + } + case RT_MSG_CLIENT_CONNECT_TCP clientConnectTcp: + { + #region Check if AppId from Client matches Server + if (!MediusClass.Manager.IsAppIdSupported(clientConnectTcp.AppId)) + { + LoggerAccessor.LogError($"Client {clientChannel.RemoteAddress} attempting to authenticate with incompatible app id {clientConnectTcp.AppId}"); + await clientChannel.CloseAsync(); + return; + } + #endregion + + List pre108ServerComplete = new() { 10114, 10130, 10164, 10190, 10124, 10284, 10330, 10334, 10414, 10421, 10442, 10538, 10540, 10550, 10582, 10584, 10680, 10681, 10683, 10684, 10724 }; + + /// + /// Some do not post-108 so we have to account for those too! + /// tmheadon 10694 does not for initial + /// + List post108ServerComplete = new() { 10694 }; + + data.ApplicationId = clientConnectTcp.AppId; + scertClient.ApplicationID = clientConnectTcp.AppId; + + Channel? targetChannel = MediusClass.Manager.GetChannelByChannelId(clientConnectTcp.TargetWorldId, data.ApplicationId); + + if (targetChannel == null) + { + Channel DefaultChannel = MediusClass.Manager.GetOrCreateDefaultLobbyChannel(data.ApplicationId, scertClient.MediusVersion ?? 0); + + if (DefaultChannel.Id == clientConnectTcp.TargetWorldId) + targetChannel = DefaultChannel; + + if (targetChannel == null) + { + LoggerAccessor.LogError($"[MAS] - Client: {clientConnectTcp.AccessToken} tried to join, but targetted WorldId:{clientConnectTcp.TargetWorldId} doesn't exist!"); + await clientChannel.CloseAsync(); + break; + } + } + + // If booth are null, it means MAS client wants a new object. + if (!string.IsNullOrEmpty(clientConnectTcp.AccessToken) && !string.IsNullOrEmpty(clientConnectTcp.SessionKey)) + { + data.ClientObject = MediusClass.Manager.GetClientByAccessToken(clientConnectTcp.AccessToken, clientConnectTcp.AppId); + if (data.ClientObject == null) + data.ClientObject = MediusClass.Manager.GetClientBySessionKey(clientConnectTcp.SessionKey, clientConnectTcp.AppId); + + if (data.ClientObject != null) + LoggerAccessor.LogInfo($"[MAS] - Client Connected {clientChannel.RemoteAddress}!"); + else + { + data.Ignore = true; + LoggerAccessor.LogError($"[MAS] - ClientObject could not be granted for {clientChannel.RemoteAddress}: {clientConnectTcp}"); + break; + } + + data.ClientObject.MediusVersion = scertClient.MediusVersion ?? 0; + data.ClientObject.ApplicationId = clientConnectTcp.AppId; + data.ClientObject.OnConnected(); + } + else + { + LoggerAccessor.LogInfo($"[MAS] - Client Connected {clientChannel.RemoteAddress} with new ClientObject!"); + + data.ClientObject = new(scertClient.MediusVersion ?? 0) + { + ApplicationId = clientConnectTcp.AppId + }; + data.ClientObject.OnConnected(); + + ReserveClient(data.ClientObject); // ONLY RESERVE CLIENTS HERE! + } + + await data.ClientObject.JoinChannel(targetChannel); + + #region if PS3 + if (scertClient.IsPS3Client) + { + List ConnectAcceptTCPGames = new() { 20623, 20624, 21564, 21574, 21584, 21594, 22274, 22284, 22294, 22304, 20040, 20041, 20042, 20043, 20044 }; + + //CAC & Warhawk + if (ConnectAcceptTCPGames.Contains(scertClient.ApplicationID)) + { + Queue(new RT_MSG_SERVER_CONNECT_ACCEPT_TCP() + { + PlayerId = 0, + ScertId = GenerateNewScertClientId(), + PlayerCount = 0x0001, + IP = (clientChannel.RemoteAddress as IPEndPoint)?.Address + }, clientChannel); + } + else + Queue(new RT_MSG_SERVER_CONNECT_REQUIRE(), clientChannel); + } + #endregion + else if (scertClient.MediusVersion > 108 && scertClient.ApplicationID != 11484) + Queue(new RT_MSG_SERVER_CONNECT_REQUIRE(), clientChannel); + else + { + //Older Medius titles do NOT use CRYPTKEY_GAME, newer ones have this. + if (scertClient.CipherService != null && scertClient.CipherService.HasKey(CipherContext.RC_CLIENT_SESSION) && scertClient.MediusVersion >= 109) + Queue(new RT_MSG_SERVER_CRYPTKEY_GAME() { GameKey = scertClient.CipherService.GetPublicKey(CipherContext.RC_CLIENT_SESSION) }, clientChannel); + Queue(new RT_MSG_SERVER_CONNECT_ACCEPT_TCP() + { + PlayerId = 0, + ScertId = GenerateNewScertClientId(), + PlayerCount = 0x0001, + IP = (clientChannel.RemoteAddress as IPEndPoint)?.Address + }, clientChannel); + + if (pre108ServerComplete.Contains(data.ApplicationId) || post108ServerComplete.Contains(data.ApplicationId)) + Queue(new RT_MSG_SERVER_CONNECT_COMPLETE() { ClientCountAtConnect = 0x0001 }, clientChannel); + } + + if (MediusClass.Settings.HttpsSVOCheckPatcher) + { + switch (data.ApplicationId) + { + case 20371: + CheatQuery(0x10085d80, 6, clientChannel); // PS Home 1.50 Beta + break; + case 20384: + CheatQuery(0x008625b0, 6, clientChannel); // SingStar Vol3 Retail + CheatQuery(0x00b96850, 6, clientChannel); // SingStar Starter Pack + break; + case 21354: + CheatQuery(0x008625E0, 6, clientChannel); // SingStar Hits v1.00 + break; + case 21574: + CheatQuery(0x0070c068, 6, clientChannel); // Warhawk EU v1.50 + break; + case 21564: + CheatQuery(0x0070BFF8, 6, clientChannel); // Warhawk US v1.50 + break; + case 22924: + CheatQuery(0x00df0008, 6, clientChannel); // Starhawk v1.4 Retail + break; + } + } + + if (data.ApplicationId == 20371 || data.ApplicationId == 20374) + CheatQuery(0x00010000, 512000, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_SHA1_HASH, unchecked((int)0xDEADBEEF)); + + PokePatch(clientChannel, data); + + break; + } + + case RT_MSG_SERVER_CHEAT_QUERY clientCheatQuery: + { + byte[]? QueryData = clientCheatQuery.Data; + + if (QueryData != null) + { + LoggerAccessor.LogDebug($"[MAS] - QUERY CHECK - Client:{data.ClientObject?.IP} Has Data:{QueryData.ToHexString()} in offset: {clientCheatQuery.StartAddress}"); + + if (MediusClass.Settings.HttpsSVOCheckPatcher && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 6 + && QueryData.EqualsTo(new byte[] { 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A })) + PatchHttpsSVOCheck(clientCheatQuery.StartAddress + 4, clientChannel); + + if (data.ApplicationId == 20371 || data.ApplicationId == 20374) + { + if (data.ClientObject?.ClientHomeData != null) + { + switch (data.ClientObject.ClientHomeData.Type) + { + case "HDK With Offline": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.86.09": + switch (clientCheatQuery.StartAddress) + { + case 0x005478dc: + // 4096 character command line limit. + if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x83, 0x00, 0xfe })) + { + PokeAddress(0x005478dc, new byte[] { 0x2f, 0x83, 0x0f, 0xff }, clientChannel); + PokeAddress(0x00548378, new byte[] { 0x2b, 0x83, 0x0f, 0xff }, clientChannel); + } + break; + case 0x1054e5c0: + // Sets WorldCorePointer. + if (clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4) + data.ClientObject.SetWorldCorePointer(BitConverter.ToUInt32(BitConverter.IsLittleEndian ? EndianUtils.ReverseArray(QueryData) : QueryData)); + break; + case 0x0016cc6c: + // Patches out the forceInvite command. + if (MediusClass.Settings.PlaystationHomeForceInviteExploitPatch && MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x80, 0x00, 0x00 })) + PokeAddress(0x0016cc6c, new byte[] { 0x2f, 0x80, 0x00, 0x02 }, clientChannel); + break; + } + break; + default: + break; + } + break; + case "HDK Online Only": + switch (data.ClientObject.ClientHomeData.Version) + { + default: + break; + } + break; + case "HDK Online Only (Dbg Symbols)": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.82.09": + switch (clientCheatQuery.StartAddress) + { + case 0x00531370: + // 4096 character command line limit. + if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x83, 0x00, 0xfe })) + { + PokeAddress(0x00531370, new byte[] { 0x2f, 0x83, 0x0f, 0xff }, clientChannel); + PokeAddress(0x00531e08, new byte[] { 0x2b, 0x83, 0x0f, 0xff }, clientChannel); + } + break; + case 0x1053e160: + // Sets WorldCorePointer. + if (clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4) + data.ClientObject.SetWorldCorePointer(BitConverter.ToUInt32(BitConverter.IsLittleEndian ? EndianUtils.ReverseArray(QueryData) : QueryData)); + break; + case 0x0016b4d0: + // Patches out the forceInvite command. + if (MediusClass.Settings.PlaystationHomeForceInviteExploitPatch && MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x80, 0x00, 0x00 })) + PokeAddress(0x0016b4d0, new byte[] { 0x2f, 0x80, 0x00, 0x02 }, clientChannel); + break; + } + break; + default: + break; + } + break; + case "Online Debug": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.83.12": + switch (clientCheatQuery.StartAddress) + { + case 0x00548bc0: + // 4096 character command line limit. + if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x83, 0x00, 0xfe })) + { + PokeAddress(0x00548bc0, new byte[] { 0x2f, 0x83, 0x0f, 0xff }, clientChannel); + PokeAddress(0x0054964c, new byte[] { 0x2b, 0x83, 0x0f, 0xff }, clientChannel); + } + break; + case 0x1054e1c0: + // Sets WorldCorePointer. + if (clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4) + data.ClientObject.SetWorldCorePointer(BitConverter.ToUInt32(BitConverter.IsLittleEndian ? EndianUtils.ReverseArray(QueryData) : QueryData)); + break; + case 0x001709e0: + // Patches out the forceInvite command. + if (MediusClass.Settings.PlaystationHomeForceInviteExploitPatch && MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x80, 0x00, 0x00 })) + PokeAddress(0x001709e0, new byte[] { 0x2f, 0x80, 0x00, 0x02 }, clientChannel); + break; + } + break; + case "01.86.09": + switch (clientCheatQuery.StartAddress) + { + case 0x00555cb4: + // 4096 character command line limit. + if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x83, 0x00, 0xfe })) + { + PokeAddress(0x00555cb4, new byte[] { 0x2f, 0x83, 0x0f, 0xff }, clientChannel); + PokeAddress(0x00556740, new byte[] { 0x2b, 0x83, 0x0f, 0xff }, clientChannel); + } + break; + case 0x1054e358: + // Sets WorldCorePointer. + if (clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4) + data.ClientObject.SetWorldCorePointer(BitConverter.ToUInt32(BitConverter.IsLittleEndian ? EndianUtils.ReverseArray(QueryData) : QueryData)); + break; + case 0x0016dac0: + // Patches out the forceInvite command. + if (MediusClass.Settings.PlaystationHomeForceInviteExploitPatch && MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x2f, 0x80, 0x00, 0x00 })) + PokeAddress(0x0016dac0, new byte[] { 0x2f, 0x80, 0x00, 0x02 }, clientChannel); + break; + } + break; + default: + break; + } + break; + case "Retail": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.86.09": + switch (clientCheatQuery.StartAddress) + { + case 0x006f59b8: + // Grant PS Plus for 1.86 retail. + if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x54, 0x63, 0xd9, 0x7e })) + { + byte[] liPatch = new byte[] { 0x38, 0x60, 0x00, 0x01 }; + PokeAddress(0x006f59b8, liPatch, clientChannel); + PokeAddress(0x0073bdb0, liPatch, clientChannel); + } + break; + case 0x002aa960: + // Disable SSFW Reward check for 1.86 retail. + if (MediusClass.Settings.PokePatchOn && clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4 && QueryData.EqualsTo(new byte[] { 0x7c, 0x65, 0x1b, 0x78 })) + PokeAddress(0x002aa960, new byte[] { 0x48, 0x40, 0xe2, 0x2c }, clientChannel); + break; + case 0x105c24c8: + // Sets WorldCorePointer. + if (clientCheatQuery.QueryType == CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY && QueryData.Length == 4) + data.ClientObject.SetWorldCorePointer(BitConverter.ToUInt32(BitConverter.IsLittleEndian ? EndianUtils.ReverseArray(QueryData) : QueryData)); + break; + } + break; + default: + break; + } + break; + } + } + + switch (clientCheatQuery.SequenceId) + { + case int.MinValue: + if (data.ClientObject != null) + data.ClientObject.SSFWid = Encoding.ASCII.GetString(clientCheatQuery.Data); + break; + case -559038737: + switch (clientCheatQuery.StartAddress) + { + case 65536: + if (data.ClientObject != null) + { + if (data.ClientObject.ClientHomeData == null) + data.ClientObject.ClientHomeData = MediusClass.HomeOffsetsList.Where(x => !string.IsNullOrEmpty(x.Sha1Hash) && x.Sha1Hash[..^8] + .Equals(clientCheatQuery.Data.ToHexString(), StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); + + if (data.ClientObject.ClientHomeData != null) + { + switch (data.ClientObject.ClientHomeData.Type) + { + case "HDK With Offline": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.86.09": + CheatQuery(0x10244430, 36, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int.MinValue); + break; + default: + break; + } + break; + case "HDK Online Only": + switch (data.ClientObject.ClientHomeData.Version) + { + default: + break; + } + break; + case "HDK Online Only (Dbg Symbols)": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.82.09": + CheatQuery(0x10234440, 36, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int.MinValue); + break; + default: + break; + } + break; + case "Online Debug": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.83.12": + CheatQuery(0x10244439, 36, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int.MinValue); + break; + case "01.86.09": + CheatQuery(0x10244428, 36, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int.MinValue); + break; + default: + break; + } + break; + case "Retail": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.86.09": + CheatQuery(0x101555f0, 36, clientChannel, CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int.MinValue); + break; + default: + break; + } + break; + } + } + else if (!MediusClass.Settings.PlaystationHomeAllowAnyEboot) + { + string anticheatMsg = $"[SECURITY] - HOME ANTI-CHEAT - DETECTED UNKNOWN EBOOT - User:{data.ClientObject.IP + ":" + data.ClientObject.AccountName} CID:{data.MachineId}"; + + _ = data.ClientObject.CurrentChannel?.BroadcastSystemMessage(data.ClientObject.CurrentChannel.LocalClients.Where(x => x != data.ClientObject), anticheatMsg, byte.MaxValue); + + LoggerAccessor.LogError(anticheatMsg); + + await HorizonServerConfiguration.Database.BanIp(data.ClientObject.IP).ContinueWith((r) => + { + if (r.IsCompletedSuccessfully && r.Result) + { + // Banned + QueueBanMessage(data); + } + data.ClientObject.ForceDisconnect(); + _ = data.ClientObject.Logout(); + }); + } + } + break; + } + break; + } + } + } + break; + } + + case RT_MSG_CLIENT_CONNECT_READY_REQUIRE clientConnectReadyRequire: + { + if (scertClient.CipherService != null && scertClient.CipherService.HasKey(CipherContext.RC_CLIENT_SESSION) && !scertClient.IsPS3Client) + Queue(new RT_MSG_SERVER_CRYPTKEY_GAME() { GameKey = scertClient.CipherService.GetPublicKey(CipherContext.RC_CLIENT_SESSION) }, clientChannel); + Queue(new RT_MSG_SERVER_CONNECT_ACCEPT_TCP() + { + PlayerId = 0, + ScertId = GenerateNewScertClientId(), + PlayerCount = 0x0001, + IP = (clientChannel.RemoteAddress as IPEndPoint)?.Address + }, clientChannel); + break; + } + + case RT_MSG_CLIENT_CONNECT_READY_TCP clientConnectReadyTcp: + { + Queue(new RT_MSG_SERVER_CONNECT_COMPLETE() { ClientCountAtConnect = 0x0001 }, clientChannel); + + if (scertClient.MediusVersion > 108) + Queue(new RT_MSG_SERVER_ECHO(), clientChannel); + break; + } + + #region Echos + case RT_MSG_SERVER_ECHO serverEchoReply: + { + + break; + } + case RT_MSG_CLIENT_ECHO clientEcho: + { + Queue(new RT_MSG_CLIENT_ECHO() { Value = clientEcho.Value }, clientChannel); + break; + } + #endregion + + case RT_MSG_CLIENT_APP_TOSERVER clientAppToServer: + { + if (clientAppToServer.Message != null) + await ProcessMediusMessage(clientAppToServer.Message, clientChannel, data); + break; + } + + #region Client Disconnect + case RT_MSG_CLIENT_DISCONNECT _: + { + //Medius 1.08 (Used on WRC 4) haven't a state + if (scertClient.MediusVersion > 108) + data.State = ClientState.DISCONNECTED; + + await clientChannel.CloseAsync(); + + LoggerAccessor.LogInfo($"[MAS] - Client disconnected by request with no specific reason\n"); + break; + } + case RT_MSG_CLIENT_DISCONNECT_WITH_REASON clientDisconnectWithReason: + { + if (clientDisconnectWithReason.Reason <= RT_MSG_CLIENT_DISCONNECT_REASON.RT_MSG_CLIENT_DISCONNECT_LENGTH_MISMATCH) + LoggerAccessor.LogInfo($"[MAS] - Disconnected by request with reason of {clientDisconnectWithReason.Reason}\n"); + else + LoggerAccessor.LogInfo($"[MAS] - Disconnected by request with (application specified) reason of {clientDisconnectWithReason.Reason}\n"); + + data.State = ClientState.DISCONNECTED; + await clientChannel.CloseAsync(); + break; + } + #endregion + + default: + { + LoggerAccessor.LogWarn($"UNHANDLED RT MESSAGE: {message}"); + break; + } + } + + return; + } + + protected virtual async Task ProcessMediusMessage(BaseMediusMessage message, IChannel clientChannel, ChannelData data) + { + var scertClient = clientChannel.GetAttribute(LIBRARY.Pipeline.Constants.SCERT_CLIENT).Get(); + if (message == null) + return; + + var appSettings = MediusClass.GetAppSettingsOrDefault(data.ApplicationId); + + switch (message) + { + #region MGCL - Dme + + case MediusServerSessionBeginRequest serverSessionBeginRequest: + { + List nonSecure = new() { 10010, 10031 }; + + if (data.ClientObject != null) + { + // MGCL_SEND_FAILED, MGCL_UNSUCCESSFUL + if (!data.ClientObject.IsConnected) + { + data.ClientObject.Queue(new MediusServerSessionBeginResponse() + { + MessageID = serverSessionBeginRequest.MessageID, + Confirmation = MGCL_ERROR_CODE.MGCL_UNSUCCESSFUL + }); + } + else + { + IPHostEntry host = Dns.GetHostEntry(MediusClass.Settings.NATIp ?? "natservice.pdonline.scea.com"); + + data.ClientObject.LocationId = serverSessionBeginRequest.LocationID; + data.ClientObject.ServerType = serverSessionBeginRequest.ServerType; + data.ClientObject.ServerVersion = serverSessionBeginRequest.ServerVersion; + data.ClientObject.Port = serverSessionBeginRequest.Port; + data.ClientObject.SetIp(((IPEndPoint)clientChannel.RemoteAddress).Address.ToString().Trim(new char[] { ':', 'f', '{', '}' })); + data.ClientObject.BeginServerSession(); + + if (nonSecure.Contains(data.ClientObject.ApplicationId)) + { + // TM:BO Reply unencrypted + data.ClientObject.Queue(new MediusServerSessionBeginResponse() + { + MessageID = serverSessionBeginRequest.MessageID, + Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = new RSA_KEY(), + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() { Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService }, + new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerUDP + } + }); + } + else + { + // Default Reply + data.ClientObject.Queue(new MediusServerSessionBeginResponse() + { + MessageID = serverSessionBeginRequest.MessageID, + Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = MediusClass.GlobalAuthPublic, + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() { Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService }, + new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerUDP + } + }); + } + + data.ClientObject.KeepAliveUntilNextConnection(); + } + } + break; + } + + case MediusServerSessionBeginRequest1 serverSessionBeginRequest1: + { + if (data.ClientObject != null) + { + IPHostEntry host = Dns.GetHostEntry(MediusClass.Settings.NATIp ?? "natservice.pdonline.scea.com"); + + data.ClientObject.LocationId = serverSessionBeginRequest1.LocationID; + data.ClientObject.ServerType = serverSessionBeginRequest1.ServerType; + data.ClientObject.Port = serverSessionBeginRequest1.Port; + data.ClientObject.SetIp(((IPEndPoint)clientChannel.RemoteAddress).Address.ToString().Trim(new char[] { ':', 'f', '{', '}' })); + data.ClientObject.BeginServerSession(); + + LoggerAccessor.LogInfo($"[MAS] - Registered MGCL client for appid {data.ClientObject.ApplicationId} with access token {data.ClientObject.AccessToken}"); + + //Send NAT Service + data.ClientObject.Queue(new MediusServerSessionBeginResponse() + { + MessageID = serverSessionBeginRequest1.MessageID, + Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = MediusClass.GlobalAuthPublic, + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() { Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService }, + new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerUDP + } + }); + } + + break; + } + + case MediusServerSessionBeginRequest2 serverSessionBeginRequest2: + { + if (data.ClientObject != null) + { + IPHostEntry host = Dns.GetHostEntry(MediusClass.Settings.NATIp ?? "natservice.pdonline.scea.com"); + + data.ClientObject.LocationId = serverSessionBeginRequest2.LocationID; + data.ClientObject.ServerType = serverSessionBeginRequest2.ServerType; + data.ClientObject.Port = serverSessionBeginRequest2.Port; + data.ClientObject.SetIp(((IPEndPoint)clientChannel.RemoteAddress).Address.ToString().Trim(new char[] { ':', 'f', '{', '}' })); + data.ClientObject.BeginServerSession(); + + //Send NAT Service + data.ClientObject.Queue(new MediusServerSessionBeginResponse() + { + MessageID = serverSessionBeginRequest2.MessageID, + Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = MediusClass.GlobalAuthPublic, + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() { Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService }, + new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerUDP + } + }); + } + + break; + } + + case MediusServerAuthenticationRequest mgclAuthRequest: + { + List nonSecure = new() { 10010, 10031, 10190 }; + + if (data.ClientObject != null) + { + data.ClientObject.MGCL_TRUST_LEVEL = mgclAuthRequest.TrustLevel; + data.ClientObject.NetConnectionType = NetConnectionType.NetConnectionTypeClientServerTCP; + + if (mgclAuthRequest.AddressList.AddressList[0].AddressType == NetAddressType.NetAddressTypeBinaryExternal) + data.ClientObject.SetIp(ConvertFromIntegerToIpAddress(mgclAuthRequest.AddressList.AddressList[0].BinaryAddress)); + else if (mgclAuthRequest.AddressList.AddressList[0].AddressType == NetAddressType.NetAddressTypeBinaryExternalVport + || mgclAuthRequest.AddressList.AddressList[0].AddressType == NetAddressType.NetAddressTypeBinaryInternalVport) + { + data.ClientObject.SetIp(mgclAuthRequest.AddressList.AddressList[0].IPBinaryBitOne + "." + + mgclAuthRequest.AddressList.AddressList[0].IPBinaryBitTwo + "." + + mgclAuthRequest.AddressList.AddressList[0].IPBinaryBitThree + "." + + mgclAuthRequest.AddressList.AddressList[0].IPBinaryBitFour); + } + else + // NetAddressTypeExternal + data.ClientObject.SetIp(mgclAuthRequest.AddressList.AddressList[0].Address ?? "0.0.0.0"); + + if (nonSecure.Contains(data.ClientObject.ApplicationId)) + { + data.ClientObject.Queue(new MediusServerAuthenticationResponse() + { + MessageID = mgclAuthRequest.MessageID, + Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = new RSA_KEY(), + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, + new NetAddress() { AddressType = NetAddressType.NetAddressNone } + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerTCP + } + }); + + // Keep the client alive until the dme objects connects to MPS or times out + data.ClientObject.OnConnected(); + data.ClientObject.KeepAliveUntilNextConnection(); + } + else + { + data.ClientObject.Queue(new MediusServerAuthenticationResponse() + { + MessageID = mgclAuthRequest.MessageID, + Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = MediusClass.GlobalAuthPublic, + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() { Address = MediusClass.ProxyServer.IPAddress.ToString(), Port = MediusClass.ProxyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal }, + new NetAddress() { AddressType = NetAddressType.NetAddressNone }, + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerTCP + } + }); + + // Keep the client alive until the dme objects connects to MPS or times out + data.ClientObject.OnConnected(); + data.ClientObject.KeepAliveUntilNextConnection(); + } + } + + break; + } + + case MediusServerSetAttributesRequest mgclSetAttrRequest: + { + ClientObject? dmeObject = data.ClientObject; + if (dmeObject == null) + { + LoggerAccessor.LogError($"[MAS] - Non-DME Client sending MGCL messages."); + break; + } + + dmeObject.MGCL_SERVER_ATTRIBUTES = mgclSetAttrRequest.Attributes; + dmeObject.SetIpPort(mgclSetAttrRequest.ListenServerAddress); + + // Reply with success + dmeObject.Queue(new MediusServerSetAttributesResponse() + { + MessageID = mgclSetAttrRequest.MessageID, + Confirmation = MGCL_ERROR_CODE.MGCL_SUCCESS + }); + break; + } + + case MediusServerSessionEndRequest sessionEndRequest: + { + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} is trying to end server session without an Client Object"); + break; + } + + data.ClientObject.EndServerSession(); + + Queue(new RT_MSG_SERVER_APP() + { + Message = new MediusServerSessionEndResponse() + { + MessageID = sessionEndRequest.MessageID, + ErrorCode = MGCL_ERROR_CODE.MGCL_SUCCESS + } + }, clientChannel); + + break; + } + + case MediusServerReport serverReport: + { + data.ClientObject?.OnServerReport(serverReport); + break; + } + + #endregion + + #region Session + + case MediusExtendedSessionBeginRequest extendedSessionBeginRequest: + { + if (data.ClientObject != null) + { + data.ClientObject.MediusConnectionType = extendedSessionBeginRequest.ConnectionClass; + + await HorizonServerConfiguration.Database.GetServerFlags().ContinueWith((r) => + { + if (r.IsCompletedSuccessfully && r.Result != null && r.Result.MaintenanceMode != null) + { + // Ensure that maintenance is active + // Ensure that we're past the from date + // Ensure that we're before the to date (if set) + if (r.Result.MaintenanceMode.IsActive + && DateTimeUtils.GetHighPrecisionUtcTime() > r.Result.MaintenanceMode.FromDt + && (!r.Result.MaintenanceMode.ToDt.HasValue + || r.Result.MaintenanceMode.ToDt > DateTimeUtils.GetHighPrecisionUtcTime())) + QueueBanMessage(data, "Server in maintenance mode."); + else + { + // Reply + data.ClientObject.Queue(new MediusSessionBeginResponse() + { + MessageID = extendedSessionBeginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + SessionKey = data.ClientObject.SessionKey + }); + } + } + }); + } + break; + } + case MediusSessionBeginRequest sessionBeginRequest: + { + if (data.ClientObject != null) + { + data.ClientObject.MediusConnectionType = sessionBeginRequest.ConnectionClass; + + LoggerAccessor.LogInfo($"Retrieved ApplicationID {data.ClientObject.ApplicationId} from client connection"); + + await HorizonServerConfiguration.Database.GetServerFlags().ContinueWith((r) => + { + if (r.IsCompletedSuccessfully && r.Result != null && r.Result.MaintenanceMode != null) + { + #region Maintenance Mode? + // Ensure that maintenance is active + // Ensure that we're past the from date + // Ensure that we're before the to date (if set) + if (r.Result.MaintenanceMode.IsActive + && DateTimeUtils.GetHighPrecisionUtcTime() > r.Result.MaintenanceMode.FromDt + && (!r.Result.MaintenanceMode.ToDt.HasValue + || r.Result.MaintenanceMode.ToDt > DateTimeUtils.GetHighPrecisionUtcTime())) + QueueBanMessage(data, "Server in maintenance mode."); + #endregion + + #region Send Response + else + { + // Reply + data.ClientObject.Queue(new MediusSessionBeginResponse() + { + MessageID = sessionBeginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + SessionKey = data.ClientObject.SessionKey + }); + } + #endregion + } + }); + } + + break; + } + + case MediusSessionBeginRequest1 sessionBeginRequest1: + { + if (data.ClientObject != null) + { + data.ClientObject.MediusConnectionType = sessionBeginRequest1.ConnectionClass; + + LoggerAccessor.LogInfo($"Retrieved ApplicationID {data.ClientObject.ApplicationId} from client connection"); + + #region SystemMessageSingleTest Disabled? + if (MediusClass.Settings.SystemMessageSingleTest) + { + await QueueBanMessage(data, "MAS.Notification Test:\nYou have been banned from this server."); + + await data.ClientObject.Logout(); + } + #endregion + else + { + await HorizonServerConfiguration.Database.GetServerFlags().ContinueWith((r) => + { + if (r.IsCompletedSuccessfully && r.Result != null && r.Result.MaintenanceMode != null) + { + #region Maintenance Mode? + // Ensure that maintenance is active + // Ensure that we're past the from date + // Ensure that we're before the to date (if set) + if (r.Result.MaintenanceMode.IsActive + && DateTimeUtils.GetHighPrecisionUtcTime() > r.Result.MaintenanceMode.FromDt + && (!r.Result.MaintenanceMode.ToDt.HasValue + || r.Result.MaintenanceMode.ToDt > DateTimeUtils.GetHighPrecisionUtcTime())) + QueueBanMessage(data, "Server in maintenance mode."); + + #endregion + + #region Send Response + else + { + // Reply + data.ClientObject.Queue(new MediusSessionBeginResponse() + { + MessageID = sessionBeginRequest1.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + SessionKey = data.ClientObject.SessionKey + }); + } + #endregion + } + }); + } + } + break; + } + + case MediusSessionEndRequest sessionEndRequest: + { + ClientObject? clientToEnd = MediusClass.Manager.GetClientBySessionKey(sessionEndRequest.SessionKey, data.ApplicationId); + + if (clientToEnd == null) + { + LoggerAccessor.LogError($"[MAS] - INVALID OPERATION: {clientChannel} is trying to end session of a non-existing Client Object with SessionKey: {sessionEndRequest.SessionKey}"); + break; + } + + clientToEnd.OnDisconnected(); + + Queue(new RT_MSG_SERVER_APP() + { + Message = new MediusSessionEndResponse() + { + MessageID = sessionEndRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + } + }, clientChannel); + + break; + } + + #endregion + + #region Localization + + case MediusSetLocalizationParamsRequest setLocalizationParamsRequest: + { + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {setLocalizationParamsRequest} without a session."); + break; + } + + data.ClientObject.CharacterEncoding = setLocalizationParamsRequest.CharacterEncoding; + data.ClientObject.LanguageType = setLocalizationParamsRequest.Language; + + data.ClientObject.Queue(new MediusStatusResponse() + { + Type = 0xA4, + Class = setLocalizationParamsRequest.PacketClass, + MessageID = setLocalizationParamsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess + }); + break; + } + + case MediusSetLocalizationParamsRequest1 setLocalizationParamsRequest1: + { + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {setLocalizationParamsRequest1} without a session."); + break; + } + + data.ClientObject.CharacterEncoding = setLocalizationParamsRequest1.CharacterEncoding; + data.ClientObject.LanguageType = setLocalizationParamsRequest1.Language; + data.ClientObject.TimeZone = setLocalizationParamsRequest1.TimeZone; + data.ClientObject.LocationId = setLocalizationParamsRequest1.LocationID; + + data.ClientObject.Queue(new MediusStatusResponse() + { + Type = 0xA4, + Class = (NetMessageClass)1, + MessageID = setLocalizationParamsRequest1.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess + }); + break; + } + case MediusSetLocalizationParamsRequest2 setLocalizationParamsRequest2: + { + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {setLocalizationParamsRequest2} without a session."); + break; + } + + data.ClientObject.CharacterEncoding = setLocalizationParamsRequest2.CharacterEncoding; + data.ClientObject.LanguageType = setLocalizationParamsRequest2.Language; + data.ClientObject.TimeZone = setLocalizationParamsRequest2.TimeZone; + + data.ClientObject.Queue(new MediusStatusResponse() + { + Type = 0xA4, + Class = (NetMessageClass)1, + MessageID = setLocalizationParamsRequest2.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess + }); + break; + } + + #endregion + + #region Game + + case MediusGetTotalGamesRequest getTotalGamesRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getTotalGamesRequest} without a session."); + break; + } + + // ERROR -- Need to be logged in + if (!data.ClientObject.IsLoggedIn) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getTotalGamesRequest} without being logged in."); + break; + } + + data.ClientObject.Queue(new MediusGetTotalGamesResponse() + { + MessageID = getTotalGamesRequest.MessageID, + Total = 0, + StatusCode = MediusCallbackStatus.MediusRequestDenied + }); + break; + } + + #endregion + + #region Channel + + case MediusGetTotalChannelsRequest getTotalChannelsRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getTotalChannelsRequest} without a session."); + break; + } + + // ERROR -- Need to be logged in + if (!data.ClientObject.IsLoggedIn) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getTotalChannelsRequest} without being logged in."); + break; + } + + data.ClientObject.Queue(new MediusGetTotalChannelsResponse() + { + MessageID = getTotalChannelsRequest.MessageID, + Total = 0, + StatusCode = MediusCallbackStatus.MediusRequestDenied, + }); + break; + } + + case MediusSetLobbyWorldFilterRequest setLobbyWorldFilterRequest: + { + //WRC 4 Sets LobbyWorldFilter Prior to making a session. + // ERROR - Need a session + /* + if (data.ClientObject == null) + throw new InvalidOperationException($"INVALID OPERATION: {clientChannel} sent {setLobbyWorldFilterRequest} without a session."); + */ + // ERROR -- Need to be logged in + /* + if (!data.ClientObject.IsLoggedIn) + throw new InvalidOperationException($"INVALID OPERATION: {clientChannel} sent {setLobbyWorldFilterRequest} without being logged in."); + */ + /* + data.ClientObject.Queue(new MediusSetLobbyWorldFilterResponse() + { + MessageID = setLobbyWorldFilterRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusRequestDenied, + }); + */ + Queue(new RT_MSG_SERVER_APP() + { + Message = new MediusSetLobbyWorldFilterResponse() + { + MessageID = setLobbyWorldFilterRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusRequestDenied + } + }); + + break; + } + #endregion + + #region DNAS CID Check + + case MediusMachineSignaturePost machineSignaturePost: + { + if (Settings.DnasEnablePost == true) + { + //Sets the CachedPlayer's MachineId + data.MachineId = BitConverter.ToString(machineSignaturePost.MachineSignature); + + LoggerAccessor.LogInfo($"Session Key {machineSignaturePost.SessionKey} | Posting Machine signatures"); + + // Then post to the Database if logged in + if (data.ClientObject?.IsLoggedIn ?? false) + await HorizonServerConfiguration.Database.PostMachineId(data.ClientObject.AccountId, data.MachineId); + } + else + { + //DnasEnablePost set to false; + } + + break; + } + + case MediusDnasSignaturePost dnasSignaturePost: + { + if (Settings.DnasEnablePost == true) + { + //If DNAS Signature Post is the PS2/PSP/PS3 Console ID then continue + if (dnasSignaturePost.DnasSignatureType == MediusDnasCategory.DnasConsoleID) + { + data.MachineId = BitConverter.ToString(dnasSignaturePost.DnasSignature); + + LoggerAccessor.LogInfo($"Posting ConsoleID - ConsoleSigSize={dnasSignaturePost.DnasSignatureLength}"); + + // Then post to the Database if logged in + if (data.ClientObject?.IsLoggedIn ?? false) + await HorizonServerConfiguration.Database.PostMachineId(data.ClientObject.AccountId, data.MachineId); + } + + if (dnasSignaturePost.DnasSignatureType == MediusDnasCategory.DnasTitleID) + LoggerAccessor.LogInfo($"DnasSignaturePost Error - Invalid SignatureType"); + + if (dnasSignaturePost.DnasSignatureType == MediusDnasCategory.DnasDiskID) + LoggerAccessor.LogInfo($"Posting DiskID - DiskSigSize={dnasSignaturePost.DnasSignatureLength}"); + } + else + { + //DnasEnablePost false, no Post; + } + break; + } + #endregion + + #region AccessLevel (2.12) + + case MediusGetAccessLevelInfoRequest getAccessLevelInfoRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getAccessLevelInfoRequest} without a session."); + break; + } + + // ERROR -- Need to be logged in + if (!data.ClientObject.IsLoggedIn) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getAccessLevelInfoRequest} without being logged in."); + break; + } + + //int adminAccessLevel = 4; + + data.ClientObject.Queue(new MediusGetAccessLevelInfoResponse() + { + MessageID = getAccessLevelInfoRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + AccessLevel = MediusAccessLevelType.MEDIUS_ACCESSLEVEL_MODERATOR, + }); + break; + } + + #endregion + + #region Version Server + case MediusVersionServerRequest mediusVersionServerRequest: + { + List appIdBeforeSession = new() { 10442, 10724 }; + + // ERROR - Need a session + if (data.ClientObject == null && !appIdBeforeSession.Contains(data.ApplicationId)) // KILLZONE PS2 GET VERSION SERVER INFO BEFORE SESSION + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {mediusVersionServerRequest} without a session."); + break; + } + + if (Settings.MediusServerVersionOverride == true) + { + #region F1 2005 PAL + List F12005AppIds = new List { 10952, 10954 }; + // F1 2005 PAL SCES / F1 2005 PAL TCES + if (F12005AppIds.Contains(data.ApplicationId)) + { + data.ClientObject?.Queue(new MediusVersionServerResponse() + { + MessageID = mediusVersionServerRequest.MessageID, + VersionServer = "Medius Authentication Server Version 2.9.0009", + StatusCode = MediusCallbackStatus.MediusSuccess, + }); + } + #endregion + + #region Socom 1 + else if (data.ApplicationId == 10274) + { + data.ClientObject?.Queue(new MediusVersionServerResponse() + { + MessageID = mediusVersionServerRequest.MessageID, + VersionServer = "Medius Authentication Server Version 1.40.PRE8", + StatusCode = MediusCallbackStatus.MediusSuccess, + }); + } + #endregion + + #region EyeToy Chat Beta + else if (data.ApplicationId == 10550) + { + data.ClientObject?.Queue(new MediusVersionServerResponse() + { + MessageID = mediusVersionServerRequest.MessageID, + VersionServer = "Medius Authentication Server Version 1.43.0000", + StatusCode = MediusCallbackStatus.MediusSuccess, + }); + } + #endregion + + #region Killzone Beta/Retail + else if (appIdBeforeSession.Contains(data.ApplicationId)) + { + //data.ClientObject = MediusClass.LobbyServer.ReserveClient(mediusVersionServerRequest); + + data.SendQueue.Enqueue(new RT_MSG_SERVER_APP() + { + Message = new MediusVersionServerResponse() + { + MessageID = mediusVersionServerRequest.MessageID, + VersionServer = "Medius Authentication Server Version 1.50.0009", + StatusCode = MediusCallbackStatus.MediusSuccess, + } + }); + } + else + #endregion + + //Default + { + data.ClientObject?.Queue(new MediusVersionServerResponse() + { + MessageID = mediusVersionServerRequest.MessageID, + VersionServer = "Medius Authentication Server Version 3.05.201109161400", + StatusCode = MediusCallbackStatus.MediusSuccess, + }); + } + } + else + { + // If MediusServerVersionOverride is false, we send our own Version String + // AND if its Killzone PS2 we make the ClientObject BEFORE SESSIONBEGIN + if (appIdBeforeSession.Contains(data.ApplicationId)) + { + //data.ClientObject = Program.LobbyServer.ReserveClient(mediusVersionServerRequest); + data.SendQueue.Enqueue(new RT_MSG_SERVER_APP() + { + Message = new MediusVersionServerResponse() + { + MessageID = mediusVersionServerRequest.MessageID, + VersionServer = "Medius Authentication Server Version 1.50.0009", + StatusCode = MediusCallbackStatus.MediusSuccess, + } + }); + } + else + { + data.ClientObject?.Queue(new MediusVersionServerResponse() + { + MessageID = mediusVersionServerRequest.MessageID, + VersionServer = Settings.MASVersion, + StatusCode = MediusCallbackStatus.MediusSuccess, + }); + } + } + + break; + } + + #endregion + + #region Co-Locations + case MediusGetLocationsRequest getLocationsRequest: + { + // ERROR - Need a session but doesn't need to be logged in + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getLocationsRequest} without a session."); + break; + } + + LoggerAccessor.LogInfo($"Get Locations Request Received Sessionkey: {getLocationsRequest.SessionKey}"); + await HorizonServerConfiguration.Database.GetLocations(data.ClientObject.ApplicationId).ContinueWith(r => + { + LocationDTO[]? locations = r.Result; + + if (r.IsCompletedSuccessfully) + { + if (locations?.Length == 0) + { + LoggerAccessor.LogInfo("No Locations found."); + + data.ClientObject.Queue(new MediusGetLocationsResponse() + { + MessageID = getLocationsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusNoResult, + EndOfList = true + }); + } + else + { + var responses = locations?.Select(x => new MediusGetLocationsResponse() + { + MessageID = getLocationsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + LocationId = x.Id, + LocationName = x.Name + }).ToList(); + + if (responses != null) + { + LoggerAccessor.LogInfo("GetLocationsRequest success"); + LoggerAccessor.LogInfo($"NumLocations returned[{responses.Count}]"); + + responses[responses.Count - 1].EndOfList = true; + data.ClientObject.Queue(responses); + } + } + } + else + { + LoggerAccessor.LogError($"GetLocationsRequest failed [{r.Exception}]"); + + data.ClientObject.Queue(new MediusGetLocationsResponse() + { + MessageID = getLocationsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusDBError, + LocationId = -1, + LocationName = "0", + EndOfList = true + }); + } + }); + break; + } + + case MediusPickLocationRequest pickLocationRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {pickLocationRequest} without a session."); + break; + } + + data.ClientObject.LocationId = pickLocationRequest.LocationID; + + data.ClientObject.Queue(new MediusPickLocationResponse() + { + MessageID = pickLocationRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess + }); + break; + } + + #endregion + + #region Account + + case MediusAccountRegistrationRequest accountRegRequest: + { + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountRegRequest} without a session."); + break; + } + + // Check that account creation is enabled + if (appSettings.DisableAccountCreation) + { + // Reply error + data.ClientObject.Queue(new MediusAccountRegistrationResponse() + { + MessageID = accountRegRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusFail + }); + + return; + } + + // validate name + if (!MediusClass.PassTextFilter(data.ApplicationId, TextFilterContext.ACCOUNT_NAME, accountRegRequest.AccountName)) + { + data.ClientObject.Queue(new MediusAccountRegistrationResponse() + { + MessageID = accountRegRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusFail, + }); + return; + } + + await HorizonServerConfiguration.Database.CreateAccount(new CreateAccountDTO() + { + AccountName = accountRegRequest.AccountName, + AccountPassword = ComputeSHA256(accountRegRequest.Password), + MachineId = data.MachineId, + MediusStats = Convert.ToBase64String(new byte[Constants.ACCOUNTSTATS_MAXLEN]), + AppId = data.ClientObject.ApplicationId + }, clientChannel).ContinueWith((r) => + { + if (r.IsCompletedSuccessfully && r.Result != null) + { + // Reply with account id + data.ClientObject.Queue(new MediusAccountRegistrationResponse() + { + MessageID = accountRegRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + AccountID = r.Result.AccountId + }); + } + else + { + // Reply error + data.ClientObject.Queue(new MediusAccountRegistrationResponse() + { + MessageID = accountRegRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusAccountAlreadyExists + }); + } + }); + break; + } + case MediusAccountGetIDRequest accountGetIdRequest: + { + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountGetIdRequest} without a session."); + break; + } + + await HorizonServerConfiguration.Database.GetAccountByName(accountGetIdRequest.AccountName, data.ClientObject.ApplicationId).ContinueWith((r) => + { + if (r.IsCompletedSuccessfully && r.Result != null) + { + // Success + data?.ClientObject?.Queue(new MediusAccountGetIDResponse() + { + MessageID = accountGetIdRequest.MessageID, + AccountID = r.Result.AccountId, + StatusCode = MediusCallbackStatus.MediusSuccess + }); + } + else + { + // Fail + data?.ClientObject?.Queue(new MediusAccountGetIDResponse() + { + MessageID = accountGetIdRequest.MessageID, + AccountID = -1, + StatusCode = MediusCallbackStatus.MediusAccountNotFound + }); + } + }); + + break; + } + case MediusAccountDeleteRequest accountDeleteRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountDeleteRequest} without a session."); + break; + } + + // ERROR -- Need to be logged in + if (!data.ClientObject.IsLoggedIn) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountDeleteRequest} without being logged in."); + break; + } + + if (!string.IsNullOrEmpty(data.ClientObject.AccountName)) + { + await HorizonServerConfiguration.Database.DeleteAccount(data.ClientObject.AccountName, data.ClientObject.ApplicationId).ContinueWith((r) => + { + if (r.IsCompletedSuccessfully && r.Result) + { + LoggerAccessor.LogInfo($"Logging out {data?.ClientObject?.AccountName}'s account\nDeleting from Medius Server"); + + data?.ClientObject?.Logout(); + + data?.ClientObject?.Queue(new MediusAccountDeleteResponse() + { + MessageID = accountDeleteRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess + }); + } + else + { + LoggerAccessor.LogWarn($"Logout FAILED for {data?.ClientObject?.AccountName}'s account\nData still persistent on Medius Server"); + + data?.ClientObject?.Queue(new MediusAccountDeleteResponse() + { + MessageID = accountDeleteRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusDBError + }); + } + }); + } + break; + } + case MediusAnonymousLoginRequest anonymousLoginRequest: + { + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {anonymousLoginRequest} without a session."); + break; + } + + await LoginAnonymous(anonymousLoginRequest, clientChannel, data); + break; + } + case MediusAccountLoginRequest accountLoginRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountLoginRequest} without a session."); + break; + } + + await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_ACCOUNT_LOGIN_REQUEST, new OnAccountLoginRequestArgs() + { + Player = data.ClientObject, + Request = accountLoginRequest + }); + + // Check the client isn't already logged in + if (MediusClass.Manager.GetClientByAccountName(accountLoginRequest.Username, data.ClientObject.ApplicationId)?.IsLoggedIn ?? false) + { + data.ClientObject.Queue(new MediusAccountLoginResponse() + { + MessageID = accountLoginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusAccountLoggedIn + }); + } + else + { + #region SystemMessageSingleTest Disabled? + if (MediusClass.Settings.SystemMessageSingleTest != false) + { + await QueueBanMessage(data, "MAS.Notification Test:\nYou have been banned from this server."); + + await data.ClientObject.Logout(); + } + #endregion + else + { + _ = HorizonServerConfiguration.Database.GetAccountByName(accountLoginRequest.Username, data.ClientObject.ApplicationId, true).ContinueWith(async (r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result != null && data != null && data.ClientObject != null && data.ClientObject.IsConnected) + { + + if (r.Result.IsBanned) + { + // Send ban message + //await QueueBanMessage(data); + + // Account is banned + // Temporary solution is to tell the client the login failed + data?.ClientObject?.Queue(new MediusAccountLoginResponse() + { + MessageID = accountLoginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusAccountBanned + }); + + } + else if (appSettings.EnableAccountWhitelist && !appSettings.AccountIdWhitelist.Contains(r.Result.AccountId)) + { + // Account not allowed to sign in + data?.ClientObject?.Queue(new MediusAccountLoginResponse() + { + MessageID = accountLoginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusFail + }); + } + else if (MediusClass.Manager.GetClientByAccountName(accountLoginRequest.Username, data.ClientObject.ApplicationId)?.IsLoggedIn ?? false) + { + data.ClientObject.Queue(new MediusAccountLoginResponse() + { + MessageID = accountLoginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusAccountLoggedIn + }); + } + + else if (ComputeSHA256(accountLoginRequest.Password) == r.Result.AccountPassword) + await Login(accountLoginRequest.MessageID, clientChannel, data, r.Result, false); + else + { + // Incorrect password + data?.ClientObject?.Queue(new MediusAccountLoginResponse() + { + MessageID = accountLoginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusInvalidPassword + }); + } + } + else if (appSettings.CreateAccountOnNotFound) + { + // Account not found, create new and login + // Check that account creation is enabled + if (appSettings.DisableAccountCreation) + { + // Reply error + data?.ClientObject?.Queue(new MediusAccountLoginResponse() + { + MessageID = accountLoginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusFail, + }); + return; + } + + // validate name + if (data != null && !MediusClass.PassTextFilter(data.ApplicationId, TextFilterContext.ACCOUNT_NAME, accountLoginRequest.Username)) + { + data.ClientObject?.Queue(new MediusAccountLoginResponse() + { + MessageID = accountLoginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusVulgarityFound, + }); + return; + } + + await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_PRE_ACCOUNT_CREATE_ON_NOT_FOUND, new OnAccountLoginRequestArgs() + { + Player = data?.ClientObject, + Request = accountLoginRequest + }); + + if (data != null && data.ClientObject != null) + { + _ = HorizonServerConfiguration.Database.CreateAccount(new CreateAccountDTO() + { + AccountName = accountLoginRequest.Username, + AccountPassword = ComputeSHA256(accountLoginRequest.Password), + MachineId = data.MachineId, + MediusStats = Convert.ToBase64String(new byte[Constants.ACCOUNTSTATS_MAXLEN]), + AppId = data.ClientObject.ApplicationId + }, clientChannel).ContinueWith(async (r) => + { + if (r.IsCompletedSuccessfully && r.Result != null) + { + await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_POST_ACCOUNT_CREATE_ON_NOT_FOUND, new OnAccountLoginRequestArgs() + { + Player = data.ClientObject, + Request = accountLoginRequest + }); + await Login(accountLoginRequest.MessageID, clientChannel, data, r.Result, false); + } + else + { + // Reply error + data.ClientObject.Queue(new MediusAccountLoginResponse() + { + MessageID = accountLoginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusInvalidPassword + }); + } + }); + } + } + else + { + // Account not found + data?.ClientObject?.Queue(new MediusAccountLoginResponse() + { + MessageID = accountLoginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusAccountNotFound, + }); + } + }); + } + } + break; + } + + case MediusAccountUpdatePasswordRequest accountUpdatePasswordRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountUpdatePasswordRequest} without a session."); + break; + } + + // ERROR -- Need to be logged in + if (!data.ClientObject.IsLoggedIn) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountUpdatePasswordRequest} without being logged in."); + break; + } + + // Post New Password to Database + await HorizonServerConfiguration.Database.PostAccountUpdatePassword(data.ClientObject.AccountId, accountUpdatePasswordRequest.OldPassword, accountUpdatePasswordRequest.NewPassword).ContinueWith((r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result) + { + data.ClientObject.Queue(new MediusAccountUpdatePasswordStatusResponse() + { + MessageID = accountUpdatePasswordRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess + }); + } + else + { + data.ClientObject.Queue(new MediusAccountUpdatePasswordStatusResponse() + { + MessageID = accountUpdatePasswordRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusDBError + }); + } + }); + break; + } + + case MediusAccountLogoutRequest accountLogoutRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountLogoutRequest} without a session."); + break; + } + + MediusCallbackStatus result = MediusCallbackStatus.MediusFail; + + // Check token + if (data.ClientObject.IsLoggedIn && accountLogoutRequest.SessionKey == data.ClientObject.SessionKey) + { + result = MediusCallbackStatus.MediusSuccess; + + // Logout + await data.ClientObject.Logout(); + } + + data.ClientObject.Queue(new MediusAccountLogoutResponse() + { + MessageID = accountLogoutRequest.MessageID, + StatusCode = result + }); + break; + } + + case MediusAccountUpdateStatsRequest accountUpdateStatsRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountUpdateStatsRequest} without a session."); + break; + } + + // ERROR -- Need to be logged in + if (!data.ClientObject.IsLoggedIn) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {accountUpdateStatsRequest} without being logged in."); + break; + } + + await HorizonServerConfiguration.Database.PostMediusStats(data.ClientObject.AccountId, Convert.ToBase64String(accountUpdateStatsRequest.Stats)).ContinueWith((r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result) + { + data.ClientObject.Queue(new MediusAccountUpdateStatsResponse() + { + MessageID = accountUpdateStatsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess + }); + } + else + { + data.ClientObject.Queue(new MediusAccountUpdateStatsResponse() + { + MessageID = accountUpdateStatsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusDBError + }); + } + }); + break; + } + + case MediusTicketLoginRequest ticketLoginRequest: + { + // ERROR - Need a session and XI5 Ticket + if (data.ClientObject == null || ticketLoginRequest.TicketData == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {ticketLoginRequest} without a session or XI5 Ticket."); + break; + } + + // get ticket + XI5Ticket ticket = XI5Ticket.ReadFromBytes(ticketLoginRequest.TicketData); + + // setup username + string username = ticket.Username; + + // invalid ticket + if (!ticket.Valid) + { + // log to console + LoggerAccessor.LogWarn($"[MAS] - {username} tried to alter their ticket data"); + + data.ClientObject.Queue(new MediusTicketLoginResponse() + { + MessageID = ticketLoginRequest.MessageID, + StatusCodeTicketLogin = MediusCallbackStatus.MediusDBError + }); + + break; + } + + // RPCN + if (ticket.SignatureIdentifier == "RPCN") + { + data.ClientObject.IsOnRPCN = true; + username += "@RPCN"; + + // TODO: not sure if new way validates RPCN sig + if (MediusClass.Settings.ForceOfficialRPCNSignature) + { + + } + } + + // PSN + else + { + + } + + // log to console + LoggerAccessor.LogInfo($"[MAS] - {username} connected"); + + // get account + AccountDTO? account = await HorizonServerConfiguration.Database.GetAccountByName(username, data.ClientObject.ApplicationId); + + // get existing account + ClientObject? existingClient = MediusClass.Manager.GetClientByAccountName(username, data.ClientObject.ApplicationId); + + // account already logged in + if (existingClient != null && existingClient.IsLoggedIn) + { + data.ClientObject.Queue(new MediusTicketLoginResponse() + { + MessageID = ticketLoginRequest.MessageID, + StatusCodeTicketLogin = MediusCallbackStatus.MediusAccountLoggedIn + }); + + break; + } + + // account doesn't exist + if (account == null) + { + // account creation disabled + if (appSettings.DisableAccountCreation) + { + LoggerAccessor.LogError($"[MAS] - AppId {data?.ClientObject?.ApplicationId} has account creation disabled"); + + // Reply error + data?.ClientObject?.Queue(new MediusTicketLoginResponse() + { + MessageID = ticketLoginRequest.MessageID, + StatusCodeTicketLogin = MediusCallbackStatus.MediusFail, + }); + + break; + } + + // create new account + account = await HorizonServerConfiguration.Database.CreateAccount(new CreateAccountDTO() + { + AccountName = username, + AccountPassword = "UNSET", + MachineId = data.MachineId, + MediusStats = Convert.ToBase64String(new byte[Constants.ACCOUNTSTATS_MAXLEN]), + AppId = data.ClientObject.ApplicationId + }, clientChannel); + + // error creating account + if (account == null) + { + data.ClientObject.Queue(new MediusTicketLoginResponse() + { + MessageID = ticketLoginRequest.MessageID, + StatusCodeTicketLogin = MediusCallbackStatus.MediusDBError + }); + + break; + } + } + + // account is banned + if (account.IsBanned) + { + LoggerAccessor.LogWarn($"[MAS] - {username} tried to login with banned account"); + + data?.ClientObject?.Queue(new MediusTicketLoginResponse() + { + MessageID = ticketLoginRequest.MessageID, + StatusCodeTicketLogin = MediusCallbackStatus.MediusAccountBanned + }); + + break; + } + + // get home ban record + bool isHomeBanned = !MediusClass.Settings.PlaystationHomeAllowAnyEboot && + (data.ClientObject.ApplicationId == 20371 || data.ClientObject.ApplicationId == 20374) && + data.ClientObject.ClientHomeData == null; + + // account banned from home + if (isHomeBanned) + { + LoggerAccessor.LogWarn($"[MAS] - {username} tried to login while being banned from home"); + + data?.ClientObject?.Queue(new MediusTicketLoginResponse() + { + MessageID = ticketLoginRequest.MessageID, + StatusCodeTicketLogin = MediusCallbackStatus.MediusAccountBanned + }); + + break; + } + + // get client ip + string clientIp = Regex.Match(clientChannel.RemoteAddress.ToString(), @"\[(?:.*?:)?(?\d+\.\d+\.\d+\.\d+)\]").Groups["ip"].Value; + + // get ip ban record + bool isIpBanned = await HorizonServerConfiguration.Database.GetIsIpBanned(IPAddress.Parse(clientIp)); + + // ip is banned + if (isIpBanned) + { + LoggerAccessor.LogWarn($"[MAS] - {username} tried to login with banned IP {clientIp}"); + + data?.ClientObject?.Queue(new MediusTicketLoginResponse() + { + MessageID = ticketLoginRequest.MessageID, + StatusCodeTicketLogin = MediusCallbackStatus.MediusAccountBanned + }); + + break; + } + + // get cid ban record + bool isCidBanned = await HorizonServerConfiguration.Database.GetIsMacBanned(data.MachineId ?? ""); + + // cid is banned + if (isCidBanned) + { + LoggerAccessor.LogWarn($"[MAS] - {username} tried to login with banned CID {data.MachineId}"); + + data?.ClientObject?.Queue(new MediusTicketLoginResponse() + { + MessageID = ticketLoginRequest.MessageID, + StatusCodeTicketLogin = MediusCallbackStatus.MediusAccountBanned + }); + + break; + } + + // account not whitelisted + if (appSettings.EnableAccountWhitelist && + !appSettings.AccountIdWhitelist.Contains(account.AccountId)) + { + LoggerAccessor.LogError($"[MAS] - {username} tried to login without being whitelisted"); + + data?.ClientObject?.Queue(new MediusTicketLoginResponse() + { + MessageID = ticketLoginRequest.MessageID, + StatusCodeTicketLogin = MediusCallbackStatus.MediusFail + }); + + break; + } + + // login user + await Login(ticketLoginRequest.MessageID, clientChannel, data, account, true); + + break; + } + #endregion + + #region Policy / Announcements + + case MediusGetAllAnnouncementsRequest getAllAnnouncementsRequest: + { + // Send to plugins + await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_PLAYER_ON_GET_ALL_ANNOUNCEMENTS, new OnPlayerRequestArgs() + { + Player = data.ClientObject, + Request = getAllAnnouncementsRequest + }); + + await HorizonServerConfiguration.Database.GetLatestAnnouncementsList(data.ApplicationId).ContinueWith((r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result != null && r.Result.Length > 0) + { + List responses = new List(); + foreach (var result in r.Result) + { + responses.Add(new MediusGetAnnouncementsResponse() + { + MessageID = getAllAnnouncementsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + Announcement = string.IsNullOrEmpty(result.AnnouncementTitle) ? $"{result.AnnouncementBody}" : $"{result.AnnouncementTitle}\n{result.AnnouncementBody}\n", + AnnouncementID = result.Id++, + EndOfList = false + }); + } + + responses[responses.Count - 1].EndOfList = true; + data.ClientObject.Queue(responses); + } + else + { + data.ClientObject.Queue(new MediusGetAnnouncementsResponse() + { + MessageID = getAllAnnouncementsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + Announcement = "", + AnnouncementID = 0, + EndOfList = true + }); + } + }); + break; + } + + case MediusGetAnnouncementsRequest getAnnouncementsRequest: + { + // Send to plugins + await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_PLAYER_ON_GET_ANNOUNCEMENTS, new OnPlayerRequestArgs() + { + Player = data.ClientObject, + Request = getAnnouncementsRequest + }); + + await HorizonServerConfiguration.Database.GetLatestAnnouncement(data.ApplicationId).ContinueWith((r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result != null) + { + data.ClientObject.Queue(new MediusGetAnnouncementsResponse() + { + MessageID = getAnnouncementsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + Announcement = string.IsNullOrEmpty(r.Result.AnnouncementTitle) ? $"{r.Result.AnnouncementBody}" : $"{r.Result.AnnouncementTitle}\n{r.Result.AnnouncementBody}\n", + AnnouncementID = r.Result.Id++, + EndOfList = true + }); + } + else + { + data.ClientObject.Queue(new MediusGetAnnouncementsResponse() + { + MessageID = getAnnouncementsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + Announcement = "", + AnnouncementID = 0, + EndOfList = true + }); + } + }); + break; + } + + case MediusGetPolicyRequest getPolicyRequest: + { + // Send to plugins + await MediusClass.Plugins.OnEvent(PluginEvent.MEDIUS_PLAYER_ON_GET_POLICY, new OnPlayerRequestArgs() + { + Player = data.ClientObject, + Request = getPolicyRequest + }); + + switch (getPolicyRequest.Policy) + { + case MediusPolicyType.Privacy: + { + if (data.ClientObject != null) + { + await HorizonServerConfiguration.Database.GetPolicy((int)MediusPolicyType.Privacy, data.ClientObject.ApplicationId).ContinueWith((r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result != null) + { + string? txt = r.Result.EulaBody; + if (!string.IsNullOrEmpty(r.Result.EulaTitle)) + txt = r.Result.EulaTitle + "\n" + txt; + else + txt = string.Empty; + LoggerAccessor.LogInfo($"GetPolicy Succeeded:{getPolicyRequest.MessageID}"); + data.ClientObject.Queue(MediusClass.GetPolicyFromText(getPolicyRequest.MessageID, txt)); + } + else if (r.IsCompletedSuccessfully && r.Result == null) + { + LoggerAccessor.LogDebug($"Sending blank Policy since no chunks were found"); + data.ClientObject.Queue(new MediusGetPolicyResponse() { MessageID = getPolicyRequest.MessageID, StatusCode = MediusCallbackStatus.MediusSuccess, Policy = string.Empty, EndOfText = true }); + } + else + { + LoggerAccessor.LogError($"GetPolicy Failed = [{r.Exception}]"); + data.ClientObject.Queue(new MediusGetPolicyResponse() { MessageID = getPolicyRequest.MessageID, StatusCode = MediusCallbackStatus.MediusSuccess, Policy = "NONE", EndOfText = true }); + } + }); + } + break; + } + case MediusPolicyType.Usage: + { + if (data.ClientObject != null) + { + await HorizonServerConfiguration.Database.GetPolicy((int)MediusPolicyType.Usage, data.ClientObject.ApplicationId).ContinueWith((r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result != null) + { + string? txt = r.Result.EulaBody; + if (!string.IsNullOrEmpty(r.Result.EulaTitle)) + txt = r.Result.EulaTitle + "\n" + txt; + else + txt = string.Empty; + LoggerAccessor.LogInfo($"GetPolicy Succeeded:{getPolicyRequest.MessageID}"); + data.ClientObject.Queue(MediusClass.GetPolicyFromText(getPolicyRequest.MessageID, txt)); + } + else if (r.IsCompletedSuccessfully && r.Result == null) + { + LoggerAccessor.LogDebug($"Sending blank Policy since no chunks were found"); + data.ClientObject.Queue(new MediusGetPolicyResponse() { MessageID = getPolicyRequest.MessageID, StatusCode = MediusCallbackStatus.MediusSuccess, Policy = string.Empty, EndOfText = true }); + } + else + { + LoggerAccessor.LogError($"GetPolicy Failed = [{r.Exception}]"); + data.ClientObject.Queue(new MediusGetPolicyResponse() { MessageID = getPolicyRequest.MessageID, StatusCode = MediusCallbackStatus.MediusSuccess, Policy = "NONE", EndOfText = true }); + } + }); + } + break; + } + } + break; + } + + #endregion + + #region Ladders + + case MediusGetLadderStatsRequest getLadderStatsRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getLadderStatsRequest} without a session."); + break; + } + + // ERROR -- Need to be logged in + if (!data.ClientObject.IsLoggedIn) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getLadderStatsRequest} without being logged in."); + break; + } + + switch (getLadderStatsRequest.LadderType) + { + case MediusLadderType.MediusLadderTypePlayer: + { + await HorizonServerConfiguration.Database.GetAccountById(getLadderStatsRequest.AccountID_or_ClanID).ContinueWith((r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result != null && r.Result.AccountStats != null) + { + data.ClientObject.Queue(new MediusGetLadderStatsResponse() + { + MessageID = getLadderStatsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + Stats = Array.ConvertAll(r.Result.AccountStats, Convert.ToInt32) + }); + } + else + { + data.ClientObject.Queue(new MediusGetLadderStatsResponse() + { + MessageID = getLadderStatsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusDBError + }); + } + }); + break; + } + case MediusLadderType.MediusLadderTypeClan: + { + await HorizonServerConfiguration.Database.GetClanById(getLadderStatsRequest.AccountID_or_ClanID, + data.ClientObject.ApplicationId) + .ContinueWith((r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result != null && r.Result.ClanStats != null) + { + data.ClientObject.Queue(new MediusGetLadderStatsResponse() + { + MessageID = getLadderStatsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + Stats = r.Result.ClanStats + }); + } + else + { + data.ClientObject.Queue(new MediusGetLadderStatsResponse() + { + MessageID = getLadderStatsRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusDBError + }); + } + }); + break; + } + default: + { + LoggerAccessor.LogWarn($"Unhandled MediusGetLadderStatsRequest {getLadderStatsRequest}"); + break; + } + } + break; + } + + case MediusGetLadderStatsWideRequest getLadderStatsWideRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getLadderStatsWideRequest} without a session."); + break; + } + + // ERROR -- Need to be logged in + if (!data.ClientObject.IsLoggedIn) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getLadderStatsWideRequest} without being logged in."); + break; + } + + switch (getLadderStatsWideRequest.LadderType) + { + case MediusLadderType.MediusLadderTypePlayer: + { + await HorizonServerConfiguration.Database.GetAccountById(getLadderStatsWideRequest.AccountID_or_ClanID).ContinueWith((r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result != null && r.Result.AccountWideStats != null) + { + data.ClientObject.Queue(new MediusGetLadderStatsWideResponse() + { + MessageID = getLadderStatsWideRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + AccountID_or_ClanID = r.Result.AccountId, + Stats = r.Result.AccountWideStats + }); + } + else + { + data.ClientObject.Queue(new MediusGetLadderStatsWideResponse() + { + MessageID = getLadderStatsWideRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusDBError + }); + } + }); + break; + } + case MediusLadderType.MediusLadderTypeClan: + { + await HorizonServerConfiguration.Database.GetClanById(getLadderStatsWideRequest.AccountID_or_ClanID, + data.ClientObject.ApplicationId) + .ContinueWith((r) => + { + if (data == null || data.ClientObject == null || !data.ClientObject.IsConnected) + return; + + if (r.IsCompletedSuccessfully && r.Result != null && r.Result.ClanWideStats != null) + { + data.ClientObject.Queue(new MediusGetLadderStatsWideResponse() + { + MessageID = getLadderStatsWideRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + AccountID_or_ClanID = r.Result.ClanId, + Stats = r.Result.ClanWideStats + }); + } + else + { + data.ClientObject.Queue(new MediusGetLadderStatsWideResponse() + { + MessageID = getLadderStatsWideRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusDBError + }); + } + }); + break; + } + default: + { + LoggerAccessor.LogWarn($"Unhandled MediusGetLadderStatsWideRequest {getLadderStatsWideRequest}"); + break; + } + } + break; + } + + #endregion + + #region Channels + + case MediusChannelListRequest channelListRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {channelListRequest} without a session."); + break; + } + + // ERROR -- Need to be logged in + if (!data.ClientObject.IsLoggedIn) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {channelListRequest} without being logged in."); + break; + } + + List channelResponses = new List(); + + var lobbyChannels = MediusClass.Manager.GetChannelList( + data.ClientObject.ApplicationId, + channelListRequest.PageID, + channelListRequest.PageSize, + ChannelType.Lobby + ); + + foreach (var channel in lobbyChannels) + { + channelResponses.Add(new MediusChannelListResponse() + { + MessageID = channelListRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + MediusWorldID = channel.Id, + LobbyName = channel.Name, + PlayerCount = channel.PlayerCount, + EndOfList = false + }); + } + + if (channelResponses.Count == 0) + { + // Return none + data.ClientObject.Queue(new MediusChannelListResponse() + { + MessageID = channelListRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusNoResult, + EndOfList = true + }); + } + else + { + // Ensure the end of list flag is set + channelResponses[channelResponses.Count - 1].EndOfList = true; + + // Add to responses + data.ClientObject.Queue(channelResponses); + } + + + break; + } + + #endregion + + #region Deadlocked No-op Messages (MAS) + + case MediusGetBuddyList_ExtraInfoRequest getBuddyList_ExtraInfoRequest: + { + Queue(new RT_MSG_SERVER_APP() + { + Message = new MediusGetBuddyList_ExtraInfoResponse() + { + MessageID = getBuddyList_ExtraInfoRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusNoResult, + EndOfList = true + } + }, clientChannel); + break; + } + + case MediusGetIgnoreListRequest getIgnoreListRequest: + { + Queue(new RT_MSG_SERVER_APP() + { + Message = new MediusGetIgnoreListResponse() + { + MessageID = getIgnoreListRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusNoResult, + EndOfList = true + } + }, clientChannel); + break; + } + + case MediusGetMyClansRequest getMyClansRequest: + { + Queue(new RT_MSG_SERVER_APP() + { + Message = new MediusGetMyClansResponse() + { + MessageID = getMyClansRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusNoResult, + EndOfList = true + } + }, clientChannel); + break; + } + + #endregion + + #region TextFilter + + case MediusTextFilterRequest textFilterRequest: + { + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {textFilterRequest} without a session."); + break; + } + + // Deny special characters + // Also trim any whitespace + switch (textFilterRequest.TextFilterType) + { + case MediusTextFilterType.MediusTextFilterPassFail: + { + // validate name + if (!MediusClass.PassTextFilter(data.ApplicationId, Config.TextFilterContext.ACCOUNT_NAME, textFilterRequest.Text)) + { + // Failed due to special characters + data.ClientObject.Queue(new MediusTextFilterResponse() + { + MessageID = textFilterRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusFail + }); + return; + } + else + { + data.ClientObject.Queue(new MediusTextFilterResponse() + { + MessageID = textFilterRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusPass, + Text = textFilterRequest.Text.Trim() + }); + } + break; + } + case MediusTextFilterType.MediusTextFilterReplace: + { + data.ClientObject.Queue(new MediusTextFilterResponse() + { + MessageID = textFilterRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusPass, + Text = MediusClass.FilterTextFilter(data.ApplicationId, TextFilterContext.ACCOUNT_NAME, textFilterRequest.Text).Trim() + }); + break; + } + } + break; + } + + #endregion + + #region Time + case MediusGetServerTimeRequest getServerTimeRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getServerTimeRequest} without a session."); + break; + } + + //Doesn't need to be logged in to get ServerTime + + var time = DateTime.Now; + + await GetTimeZone(time).ContinueWith((r) => + { + if (r.IsCompletedSuccessfully) + { + //Fetched + data.ClientObject.Queue(new MediusGetServerTimeResponse() + { + MessageID = getServerTimeRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + Local_server_timezone = r.Result, + }); + } + else + { + //default + data.ClientObject.Queue(new MediusGetServerTimeResponse() + { + MessageID = getServerTimeRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + Local_server_timezone = MediusTimeZone.MediusTimeZone_GMT, + }); + } + }); + break; + } + #endregion + + #region GetMyIP + //Syphon Filter - The Omega Strain Beta + + case MediusGetMyIPRequest getMyIpRequest: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {getMyIpRequest} without a session."); + break; + } + + IPAddress? ClientIP = (clientChannel.RemoteAddress as IPEndPoint)?.Address; + + if (ClientIP == null) + { + LoggerAccessor.LogInfo($"Error: Retrieving Client IP address {clientChannel.RemoteAddress} = [{ClientIP}]"); + data.ClientObject.Queue(new MediusGetMyIPResponse() + { + MessageID = getMyIpRequest.MessageID, + IP = null, + StatusCode = MediusCallbackStatus.MediusDMEError + }); + } + else + { + data.ClientObject.Queue(new MediusGetMyIPResponse() + { + MessageID = getMyIpRequest.MessageID, + IP = ClientIP, + StatusCode = MediusCallbackStatus.MediusSuccess + }); + } + + break; + } + + #endregion + + #region UpdateUserState + case MediusUpdateUserState updateUserState: + { + // ERROR - Need a session + if (data.ClientObject == null) + { + LoggerAccessor.LogError($"INVALID OPERATION: {clientChannel} sent {updateUserState} without a session."); + break; + } + + // ERROR - Needs to be logged in --Doesn't need to be logged in on older clients + + switch (updateUserState.UserAction) + { + case MediusUserAction.KeepAlive: + { + data.ClientObject.KeepAliveUntilNextConnection(); + break; + } + case MediusUserAction.JoinedChatWorld: + { + LoggerAccessor.LogInfo($"[MAS] - Successfully Joined ChatWorld [{data.ClientObject.CurrentChannel?.Id}] {data.ClientObject.AccountId}:{data.ClientObject.AccountName}"); + break; + } + case MediusUserAction.LeftGameWorld: + { + LoggerAccessor.LogInfo($"[MAS] - Successfully Left GameWorld {data.ClientObject.AccountId}:{data.ClientObject.AccountName}"); + MediusClass.AntiCheatPlugin.mc_anticheat_event_msg_UPDATEUSERSTATE(AnticheatEventCode.anticheatLEAVEGAME, data.ClientObject.MediusWorldID, data.ClientObject.AccountId, MediusClass.AntiCheatClient, updateUserState, 256); + break; + } + case MediusUserAction.LeftPartyWorld: + { + LoggerAccessor.LogInfo($"[MAS] - Successfully Left PartyWorld {data.ClientObject.AccountId}:{data.ClientObject.AccountName}"); + break; + } + default: + { + LoggerAccessor.LogWarn($"[MAS] - Requested a non-existant UserState {data.ClientObject.AccountId}:{data.ClientObject.AccountName}, please report to GITHUB."); + break; + } + } + + break; + } + + #endregion + + default: + { + LoggerAccessor.LogWarn($"Unhandled Medius Message: {message}"); + break; + } + } + } + + #region Login + private async Task Login(MessageId messageId, IChannel clientChannel, ChannelData data, AccountDTO accountDto, bool ticket) + { + var fac = new PS2CipherFactory(); + var rsa = fac.CreateNew(CipherContext.RSA_AUTH) as PS2_RSA; + IPHostEntry host = Dns.GetHostEntry(MediusClass.Settings.NATIp ?? "natservice.pdonline.scea.com"); + + List pre108Secure = new() { 10010, 10031, 10190, 10124, 10680, 10681, 10683, 10684 }; + + if (data.ClientObject!.IP == IPAddress.Any) + data.ClientObject!.SetIp(((IPEndPoint)clientChannel.RemoteAddress).Address.ToString().Trim(new char[] { ':', 'f', '{', '}' })); + + if ((data.ApplicationId == 20371 || data.ApplicationId == 20374) && data.ClientObject.ClientHomeData != null) + { + if (data.ClientObject.IsOnRPCN && data.ClientObject.ClientHomeData.VersionAsDouble >= 01.83) + { + if (!string.IsNullOrEmpty(data.ClientObject.ClientHomeData.Type) && (data.ClientObject.ClientHomeData.Type.Contains("HDK") || data.ClientObject.ClientHomeData.Type == "Online Debug")) + _ = HomeRTMTools.SendRemoteCommand(data.ClientObject, "lc Debug.System( 'mlaaenable 0' )"); + else + _ = HomeRTMTools.SendRemoteCommand(data.ClientObject, "mlaaenable 0"); + } + /*else if (data.ClientObject.ClientHomeData.VersionAsDouble >= 01.83) // MSAA PS3 Only for now: https://github.com/RPCS3/rpcs3/issues/15719 + { + if (!string.IsNullOrEmpty(data.ClientObject.ClientHomeData?.Type) && (data.ClientObject.ClientHomeData.Type.Contains("HDK") || data.ClientObject.ClientHomeData.Type == "Online Debug")) + _ = HomeRTMTools.SendRemoteCommand(data.ClientObject, "lc Debug.System( 'msaaenable 1' )"); + else + _ = HomeRTMTools.SendRemoteCommand(data.ClientObject, "msaaenable 1"); + }*/ + + switch (data.ClientObject.ClientHomeData.Type) + { + case "HDK With Offline": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.86.09": + if (MediusClass.Settings.PokePatchOn) + { + CheatQuery(0x005478dc, 4, clientChannel); + + CheatQuery(0x0016cc6c, 4, clientChannel); + } + + CheatQuery(0x1054e5c0, 4, clientChannel); + break; + default: + break; + } + break; + case "HDK Online Only": + switch (data.ClientObject.ClientHomeData.Version) + { + default: + break; + } + break; + case "HDK Online Only (Dbg Symbols)": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.82.09": + if (MediusClass.Settings.PokePatchOn) + { + CheatQuery(0x00531370, 4, clientChannel); + + CheatQuery(0x0016b4d0, 4, clientChannel); + } + + CheatQuery(0x1053e160, 4, clientChannel); + break; + default: + break; + } + break; + case "Online Debug": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.83.12": + if (MediusClass.Settings.PokePatchOn) + { + CheatQuery(0x00548bc0, 4, clientChannel); + + CheatQuery(0x001709e0, 4, clientChannel); + } + + CheatQuery(0x1054e1c0, 4, clientChannel); + break; + case "01.86.09": + if (MediusClass.Settings.PokePatchOn) + { + CheatQuery(0x00555cb4, 4, clientChannel); + + CheatQuery(0x0016dac0, 4, clientChannel); + } + + CheatQuery(0x1054e358, 4, clientChannel); + break; + default: + break; + } + break; + case "Retail": + switch (data.ClientObject.ClientHomeData.Version) + { + case "01.86.09": + if (MediusClass.Settings.PokePatchOn) + { + CheatQuery(0x006f59b8, 4, clientChannel); + CheatQuery(0x002aa960, 4, clientChannel); + } + + CheatQuery(0x105c24c8, 4, clientChannel); + break; + default: + break; + } + break; + } + } + + await data.ClientObject.Login(accountDto); + + #region Update DB IP and CID + await HorizonServerConfiguration.Database.PostAccountIp(accountDto.AccountId, ((IPEndPoint)clientChannel.RemoteAddress).Address.MapToIPv4().ToString()); + + CIDManager.CreateCIDPair(data.ClientObject.AccountName, data.MachineId); + + if (!string.IsNullOrEmpty(data.MachineId)) + await HorizonServerConfiguration.Database.PostMachineId(data.ClientObject.AccountId, data.MachineId); + #endregion + + // Add to logged in clients + MediusClass.Manager.AddOrUpdateLoggedInClient(data.ClientObject); + + LoggerAccessor.LogInfo($"LOGGING IN AS {data.ClientObject.AccountName} with access token {data.ClientObject.AccessToken}"); + + // Tell client + if (ticket) + { + #region IF PS3 Client + data.ClientObject.Queue(new MediusTicketLoginResponse() + { + //TicketLoginResponse + MessageID = messageId, + StatusCodeTicketLogin = MediusCallbackStatus.MediusSuccess, + PasswordType = MediusPasswordType.MediusPasswordNotSet, + + //AccountLoginResponse Wrapped + MessageID2 = messageId, + StatusCodeAccountLogin = MediusCallbackStatus.MediusSuccess, + AccountID = data.ClientObject.AccountId, + AccountType = MediusAccountType.MediusMasterAccount, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = new RSA_KEY(), //MediusStarter.GlobalAuthPublic, + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() {Address = !string.IsNullOrEmpty(MediusClass.Settings.NpMLSIpOverride) ? MediusClass.Settings.NpMLSIpOverride : MediusClass.LobbyServer.IPAddress.ToString(), Port = (MediusClass.Settings.NpMLSPortOverride != -1) ? MediusClass.Settings.NpMLSPortOverride : MediusClass.LobbyServer.TCPPort , AddressType = NetAddressType.NetAddressTypeExternal}, + new NetAddress() {Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService}, + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerTCP + }, + }); + #endregion + + // Prepare for transition to lobby server + data.ClientObject.KeepAliveUntilNextConnection(); + } + else + { + #region If PS2/PSP + + if (data.ClientObject.MediusVersion > 108) + { + data.ClientObject.Queue(new MediusAccountLoginResponse() + { + MessageID = messageId, + StatusCode = MediusCallbackStatus.MediusSuccess, + AccountID = data.ClientObject.AccountId, + AccountType = MediusAccountType.MediusMasterAccount, + WorldID = data.ClientObject.CurrentChannel!.Id, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = MediusClass.GlobalAuthPublic, + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() {Address = MediusClass.LobbyServer.IPAddress.ToString(), Port = MediusClass.LobbyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal}, + new NetAddress() {Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService}, + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerTCP + }, + }); + } + else if (pre108Secure.Contains(data.ClientObject.ApplicationId)) //10683 / 10684 + { + data.ClientObject.Queue(new MediusAccountLoginResponse() + { + MessageID = messageId, + StatusCode = MediusCallbackStatus.MediusSuccess, + AccountID = data.ClientObject.AccountId, + AccountType = MediusAccountType.MediusMasterAccount, + WorldID = data.ClientObject.CurrentChannel!.Id, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = new RSA_KEY(), + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() {Address = MediusClass.LobbyServer.IPAddress.ToString(), Port = MediusClass.LobbyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal}, + new NetAddress() {Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService}, + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerTCP + }, + }); + } + else + { + data.ClientObject.Queue(new MediusAccountLoginResponse() + { + MessageID = messageId, + StatusCode = MediusCallbackStatus.MediusSuccess, + AccountID = data.ClientObject.AccountId, + AccountType = MediusAccountType.MediusMasterAccount, + WorldID = data.ClientObject.CurrentChannel!.Id, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = MediusClass.GlobalAuthPublic, //Some Older Medius games don't set a RSA Key + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() {Address = MediusClass.LobbyServer.IPAddress.ToString(), Port = MediusClass.LobbyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal}, + new NetAddress() {Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService}, + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerTCP + }, + }); + } + + // Prepare for transition to lobby server + data.ClientObject.KeepAliveUntilNextConnection(); + #endregion + } + } + #endregion + + #region AnonymousLogin + private async Task LoginAnonymous(MediusAnonymousLoginRequest anonymousLoginRequest, IChannel clientChannel, ChannelData data) + { + IPHostEntry host = Dns.GetHostEntry(MediusClass.Settings.NATIp ?? "natservice.pdonline.scea.com"); + PS2CipherFactory fac = new(); + var rsa = fac.CreateNew(CipherContext.RSA_AUTH) as PS2_RSA; + + int iAccountID = MediusClass.Manager.AnonymousAccountIDGenerator(MediusClass.Settings.AnonymousIDRangeSeed); + LoggerAccessor.LogInfo($"AnonymousIDRangeSeedGenerator AccountID returned {iAccountID}"); + + if (data.ClientObject != null) + { + char[] charsToRemove = { ':', 'f', '{', '}' }; + if (data.ClientObject.IP == IPAddress.Any) + data.ClientObject.SetIp(((IPEndPoint)clientChannel.RemoteAddress).Address.ToString().Trim(charsToRemove)); + } + + if (data.ClientObject != null) + { + CIDManager.CreateCIDPair("AnonymousClient", data.MachineId); + + // Login + await data.ClientObject.LoginAnonymous(anonymousLoginRequest, iAccountID); + + #region Update DB IP and CID + + //We don't post to the database as anonymous... This ain't it chief + + #endregion + + // Add to logged in clients + MediusClass.Manager.AddOrUpdateLoggedInClient(data.ClientObject); + + LoggerAccessor.LogInfo($"LOGGING IN ANONYMOUSLY AS {data.ClientObject.AccountDisplayName} with access token {data.ClientObject.AccessToken}"); + + // Tell client + data.ClientObject.Queue(new MediusAnonymousLoginResponse() + { + MessageID = anonymousLoginRequest.MessageID, + StatusCode = MediusCallbackStatus.MediusSuccess, + AccountID = iAccountID, + AccountType = MediusAccountType.MediusMasterAccount, + WorldID = data.ClientObject.CurrentChannel!.Id, + ConnectInfo = new NetConnectionInfo() + { + AccessKey = data.ClientObject.AccessToken, + SessionKey = data.ClientObject.SessionKey, + TargetWorldID = data.ClientObject.CurrentChannel!.Id, + ServerKey = new RSA_KEY(), // Null for 108 clients + AddressList = new NetAddressList() + { + AddressList = new NetAddress[Constants.NET_ADDRESS_LIST_COUNT] + { + new NetAddress() {Address = MediusClass.LobbyServer.IPAddress.ToString(), Port = MediusClass.LobbyServer.TCPPort, AddressType = NetAddressType.NetAddressTypeExternal}, + new NetAddress() {Address = host.AddressList.First().ToString(), Port = MediusClass.Settings.NATPort, AddressType = NetAddressType.NetAddressTypeNATService}, + } + }, + Type = NetConnectionType.NetConnectionTypeClientServerTCP + } + }); + + data.ClientObject.KeepAliveUntilNextConnection(); + } + } + #endregion + + #region TimeZone + public Task GetTimeZone(DateTime time) + { + var tz = TimeZoneInfo.Local; + var tzStanName = tz.StandardName; + + if (tzStanName == "CEST") + return Task.FromResult(MediusTimeZone.MediusTimeZone_CEST); + else if (tz.Id == "Swedish Standard Time") + return Task.FromResult(MediusTimeZone.MediusTimeZone_SWEDISHST); + else if (tz.Id == "FST") + return Task.FromResult(MediusTimeZone.MediusTimeZone_FST); + else if (tz.Id == "Central Africa Time") + return Task.FromResult(MediusTimeZone.MediusTimeZone_CAT); + else if (tzStanName == "South Africa Standard Time") + return Task.FromResult(MediusTimeZone.MediusTimeZone_SAST); + else if (tz.Id == "EET") + return Task.FromResult(MediusTimeZone.MediusTimeZone_EET); + else if (tz.Id == "Israel Standard Time") + return Task.FromResult(MediusTimeZone.MediusTimeZone_ISRAELST); + + return Task.FromResult(MediusTimeZone.MediusTimeZone_GMT); + } + #endregion + + #region ConvertFromIntegerToIpAddress + /// + /// Convert from Binary Ip Address to UInt + /// + /// Binary formatted IP Address + /// + public static string ConvertFromIntegerToIpAddress(uint ipAddress) + { + byte[] bytes = BitConverter.GetBytes(ipAddress); + + if (!BitConverter.IsLittleEndian) + Array.Reverse(bytes); + + return new IPAddress(bytes).ToString(); + } + #endregion + + #region ConvertFromIntegerToPort + /// + /// Convert from Binary Ip Address to UInt + /// + /// Binary formatted IP Address + /// + public static int ConvertFromIntegerToPort(string port) + { + int i = Convert.ToInt32(port, 2); + + // flip little-endian to big-endian(network order) + /* NOT NEEDED + if (BitConverter.IsLittleEndian) + { + Array.Reverse(bytes); + } + */ + return i; + } + #endregion + + #region ConvertFromIntegerToIpAddress + /// + /// Convert from Binary Ip Address to UInt + /// + /// Binary formatted IP Address + /// + public static uint ConvertFromIpAddressToBinary(IPAddress ipAddress) + { + uint Uint = (uint)BitConverter.ToInt32(ipAddress.GetAddressBytes()); + + // flip little-endian to big-endian(network order) + /* NOT NEEDED + if (BitConverter.IsLittleEndian) + { + Array.Reverse(bytes); + } + */ + return Uint; + } + #endregion + + #region PokeEngine + + private void PokePatch(IChannel clientChannel, ChannelData data) + { + if (MediusClass.Settings.PokePatchOn) + { + if (File.Exists(Directory.GetCurrentDirectory() + $"/static/poke_config.json")) + { + try + { + JObject? jsonObject = JObject.Parse(File.ReadAllText(Directory.GetCurrentDirectory() + $"/static/poke_config.json")); + + foreach (JProperty? appProperty in jsonObject.Properties()) + { + string? appId = appProperty.Name; + + if (!string.IsNullOrEmpty(appId) && appId == data.ApplicationId.ToString()) + { + if (appProperty.Value is JObject innerObject) + { + foreach (JProperty? offsetProperty in innerObject.Properties()) + { + string? offset = offsetProperty.Name; + string? valuestr = offsetProperty.Value.ToString(); + + if (!string.IsNullOrEmpty(offset) && !string.IsNullOrEmpty(valuestr) && uint.TryParse(offset.Replace("0x", string.Empty), NumberStyles.HexNumber, null, out uint offsetValue) && uint.TryParse(valuestr, NumberStyles.Any, null, out uint hexValue)) + { + LoggerAccessor.LogInfo($"[MAS] - MemoryPoke sent to appid {appId} with infos : offset:{offset} - value:{valuestr}"); + Queue(new RT_MSG_SERVER_MEMORY_POKE() + { + start_Address = offsetValue, + Payload = BitConverter.GetBytes(hexValue), + SkipEncryption = true + + }, clientChannel); + } + else + LoggerAccessor.LogWarn($"[MAS] - MemoryPoke failed to convert json properties! Check your Json syntax."); + } + } + } + } + } + catch (Exception ex) + { + LoggerAccessor.LogWarn($"[MAS] - MemoryPoke failed to initialise! {ex}."); + } + } + else + LoggerAccessor.LogWarn($"[MAS] - No MemoryPoke config found."); + } + } + + private bool CheatQuery(uint address, int Length, IChannel? clientChannel, CheatQueryType Type = CheatQueryType.DME_SERVER_CHEAT_QUERY_RAW_MEMORY, int SequenceId = 1) + { + // address = 0, don't read + if (address == 0) + return false; + + // client channel is null, don't read + if (clientChannel == null) + return false; + + // read client memory + Queue(new RT_MSG_SERVER_CHEAT_QUERY() + { + QueryType = Type, + SequenceId = SequenceId, + StartAddress = address, + Length = Length, + }, clientChannel); + + // return read + return true; + } + + private bool PatchHttpsSVOCheck(uint patchLocation, IChannel? clientChannel) + { + // patch location = 0, don't patch + if (patchLocation == 0) + return false; + + // client channel is null, don't patch + if (clientChannel == null) + return false; + + // poke client memory + Queue(new RT_MSG_SERVER_MEMORY_POKE() + { + start_Address = patchLocation, + Payload = new byte[] { 0x3A, 0x2F }, // We patch to :/ instead of s: as the check only compare first 6 characters. + SkipEncryption = false, + }, clientChannel); + + // return patched + return true; + } + + private bool PokeAddress(uint patchLocation, byte[] Payload, IChannel? clientChannel) + { + // patch location = 0, don't patch + if (patchLocation == 0) + return false; + + // client channel is null, don't patch + if (clientChannel == null) + return false; + + // poke client memory + Queue(new RT_MSG_SERVER_MEMORY_POKE() + { + start_Address = patchLocation, + Payload = Payload, + SkipEncryption = false, + }, clientChannel); + + // return patched + return true; + } + #endregion + + #region SHA256 + + /// + /// Compute the SHA256 checksum of a string. + /// Calcul la somme des contr�les en SHA256 d'un string. + /// + /// The input string. + /// A string. + private static string ComputeSHA256(string input) + { + // ComputeHash - returns byte array + byte[] bytes = NetHasher.DotNetHasher.ComputeSHA256(Encoding.UTF8.GetBytes(input)); + + // Convert byte array to a string + StringBuilder builder = new(); + for (int i = 0; i < bytes.Length; i++) + builder.Append(bytes[i].ToString("x2")); + + return builder.ToString(); + } + #endregion + } +} From ef6bd423b055dc11ad5d40e43cfeb1eebb934967 Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 10:46:12 -0400 Subject: [PATCH 04/14] Delete BackendServices/CastleLibrary/XI5/obj directory Did not mean to add this initially --- .../XI5/obj/Debug/net6.0/XI5.AssemblyInfo.cs | 24 - .../Debug/net6.0/XI5.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 17 - .../XI5/obj/Debug/net6.0/XI5.assets.cache | Bin 14520 -> 0 bytes .../net6.0/XI5.csproj.AssemblyReference.cache | Bin 14099 -> 0 bytes .../obj/Debug/net6.0/XI5.csproj.CopyComplete | 0 .../net6.0/XI5.csproj.CoreCompileInputs.cache | 1 - .../net6.0/XI5.csproj.FileListAbsolute.txt | 38 - .../XI5/obj/Debug/net6.0/XI5.csproj.Up2Date | 0 .../XI5/obj/Debug/net6.0/XI5.dll | Bin 13312 -> 0 bytes .../XI5/obj/Debug/net6.0/XI5.pdb | Bin 14092 -> 0 bytes .../XI5/obj/Debug/net6.0/ref/XI5.dll | Bin 6144 -> 0 bytes .../XI5/obj/Debug/net6.0/refint/XI5.dll | Bin 6144 -> 0 bytes .../obj/Release/net6.0/XI5.AssemblyInfo.cs | 24 - .../net6.0/XI5.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 17 - .../XI5/obj/Release/net6.0/XI5.assets.cache | Bin 14520 -> 0 bytes .../net6.0/XI5.csproj.AssemblyReference.cache | Bin 14111 -> 0 bytes .../Release/net6.0/XI5.csproj.CopyComplete | 0 .../net6.0/XI5.csproj.CoreCompileInputs.cache | 1 - .../net6.0/XI5.csproj.FileListAbsolute.txt | 19 - .../XI5/obj/Release/net6.0/XI5.dll | Bin 12800 -> 0 bytes .../XI5/obj/Release/net6.0/XI5.pdb | Bin 13528 -> 0 bytes .../XI5/obj/Release/net6.0/ref/XI5.dll | Bin 6144 -> 0 bytes .../XI5/obj/Release/net6.0/refint/XI5.dll | Bin 6144 -> 0 bytes .../XI5/obj/XI5.csproj.nuget.dgspec.json | 335 ----- .../XI5/obj/XI5.csproj.nuget.g.props | 23 - .../XI5/obj/XI5.csproj.nuget.g.targets | 9 - .../CastleLibrary/XI5/obj/project.assets.json | 1230 ----------------- .../CastleLibrary/XI5/obj/project.nuget.cache | 29 - 30 files changed, 1769 deletions(-) delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfo.cs delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfoInputs.cache delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.assets.cache delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.AssemblyReference.cache delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CopyComplete delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CoreCompileInputs.cache delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.FileListAbsolute.txt delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.Up2Date delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.dll delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.pdb delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/ref/XI5.dll delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/refint/XI5.dll delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfo.cs delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfoInputs.cache delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.assets.cache delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.AssemblyReference.cache delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.CopyComplete delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.CoreCompileInputs.cache delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.FileListAbsolute.txt delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.dll delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.pdb delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/ref/XI5.dll delete mode 100644 BackendServices/CastleLibrary/XI5/obj/Release/net6.0/refint/XI5.dll delete mode 100644 BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.dgspec.json delete mode 100644 BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.props delete mode 100644 BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.targets delete mode 100644 BackendServices/CastleLibrary/XI5/obj/project.assets.json delete mode 100644 BackendServices/CastleLibrary/XI5/obj/project.nuget.cache diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfo.cs b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfo.cs deleted file mode 100644 index aa70e6d89..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfo.cs +++ /dev/null @@ -1,24 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyMetadata("IsTrimmable", "True")] -[assembly: System.Reflection.AssemblyCompanyAttribute("XI5")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] -[assembly: System.Reflection.AssemblyProductAttribute("XI5")] -[assembly: System.Reflection.AssemblyTitleAttribute("XI5")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfoInputs.cache b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfoInputs.cache deleted file mode 100644 index 4e6f2fadb..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -267b49fed0d3c9b3cb7bb2e5d97c480ea83ca5e30a57302b958adc3bb5e5f5f5 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index dfa4ce073..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,17 +0,0 @@ -is_global = true -build_property.EnableAotAnalyzer = -build_property.EnableSingleFileAnalyzer = -build_property.EnableTrimAnalyzer = true -build_property.IncludeAllContentForSelfExtract = -build_property.TargetFramework = net6.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = XI5 -build_property.ProjectDir = C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.assets.cache b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.assets.cache deleted file mode 100644 index 0f72cc85376ec0d1a463616fdf35baeb0c83fff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14520 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 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CopyComplete b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CopyComplete deleted file mode 100644 index e69de29bb..000000000 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CoreCompileInputs.cache b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CoreCompileInputs.cache deleted file mode 100644 index da368760f..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -99cd161f66b00417da097ceeaebe58348b1192b89971fd4516cfb5f29b12bcd4 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.FileListAbsolute.txt b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.FileListAbsolute.txt deleted file mode 100644 index fafba24d5..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,38 +0,0 @@ -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\XI5.deps.json -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\XI5.dll -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\XI5.pdb -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\CastleLibrary.dll -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\CustomLogger.dll -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\EndianTools.dll -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\CastleLibrary.pdb -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\CustomLogger.pdb -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\bin\Debug\net6.0\EndianTools.pdb -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.AssemblyReference.cache -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.GeneratedMSBuildEditorConfig.editorconfig -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.AssemblyInfoInputs.cache -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.AssemblyInfo.cs -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.CoreCompileInputs.cache -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.Up2Date -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.dll -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\refint\XI5.dll -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\XI5.pdb -C:\Users\Mack\Downloads\MultiServer3-NextGenHorizon\BackendServices\XI5\obj\Debug\net6.0\ref\XI5.dll -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\XI5.deps.json -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\XI5.dll -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\XI5.pdb -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\CastleLibrary.dll -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\CustomLogger.dll -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\EndianTools.dll -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\CastleLibrary.pdb -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\CustomLogger.pdb -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\bin\Debug\net6.0\EndianTools.pdb -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.AssemblyReference.cache -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.GeneratedMSBuildEditorConfig.editorconfig -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.AssemblyInfoInputs.cache -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.AssemblyInfo.cs -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.CoreCompileInputs.cache -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.csproj.CopyComplete -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.dll -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\refint\XI5.dll -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\XI5.pdb -C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\obj\Debug\net6.0\ref\XI5.dll diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.Up2Date b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.csproj.Up2Date deleted file mode 100644 index e69de29bb..000000000 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.dll b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.dll deleted file mode 100644 index 8c5aceec357d9ce878b6890ce18207dede436182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13312 zcmeHN3vgU#bw2;y-MbH2vUX+5!q1guJBwv+^okQF@k3906Iqfi$##NMX{EiAuf5t` z-@B3}yEZc5%w$p+QUWAxCUpZ-V1`Gafd(2%Oq;|&cmxsx!wi@GTz{&MZWQPYm*tn9dzoQRGlGns5YI$}hv$xPJDL_2!>qZ8Sb5ic(fZE#KZ zbrN+e4_z29|Cd5pOf?W~0Y`VZBX{5##XXFhs8Vpv@tYa!zg!mp!RO0E!{=F* z|Ia;Ll3BPaVYio&VWP`!J0^?QEYT7W%MwHbMdt5;M2P|=Y5~xDOXzssn9hSfx)}g6 z8S8@n!5)rVwlxZ|_%;lL2O7s+a_z=+#VsS9g(CY(v$)w-6Yi30H&I&&DQE}B6&L%a zk&n9J&!x3QO1OVGsA}+vduSh~m2Z#2Qb^OQS7tE>p-pGQfMxzIemw?-deW<7Rp2bC zrvUmbw1w+oT3c+p_PTACEpF@Kwl&4JHP>ysytJ*4+A&mwHcZ;Gs|p@^tC!TbREO%< zljia2hkg28VyQe>eN|O?!(LIS(u0RXr2DRVt9)VK))!Ye1F358P&4fL*q()f=Im

~HfK!@lp~bbZ(X~+RScvhOB34 ztRCw27JyTl9z$?+!m^S%co|QO68Y_6PxUhq%#*mQhqTj7$fT6{S01a*ZiR(SnxA{u zW5_3+K){k7L+S{Dj&vJkC=^4gEZ`tDgabeH7_vYJnACZ#3n6x~0OurF8gmjX2qC0L zq>PTfIAfM*0mmgI02Bf-L{L8iqu$LJqmNEwj93mBV+>iQN1Jg;be9CMT+8c+wbQI@ z-w0bFJ==iCB+O&EFT3iIDZf?Lq!W)=Bjo<-EQ)9-e-kfHtm%+{#R5jQ1>Ev_wogI! z!%NS>4@8aqz{Kbw-6LKgh1($gw+$jrG2i{?F8=cD(YSNZl(PQljC#Sqt)KknUuRn(RBR%de;W`~{ z$5>y6xR9Tk`!)#dxfA+8`h(KBWPHTZMqIT4oKUphi`wHp1d%I-!#^K85- zO4u1+PbuVOx3D?tqCM2ER_*h2rR6b}1iuK)w(2 zKSRstM)K5F(hhL8(;86wXV=k-YX9tvzH2#0Q+06m-JxFqY6Abw$N0AdzRkmU zPWXofjs$+8w$YF2m#P}?8vg;P0Q;gm_V>`$;A^n_7cTWZpHI{1l1r6`$}|soYaPvQ zJ*;_YK&S_5{yeZs3(&iSx;OAk{ZX8M{#vMW0o`8->iw=P23e3k?8=(;N>HD4Wp7vO zv=DvPmHm~f1NE#cdq%~yGWv=u`&3=zFg0CxJ##KXzp&)oofi{lb;K zMePFh8&`IZdXy?it>+P)3mn6&S5Qc(djsEvpGzs?%C5lArL@YGeHOAxs&i$RAgiP; zuB;U{!_?x+dSNq6J6zdEg6p&hb-J=AgLR;KT-gE7qf|u)U0Kpo32NAp)l3B*Lbkn9 zCw`Ji9ollbw1KI61Fz8?S~d0Y7EKROji(3H1}-$9zN31y8v3zI?Fk*yR?@Frst?pE z(r|8I&ECKvZ8a@*sk=d~q17&R4>Z@(MwdDYY8^GW)aQMFrbX!?m*VWHrRQBL=SgYn zX$jsUxChRqI@;}0A4R(j^g*GXrBC}F#TkPS_Ry4E+DI)z-HWj+$aVeqqK(FxI^NjOSi;1)7Sk&_kYw)d|VY7sTfv zvgm^0z67z0!-6a0CV($isEE^ zpB8sv6}6%+O~M}q+%0z61r7_G z75F|nj$WP?c+rJ6J?ObC`1f7N98#>QT*#cL;I%Gf&The5UC5ka!ILgz&aB|)T*#aY zg8!`xne(*Z7hTAl%YuL3h0GyM{Ba?3qJr1DkU6^r9~L+(@Pfdn1zr|N9<~z|xLe?` zz*&J81YY)>#wpZZFfPbcU;`VReuVrrL~QupI~FcvjlwsRWM%{s$JRUYs~H4XT) z0KOP!&7HXYDjpF+1!6-ba)vYv0-@yGc z?rmz2Zo?XCWfh{^cWxgVy18knfo?xwBva0jd*_JDJDj*_=wRo8A(j{L<`TSx+p&dh zw-hY2nVFROuo5^+Ore6$-L3Ox3#IM#bs}6VZ$!bxQ)h*{LtV) z*DdTM-M%lInoJuzsk6PqP9ErM?-6;wIi4|6Z8N=NW9F!tOpBm@#?BiP@kB38CDW6} z&=3uc!OOO6YNjKZPg07(?K?*u3x+jijv9#++32soNOAAInY5WHh>C>xWgC{;WY9sG zo3QQ4BELxR)Q~ZqGe+}9idu6yBa`aNS`*1U)5Ug<1JWu*+@{Mk(kZ&V=+e&PLql!J z(c^fnazzD~7E2tb7V`^ET}P6-4&UlYP8f@2a1AkE%&jlsKc;|I14&6quCUvFLjv!#mSHX zOGY>mj!$Bw^LpS?Vy1<8z(^;j1+y1>&}X57jOG^$ z*g!HfGbeE8QTTat#7vv{5^38ELeCj+kc*2`Vo34`3v)p##NENLWUfM^#5o04c=Ky6 z?J@Et!olt=nmQ%4+Z?e_o#TUfGi}HBChen(tL(mH{-`+DZDhuQ_8Z1=p`E2#sBu`e z#VpMuchcfXYdXypIG)0DQT^^k+3L5^467!QLGgx{Msk9X3R!E$C2WVs(Mg~LyU{>& zCMPIicbj>nS7#<=CNtucQzyhJ7iE8YEpyy-6r6$~3NFf~=amZ)&gT@CqcN67%|)_M zB7>d4Oz~>$oE|lD!bJKeCUR+G!pLCl%;Wb@=5kqU9v5!+jyc1eQ*E`zC%O3?rvsI0 zG>?dIPA`sPyET)`XNw8Ynn|^%jif~|j2z(Eb zHgg>Nsez)wm92pG7Y!Xf z9kR{LWAUL%u`JHR1C)mw>JBqGp2^yIbJV6TD?2fmF{imQ?laSA(>6x4nUuY7X*lba z>#=OWwp;%Y25j|)EeYaQewpI}e#kQO22z#RVbN%b1Mzk=Z$%-Qu}#McXNOG_P?q#8 zRw?^>^AmR>a(y`tM5u{~hE0ifGlx)@a5~%jCP&id=$*z)36~Ss*{@_YE{d??z$A;R zcjOo{M?&wSSc^_#^EM(o4URcDr68S6N0CocG>T)EOZFc{))oTI$srFA`2^n&ZpqaDFwSc2t49QA~U4oXF*8a5g=c*h+{yfQMwb7yNY^SaS#vTqeLgQ&`H2n$o4`fiQ%x}iE2!s^%Sh6;eQJHc|1qqn*l5ei2=`S z@Uqam6&zYR2+Mck?xjP3wBj)0cM}c4vrc$E1iy#i&tiV_b@)x-c9;)4OGn^c z3ivd70Q_ZbrpDRZT?a@6_6C-o_aC(iR z=OkM5JtGpa{KjipzNY57F0?geG|r4>;e!PaIWmaJ#wg-7BV*)Pj6s&gxTA}Z$rB~zjVcxJ z0fd(`TH%Xossa#<1j98Iy5F;vd~wI6+Hk=chU{K3dQ!Jwvv2SZvoDc$;@P=W6v z6%`dap}|KgyjY8a;NmwM54d2%(=|SJI1tbq;F5S0gjb;e`y9C^au2!)g~GEJ_2uFH zDm=)ht0?IAMa;;ArfI$?MP{GDN0>Ff)o?5_`vPJC*0;-|9t{>|zm5Opet)?UV&GH@pcqgigH{cnnHAx4lIBH_@#7Z0 zPdZbm;EBx+|HNDKEqesk;4#)M#GF^8(CKZhAfD>f`{gEB`z^O%cu&ema zqY&yKr$jIiCC9TMCnM0S7(4@P!CSMzydRDnAf zh`IJal;PIA3PZvt*8mIwmCW^IGsUy&z)^nDRM7LYKL7Am6YuF9XwO;( zUSYSm?=Cy0w#6G@pki6^MXD~>&~l6pzv`+cTWDg^M(*~kBf;^XztBCH1{@L zKL1k>J23A$yyTJlNbT#xeA7AHM-#a5S5JkD)$zwf#6P-Rf$U0&jCCp*lw1e;JNi>E zy(@I+i;2DG-#oPWw^y5**+%=VNBA3zePkcL*c|CF?Bn@t?#MnI#!Vi9VKr~tz02N;je(WO}7??xTo5OSd-o!*D9IXFL$ zA~6hkJ7no=8)0K%I7&_Z3I9J60VNZKza*KR?~?OZ9ax5o_^h`V_u*lpxA9_eueWLV zyEq&p`*GNF4wL=ZuzRsR4&m8@BX6&0e%AZ*tEhRv`R2=c;;(w-;-Xt(R(KtN3RaUi zKy+ct=A&K$oB9|wc)m8^t2oL8q)BjX$ocr?9128%9{0Y2ZWO%ZLy~jATx{uS(P_ZJ z)%n+gqZVR7G1yl)s`EiBCwcw~>p@heOoI#JxW zh}~Y7&(UG+!Z?`XgY~uS^LYEvE{i_-wJBfXO+lai#_qI0Z{cX?##->F7185^;RI$O k4X>lffYQV3;`qSDKV82o0=u2Ri%RhyP5tTme;0xO0U7Ps$p8QV diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.pdb b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/XI5.pdb deleted file mode 100644 index ae1184514630d388ecc245e0f460c84b437f99bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14092 zcma)D2V4`$_uq}7DcD5?Q3OFyh%^;F^dN=aL9qgXED%Y-B$Rl{1yMm%1Qk>)2v$Hv z6cu|r_4I6K7w^u~Q_q5@VsH3=vjqY~e}DMQX5Y^HzW3(Mo7p$ByW9wWE{@?C`ZIw6e{fDU604@K%pvVWGEwOV z1?lMtg#cDLpx40f7Wg&7am);7VIlAv3%@vKH3Y}RPzs^!8^XeR4`pG`puC3i2@1;r zP*A!;=?$en6dNcGP+XymhT;Xq7fJ|}@ld8h5kX0YqJW}?qJfeFB_B!=6eCBdgHi(p z=diFKDC3|^g+f4)LP>=(3(6iSccGXJV`1)4ri16HKNfZ!=)Z>HSO;heoMTY@pe6J@P%G^?>dM=T=bk;9sAvcLf^x-hif|>*2hGHiUCjwCjzuXjBIw z(5k+Z7LDpr3~1v~3@|jR@2o{5-CeY3RNqyLM)jy2+W78TG^+2RMI$_l6^0+x_tK(K zy{Q(B>U(R^sJ@RDjp|YSGV)NpnHG)e&9!J$k7AbLNA(t3G^+0p{lV0yLN_ur;*|kC z0O~u^{c{7ZSpscB(?0<{5a=#6eHv&hpu5v_9njW5_o8Xk7lYc+Hf?CzHuPXE8rf^t zhPKzDCqexXpnKE$Y=9mLbRU{VW7q-czFPH;K%3F@WT@u=-H)bK(0*s2Eod5zeU~;g zT*7`thgQe&KzG2VlGlUCV<;SP@CF(|)O_PjUP1lK!cf#=*hnZiSd9K6$aBQWjJEby zz&zkjgd;O?p)1 z9UPwwJ=#GJd+YEw9H%*AY&~qfqa_?)IC{d-gJY?uhi!tRKDLA73Fq~kSUBnp)4hE{X@o*4mdh|DF&&Fb z6-z{f0uvGOa`YRQnveiL6ckHQU{WO}QepCh1SO%uK$3_jPnD@Ku`C051jh9x``o&2 zJ-9gw(mT&xzSZ=7T-cAN46bx5h`^49tY?+!H8kzMv@qMhxZXQ%&VhiNhCV@=GNUPh z+v|Vpx__F=WJ`EV>dC^xg4#OEqUjI94+UbpO`a^d-{x$m>mh#Xzc3bWwB9%+n9L3m z#wQ!_31zZMo?;V}Dp83e2n968)iIdJQ27utU%5g&LoRa+bqRI!7H1HmE?j^RG7;hv z#}mp96a0qvpu8Z+P!TfZ1|=t6X*30AckI%8Oi-9*LXgdqW zUMje^$EB(WWMkK6U1v1sHCHtCmTxBI;1N?UhZT$}eOzOHJGSBayoP%V{d#4dTJq_5 z+0l$1U~020KUspjy_BpUEH(4O9Jo>PSsfRw_B^u5s>8KSivB%I{C6DB@)>;T_}e*I z|1t66g2l_FDPjqsaAYpIaojmhjw3lPuER&VaGZyZj2k(8l)H0$f@_>;xQkPq`v@Z5 zjSx9G5%JE$N5s3w#k;u^ZbTd=5y}!%g^2{lv&NM2R7E`Dm;jO;yafQS`KiB?vRav9|WnHFP5bDcA~Dk2iZG6IVX_u>g0_yX=Y9|!0wR7S)& zp&wpIxWFqk6rB!_af%5EkMV&Ek%DlVr_B|b-MJlWbA_{Rgv+-OE-~Lkxabz;`Ylne ztwdp)s(C`CN8B06Ge z=(&D{%d_=0SrTt?VxokgnIfYOZNiQkVC#FF?l-~XD0k8A6ZHX4PCgA1$1CJYd4h_= zi%1eGQfT(BwNDRX8kpT(t0!1XeS_y>2bOQ_dcS82yVl6($z=)R#8d?tK^(6*rAi@; zN72Ms7~aGBA7tV9{0=uBjI$3ZuA7g?yqo^){~?VFq1)_}d(n?KV1Hv+MrQWx(xl3O z!?J-2yQee^}WbtZ0*))P| zkgmoRq)AR;o;Y^G;`q%aX63xRNe%OSZ-jqs=dy2VTJmyU-rYBaWnD{d{+de z{c~^IN|XwWba;KhQoWj2r0O%^-`@?IbV5U521C)-su@}VN{PG}Z+;j>VN*9BnW$PA zxN0LeEqnB7{&z)E&__jfbCFXEdgMRycD(4fesl4*rGlzNozPGPOs6Vw8r*LvwDZe# zr%=?LDDEojRNa|Zt?#k7N6Z#Y3wpd*nJScUg-UTeG(y1)+6Pa@yu>VVtk?MHN!!A@ z1@6i?HE8vJ>m79iDP=(kd8KINS~;%BsDEWA$P=)K7cHOiq6HHrmbtoc+F6+}D(Dsh zCXAN0@v4{7e~QOT&WVuL_&p#=G?&}1=YL;ugkN=xM@5&Er5}a?nkBCq! zRfLoSc>%Z}f9nfI846-~z0kKA@HL6|r4B2_?`o$Al94musU1i2oGd<7hz(%AH z@nWF_@?xgDPUcL!gurH9j7n3^`uJ=;8$3SdReFnJX^LD1J_&-vSib{XKEXJ6 zmbK^->OIN8-`$0tXL&VM^_GKk@wd&&TjBYTmbaHtvnweFby7Xcu%zC36n~}q&8&$0 zcdvBIpc?&Rv3xng+_th%�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 diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/ref/XI5.dll b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/ref/XI5.dll deleted file mode 100644 index d2e81ad0323fd307f7e5a6c76287f07db8c20f00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 R@8f$;y)WxKMz`4v{2Q_5<3Rub diff --git a/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/refint/XI5.dll b/BackendServices/CastleLibrary/XI5/obj/Debug/net6.0/refint/XI5.dll deleted file mode 100644 index d2e81ad0323fd307f7e5a6c76287f07db8c20f00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 R@8f$;y)WxKMz`4v{2Q_5<3Rub diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfo.cs b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfo.cs deleted file mode 100644 index 457391a63..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfo.cs +++ /dev/null @@ -1,24 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyMetadata("IsTrimmable", "True")] -[assembly: System.Reflection.AssemblyCompanyAttribute("XI5")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] -[assembly: System.Reflection.AssemblyProductAttribute("XI5")] -[assembly: System.Reflection.AssemblyTitleAttribute("XI5")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfoInputs.cache b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfoInputs.cache deleted file mode 100644 index fa15ef187..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -15e97e16d15ebd00982545a7d4a698b35bbc869313285017b7041db1447222cf diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index dfa4ce073..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,17 +0,0 @@ -is_global = true -build_property.EnableAotAnalyzer = -build_property.EnableSingleFileAnalyzer = -build_property.EnableTrimAnalyzer = true -build_property.IncludeAllContentForSelfExtract = -build_property.TargetFramework = net6.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = XI5 -build_property.ProjectDir = C:\Users\Mack\Desktop\MultiServer3-NextGenHorizon-P2P-Fixed\BackendServices\XI5\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.assets.cache b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.assets.cache deleted file mode 100644 index acfe789301b38e9ebecc6853892a83b9430ac012..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14520 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 diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.AssemblyReference.cache b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/XI5.csproj.AssemblyReference.cache deleted file mode 100644 index a59e76fec1be6856b866b14441015ac214468865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14111 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 diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/ref/XI5.dll b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/ref/XI5.dll deleted file mode 100644 index a00937c16a43857f62e0d8e3cd788b23410de3f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 zcmeHLUu+yl8UJ?o?tHeB!*=Wt6q2rS5Ec!mbDgG5lQehs+3BV6pZdSZY&Mxo)6*NSQ*({FUNLOj@%6IM-KMRZww|9W>UF0o();)K9BaFtpCY=b#OTOFkK77J zyG@_cdzB2)K1h;*^yrglv#2^MQJ-wpAZ`|L{IYBV+l)r5SJ;&QJ8hd~5z4PG5X~{M zN^~3k_LQw4jO(!b4QGj z8wli_BtS=sj_A{_=T;z-Ijn+UUjwL-l7-8(D=Y_wJhili%HtkHjg&0Ljj;F0dw2#u zc<{#2rT5;=zmuR>d#8?Gy@yl1pW5AKfX`JFKATjEQz=XI#U3Jsh5twC8T=AW6faCD zZ4Z3TY@A4E(&L%&u~Y0YP8RSzoKGWPCd$N#-oXoKr0Bb*UGv!DuQ>Dh_!?O((mz1+ z898!(v5;qFH{wHZBNLWWW*!AcnDX?IZKa#fvVSS#e4cUqL#S{s&$>aha7C$h`v6+D z+25{Ab7dDq-%^<-O3<=$SWD0?iI1sF4=PFR0G&q62}(%GIb~T*(4Xkfz+si~4TW)C z;#Vd9P2#9TS9=56ZFLDA{z>d}h*)w%;!jnkb;s@)#l=) zf&Bv{PeC_G+HfD$!JVZZaEZh!ouQ?zH??!XuSmSCGVM$J88Q7MDSut!2aunn3{7Gp zd+9t-0nTUPlDq-`>SNx687oMaTPbRCh?#E=NWOVVc#Xad ze397ZSJLK&#HN(2Yi$1$N$2Q$^3>CS37i!w=BEpoKP(ghRxR2Kj`~hGJ zPpt~+$ANvklDKXirq~v*al9;ce{SBhrM7S)N?+}fI1F%4^BesY$IEzcMA zbYYG*467+tR;X(D20B-QKEmBFE22=9+?;KhcE~Jx!fne7p4Z&X1onY^)~E~0Be0SQ zqCMb3)ApH#-0)isK{?M8^|IBP5x&78N@$7YkVNJBkIdCR|}xL>Oa76-wB*VYfPp_FPN3 zZ_vG-|fv z`DVonMeRJ(;f5&&o7baYn;<1T4#JZoPi;0#7jzKy&K?MqMeNC@M|0(85eFw2#2L&( z!S<=*VEYDa@si{E$l7rIf?XAxG~rZRG-29?+oGv@!*9vwm}t)(TGL61>57t!1Nw)U zOvQCoNu`q4&#heU|9#J6croCPp{k_DNX3zp#QBj?)r^|x(h~iBT4G=@kr*0SRN`?` zx(9N=UWr`;xo(Q71GyvdWD*0VP`i^l4fPk4{uwa6Jm`@)C{-JUdKBu>P(4b$5U4Re zqLK>EIW9-}dQnmjKJ6NfS;wB*tcV6LQt6WGJnt#6Q>EQmg$|`>r%IEKD{_s-@%HMT z-8h-fz(Hzo=NZhKUc)k4d_E+(hYpJ&g?bBK$u;YBeyn39w<%;08lP#j4{tF%Fv9R4 zWo8VQM*I==C={2B3?c&Z+d0C&k8kv_q{80|LP4}`-+2Sk3ew42)(mgrx>rGNLhgFj z-uX0TgHQBm_j{LCWU_~XUj`y+2Df>v#a2WJGI-NH0cv@b=%rwrNRyXTzPT<@kye0H zv;eArUs`6t7l6~juP*d%?C<{${Dg1KpgkwO1m6J>w^GXA0SdetxF=4NiSG#kpEj+L zBlX8{+afAKYe4EjZ;%f=2V79D$Nqw06vX7i%7naj7f&~(O$Ilp;O_*LK@p9@zk(Z) zgIjh(j?qF!1~_b8lx0MN9SvKy3nR=!>*2n{<2820)3HxR?3ZBgqDLq0G2F&7JC*&j zJ!kGqTN^Q0kw^l+X{tiX-&}a`VSf>}HEGEiG^iybs^MnJzccBmk4nFDZ8^^l`wjD8 zF35DRf6jLv{Tz(hM6P}$n&`YF_SpS*ww+wVcygEv53$#=3KpW)u>*F`P^S;i)BW<1 UW*{4UAM2+-lJ$L~du#^&1FGEMPyhe` diff --git a/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/refint/XI5.dll b/BackendServices/CastleLibrary/XI5/obj/Release/net6.0/refint/XI5.dll deleted file mode 100644 index a00937c16a43857f62e0d8e3cd788b23410de3f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 zcmeHLUu+yl8UJ?o?tHeB!*=Wt6q2rS5Ec!mbDgG5lQehs+3BV6pZdSZY&Mxo)6*NSQ*({FUNLOj@%6IM-KMRZww|9W>UF0o();)K9BaFtpCY=b#OTOFkK77J zyG@_cdzB2)K1h;*^yrglv#2^MQJ-wpAZ`|L{IYBV+l)r5SJ;&QJ8hd~5z4PG5X~{M zN^~3k_LQw4jO(!b4QGj z8wli_BtS=sj_A{_=T;z-Ijn+UUjwL-l7-8(D=Y_wJhili%HtkHjg&0Ljj;F0dw2#u zc<{#2rT5;=zmuR>d#8?Gy@yl1pW5AKfX`JFKATjEQz=XI#U3Jsh5twC8T=AW6faCD zZ4Z3TY@A4E(&L%&u~Y0YP8RSzoKGWPCd$N#-oXoKr0Bb*UGv!DuQ>Dh_!?O((mz1+ z898!(v5;qFH{wHZBNLWWW*!AcnDX?IZKa#fvVSS#e4cUqL#S{s&$>aha7C$h`v6+D z+25{Ab7dDq-%^<-O3<=$SWD0?iI1sF4=PFR0G&q62}(%GIb~T*(4Xkfz+si~4TW)C z;#Vd9P2#9TS9=56ZFLDA{z>d}h*)w%;!jnkb;s@)#l=) zf&Bv{PeC_G+HfD$!JVZZaEZh!ouQ?zH??!XuSmSCGVM$J88Q7MDSut!2aunn3{7Gp zd+9t-0nTUPlDq-`>SNx687oMaTPbRCh?#E=NWOVVc#Xad ze397ZSJLK&#HN(2Yi$1$N$2Q$^3>CS37i!w=BEpoKP(ghRxR2Kj`~hGJ zPpt~+$ANvklDKXirq~v*al9;ce{SBhrM7S)N?+}fI1F%4^BesY$IEzcMA zbYYG*467+tR;X(D20B-QKEmBFE22=9+?;KhcE~Jx!fne7p4Z&X1onY^)~E~0Be0SQ zqCMb3)ApH#-0)isK{?M8^|IBP5x&78N@$7YkVNJBkIdCR|}xL>Oa76-wB*VYfPp_FPN3 zZ_vG-|fv z`DVonMeRJ(;f5&&o7baYn;<1T4#JZoPi;0#7jzKy&K?MqMeNC@M|0(85eFw2#2L&( z!S<=*VEYDa@si{E$l7rIf?XAxG~rZRG-29?+oGv@!*9vwm}t)(TGL61>57t!1Nw)U zOvQCoNu`q4&#heU|9#J6croCPp{k_DNX3zp#QBj?)r^|x(h~iBT4G=@kr*0SRN`?` zx(9N=UWr`;xo(Q71GyvdWD*0VP`i^l4fPk4{uwa6Jm`@)C{-JUdKBu>P(4b$5U4Re zqLK>EIW9-}dQnmjKJ6NfS;wB*tcV6LQt6WGJnt#6Q>EQmg$|`>r%IEKD{_s-@%HMT z-8h-fz(Hzo=NZhKUc)k4d_E+(hYpJ&g?bBK$u;YBeyn39w<%;08lP#j4{tF%Fv9R4 zWo8VQM*I==C={2B3?c&Z+d0C&k8kv_q{80|LP4}`-+2Sk3ew42)(mgrx>rGNLhgFj z-uX0TgHQBm_j{LCWU_~XUj`y+2Df>v#a2WJGI-NH0cv@b=%rwrNRyXTzPT<@kye0H zv;eArUs`6t7l6~juP*d%?C<{${Dg1KpgkwO1m6J>w^GXA0SdetxF=4NiSG#kpEj+L zBlX8{+afAKYe4EjZ;%f=2V79D$Nqw06vX7i%7naj7f&~(O$Ilp;O_*LK@p9@zk(Z) zgIjh(j?qF!1~_b8lx0MN9SvKy3nR=!>*2n{<2820)3HxR?3ZBgqDLq0G2F&7JC*&j zJ!kGqTN^Q0kw^l+X{tiX-&}a`VSf>}HEGEiG^iybs^MnJzccBmk4nFDZ8^^l`wjD8 zF35DRf6jLv{Tz(hM6P}$n&`YF_SpS*ww+wVcygEv53$#=3KpW)u>*F`P^S;i)BW<1 UW*{4UAM2+-lJ$L~du#^&1FGEMPyhe` diff --git a/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.dgspec.json b/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.dgspec.json deleted file mode 100644 index 9483b0f40..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.dgspec.json +++ /dev/null @@ -1,335 +0,0 @@ -{ - "format": 1, - "restore": { - "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj": {} - }, - "projects": { - "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj", - "projectName": "CastleLibrary", - "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj", - "packagesPath": "C:\\Users\\Mack\\.nuget\\packages\\", - "outputPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\Mack\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": { - "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\CustomLogger.csproj": { - "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\CustomLogger.csproj" - }, - "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\EndianTools.csproj": { - "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\EndianTools.csproj" - } - } - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "dependencies": { - "Microsoft.NET.ILLink.Analyzers": { - "suppressParent": "All", - "target": "Package", - "version": "[7.0.100-1.23211.1, )", - "autoReferenced": true - }, - "Microsoft.NET.ILLink.Tasks": { - "suppressParent": "All", - "target": "Package", - "version": "[7.0.100-1.23211.1, )", - "autoReferenced": true - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.102\\RuntimeIdentifierGraph.json" - } - } - }, - "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\CustomLogger.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\CustomLogger.csproj", - "projectName": "CustomLogger", - "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\CustomLogger.csproj", - "packagesPath": "C:\\Users\\Mack\\.nuget\\packages\\", - "outputPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CustomLogger\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\Mack\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "dependencies": { - "Figgle": { - "target": "Package", - "version": "[0.5.1, )" - }, - "Microsoft.Extensions.Logging": { - "target": "Package", - "version": "[8.0.0, )" - }, - "Microsoft.Extensions.Logging.Console": { - "target": "Package", - "version": "[8.0.0, )" - }, - "Microsoft.NET.ILLink.Analyzers": { - "suppressParent": "All", - "target": "Package", - "version": "[7.0.100-1.23211.1, )", - "autoReferenced": true - }, - "Microsoft.NET.ILLink.Tasks": { - "suppressParent": "All", - "target": "Package", - "version": "[7.0.100-1.23211.1, )", - "autoReferenced": true - }, - "NReco.Logging.File": { - "target": "Package", - "version": "[1.2.1, )" - }, - "System.Security.Principal.Windows": { - "target": "Package", - "version": "[5.0.0, )" - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.102\\RuntimeIdentifierGraph.json" - } - } - }, - "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\EndianTools.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\EndianTools.csproj", - "projectName": "EndianTools", - "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\EndianTools.csproj", - "packagesPath": "C:\\Users\\Mack\\.nuget\\packages\\", - "outputPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\EndianTools\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\Mack\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "dependencies": { - "Microsoft.NET.ILLink.Analyzers": { - "suppressParent": "All", - "target": "Package", - "version": "[7.0.100-1.23211.1, )", - "autoReferenced": true - }, - "Microsoft.NET.ILLink.Tasks": { - "suppressParent": "All", - "target": "Package", - "version": "[7.0.100-1.23211.1, )", - "autoReferenced": true - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.102\\RuntimeIdentifierGraph.json" - } - } - }, - "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj", - "projectName": "XI5", - "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj", - "packagesPath": "C:\\Users\\Mack\\.nuget\\packages\\", - "outputPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\Mack\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": { - "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj": { - "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj" - } - } - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "dependencies": { - "Microsoft.NET.ILLink.Analyzers": { - "suppressParent": "All", - "target": "Package", - "version": "[7.0.100-1.23211.1, )", - "autoReferenced": true - }, - "Microsoft.NET.ILLink.Tasks": { - "suppressParent": "All", - "target": "Package", - "version": "[7.0.100-1.23211.1, )", - "autoReferenced": true - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.102\\RuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.props b/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.props deleted file mode 100644 index 3274d1b22..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.props +++ /dev/null @@ -1,23 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\Mack\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 6.8.1 - - - - - - - - - - - C:\Users\Mack\.nuget\packages\microsoft.net.illink.tasks\7.0.100-1.23211.1 - - \ No newline at end of file diff --git a/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.targets b/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.targets deleted file mode 100644 index 5d2332546..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/XI5.csproj.nuget.g.targets +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/BackendServices/CastleLibrary/XI5/obj/project.assets.json b/BackendServices/CastleLibrary/XI5/obj/project.assets.json deleted file mode 100644 index 362217035..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/project.assets.json +++ /dev/null @@ -1,1230 +0,0 @@ -{ - "version": 3, - "targets": { - "net6.0": { - "Figgle/0.5.1": { - "type": "package", - "compile": { - "lib/netstandard2.0/Figgle.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/netstandard2.0/Figgle.dll": { - "related": ".xml" - } - } - }, - "Microsoft.Extensions.Configuration/8.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.Configuration.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.Configuration.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "Microsoft.Extensions.Configuration.Abstractions/8.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.Configuration.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.Configuration.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "Microsoft.Extensions.Configuration.Binder/8.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.Configuration.Binder.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.Configuration.Binder.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/netstandard2.0/Microsoft.Extensions.Configuration.Binder.targets": {} - } - }, - "Microsoft.Extensions.DependencyInjection/8.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.DependencyInjection.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": { - "type": "package", - "compile": { - "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "Microsoft.Extensions.Logging/8.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.Logging.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "Microsoft.Extensions.Logging.Abstractions/8.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets": {} - } - }, - "Microsoft.Extensions.Logging.Configuration/8.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.Logging.Configuration.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.Logging.Configuration.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "Microsoft.Extensions.Logging.Console/8.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Configuration": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Json": "8.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.Logging.Console.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.Logging.Console.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "Microsoft.Extensions.Options/8.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.Options.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/Microsoft.Extensions.Options.targets": {} - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "Microsoft.Extensions.Primitives/8.0.0": { - "type": "package", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - }, - "compile": { - "lib/net6.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/Microsoft.Extensions.Primitives.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - } - }, - "Microsoft.NET.ILLink.Analyzers/7.0.100-1.23211.1": { - "type": "package", - "build": { - "build/Microsoft.NET.ILLink.Analyzers.props": {} - } - }, - "Microsoft.NET.ILLink.Tasks/7.0.100-1.23211.1": { - "type": "package", - "build": { - "build/Microsoft.NET.ILLink.Tasks.props": {} - } - }, - "NReco.Logging.File/1.2.1": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Configuration": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" - }, - "compile": { - "lib/net6.0/NReco.Logging.File.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/NReco.Logging.File.dll": { - "related": ".xml" - } - } - }, - "System.Runtime.CompilerServices.Unsafe/6.0.0": { - "type": "package", - "compile": { - "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/netcoreapp3.1/_._": {} - } - }, - "System.Security.Principal.Windows/5.0.0": { - "type": "package", - "compile": { - "ref/netcoreapp3.0/System.Security.Principal.Windows.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/netstandard2.0/System.Security.Principal.Windows.dll": { - "related": ".xml" - } - }, - "runtimeTargets": { - "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Text.Encodings.Web/8.0.0": { - "type": "package", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - }, - "compile": { - "lib/net6.0/System.Text.Encodings.Web.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/System.Text.Encodings.Web.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/_._": {} - }, - "runtimeTargets": { - "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.dll": { - "assetType": "runtime", - "rid": "browser" - } - } - }, - "System.Text.Json/8.0.0": { - "type": "package", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "8.0.0" - }, - "compile": { - "lib/net6.0/System.Text.Json.dll": { - "related": ".xml" - } - }, - "runtime": { - "lib/net6.0/System.Text.Json.dll": { - "related": ".xml" - } - }, - "build": { - "buildTransitive/net6.0/System.Text.Json.targets": {} - } - }, - "CastleLibrary/1.0.0": { - "type": "project", - "framework": ".NETCoreApp,Version=v6.0", - "dependencies": { - "CustomLogger": "1.0.0", - "EndianTools": "1.0.0" - }, - "compile": { - "bin/placeholder/CastleLibrary.dll": {} - }, - "runtime": { - "bin/placeholder/CastleLibrary.dll": {} - } - }, - "CustomLogger/1.0.0": { - "type": "project", - "framework": ".NETCoreApp,Version=v6.0", - "dependencies": { - "Figgle": "0.5.1", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Console": "8.0.0", - "NReco.Logging.File": "1.2.1", - "System.Security.Principal.Windows": "5.0.0" - }, - "compile": { - "bin/placeholder/CustomLogger.dll": {} - }, - "runtime": { - "bin/placeholder/CustomLogger.dll": {} - } - }, - "EndianTools/1.0.0": { - "type": "project", - "framework": ".NETCoreApp,Version=v6.0", - "compile": { - "bin/placeholder/EndianTools.dll": {} - }, - "runtime": { - "bin/placeholder/EndianTools.dll": {} - } - } - } - }, - "libraries": { - "Figgle/0.5.1": { - "sha512": "F21k9oOGRgSb+1dCX0kFDYRBbShSMFvL49xjNmF/dsJwiN5M7zBaSWsYKpi/KZWXVIIxNzTbNTq9ZciucaHYMQ==", - "type": "package", - "path": "figgle/0.5.1", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "README.md", - "figgle.0.5.1.nupkg.sha512", - "figgle.nuspec", - "lib/netstandard2.0/Figgle.dll", - "lib/netstandard2.0/Figgle.xml", - "logo-square-256px.png" - ] - }, - "Microsoft.Extensions.Configuration/8.0.0": { - "sha512": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", - "type": "package", - "path": "microsoft.extensions.configuration/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Configuration.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Configuration.targets", - "lib/net462/Microsoft.Extensions.Configuration.dll", - "lib/net462/Microsoft.Extensions.Configuration.xml", - "lib/net6.0/Microsoft.Extensions.Configuration.dll", - "lib/net6.0/Microsoft.Extensions.Configuration.xml", - "lib/net7.0/Microsoft.Extensions.Configuration.dll", - "lib/net7.0/Microsoft.Extensions.Configuration.xml", - "lib/net8.0/Microsoft.Extensions.Configuration.dll", - "lib/net8.0/Microsoft.Extensions.Configuration.xml", - "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll", - "lib/netstandard2.0/Microsoft.Extensions.Configuration.xml", - "microsoft.extensions.configuration.8.0.0.nupkg.sha512", - "microsoft.extensions.configuration.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Configuration.Abstractions/8.0.0": { - "sha512": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", - "type": "package", - "path": "microsoft.extensions.configuration.abstractions/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Configuration.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Configuration.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Configuration.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Configuration.Abstractions.xml", - "lib/net6.0/Microsoft.Extensions.Configuration.Abstractions.dll", - "lib/net6.0/Microsoft.Extensions.Configuration.Abstractions.xml", - "lib/net7.0/Microsoft.Extensions.Configuration.Abstractions.dll", - "lib/net7.0/Microsoft.Extensions.Configuration.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.xml", - "microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512", - "microsoft.extensions.configuration.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Configuration.Binder/8.0.0": { - "sha512": "mBMoXLsr5s1y2zOHWmKsE9veDcx8h1x/c3rz4baEdQKTeDcmQAPNbB54Pi/lhFO3K431eEq6PFbMgLaa6PHFfA==", - "type": "package", - "path": "microsoft.extensions.configuration.binder/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/cs/Microsoft.Extensions.Configuration.Binder.SourceGeneration.dll", - "analyzers/dotnet/cs/cs/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/de/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/es/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/fr/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/it/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/ja/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/ko/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/pl/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/pt-BR/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/ru/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/tr/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/zh-Hans/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "analyzers/dotnet/cs/zh-Hant/Microsoft.Extensions.Configuration.Binder.SourceGeneration.resources.dll", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Configuration.Binder.targets", - "lib/net462/Microsoft.Extensions.Configuration.Binder.dll", - "lib/net462/Microsoft.Extensions.Configuration.Binder.xml", - "lib/net6.0/Microsoft.Extensions.Configuration.Binder.dll", - "lib/net6.0/Microsoft.Extensions.Configuration.Binder.xml", - "lib/net7.0/Microsoft.Extensions.Configuration.Binder.dll", - "lib/net7.0/Microsoft.Extensions.Configuration.Binder.xml", - "lib/net8.0/Microsoft.Extensions.Configuration.Binder.dll", - "lib/net8.0/Microsoft.Extensions.Configuration.Binder.xml", - "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll", - "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.xml", - "microsoft.extensions.configuration.binder.8.0.0.nupkg.sha512", - "microsoft.extensions.configuration.binder.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection/8.0.0": { - "sha512": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.xml", - "lib/net6.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net6.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/net7.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net7.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.xml", - "microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512", - "microsoft.extensions.dependencyinjection.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/8.0.0": { - "sha512": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", - "type": "package", - "path": "microsoft.extensions.dependencyinjection.abstractions/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml", - "microsoft.extensions.dependencyinjection.abstractions.8.0.0.nupkg.sha512", - "microsoft.extensions.dependencyinjection.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging/8.0.0": { - "sha512": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "type": "package", - "path": "microsoft.extensions.logging/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Logging.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.targets", - "lib/net462/Microsoft.Extensions.Logging.dll", - "lib/net462/Microsoft.Extensions.Logging.xml", - "lib/net6.0/Microsoft.Extensions.Logging.dll", - "lib/net6.0/Microsoft.Extensions.Logging.xml", - "lib/net7.0/Microsoft.Extensions.Logging.dll", - "lib/net7.0/Microsoft.Extensions.Logging.xml", - "lib/net8.0/Microsoft.Extensions.Logging.dll", - "lib/net8.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.xml", - "lib/netstandard2.1/Microsoft.Extensions.Logging.dll", - "lib/netstandard2.1/Microsoft.Extensions.Logging.xml", - "microsoft.extensions.logging.8.0.0.nupkg.sha512", - "microsoft.extensions.logging.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging.Abstractions/8.0.0": { - "sha512": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "type": "package", - "path": "microsoft.extensions.logging.abstractions/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net462/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net6.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net7.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net7.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml", - "microsoft.extensions.logging.abstractions.8.0.0.nupkg.sha512", - "microsoft.extensions.logging.abstractions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging.Configuration/8.0.0": { - "sha512": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==", - "type": "package", - "path": "microsoft.extensions.logging.configuration/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Logging.Configuration.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Configuration.targets", - "lib/net462/Microsoft.Extensions.Logging.Configuration.dll", - "lib/net462/Microsoft.Extensions.Logging.Configuration.xml", - "lib/net6.0/Microsoft.Extensions.Logging.Configuration.dll", - "lib/net6.0/Microsoft.Extensions.Logging.Configuration.xml", - "lib/net7.0/Microsoft.Extensions.Logging.Configuration.dll", - "lib/net7.0/Microsoft.Extensions.Logging.Configuration.xml", - "lib/net8.0/Microsoft.Extensions.Logging.Configuration.dll", - "lib/net8.0/Microsoft.Extensions.Logging.Configuration.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Configuration.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Configuration.xml", - "microsoft.extensions.logging.configuration.8.0.0.nupkg.sha512", - "microsoft.extensions.logging.configuration.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Logging.Console/8.0.0": { - "sha512": "e+48o7DztoYog+PY430lPxrM4mm3PbA6qucvQtUDDwVo4MO+ejMw7YGc/o2rnxbxj4isPxdfKFzTxvXMwAz83A==", - "type": "package", - "path": "microsoft.extensions.logging.console/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Logging.Console.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Console.targets", - "lib/net462/Microsoft.Extensions.Logging.Console.dll", - "lib/net462/Microsoft.Extensions.Logging.Console.xml", - "lib/net6.0/Microsoft.Extensions.Logging.Console.dll", - "lib/net6.0/Microsoft.Extensions.Logging.Console.xml", - "lib/net7.0/Microsoft.Extensions.Logging.Console.dll", - "lib/net7.0/Microsoft.Extensions.Logging.Console.xml", - "lib/net8.0/Microsoft.Extensions.Logging.Console.dll", - "lib/net8.0/Microsoft.Extensions.Logging.Console.xml", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Console.dll", - "lib/netstandard2.0/Microsoft.Extensions.Logging.Console.xml", - "microsoft.extensions.logging.console.8.0.0.nupkg.sha512", - "microsoft.extensions.logging.console.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Options/8.0.0": { - "sha512": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "type": "package", - "path": "microsoft.extensions.options/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Options.SourceGeneration.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Options.SourceGeneration.resources.dll", - "buildTransitive/net461/Microsoft.Extensions.Options.targets", - "buildTransitive/net462/Microsoft.Extensions.Options.targets", - "buildTransitive/net6.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.targets", - "buildTransitive/netstandard2.0/Microsoft.Extensions.Options.targets", - "lib/net462/Microsoft.Extensions.Options.dll", - "lib/net462/Microsoft.Extensions.Options.xml", - "lib/net6.0/Microsoft.Extensions.Options.dll", - "lib/net6.0/Microsoft.Extensions.Options.xml", - "lib/net7.0/Microsoft.Extensions.Options.dll", - "lib/net7.0/Microsoft.Extensions.Options.xml", - "lib/net8.0/Microsoft.Extensions.Options.dll", - "lib/net8.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.0/Microsoft.Extensions.Options.dll", - "lib/netstandard2.0/Microsoft.Extensions.Options.xml", - "lib/netstandard2.1/Microsoft.Extensions.Options.dll", - "lib/netstandard2.1/Microsoft.Extensions.Options.xml", - "microsoft.extensions.options.8.0.0.nupkg.sha512", - "microsoft.extensions.options.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": { - "sha512": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==", - "type": "package", - "path": "microsoft.extensions.options.configurationextensions/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Options.ConfigurationExtensions.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Options.ConfigurationExtensions.targets", - "lib/net462/Microsoft.Extensions.Options.ConfigurationExtensions.dll", - "lib/net462/Microsoft.Extensions.Options.ConfigurationExtensions.xml", - "lib/net6.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll", - "lib/net6.0/Microsoft.Extensions.Options.ConfigurationExtensions.xml", - "lib/net7.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll", - "lib/net7.0/Microsoft.Extensions.Options.ConfigurationExtensions.xml", - "lib/net8.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll", - "lib/net8.0/Microsoft.Extensions.Options.ConfigurationExtensions.xml", - "lib/netstandard2.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll", - "lib/netstandard2.0/Microsoft.Extensions.Options.ConfigurationExtensions.xml", - "microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512", - "microsoft.extensions.options.configurationextensions.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.Extensions.Primitives/8.0.0": { - "sha512": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", - "type": "package", - "path": "microsoft.extensions.primitives/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/Microsoft.Extensions.Primitives.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/Microsoft.Extensions.Primitives.targets", - "lib/net462/Microsoft.Extensions.Primitives.dll", - "lib/net462/Microsoft.Extensions.Primitives.xml", - "lib/net6.0/Microsoft.Extensions.Primitives.dll", - "lib/net6.0/Microsoft.Extensions.Primitives.xml", - "lib/net7.0/Microsoft.Extensions.Primitives.dll", - "lib/net7.0/Microsoft.Extensions.Primitives.xml", - "lib/net8.0/Microsoft.Extensions.Primitives.dll", - "lib/net8.0/Microsoft.Extensions.Primitives.xml", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll", - "lib/netstandard2.0/Microsoft.Extensions.Primitives.xml", - "microsoft.extensions.primitives.8.0.0.nupkg.sha512", - "microsoft.extensions.primitives.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "Microsoft.NET.ILLink.Analyzers/7.0.100-1.23211.1": { - "sha512": "0GvbEgDGcUQA9KuWcQU1WwYHXt1tBzNr1Nls/M57rM7NA/AndFwCaCEoJpJkmxRY7xLlPDBnmGp8h5+FNqUngg==", - "type": "package", - "path": "microsoft.net.illink.analyzers/7.0.100-1.23211.1", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "analyzers/dotnet/cs/ILLink.CodeFixProvider.dll", - "analyzers/dotnet/cs/ILLink.RoslynAnalyzer.dll", - "build/Microsoft.NET.ILLink.Analyzers.props", - "microsoft.net.illink.analyzers.7.0.100-1.23211.1.nupkg.sha512", - "microsoft.net.illink.analyzers.nuspec" - ] - }, - "Microsoft.NET.ILLink.Tasks/7.0.100-1.23211.1": { - "sha512": "tvG8XZYLjT0o3WicCyKBZysVWo1jC9HdCFmNRmddx3WbAz0UCsd0qKZqpiEo99VLA8Re+FzWK51OcRldQPbt2Q==", - "type": "package", - "path": "microsoft.net.illink.tasks/7.0.100-1.23211.1", - "hasTools": true, - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "Sdk/Sdk.props", - "build/6.0_suppressions.xml", - "build/Microsoft.NET.ILLink.Tasks.props", - "build/Microsoft.NET.ILLink.targets", - "microsoft.net.illink.tasks.7.0.100-1.23211.1.nupkg.sha512", - "microsoft.net.illink.tasks.nuspec", - "tools/net472/ILLink.Tasks.dll", - "tools/net472/Mono.Cecil.dll", - "tools/net472/System.Buffers.dll", - "tools/net472/System.Collections.Immutable.dll", - "tools/net472/System.Memory.dll", - "tools/net472/System.Numerics.Vectors.dll", - "tools/net472/System.Reflection.Metadata.dll", - "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", - "tools/net7.0/ILLink.Tasks.deps.json", - "tools/net7.0/ILLink.Tasks.dll", - "tools/net7.0/Mono.Cecil.Pdb.dll", - "tools/net7.0/Mono.Cecil.dll", - "tools/net7.0/illink.deps.json", - "tools/net7.0/illink.dll", - "tools/net7.0/illink.runtimeconfig.json" - ] - }, - "NReco.Logging.File/1.2.1": { - "sha512": "DuGBOw5uIvrT/iH0pTBJaUxn6Y0kGGj83HMMwPgt+3B6HGUz3l+NjFgP6LgMdNLU72G4C8E6e7lB0qIoLz+/RQ==", - "type": "package", - "path": "nreco.logging.file/1.2.1", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "lib/net6.0/NReco.Logging.File.dll", - "lib/net6.0/NReco.Logging.File.xml", - "lib/net8.0/NReco.Logging.File.dll", - "lib/net8.0/NReco.Logging.File.xml", - "lib/netstandard2.0/NReco.Logging.File.dll", - "lib/netstandard2.0/NReco.Logging.File.xml", - "nreco.logging.file.1.2.1.nupkg.sha512", - "nreco.logging.file.nuspec" - ] - }, - "System.Runtime.CompilerServices.Unsafe/6.0.0": { - "sha512": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", - "type": "package", - "path": "system.runtime.compilerservices.unsafe/6.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.targets", - "buildTransitive/netcoreapp3.1/_._", - "lib/net461/System.Runtime.CompilerServices.Unsafe.dll", - "lib/net461/System.Runtime.CompilerServices.Unsafe.xml", - "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll", - "lib/net6.0/System.Runtime.CompilerServices.Unsafe.xml", - "lib/netcoreapp3.1/System.Runtime.CompilerServices.Unsafe.dll", - "lib/netcoreapp3.1/System.Runtime.CompilerServices.Unsafe.xml", - "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", - "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", - "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", - "system.runtime.compilerservices.unsafe.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "System.Security.Principal.Windows/5.0.0": { - "sha512": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==", - "type": "package", - "path": "system.security.principal.windows/5.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "lib/net46/System.Security.Principal.Windows.dll", - "lib/net461/System.Security.Principal.Windows.dll", - "lib/net461/System.Security.Principal.Windows.xml", - "lib/netstandard1.3/System.Security.Principal.Windows.dll", - "lib/netstandard2.0/System.Security.Principal.Windows.dll", - "lib/netstandard2.0/System.Security.Principal.Windows.xml", - "lib/uap10.0.16299/_._", - "ref/net46/System.Security.Principal.Windows.dll", - "ref/net461/System.Security.Principal.Windows.dll", - "ref/net461/System.Security.Principal.Windows.xml", - "ref/netcoreapp3.0/System.Security.Principal.Windows.dll", - "ref/netcoreapp3.0/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/System.Security.Principal.Windows.dll", - "ref/netstandard1.3/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", - "ref/netstandard2.0/System.Security.Principal.Windows.dll", - "ref/netstandard2.0/System.Security.Principal.Windows.xml", - "ref/uap10.0.16299/_._", - "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.dll", - "runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.xml", - "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll", - "runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.xml", - "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", - "runtimes/win/lib/net461/System.Security.Principal.Windows.dll", - "runtimes/win/lib/net461/System.Security.Principal.Windows.xml", - "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.dll", - "runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.xml", - "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll", - "runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.xml", - "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll", - "runtimes/win/lib/uap10.0.16299/_._", - "system.security.principal.windows.5.0.0.nupkg.sha512", - "system.security.principal.windows.nuspec", - "useSharedDesignerContext.txt", - "version.txt" - ] - }, - "System.Text.Encodings.Web/8.0.0": { - "sha512": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", - "type": "package", - "path": "system.text.encodings.web/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "THIRD-PARTY-NOTICES.TXT", - "buildTransitive/net461/System.Text.Encodings.Web.targets", - "buildTransitive/net462/_._", - "buildTransitive/net6.0/_._", - "buildTransitive/netcoreapp2.0/System.Text.Encodings.Web.targets", - "lib/net462/System.Text.Encodings.Web.dll", - "lib/net462/System.Text.Encodings.Web.xml", - "lib/net6.0/System.Text.Encodings.Web.dll", - "lib/net6.0/System.Text.Encodings.Web.xml", - "lib/net7.0/System.Text.Encodings.Web.dll", - "lib/net7.0/System.Text.Encodings.Web.xml", - "lib/net8.0/System.Text.Encodings.Web.dll", - "lib/net8.0/System.Text.Encodings.Web.xml", - "lib/netstandard2.0/System.Text.Encodings.Web.dll", - "lib/netstandard2.0/System.Text.Encodings.Web.xml", - "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.dll", - "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.xml", - "runtimes/browser/lib/net7.0/System.Text.Encodings.Web.dll", - "runtimes/browser/lib/net7.0/System.Text.Encodings.Web.xml", - "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.dll", - "runtimes/browser/lib/net8.0/System.Text.Encodings.Web.xml", - "system.text.encodings.web.8.0.0.nupkg.sha512", - "system.text.encodings.web.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "System.Text.Json/8.0.0": { - "sha512": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", - "type": "package", - "path": "system.text.json/8.0.0", - "files": [ - ".nupkg.metadata", - ".signature.p7s", - "Icon.png", - "LICENSE.TXT", - "PACKAGE.md", - "THIRD-PARTY-NOTICES.TXT", - "analyzers/dotnet/roslyn3.11/cs/System.Text.Json.SourceGeneration.dll", - "analyzers/dotnet/roslyn3.11/cs/cs/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/de/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/es/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/fr/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/it/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ja/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ko/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pl/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/ru/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/tr/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn3.11/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/System.Text.Json.SourceGeneration.dll", - "analyzers/dotnet/roslyn4.0/cs/cs/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/de/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/es/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/fr/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/it/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ja/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ko/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pl/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/ru/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/tr/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.0/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/System.Text.Json.SourceGeneration.dll", - "analyzers/dotnet/roslyn4.4/cs/cs/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/de/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/es/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/fr/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/it/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ja/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ko/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pl/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/ru/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/tr/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", - "analyzers/dotnet/roslyn4.4/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", - "buildTransitive/net461/System.Text.Json.targets", - "buildTransitive/net462/System.Text.Json.targets", - "buildTransitive/net6.0/System.Text.Json.targets", - "buildTransitive/netcoreapp2.0/System.Text.Json.targets", - "buildTransitive/netstandard2.0/System.Text.Json.targets", - "lib/net462/System.Text.Json.dll", - "lib/net462/System.Text.Json.xml", - "lib/net6.0/System.Text.Json.dll", - "lib/net6.0/System.Text.Json.xml", - "lib/net7.0/System.Text.Json.dll", - "lib/net7.0/System.Text.Json.xml", - "lib/net8.0/System.Text.Json.dll", - "lib/net8.0/System.Text.Json.xml", - "lib/netstandard2.0/System.Text.Json.dll", - "lib/netstandard2.0/System.Text.Json.xml", - "system.text.json.8.0.0.nupkg.sha512", - "system.text.json.nuspec", - "useSharedDesignerContext.txt" - ] - }, - "CastleLibrary/1.0.0": { - "type": "project", - "path": "../CastleLibrary/CastleLibrary.csproj", - "msbuildProject": "../CastleLibrary/CastleLibrary.csproj" - }, - "CustomLogger/1.0.0": { - "type": "project", - "path": "../CustomLogger/CustomLogger.csproj", - "msbuildProject": "../CustomLogger/CustomLogger.csproj" - }, - "EndianTools/1.0.0": { - "type": "project", - "path": "../EndianTools/EndianTools.csproj", - "msbuildProject": "../EndianTools/EndianTools.csproj" - } - }, - "projectFileDependencyGroups": { - "net6.0": [ - "CastleLibrary >= 1.0.0", - "Microsoft.NET.ILLink.Analyzers >= 7.0.100-1.23211.1", - "Microsoft.NET.ILLink.Tasks >= 7.0.100-1.23211.1" - ] - }, - "packageFolders": { - "C:\\Users\\Mack\\.nuget\\packages\\": {}, - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj", - "projectName": "XI5", - "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj", - "packagesPath": "C:\\Users\\Mack\\.nuget\\packages\\", - "outputPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\Mack\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net6.0" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "projectReferences": { - "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj": { - "projectPath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\CastleLibrary\\CastleLibrary.csproj" - } - } - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net6.0": { - "targetAlias": "net6.0", - "dependencies": { - "Microsoft.NET.ILLink.Analyzers": { - "suppressParent": "All", - "target": "Package", - "version": "[7.0.100-1.23211.1, )", - "autoReferenced": true - }, - "Microsoft.NET.ILLink.Tasks": { - "suppressParent": "All", - "target": "Package", - "version": "[7.0.100-1.23211.1, )", - "autoReferenced": true - } - }, - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.102\\RuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/BackendServices/CastleLibrary/XI5/obj/project.nuget.cache b/BackendServices/CastleLibrary/XI5/obj/project.nuget.cache deleted file mode 100644 index c9a70c8d0..000000000 --- a/BackendServices/CastleLibrary/XI5/obj/project.nuget.cache +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "49k8UCaSTGH6VC6GKMPkXtbJto18oMnarnPxyRYOs3Kyq4wKaWy+4wVwyeU/Iw9qbyNQ/HrJr5zn6NQQAdhIWQ==", - "success": true, - "projectFilePath": "C:\\Users\\Mack\\Desktop\\MultiServer3-NextGenHorizon-P2P-Fixed\\BackendServices\\XI5\\XI5.csproj", - "expectedPackageFiles": [ - "C:\\Users\\Mack\\.nuget\\packages\\figgle\\0.5.1\\figgle.0.5.1.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.configuration\\8.0.0\\microsoft.extensions.configuration.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\8.0.0\\microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.configuration.binder\\8.0.0\\microsoft.extensions.configuration.binder.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\8.0.0\\microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\8.0.0\\microsoft.extensions.dependencyinjection.abstractions.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.logging\\8.0.0\\microsoft.extensions.logging.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\8.0.0\\microsoft.extensions.logging.abstractions.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.logging.configuration\\8.0.0\\microsoft.extensions.logging.configuration.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.logging.console\\8.0.0\\microsoft.extensions.logging.console.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.options\\8.0.0\\microsoft.extensions.options.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.options.configurationextensions\\8.0.0\\microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.extensions.primitives\\8.0.0\\microsoft.extensions.primitives.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.net.illink.analyzers\\7.0.100-1.23211.1\\microsoft.net.illink.analyzers.7.0.100-1.23211.1.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\microsoft.net.illink.tasks\\7.0.100-1.23211.1\\microsoft.net.illink.tasks.7.0.100-1.23211.1.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\nreco.logging.file\\1.2.1\\nreco.logging.file.1.2.1.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\6.0.0\\system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\system.security.principal.windows\\5.0.0\\system.security.principal.windows.5.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\system.text.encodings.web\\8.0.0\\system.text.encodings.web.8.0.0.nupkg.sha512", - "C:\\Users\\Mack\\.nuget\\packages\\system.text.json\\8.0.0\\system.text.json.8.0.0.nupkg.sha512" - ], - "logs": [] -} \ No newline at end of file From 0db9adb7ddb064fc95bf468522aab54a5c307a02 Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 10:47:39 -0400 Subject: [PATCH 05/14] Ticket reader fix Swapped to using provided endian tools --- .../CastleLibrary/XI5/Reader/TicketReader.cs | 105 +++++++----------- 1 file changed, 39 insertions(+), 66 deletions(-) diff --git a/BackendServices/CastleLibrary/XI5/Reader/TicketReader.cs b/BackendServices/CastleLibrary/XI5/Reader/TicketReader.cs index b3ddd6de9..2219e65bc 100644 --- a/BackendServices/CastleLibrary/XI5/Reader/TicketReader.cs +++ b/BackendServices/CastleLibrary/XI5/Reader/TicketReader.cs @@ -1,89 +1,64 @@ -using System; -using System.Buffers.Binary; -using System.Collections.Generic; +using BitConverterExtension; +using System; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; using XI5.Types; namespace XI5.Reader { public class TicketReader : BinaryReader { - public TicketReader(Stream input) : base(input) - { } + // setup endian converter + private static readonly BigEndianBitConverter bigEndian = new(); - #region Big Endian Shenanigans + public TicketReader(Stream input) : base(input) { } - // credit where credit is due: https://stackoverflow.com/a/71048495 + #region Big Endian Conversion - public override short ReadInt16() => BinaryPrimitives.ReadInt16BigEndian(ReadBytes(2)); - public override int ReadInt32() => BinaryPrimitives.ReadInt32BigEndian(ReadBytes(4)); - public override long ReadInt64() => BinaryPrimitives.ReadInt64BigEndian(ReadBytes(8)); - - public override ushort ReadUInt16() => BinaryPrimitives.ReadUInt16BigEndian(ReadBytes(2)); - public override uint ReadUInt32() => BinaryPrimitives.ReadUInt32BigEndian(ReadBytes(4)); - public override ulong ReadUInt64() => BinaryPrimitives.ReadUInt64BigEndian(ReadBytes(8)); + public override short ReadInt16() + { + byte[] bytes = ReadBytes(2); + return bigEndian.ToInt16(bytes, 0); + } - #endregion + public override int ReadInt32() + { + byte[] bytes = ReadBytes(4); + return bigEndian.ToInt32(bytes, 0); + } - internal TicketVersion ReadTicketVersion() => new TicketVersion((byte)(ReadByte() >> 4), ReadByte()); + public override long ReadInt64() + { + byte[] bytes = ReadBytes(8); + return bigEndian.ToInt64(bytes, 0); + } - internal ushort ReadTicketHeader() + public override ushort ReadUInt16() { - // Ticket header - ReadBytes(4); // Header - return ReadUInt16(); // Ticket length + byte[] bytes = ReadBytes(2); + return bigEndian.ToUInt16(bytes, 0); } - public void DetermineTicketFormat() + public override uint ReadUInt32() { - TicketVersion version = ReadTicketVersion(); - Console.Write($"Ticket version {version.Major}.{version.Minor}"); - ushort length = ReadTicketHeader(); - Console.WriteLine($", length is {length} bytes"); - - while (this.BaseStream.Position <= length) - { - DetermineSectionFormat(); - } - - long unreadBytes = this.BaseStream.Length - this.BaseStream.Position; - if (unreadBytes != 0) - { - Console.WriteLine($"!!! Unread bytes: {unreadBytes} !!!"); - } + byte[] bytes = ReadBytes(4); + return bigEndian.ToUInt32(bytes, 0); } - private void DetermineSectionFormat() + public override ulong ReadUInt64() { - TicketDataSection section = ReadTicketSectionHeader(); - Console.WriteLine($" {section.Type} Section, length is {section.Length} @ offset {section.Position}"); - - if (section.Type == TicketDataSectionType.DateOfBirth) - { - this.BaseStream.Position += section.Length; - } - - int endSpot = section.Length + section.Position; - while (this.BaseStream.Position <= endSpot) - { - DetermineData(); - } + byte[] bytes = ReadBytes(8); + return bigEndian.ToUInt64(bytes, 0); } - private void DetermineData() + #endregion + + internal TicketVersion ReadTicketVersion() => new TicketVersion((byte)(ReadByte() >> 4), ReadByte()); + + internal ushort ReadTicketHeader() { - TicketData data = ReadTicketData(TicketDataType.Empty); - if ((ushort)data.Type >> 8 == 0x30) // if data type starts with section header - { - this.BaseStream.Position -= sizeof(ushort) * 2; // roll back read from data - DetermineSectionFormat(); // read the section - return; - } - this.ReadBytes(data.Length); - Console.WriteLine($" {data.Type}, length is {data.Length}"); + ReadBytes(4); // header + return ReadUInt16(); // ticket length } internal TicketDataSection ReadTicketSectionHeader() @@ -92,9 +67,7 @@ internal TicketDataSection ReadTicketSectionHeader() byte sectionHeader = this.ReadByte(); if (sectionHeader != 0x30) - { - throw new FormatException($"Expected 0x30 for section header, was {sectionHeader}. Offset is {this.BaseStream.Position}"); - } + throw new FormatException($"[XI5Ticket] - Expected 0x30 for section header, was {sectionHeader}. Offset is {this.BaseStream.Position}"); TicketDataSectionType type = (TicketDataSectionType)this.ReadByte(); ushort length = this.ReadUInt16(); @@ -106,7 +79,7 @@ private TicketData ReadTicketData(TicketDataType expectedType) { TicketData data = new TicketData((TicketDataType)ReadUInt16(), ReadUInt16()); if (data.Type != expectedType && expectedType != TicketDataType.Empty) - throw new FormatException($"Expected data type to be {expectedType}, was really {data.Type} ({(int)data.Type})"); + throw new FormatException($"[XI5Ticket] - Expected data type to be {expectedType}, was really {data.Type} ({(int)data.Type})"); return data; } From 87d03fba61a33fcab7df4e6b646f5dbc9fade180 Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 10:48:48 -0400 Subject: [PATCH 06/14] Removed unnecessary usings --- .../CastleLibrary/XI5/Types/Parsers/TicketParser21.cs | 7 +------ .../CastleLibrary/XI5/Types/Parsers/TicketParser30.cs | 8 ++------ 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser21.cs b/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser21.cs index d675f811e..d5e9695b9 100644 --- a/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser21.cs +++ b/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser21.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using XI5.Reader; +using XI5.Reader; namespace XI5.Types.Parsers { diff --git a/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs b/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs index 30b9c33f8..e5b176f20 100644 --- a/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs +++ b/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using XI5.Reader; namespace XI5.Types.Parsers @@ -30,7 +26,7 @@ internal static void ParseTicket(XI5Ticket ticket, TicketReader reader) TicketDataSection header = reader.ReadTicketSectionHeader(); if (header.Type != TicketDataSectionType.DateOfBirth) { - throw new FormatException($"Expected section to be {nameof(TicketDataSectionType.DateOfBirth)}, " + + throw new FormatException($"[XI5Ticket] - Expected section to be {nameof(TicketDataSectionType.DateOfBirth)}, " + $"was really {header.Type} ({(int)header.Type})"); } @@ -41,7 +37,7 @@ internal static void ParseTicket(XI5Ticket ticket, TicketReader reader) header = reader.ReadTicketSectionHeader(); if (header.Type != TicketDataSectionType.Age) { - throw new FormatException($"Expected section to be {nameof(TicketDataSectionType.Age)}, " + + throw new FormatException($"[XI5Ticket] - Expected section to be {nameof(TicketDataSectionType.Age)}, " + $"was really {header.Type} ({(int)header.Type})"); } From c0bb0b19e0c909da40259e68d5d861a328e3e1c1 Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 10:49:18 -0400 Subject: [PATCH 07/14] Removed unnecessary usings --- BackendServices/CastleLibrary/XI5/Types/TicketData.cs | 8 +------- .../CastleLibrary/XI5/Types/TicketDataSection.cs | 8 +------- .../CastleLibrary/XI5/Types/TicketDataSectionType.cs | 8 +------- BackendServices/CastleLibrary/XI5/Types/TicketDataType.cs | 8 +------- BackendServices/CastleLibrary/XI5/Types/TicketVersion.cs | 8 +------- 5 files changed, 5 insertions(+), 35 deletions(-) diff --git a/BackendServices/CastleLibrary/XI5/Types/TicketData.cs b/BackendServices/CastleLibrary/XI5/Types/TicketData.cs index 9e5901f73..d084222b8 100644 --- a/BackendServices/CastleLibrary/XI5/Types/TicketData.cs +++ b/BackendServices/CastleLibrary/XI5/Types/TicketData.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Types +namespace XI5.Types { public readonly struct TicketData { diff --git a/BackendServices/CastleLibrary/XI5/Types/TicketDataSection.cs b/BackendServices/CastleLibrary/XI5/Types/TicketDataSection.cs index 67eabd136..4008c8828 100644 --- a/BackendServices/CastleLibrary/XI5/Types/TicketDataSection.cs +++ b/BackendServices/CastleLibrary/XI5/Types/TicketDataSection.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Types +namespace XI5.Types { public readonly struct TicketDataSection { diff --git a/BackendServices/CastleLibrary/XI5/Types/TicketDataSectionType.cs b/BackendServices/CastleLibrary/XI5/Types/TicketDataSectionType.cs index 4f351283e..550d1ec5b 100644 --- a/BackendServices/CastleLibrary/XI5/Types/TicketDataSectionType.cs +++ b/BackendServices/CastleLibrary/XI5/Types/TicketDataSectionType.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Types +namespace XI5.Types { public enum TicketDataSectionType : byte { diff --git a/BackendServices/CastleLibrary/XI5/Types/TicketDataType.cs b/BackendServices/CastleLibrary/XI5/Types/TicketDataType.cs index 13d618f52..38d525920 100644 --- a/BackendServices/CastleLibrary/XI5/Types/TicketDataType.cs +++ b/BackendServices/CastleLibrary/XI5/Types/TicketDataType.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Types +namespace XI5.Types { public enum TicketDataType : ushort { diff --git a/BackendServices/CastleLibrary/XI5/Types/TicketVersion.cs b/BackendServices/CastleLibrary/XI5/Types/TicketVersion.cs index 94f53d743..6a91bbded 100644 --- a/BackendServices/CastleLibrary/XI5/Types/TicketVersion.cs +++ b/BackendServices/CastleLibrary/XI5/Types/TicketVersion.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Types +namespace XI5.Types { public readonly struct TicketVersion { From d6e360471679225df5e07399646db7bd3813e439 Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 10:50:21 -0400 Subject: [PATCH 08/14] Delete BackendServices/CastleLibrary/XI5/Verification/Keys/Games directory Delete specific games for now --- .../Verification/Keys/Games/DefaultSigningKey.cs | 14 -------------- .../Verification/Keys/Games/WarhawkSigningKey.cs | 14 -------------- 2 files changed, 28 deletions(-) delete mode 100644 BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs delete mode 100644 BackendServices/CastleLibrary/XI5/Verification/Keys/Games/WarhawkSigningKey.cs diff --git a/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs deleted file mode 100644 index 27e04f571..000000000 --- a/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Verification.Keys.Games -{ - public class DefaultSigningKey : PsnSigningKey - { - public override string PublicKeyX => "39c62d061d4ee35c5f3f7531de0af3cf918346526edac727"; - public override string PublicKeyY => "a5d578b55113e612bf1878d4cc939d61a41318403b5bdf86"; - } -} diff --git a/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/WarhawkSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/WarhawkSigningKey.cs deleted file mode 100644 index 018da0e4c..000000000 --- a/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/WarhawkSigningKey.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Verification.Keys.Games -{ - public class WarhawkSigningKey : PsnSigningKey - { - public override string PublicKeyX => "39c62d061d4ee35c5f3f7531de0af3cf918346526edac727"; - public override string PublicKeyY => "a5d578b55113e612bf1878d4cc939d61a41318403b5bdf86"; - } -} From 62d23eb9ebfc13bbda2ad95ac279f89e0866c317 Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 10:51:24 -0400 Subject: [PATCH 09/14] Removed unnecessary usings Also removed extra games. If a game is found using a different key, we will add it there. --- .../XI5/Verification/Keys/Games/DefaultSigningKey.cs | 8 ++++++++ .../CastleLibrary/XI5/Verification/Keys/PsnSigningKey.cs | 8 +------- .../CastleLibrary/XI5/Verification/Keys/RpcnSigningKey.cs | 8 +------- 3 files changed, 10 insertions(+), 14 deletions(-) create mode 100644 BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs diff --git a/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs new file mode 100644 index 000000000..195613fde --- /dev/null +++ b/BackendServices/CastleLibrary/XI5/Verification/Keys/Games/DefaultSigningKey.cs @@ -0,0 +1,8 @@ +namespace XI5.Verification.Keys.Games +{ + public class DefaultSigningKey : PsnSigningKey + { + public override string PublicKeyX => "39c62d061d4ee35c5f3f7531de0af3cf918346526edac727"; + public override string PublicKeyY => "a5d578b55113e612bf1878d4cc939d61a41318403b5bdf86"; + } +} diff --git a/BackendServices/CastleLibrary/XI5/Verification/Keys/PsnSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/Keys/PsnSigningKey.cs index 901a4b725..e500f5f16 100644 --- a/BackendServices/CastleLibrary/XI5/Verification/Keys/PsnSigningKey.cs +++ b/BackendServices/CastleLibrary/XI5/Verification/Keys/PsnSigningKey.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Verification.Keys +namespace XI5.Verification.Keys { ///

/// A public signing key used when PS3/PSVita clients connect via official PSN. diff --git a/BackendServices/CastleLibrary/XI5/Verification/Keys/RpcnSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/Keys/RpcnSigningKey.cs index ec2888cfe..5a41017c6 100644 --- a/BackendServices/CastleLibrary/XI5/Verification/Keys/RpcnSigningKey.cs +++ b/BackendServices/CastleLibrary/XI5/Verification/Keys/RpcnSigningKey.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Verification.Keys +namespace XI5.Verification.Keys { /// /// The public signing key used when RPCS3 clients connect via RPCN. From f9bf3241626ddf1ef53c401e6de606cc285c6c3a Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 10:52:00 -0400 Subject: [PATCH 10/14] Removed unnecessary usings Also cleaned up some logging --- .../XI5/Verification/ITicketSigningKey.cs | 8 +------- .../XI5/Verification/SigningKeyResolver.cs | 15 +++------------ .../Verification/TicketSignatureMessageTypes.cs | 8 +------- .../XI5/Verification/TicketVerifier.cs | 5 ++--- 4 files changed, 7 insertions(+), 29 deletions(-) diff --git a/BackendServices/CastleLibrary/XI5/Verification/ITicketSigningKey.cs b/BackendServices/CastleLibrary/XI5/Verification/ITicketSigningKey.cs index ee88a8479..8e3942a17 100644 --- a/BackendServices/CastleLibrary/XI5/Verification/ITicketSigningKey.cs +++ b/BackendServices/CastleLibrary/XI5/Verification/ITicketSigningKey.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Verification +namespace XI5.Verification { /// /// Defines the parameters for a key used for verification. diff --git a/BackendServices/CastleLibrary/XI5/Verification/SigningKeyResolver.cs b/BackendServices/CastleLibrary/XI5/Verification/SigningKeyResolver.cs index 3a55ab000..77a84aec1 100644 --- a/BackendServices/CastleLibrary/XI5/Verification/SigningKeyResolver.cs +++ b/BackendServices/CastleLibrary/XI5/Verification/SigningKeyResolver.cs @@ -1,9 +1,5 @@ -using CustomLogger; -using System; +using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using XI5.Verification.Keys; using XI5.Verification.Keys.Games; @@ -14,12 +10,8 @@ public static class SigningKeyResolver // Map Title IDs to PSN signing keys private static readonly Dictionary PsnKeys = new(StringComparer.OrdinalIgnoreCase) { - { "NPUA80093", new WarhawkSigningKey() }, // US public beta - { "NPUA80077", new WarhawkSigningKey() }, // US digital - { "NPEA00017", new WarhawkSigningKey() }, // EU digital - { "BCUS98117", new WarhawkSigningKey() }, // US disc - { "BCES00008", new WarhawkSigningKey() }, // EU disc - { "BCAS20015", new WarhawkSigningKey() }, // Asia disc + // game title ID, signing key, e.x + // { "NPUA80093", new WarhawkSigningKey() }, }; /// @@ -36,7 +28,6 @@ public static ITicketSigningKey GetSigningKey(string issuer, string titleId) return psnKey; // default signing key - LoggerAccessor.LogInfo($"No signing key found for TitleID '{titleId}'. Using default key."); return new DefaultSigningKey(); } } diff --git a/BackendServices/CastleLibrary/XI5/Verification/TicketSignatureMessageTypes.cs b/BackendServices/CastleLibrary/XI5/Verification/TicketSignatureMessageTypes.cs index 4442290f6..6000585e1 100644 --- a/BackendServices/CastleLibrary/XI5/Verification/TicketSignatureMessageTypes.cs +++ b/BackendServices/CastleLibrary/XI5/Verification/TicketSignatureMessageTypes.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5.Verification +namespace XI5.Verification { public enum TicketSignatureMessageType : byte { diff --git a/BackendServices/CastleLibrary/XI5/Verification/TicketVerifier.cs b/BackendServices/CastleLibrary/XI5/Verification/TicketVerifier.cs index 616eba9a4..db7673ddc 100644 --- a/BackendServices/CastleLibrary/XI5/Verification/TicketVerifier.cs +++ b/BackendServices/CastleLibrary/XI5/Verification/TicketVerifier.cs @@ -4,15 +4,14 @@ using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Security; using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace XI5.Verification { public class TicketVerifier { + // credit: LittleBigRefresh team + private readonly TicketSignatureMessageType _messageType; private readonly XI5Ticket _ticket; private readonly byte[] _ticketData; From 06ad1d8badf45b669a188ea4af97e0306a5fd082 Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 10:53:04 -0400 Subject: [PATCH 11/14] Removed unnecessary usings Cleaned up temp Official RPCN var --- .../CastleLibrary/XI5/XI5Ticket.cs | 59 ++++++++----------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/BackendServices/CastleLibrary/XI5/XI5Ticket.cs b/BackendServices/CastleLibrary/XI5/XI5Ticket.cs index 99ab2011d..d840b3d0a 100644 --- a/BackendServices/CastleLibrary/XI5/XI5Ticket.cs +++ b/BackendServices/CastleLibrary/XI5/XI5Ticket.cs @@ -1,31 +1,21 @@ -using Microsoft.VisualBasic; -using Org.BouncyCastle.Asn1; -using Org.BouncyCastle.Crypto.Parameters; -using Org.BouncyCastle.Crypto.Signers; -using Org.BouncyCastle.OpenSsl; -using System; +using System; using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using XI5.Reader; +using XI5.Types; +using XI5.Types.Parsers; +using XI5.Verification; +using CustomLogger; + +namespace XI5 +{ + // https://www.psdevwiki.com/ps3/X-I-5-Ticket + // https://github.com/RipleyTom/rpcn/blob/master/src/server/client/ticket.rs + // https://github.com/LittleBigRefresh/NPTicket/tree/main -#if NET6_0_OR_GREATER -using System.Diagnostics.CodeAnalysis; -using System.Diagnostics.Contracts; - -#endif -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using XI5.Reader; -using XI5.Types; -using XI5.Types.Parsers; -using XI5.Verification; - -namespace XI5 -{ - // https://www.psdevwiki.com/ps3/X-I-5-Ticket - // https://github.com/RipleyTom/rpcn/blob/master/src/server/client/ticket.rs - // https://github.com/LittleBigRefresh/NPTicket/tree/main - public class XI5Ticket { // constructor @@ -52,7 +42,6 @@ public XI5Ticket() { } public ushort TicketLength { get; set; } public TicketDataSection BodySection { get; set; } - public bool SignedByOfficialRPCN { get { return true; } } public string SignatureIdentifier { get; set; } public byte[] SignatureData { get; set; } public bool Valid { get; protected set; } @@ -60,7 +49,6 @@ public XI5Ticket() { } // TODO: Use GeneratedRegex, this is not in netstandard yet internal static readonly Regex ServiceIdRegex = new Regex("(?<=-)[A-Z0-9]{9}(?=_)", RegexOptions.Compiled); - [Pure] public static XI5Ticket ReadFromBytes(byte[] ticketData) { using (var ms = new MemoryStream(ticketData)) @@ -100,11 +88,11 @@ public static XI5Ticket ReadFromStream(Stream ticketStream) long actualLength = ticketStream.Length - headerLength; if (ticket.TicketLength != actualLength) - throw new FormatException($"Expected ticket length to be {ticket.TicketLength} bytes, but was {actualLength} bytes."); + throw new FormatException($"[XI5Ticket] - Expected ticket length to be {ticket.TicketLength} bytes, but was {actualLength} bytes."); ticket.BodySection = reader.ReadTicketSectionHeader(); if (ticket.BodySection.Type != TicketDataSectionType.Body) - throw new FormatException($"Expected first section to be {nameof(TicketDataSectionType.Body)}, but was {ticket.BodySection.Type} ({(int)ticket.BodySection.Type})."); + throw new FormatException($"[XI5Ticket] - Expected first section to be {nameof(TicketDataSectionType.Body)}, but was {ticket.BodySection.Type} ({(int)ticket.BodySection.Type})."); // ticket 2.1 if (ticket.Version.Major == 2 && ticket.Version.Minor == 1) @@ -116,20 +104,25 @@ public static XI5Ticket ReadFromStream(Stream ticketStream) // unhandled ticket version else - throw new FormatException($"Unknown/unhandled ticket version {ticket.Version.Major}.{ticket.Version.Minor}."); + throw new FormatException($"[XI5Ticket] - Unknown/unhandled ticket version {ticket.Version}."); var footer = reader.ReadTicketSectionHeader(); if (footer.Type != TicketDataSectionType.Footer) - throw new FormatException($"Expected last section to be {nameof(TicketDataSectionType.Footer)}, but was {footer.Type} ({(int)footer.Type})."); + throw new FormatException($"[XI5Ticket] - Expected last section to be {nameof(TicketDataSectionType.Footer)}, but was {footer.Type} ({(int)footer.Type})."); ticket.SignatureIdentifier = reader.ReadTicketStringData(TicketDataType.Binary); ticket.SignatureData = reader.ReadTicketBinaryData(); } + // verify ticket signature ITicketSigningKey signingKey = SigningKeyResolver.GetSigningKey(ticket.SignatureIdentifier, ticket.TitleId); TicketVerifier ticketVerifier = new TicketVerifier(ticketData, ticket, signingKey); ticket.Valid = ticketVerifier.IsTicketValid(); + // ticket invalid + if (!ticket.Valid) + LoggerAccessor.LogWarn($"[XI5Ticket] - Ticket for {ticket.TitleId} has invalid signature!"); + return ticket; } @@ -156,5 +149,5 @@ public override string ToString() return sb.ToString(); } - } + } } \ No newline at end of file From 09c3b68299cce64a61fed93547be3c20b4372ccf Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 10:53:56 -0400 Subject: [PATCH 12/14] Delete BackendServices/CastleLibrary/XI5/StreamExtensions.cs We don't need this anymore --- .../CastleLibrary/XI5/StreamExtensions.cs | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 BackendServices/CastleLibrary/XI5/StreamExtensions.cs diff --git a/BackendServices/CastleLibrary/XI5/StreamExtensions.cs b/BackendServices/CastleLibrary/XI5/StreamExtensions.cs deleted file mode 100644 index d7c28e000..000000000 --- a/BackendServices/CastleLibrary/XI5/StreamExtensions.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace XI5 -{ - internal static class StreamExtensions - { - public static uint ReadUInt(this Stream stream) - { - byte[] buffer = new byte[4]; - stream.Read(buffer, 0, 4); - if (BitConverter.IsLittleEndian) - Array.Reverse(buffer); - return BitConverter.ToUInt32(buffer, 0); - } - - public static ulong ReadULong(this Stream stream) - { - byte[] buffer = new byte[8]; - stream.Read(buffer, 0, 8); - if (BitConverter.IsLittleEndian) - Array.Reverse(buffer); - return BitConverter.ToUInt64(buffer, 0); - } - - public static ushort ReadUShort(this Stream stream) - { - byte[] buffer = new byte[2]; - stream.Read(buffer, 0, 2); - if (BitConverter.IsLittleEndian) - Array.Reverse(buffer); - return BitConverter.ToUInt16(buffer, 0); - } - - public static bool ReadAll(this Stream stream, byte[] buffer, int startIndex, int count) - { - if (stream == null) - return false; - - int offset = 0; - while (offset < count) - { - int readCount = stream.Read(buffer, startIndex + offset, count - offset); - if (readCount == 0) - return false; - offset += readCount; - } - return true; - } - } -} From a2fd8d7d52c22ffc18f1711db1ac158423a09489 Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 11:19:08 -0400 Subject: [PATCH 13/14] Update TicketParser30.cs Removed console.writeline --- .../CastleLibrary/XI5/Types/Parsers/TicketParser30.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs b/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs index e5b176f20..8e401e0bb 100644 --- a/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs +++ b/BackendServices/CastleLibrary/XI5/Types/Parsers/TicketParser30.cs @@ -30,10 +30,9 @@ internal static void ParseTicket(XI5Ticket ticket, TicketReader reader) $"was really {header.Type} ({(int)header.Type})"); } - reader.ReadUInt32(); // Birthdate - reader.SkipTicketEmptyData(2); // Padding? + reader.ReadUInt32(); // d.o.b + reader.SkipTicketEmptyData(2); - Console.WriteLine(reader.BaseStream.Position); header = reader.ReadTicketSectionHeader(); if (header.Type != TicketDataSectionType.Age) { From 117f240b3187ab0999847d6d2705474661eeecc8 Mon Sep 17 00:00:00 2001 From: score3229 <49077373+score3229@users.noreply.github.com> Date: Tue, 27 May 2025 11:31:20 -0400 Subject: [PATCH 14/14] Updated XI5Ticket in login function --- Servers/SSFWServer/SSFWLogin.cs | 39 ++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/Servers/SSFWServer/SSFWLogin.cs b/Servers/SSFWServer/SSFWLogin.cs index 453fc4585..48282ccaa 100644 --- a/Servers/SSFWServer/SSFWLogin.cs +++ b/Servers/SSFWServer/SSFWLogin.cs @@ -1,10 +1,9 @@ using CustomLogger; -using NetworkLibrary.Extension; -using System.Text; +using NetHasher; using System.Collections.Concurrent; +using System.Text; using WebAPIService.SSFW; using XI5; -using NetHasher; namespace SSFWServer { @@ -166,21 +165,25 @@ public SSFWLogin(string XHomeClientVersion, string generalsecret, string homeCli extractedData[i] = 0x48; } - XI5Ticket ticket = XI5Ticket.ReadFromBytes(ticketBuffer); - - if (ByteUtils.FindBytePattern(ticketBuffer, new byte[] { 0x52, 0x50, 0x43, 0x4E }, 184) != -1) - { - if (SSFWServerConfiguration.ForceOfficialRPCNSignature && !ticket.SignedByOfficialRPCN) - { - LoggerAccessor.LogError($"[SSFW] : User {Encoding.ASCII.GetString(extractedData).Replace("H", string.Empty)} was caught using an invalid RPCN signature!"); - return null; - } - - IsRPCN = true; - LoggerAccessor.LogInfo($"[SSFW] : User {Encoding.ASCII.GetString(extractedData).Replace("H", string.Empty)} logged in and is on RPCN"); - } - else - LoggerAccessor.LogInfo($"[SSFW] : {Encoding.ASCII.GetString(extractedData).Replace("H", string.Empty)} logged in and is on PSN"); + XI5Ticket ticket = XI5Ticket.ReadFromBytes(ticketBuffer); + + // invalid ticket + if (!ticket.Valid) + { + LoggerAccessor.LogWarn($"[SSFWLogin] - {ticket.Username} tried to alter their ticket data"); + return null; + } + + // RPCN + if (ticket.SignatureIdentifier == "RPCN") + { + IsRPCN = true; + LoggerAccessor.LogInfo($"[SSFWLogin] - {ticket.Username} logged in and is on RPCN"); + } + + // PSN + else + LoggerAccessor.LogInfo($"[SSFWLogin] - {ticket.Username} logged in and is on PSN"); (string, string) UserNames = new(); (string, string) ResultStrings = new();