diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..ca2abcb --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Carl Kittelberger + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/libnpsharp.sln b/libnpsharp.sln index 09d50cf..0ce2d38 100644 --- a/libnpsharp.sln +++ b/libnpsharp.sln @@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.30501.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "libnpsharp", "src\libnpsharp\libnpsharp.csproj", "{1A5AC63A-250E-4BC8-B81A-822AC31F5E37}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "npmotd", "src\npmotd\npmotd.csproj", "{7887D77B-3C79-44C5-AB80-944B191321BB}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{587B7B8C-1605-46CF-BA39-AC9C72C1E860}" @@ -16,7 +14,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{587B7B EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "npfile", "src\npfile\npfile.csproj", "{19EBF339-E076-4962-A671-5B44A978687D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "npserv", "src\npserv\npserv.csproj", "{1FF77692-D07C-4131-95AE-21AD2A74CA11}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{F86304A3-8257-4132-A0B3-AC3CE0E2EB3F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPSharp.Client", "src\client\NPSharp.Client.csproj", "{C6F941A5-82AF-456A-9B3A-752E5B001035}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPSharp.Server", "src\server\NPSharp.Server.csproj", "{1A5AC63A-250E-4BC8-B81A-822AC31F5E37}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -24,10 +26,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1A5AC63A-250E-4BC8-B81A-822AC31F5E37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1A5AC63A-250E-4BC8-B81A-822AC31F5E37}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1A5AC63A-250E-4BC8-B81A-822AC31F5E37}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1A5AC63A-250E-4BC8-B81A-822AC31F5E37}.Release|Any CPU.Build.0 = Release|Any CPU {7887D77B-3C79-44C5-AB80-944B191321BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7887D77B-3C79-44C5-AB80-944B191321BB}.Debug|Any CPU.Build.0 = Debug|Any CPU {7887D77B-3C79-44C5-AB80-944B191321BB}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -35,13 +33,20 @@ Global {19EBF339-E076-4962-A671-5B44A978687D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19EBF339-E076-4962-A671-5B44A978687D}.Debug|Any CPU.Build.0 = Debug|Any CPU {19EBF339-E076-4962-A671-5B44A978687D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {19EBF339-E076-4962-A671-5B44A978687D}.Release|Any CPU.Build.0 = Release|Any CPU - {1FF77692-D07C-4131-95AE-21AD2A74CA11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1FF77692-D07C-4131-95AE-21AD2A74CA11}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1FF77692-D07C-4131-95AE-21AD2A74CA11}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1FF77692-D07C-4131-95AE-21AD2A74CA11}.Release|Any CPU.Build.0 = Release|Any CPU + {C6F941A5-82AF-456A-9B3A-752E5B001035}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6F941A5-82AF-456A-9B3A-752E5B001035}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6F941A5-82AF-456A-9B3A-752E5B001035}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6F941A5-82AF-456A-9B3A-752E5B001035}.Release|Any CPU.Build.0 = Release|Any CPU + {1A5AC63A-250E-4BC8-B81A-822AC31F5E37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A5AC63A-250E-4BC8-B81A-822AC31F5E37}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A5AC63A-250E-4BC8-B81A-822AC31F5E37}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A5AC63A-250E-4BC8-B81A-822AC31F5E37}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {7887D77B-3C79-44C5-AB80-944B191321BB} = {F86304A3-8257-4132-A0B3-AC3CE0E2EB3F} + {19EBF339-E076-4962-A671-5B44A978687D} = {F86304A3-8257-4132-A0B3-AC3CE0E2EB3F} + EndGlobalSection EndGlobal diff --git a/src/libnpsharp/Authentication/SessionAuthenticationClient.cs b/src/client/Authentication/SessionAuthenticationClient.cs similarity index 100% rename from src/libnpsharp/Authentication/SessionAuthenticationClient.cs rename to src/client/Authentication/SessionAuthenticationClient.cs diff --git a/src/libnpsharp/Authentication/SessionAuthenticationResult.cs b/src/client/Authentication/SessionAuthenticationResult.cs similarity index 100% rename from src/libnpsharp/Authentication/SessionAuthenticationResult.cs rename to src/client/Authentication/SessionAuthenticationResult.cs diff --git a/src/client/Master/Client/MasterGetServersKeywords.cs b/src/client/Master/Client/MasterGetServersKeywords.cs new file mode 100644 index 0000000..54131e0 --- /dev/null +++ b/src/client/Master/Client/MasterGetServersKeywords.cs @@ -0,0 +1,11 @@ +namespace NPSharp.Master.Messages.Data +{ + /// + /// Represents keywords for a master server standard serverlist request. + /// + public enum MasterGetServersKeywords + { + Full = 0x01, + Empty = 0x02 + } +} \ No newline at end of file diff --git a/src/libnpsharp/Master/Messages/Client/MasterGetServersMessage.cs b/src/client/Master/Client/MasterGetServersMessage.cs similarity index 86% rename from src/libnpsharp/Master/Messages/Client/MasterGetServersMessage.cs rename to src/client/Master/Client/MasterGetServersMessage.cs index 98e6612..5c3c0a3 100644 --- a/src/libnpsharp/Master/Messages/Client/MasterGetServersMessage.cs +++ b/src/client/Master/Client/MasterGetServersMessage.cs @@ -1,7 +1,5 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Text; using log4net; using NPSharp.Master.Messages.Data; @@ -62,16 +60,4 @@ namespace NPSharp.Master.Messages.Client /// public List Keywords { get; set; } } -} - -namespace NPSharp.Master.Messages.Data -{ - /// - /// Represents keywords for a master server standard serverlist request. - /// - public enum MasterGetServersKeywords - { - Full = 0x01, - Empty = 0x02 - } } \ No newline at end of file diff --git a/src/client/Master/DedicatedServerEntry.cs b/src/client/Master/DedicatedServerEntry.cs new file mode 100644 index 0000000..2a328bd --- /dev/null +++ b/src/client/Master/DedicatedServerEntry.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; + +namespace NPSharp.Master +{ + public class DedicatedServerEntry + { + internal DedicatedServerEntry(IPAddress ip, params ushort[] ports) + { + IP = ip; + Ports = ports; + } + + public IPAddress IP { get; private set; } + + public ushort[] Ports { get; private set; } + + internal byte[] Serialize(bool standardFormat = true) + { + if (standardFormat && IP.AddressFamily != AddressFamily.InterNetwork) + throw new InvalidOperationException("Can't serialize non-IPv4 addresses into standard format"); + + var buffer = new List(); + + if (standardFormat) + buffer.AddRange(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(IP.GetHashCode()))); // TODO: GetHashCode == IP address as number??? + else + { + // TODO: Implement extended serialization format for IP addresses! + throw new NotImplementedException("Extended serialization format not implemented yet"); + } + + foreach (var port in Ports) + buffer.AddRange(BitConverter.GetBytes((ushort) IPAddress.HostToNetworkOrder((short) port))); + + return buffer.ToArray(); + } + + // TODO: Deserialize + } +} \ No newline at end of file diff --git a/src/libnpsharp/Master/Messages/MasterClientMessage.cs b/src/client/Master/MasterClientMessage.cs similarity index 62% rename from src/libnpsharp/Master/Messages/MasterClientMessage.cs rename to src/client/Master/MasterClientMessage.cs index 0da582b..bc9e936 100644 --- a/src/libnpsharp/Master/Messages/MasterClientMessage.cs +++ b/src/client/Master/MasterClientMessage.cs @@ -32,7 +32,7 @@ namespace NPSharp.Master.Messages get { return GetType().GetCustomAttribute().Name; } } - internal MasterClientMessage Deserialize(Socket sock) + internal static MasterClientMessage Deserialize(Socket sock) { while (sock.Connected && !sock.Poll(2000, SelectMode.SelectRead)) { @@ -57,29 +57,7 @@ namespace NPSharp.Master.Messages throw new ProtocolViolationException("Received incomplete header"); } - var header = buffer.Take(4).ToArray(); - var command = Encoding.ASCII.GetString(buffer, 4, length - 4).Trim(); - var commandSplit = command.Split(new[] {'\t', '\r', '\n', '\0', ' '}, - StringSplitOptions.RemoveEmptyEntries); - - var commandName = commandSplit[0]; - var commandArguments = commandSplit.Skip(1).ToArray(); - - // Search for a message class which fits to the commandName - var message = - (MasterClientMessage) Activator.CreateInstance(Assembly.GetExecutingAssembly() - .GetTypes() - .Single( - t => - t.IsSubclassOf(typeof (MasterClientMessage)) && - t.GetCustomAttribute() - .Name.Equals(commandName, StringComparison.OrdinalIgnoreCase))); - - // Call the individual deserialize method - message.Deserialize(commandArguments); - message.Header = header; - - return message; + return Deserialize(buffer.Take(length).ToArray()); } catch (SocketException) { @@ -89,6 +67,33 @@ namespace NPSharp.Master.Messages } } + internal static MasterClientMessage Deserialize(byte[] buffer) + { + var header = buffer.Take(4).ToArray(); + var command = Encoding.ASCII.GetString(buffer, 4, buffer.Length - 4).Trim(); + var commandSplit = command.Split(new[] { '\t', '\r', '\n', '\0', ' ' }, + StringSplitOptions.RemoveEmptyEntries); + + var commandName = commandSplit[0]; + var commandArguments = commandSplit.Skip(1).ToArray(); + + // Search for a message class which fits to the commandName + var message = + (MasterClientMessage)Activator.CreateInstance(Assembly.GetExecutingAssembly() + .GetTypes() + .Single( + t => + t.IsSubclassOf(typeof(MasterClientMessage)) && + t.GetCustomAttribute() + .Name.Equals(commandName, StringComparison.OrdinalIgnoreCase))); + + // Call the individual deserialize method + message.Deserialize(commandArguments); + message.Header = header; + + return message; + } + internal byte[] SerializeInternal() { var buffer = new List(); diff --git a/src/libnpsharp/Master/Messages/MasterClientMessageAttribute.cs b/src/client/Master/MasterClientMessageAttribute.cs similarity index 73% rename from src/libnpsharp/Master/Messages/MasterClientMessageAttribute.cs rename to src/client/Master/MasterClientMessageAttribute.cs index 745fc9b..921cd74 100644 --- a/src/libnpsharp/Master/Messages/MasterClientMessageAttribute.cs +++ b/src/client/Master/MasterClientMessageAttribute.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace NPSharp.Master.Messages { diff --git a/src/libnpsharp/NP/NPAuthenticationResult.cs b/src/client/NP/NPAuthenticationResult.cs similarity index 100% rename from src/libnpsharp/NP/NPAuthenticationResult.cs rename to src/client/NP/NPAuthenticationResult.cs diff --git a/src/libnpsharp/NP/NPClient.cs b/src/client/NP/NPClient.cs similarity index 99% rename from src/libnpsharp/NP/NPClient.cs rename to src/client/NP/NPClient.cs index af15bc2..933822f 100644 --- a/src/libnpsharp/NP/NPClient.cs +++ b/src/client/NP/NPClient.cs @@ -79,7 +79,6 @@ namespace NPSharp.NP { if (_rpc.Read() == null) break; - _log.Debug("Disconnected."); } } catch (ProtocolViolationException error) diff --git a/src/libnpsharp/NP/NPFileException.cs b/src/client/NP/NPFileException.cs similarity index 100% rename from src/libnpsharp/NP/NPFileException.cs rename to src/client/NP/NPFileException.cs diff --git a/src/libnpsharp/libnpsharp.csproj b/src/client/NPSharp.Client.csproj similarity index 71% rename from src/libnpsharp/libnpsharp.csproj rename to src/client/NPSharp.Client.csproj index cc9f723..21d62fd 100644 --- a/src/libnpsharp/libnpsharp.csproj +++ b/src/client/NPSharp.Client.csproj @@ -1,19 +1,16 @@  - + Debug AnyCPU - {1A5AC63A-250E-4BC8-B81A-822AC31F5E37} + {C6F941A5-82AF-456A-9B3A-752E5B001035} Library Properties NPSharp - libnpsharp + npsharp_client v4.5 512 - - 12.0.0 - 2.0 ..\..\ true @@ -21,120 +18,110 @@ true full false - DEBUG;TRACE + bin\Debug\ + TRACE;DEBUG;COMPILE_RPC,COMPILE_NP,COMPILE_AUTH prompt 4 - false pdbonly true - TRACE + bin\Release\ + TRACE;COMPILE_RPC,COMPILE_NP,COMPILE_AUTH prompt 4 - false - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ - $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ - $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ + + ..\..\packages\log4net.2.0.3\lib\net40-full\log4net.dll + False ..\..\packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll - - - - ..\..\packages\log4net.2.0.3\lib\net40-full\log4net.dll - ..\..\packages\protobuf-net.2.0.0.668\lib\net40\protobuf-net.dll - - - - False - ..\..\packages\uHttpSharp.0.1.4.8\lib\net40\uhttpsharp.dll - + + + + + + + - - - - - - - + - - - - - - - + + + + + + - - - + - - - - - - - - - - - - - - - - - - - + + + + - + + + + + + + + + + + - - + + + + + + + + + + + - - - - - + - - - + + + + + + + Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Aktivieren Sie die Wiederherstellung von NuGet-Paketen, um die fehlende Datei herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}". + + + - - - - - - \ No newline at end of file diff --git a/src/npserv/Properties/AssemblyInfo.cs b/src/client/Properties/AssemblyInfo.cs similarity index 70% rename from src/npserv/Properties/AssemblyInfo.cs rename to src/client/Properties/AssemblyInfo.cs index 00beb8b..26598b8 100644 --- a/src/npserv/Properties/AssemblyInfo.cs +++ b/src/client/Properties/AssemblyInfo.cs @@ -1,28 +1,26 @@ using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Allgemeine Informationen über eine Assembly werden über die folgenden // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, // die mit einer Assembly verknüpft sind. - -[assembly: AssemblyTitle("npserv")] +[assembly: AssemblyTitle("NPSharp client library")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Hewlett-Packard")] -[assembly: AssemblyProduct("npserv")] -[assembly: AssemblyCopyright("Copyright © Hewlett-Packard 2014")] +[assembly: AssemblyCompany("Carl Kittelberger")] +[assembly: AssemblyProduct("NPSharp")] +[assembly: AssemblyCopyright("© 2014 Carl Kittelberger")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar // für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von // COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. - [assembly: ComVisible(false)] // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird - -[assembly: Guid("098bf075-4a4b-437c-9283-011ffb6ff277")] +[assembly: Guid("eb49c20b-b649-42fa-bff4-f62aba36e0b0")] // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: // @@ -34,6 +32,8 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyFileVersion("1.0")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file +// Make internals visible to the server counterpart of this library +[assembly: InternalsVisibleTo("npsharp_server")] \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/Client/AuthenticateRegisterServerMessage.cs b/src/client/RPC/Messages/Client/AuthenticateRegisterServerMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/AuthenticateRegisterServerMessage.cs rename to src/client/RPC/Messages/Client/AuthenticateRegisterServerMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/AuthenticateValidateTicketMessage.cs b/src/client/RPC/Messages/Client/AuthenticateValidateTicketMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/AuthenticateValidateTicketMessage.cs rename to src/client/RPC/Messages/Client/AuthenticateValidateTicketMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/AuthenticateWithDetailsMessage.cs b/src/client/RPC/Messages/Client/AuthenticateWithDetailsMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/AuthenticateWithDetailsMessage.cs rename to src/client/RPC/Messages/Client/AuthenticateWithDetailsMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/AuthenticateWithKeyMessage.cs b/src/client/RPC/Messages/Client/AuthenticateWithKeyMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/AuthenticateWithKeyMessage.cs rename to src/client/RPC/Messages/Client/AuthenticateWithKeyMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/AuthenticateWithTokenMessage.cs b/src/client/RPC/Messages/Client/AuthenticateWithTokenMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/AuthenticateWithTokenMessage.cs rename to src/client/RPC/Messages/Client/AuthenticateWithTokenMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/FriendsGetProfileDataMessage.cs b/src/client/RPC/Messages/Client/FriendsGetProfileDataMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/FriendsGetProfileDataMessage.cs rename to src/client/RPC/Messages/Client/FriendsGetProfileDataMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/FriendsGetUserAvatarMessage.cs b/src/client/RPC/Messages/Client/FriendsGetUserAvatarMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/FriendsGetUserAvatarMessage.cs rename to src/client/RPC/Messages/Client/FriendsGetUserAvatarMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/FriendsSetPresenceMessage.cs b/src/client/RPC/Messages/Client/FriendsSetPresenceMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/FriendsSetPresenceMessage.cs rename to src/client/RPC/Messages/Client/FriendsSetPresenceMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/FriendsSetSteamIDMessage.cs b/src/client/RPC/Messages/Client/FriendsSetSteamIDMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/FriendsSetSteamIDMessage.cs rename to src/client/RPC/Messages/Client/FriendsSetSteamIDMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/MessagingSendDataMessage.cs b/src/client/RPC/Messages/Client/MessagingSendDataMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/MessagingSendDataMessage.cs rename to src/client/RPC/Messages/Client/MessagingSendDataMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/StorageGetPublisherFileMessage.cs b/src/client/RPC/Messages/Client/StorageGetPublisherFileMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/StorageGetPublisherFileMessage.cs rename to src/client/RPC/Messages/Client/StorageGetPublisherFileMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/StorageGetUserFileMessage.cs b/src/client/RPC/Messages/Client/StorageGetUserFileMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/StorageGetUserFileMessage.cs rename to src/client/RPC/Messages/Client/StorageGetUserFileMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/StorageSendRandomStringMessage.cs b/src/client/RPC/Messages/Client/StorageSendRandomStringMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/StorageSendRandomStringMessage.cs rename to src/client/RPC/Messages/Client/StorageSendRandomStringMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Client/StorageWriteUserFileMessage.cs b/src/client/RPC/Messages/Client/StorageWriteUserFileMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Client/StorageWriteUserFileMessage.cs rename to src/client/RPC/Messages/Client/StorageWriteUserFileMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Data/FriendDetails.cs b/src/client/RPC/Messages/Data/FriendDetails.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Data/FriendDetails.cs rename to src/client/RPC/Messages/Data/FriendDetails.cs diff --git a/src/libnpsharp/RPC/Messages/Data/FriendsPresence.cs b/src/client/RPC/Messages/Data/FriendsPresence.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Data/FriendsPresence.cs rename to src/client/RPC/Messages/Data/FriendsPresence.cs diff --git a/src/libnpsharp/RPC/Messages/Data/PresenceState.cs b/src/client/RPC/Messages/Data/PresenceState.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Data/PresenceState.cs rename to src/client/RPC/Messages/Data/PresenceState.cs diff --git a/src/libnpsharp/RPC/Messages/Data/ProfileData.cs b/src/client/RPC/Messages/Data/ProfileData.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Data/ProfileData.cs rename to src/client/RPC/Messages/Data/ProfileData.cs diff --git a/src/libnpsharp/RPC/Messages/Data/Ticket.cs b/src/client/RPC/Messages/Data/Ticket.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Data/Ticket.cs rename to src/client/RPC/Messages/Data/Ticket.cs diff --git a/src/libnpsharp/RPC/Messages/Data/TicketValidationResult.cs b/src/client/RPC/Messages/Data/TicketValidationResult.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Data/TicketValidationResult.cs rename to src/client/RPC/Messages/Data/TicketValidationResult.cs diff --git a/src/libnpsharp/RPC/Messages/PacketAttribute.cs b/src/client/RPC/Messages/PacketAttribute.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/PacketAttribute.cs rename to src/client/RPC/Messages/PacketAttribute.cs diff --git a/src/libnpsharp/RPC/Messages/RPCClientMessage.cs b/src/client/RPC/Messages/RPCClientMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/RPCClientMessage.cs rename to src/client/RPC/Messages/RPCClientMessage.cs diff --git a/src/libnpsharp/RPC/Messages/RPCMessage.cs b/src/client/RPC/Messages/RPCMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/RPCMessage.cs rename to src/client/RPC/Messages/RPCMessage.cs diff --git a/src/libnpsharp/RPC/Messages/RPCServerMessage.cs b/src/client/RPC/Messages/RPCServerMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/RPCServerMessage.cs rename to src/client/RPC/Messages/RPCServerMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/AuthenticateExternalStatusMessage.cs b/src/client/RPC/Messages/Server/AuthenticateExternalStatusMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/AuthenticateExternalStatusMessage.cs rename to src/client/RPC/Messages/Server/AuthenticateExternalStatusMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/AuthenticateRegisterServerResultMessage.cs b/src/client/RPC/Messages/Server/AuthenticateRegisterServerResultMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/AuthenticateRegisterServerResultMessage.cs rename to src/client/RPC/Messages/Server/AuthenticateRegisterServerResultMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/AuthenticateResultMessage.cs b/src/client/RPC/Messages/Server/AuthenticateResultMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/AuthenticateResultMessage.cs rename to src/client/RPC/Messages/Server/AuthenticateResultMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/AuthenticateUserGroupMessage.cs b/src/client/RPC/Messages/Server/AuthenticateUserGroupMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/AuthenticateUserGroupMessage.cs rename to src/client/RPC/Messages/Server/AuthenticateUserGroupMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/AuthenticateValidateTicketResultMessage.cs b/src/client/RPC/Messages/Server/AuthenticateValidateTicketResultMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/AuthenticateValidateTicketResultMessage.cs rename to src/client/RPC/Messages/Server/AuthenticateValidateTicketResultMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/CloseAppMessage.cs b/src/client/RPC/Messages/Server/CloseAppMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/CloseAppMessage.cs rename to src/client/RPC/Messages/Server/CloseAppMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/FriendsGetProfileDataResultMessage.cs b/src/client/RPC/Messages/Server/FriendsGetProfileDataResultMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/FriendsGetProfileDataResultMessage.cs rename to src/client/RPC/Messages/Server/FriendsGetProfileDataResultMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/FriendsGetUserAvatarResultMessage.cs b/src/client/RPC/Messages/Server/FriendsGetUserAvatarResultMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/FriendsGetUserAvatarResultMessage.cs rename to src/client/RPC/Messages/Server/FriendsGetUserAvatarResultMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/FriendsPresenceMessage.cs b/src/client/RPC/Messages/Server/FriendsPresenceMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/FriendsPresenceMessage.cs rename to src/client/RPC/Messages/Server/FriendsPresenceMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/FriendsRosterMessage.cs b/src/client/RPC/Messages/Server/FriendsRosterMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/FriendsRosterMessage.cs rename to src/client/RPC/Messages/Server/FriendsRosterMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/HelloMessage.cs b/src/client/RPC/Messages/Server/HelloMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/HelloMessage.cs rename to src/client/RPC/Messages/Server/HelloMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/StoragePublisherFileMessage.cs b/src/client/RPC/Messages/Server/StoragePublisherFileMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/StoragePublisherFileMessage.cs rename to src/client/RPC/Messages/Server/StoragePublisherFileMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/StorageUserFileMessage.cs b/src/client/RPC/Messages/Server/StorageUserFileMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/StorageUserFileMessage.cs rename to src/client/RPC/Messages/Server/StorageUserFileMessage.cs diff --git a/src/libnpsharp/RPC/Messages/Server/StorageWriteUserFileResultMessage.cs b/src/client/RPC/Messages/Server/StorageWriteUserFileResultMessage.cs similarity index 100% rename from src/libnpsharp/RPC/Messages/Server/StorageWriteUserFileResultMessage.cs rename to src/client/RPC/Messages/Server/StorageWriteUserFileResultMessage.cs diff --git a/src/libnpsharp/RPC/RPCClientStream.cs b/src/client/RPC/RPCClientStream.cs similarity index 100% rename from src/libnpsharp/RPC/RPCClientStream.cs rename to src/client/RPC/RPCClientStream.cs diff --git a/src/libnpsharp/RPC/RPCStream.cs b/src/client/RPC/RPCStream.cs similarity index 100% rename from src/libnpsharp/RPC/RPCStream.cs rename to src/client/RPC/RPCStream.cs diff --git a/src/libnpsharp/Steam/CSteamID.cs b/src/client/Steam/CSteamID.cs similarity index 100% rename from src/libnpsharp/Steam/CSteamID.cs rename to src/client/Steam/CSteamID.cs diff --git a/src/libnpsharp/Steam/EAccountType.cs b/src/client/Steam/EAccountType.cs similarity index 100% rename from src/libnpsharp/Steam/EAccountType.cs rename to src/client/Steam/EAccountType.cs diff --git a/src/libnpsharp/Steam/EUniverse.cs b/src/client/Steam/EUniverse.cs similarity index 100% rename from src/libnpsharp/Steam/EUniverse.cs rename to src/client/Steam/EUniverse.cs diff --git a/src/libnpsharp/Steam/InteropHelp.cs b/src/client/Steam/InteropHelp.cs similarity index 100% rename from src/libnpsharp/Steam/InteropHelp.cs rename to src/client/Steam/InteropHelp.cs diff --git a/src/libnpsharp/Steam/README.txt b/src/client/Steam/README.txt similarity index 100% rename from src/libnpsharp/Steam/README.txt rename to src/client/Steam/README.txt diff --git a/src/libnpsharp/Steam/SteamID_t.cs b/src/client/Steam/SteamID_t.cs similarity index 100% rename from src/libnpsharp/Steam/SteamID_t.cs rename to src/client/Steam/SteamID_t.cs diff --git a/src/client/packages.config b/src/client/packages.config new file mode 100644 index 0000000..04f4b7d --- /dev/null +++ b/src/client/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/libnpsharp/Master/Messages/Client/MasterGetServersExtendedMessage.cs b/src/libnpsharp/Master/Messages/Client/MasterGetServersExtendedMessage.cs deleted file mode 100644 index 64cd4aa..0000000 --- a/src/libnpsharp/Master/Messages/Client/MasterGetServersExtendedMessage.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using log4net; -using NPSharp.Master.Messages.Data; - -namespace NPSharp.Master.Messages.Client -{ - /// - /// Represents a request message for the master server for an extended dedicated server list. - /// - [MasterClientMessage("getserversExt")] - public class MasterGetServersExtendedMessage : MasterClientMessage - { - private static readonly ILog Log; - - static MasterGetServersExtendedMessage() - { - Log = LogManager.GetLogger(typeof (MasterGetServersExtendedMessage)); - } - - protected override string Serialize() - { - // I wonder if an extra useless space char at the end is okay in this case - return string.Format("{0} {1} {2} {3}", Name, GameName, ProtocolVersion, string.Join(" ", Keywords.Select(k => k.ToString()))); - } - - protected override void Deserialize(string[] arguments) - { - GameName = arguments[0]; - ProtocolVersion = uint.Parse(arguments[1]); - foreach (var kw in arguments.Skip(2)) - { - switch (kw.ToLower()) - { - case "empty": - Keywords.Add(MasterGetServersExtendedKeywords.Empty); - break; - case "full": - Keywords.Add(MasterGetServersExtendedKeywords.Full); - break; - case "ipv4": - Keywords.Add(MasterGetServersExtendedKeywords.InternetProtocolVersion4); - break; - case "ipv6": - Keywords.Add(MasterGetServersExtendedKeywords.InternetProtocolVersion6); - break; - default: - Log.WarnFormat("{0}: weird keyword {1}", Name, kw); - break; - } - } - } - - /// - /// The game for which servers should be fetched - /// - public string GameName { get; set; } - - /// - /// The protocol version of the dedicated servers to search for - /// - public uint ProtocolVersion { get; set; } - - /// - /// Extra keywords to take care of when generating the server list - /// - public List Keywords { get; set; } - } -} - -namespace NPSharp.Master.Messages.Data -{ - /// - /// Represents keywords for a master server standard serverlist request. - /// - public enum MasterGetServersExtendedKeywords - { - Full = 0x01, - Empty = 0x02, - InternetProtocolVersion4 = 0x04, - InternetProtocolVersion6 = 0x08 - } -} \ No newline at end of file diff --git a/src/npserv/App.config b/src/masterlist/App.config similarity index 76% rename from src/npserv/App.config rename to src/masterlist/App.config index 728a6f5..a2dd99c 100644 --- a/src/npserv/App.config +++ b/src/masterlist/App.config @@ -1,9 +1,8 @@  - - - - + + + diff --git a/src/masterlist/Program.cs b/src/masterlist/Program.cs new file mode 100644 index 0000000..5125320 --- /dev/null +++ b/src/masterlist/Program.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using log4net; +using log4net.Appender; +using log4net.Config; +using log4net.Core; +using log4net.Layout; + +namespace NPSharp.CommandLine.MasterList +{ + class Program + { + static void Main(string[] args) + { + // log4net setup + if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX) + { + var appender = new ConsoleAppender + { +#if DEBUG + Threshold = Level.Debug, +#else + Threshold = Level.Info, +#endif + Layout = new PatternLayout("<%d{HH:mm:ss}> [%logger:%thread] %level: %message%newline"), + }; + BasicConfigurator.Configure(new IAppender[] { appender, new DebugAppender { Layout = appender.Layout, Threshold = Level.All } }); + } + else + { + var appender = new ColoredConsoleAppender + { +#if DEBUG + Threshold = Level.Debug, +#else + Threshold = Level.Info, +#endif + Layout = new PatternLayout("<%d{HH:mm:ss}> [%logger:%thread] %level: %message%newline"), + }; + appender.AddMapping(new ColoredConsoleAppender.LevelColors + { + Level = Level.Debug, + ForeColor = ColoredConsoleAppender.Colors.Cyan | ColoredConsoleAppender.Colors.HighIntensity + }); + appender.AddMapping(new ColoredConsoleAppender.LevelColors + { + Level = Level.Info, + ForeColor = ColoredConsoleAppender.Colors.Green | ColoredConsoleAppender.Colors.HighIntensity + }); + appender.AddMapping(new ColoredConsoleAppender.LevelColors + { + Level = Level.Warn, + ForeColor = ColoredConsoleAppender.Colors.Purple | ColoredConsoleAppender.Colors.HighIntensity + }); + appender.AddMapping(new ColoredConsoleAppender.LevelColors + { + Level = Level.Error, + ForeColor = ColoredConsoleAppender.Colors.Red | ColoredConsoleAppender.Colors.HighIntensity + }); + appender.AddMapping(new ColoredConsoleAppender.LevelColors + { + Level = Level.Fatal, + ForeColor = ColoredConsoleAppender.Colors.White | ColoredConsoleAppender.Colors.HighIntensity, + BackColor = ColoredConsoleAppender.Colors.Red + }); + appender.ActivateOptions(); + BasicConfigurator.Configure(new IAppender[] { appender, new DebugAppender { Layout = appender.Layout, Threshold = Level.All } }); + } + + var log = LogManager.GetLogger("Main"); + + // Arguments + if (args.Length < 1) + { + log.ErrorFormat("Needs at least 1 argument: hostname [masterport, defaults to 27015]"); + return; + } + + var hostname = args[0]; + var masterport = (ushort)27015; + ushort.TryParse(args[1], out masterport); + + + + } + } +} diff --git a/src/masterlist/masterlist.csproj b/src/masterlist/masterlist.csproj new file mode 100644 index 0000000..2149452 --- /dev/null +++ b/src/masterlist/masterlist.csproj @@ -0,0 +1,84 @@ + + + + + Debug + AnyCPU + {3321608C-2063-4AC4-AF03-5858A7A2B1D8} + Exe + Properties + NPSharp.CommandLine.MasterList + masterlist + v4.5 + 512 + ..\..\ + true + + + true + full + false + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + TRACE + prompt + 4 + false + + + $(SolutionDir)\bin\$(Configuration)\$(Platform)\ + $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ + $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ + $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ + $(SolutionDir)\bin\$(Configuration)\$(Platform)\ + + + + ..\..\packages\log4net.2.0.3\lib\net40-full\log4net.dll + + + + + + + + + + + + + + + + + + + + + + {c6f941a5-82af-456a-9b3a-752e5b001035} + NPSharp.Client + + + + + + + Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Aktivieren Sie die Wiederherstellung von NuGet-Paketen, um die fehlende Datei herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}". + + + + + \ No newline at end of file diff --git a/src/masterlist/packages.config b/src/masterlist/packages.config new file mode 100644 index 0000000..3a86f25 --- /dev/null +++ b/src/masterlist/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/npfile/Program.cs b/src/npfile/Program.cs index 278167f..9de71d1 100644 --- a/src/npfile/Program.cs +++ b/src/npfile/Program.cs @@ -1,7 +1,6 @@ using System; using System.Net; using System.Net.Sockets; -using System.Threading; using System.Threading.Tasks; using log4net; using log4net.Appender; @@ -24,63 +23,8 @@ namespace NPSharp.CommandLine.File private static void Main(string[] args) { // log4net setup - if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX) - { - var appender = new ConsoleAppender - { -#if DEBUG - Threshold = Level.Debug, -#else - Threshold = Level.Info, -#endif - Layout = new PatternLayout("<%d{HH:mm:ss}> [%logger:%thread] %level: %message%newline"), - }; - BasicConfigurator.Configure(new IAppender[] - {appender, new DebugAppender {Layout = appender.Layout, Threshold = Level.All}}); - } - else - { - var appender = new ColoredConsoleAppender - { -#if DEBUG - Threshold = Level.Debug, -#else - Threshold = Level.Info, -#endif - Layout = new PatternLayout("<%d{HH:mm:ss}> [%logger:%thread] %level: %message%newline"), - }; - appender.AddMapping(new ColoredConsoleAppender.LevelColors - { - Level = Level.Debug, - ForeColor = ColoredConsoleAppender.Colors.Cyan | ColoredConsoleAppender.Colors.HighIntensity - }); - appender.AddMapping(new ColoredConsoleAppender.LevelColors - { - Level = Level.Info, - ForeColor = ColoredConsoleAppender.Colors.Green | ColoredConsoleAppender.Colors.HighIntensity - }); - appender.AddMapping(new ColoredConsoleAppender.LevelColors - { - Level = Level.Warn, - ForeColor = ColoredConsoleAppender.Colors.Purple | ColoredConsoleAppender.Colors.HighIntensity - }); - appender.AddMapping(new ColoredConsoleAppender.LevelColors - { - Level = Level.Error, - ForeColor = ColoredConsoleAppender.Colors.Red | ColoredConsoleAppender.Colors.HighIntensity - }); - appender.AddMapping(new ColoredConsoleAppender.LevelColors - { - Level = Level.Fatal, - ForeColor = ColoredConsoleAppender.Colors.White | ColoredConsoleAppender.Colors.HighIntensity, - BackColor = ColoredConsoleAppender.Colors.Red - }); - appender.ActivateOptions(); - BasicConfigurator.Configure(new IAppender[] - {appender, new DebugAppender {Layout = appender.Layout, Threshold = Level.All}}); - } - - ILog log = LogManager.GetLogger("Main"); + SetupLog4Net(); + var log = LogManager.GetLogger("Main"); // Arguments if (args.Length < 4) @@ -120,13 +64,13 @@ namespace NPSharp.CommandLine.File log.Error("Connection to NP server failed."); return; } + log.Info("NP connection successful, authenticating..."); // ??? if (!np.AuthenticateWithToken(ah.SessionToken).Result) { np.Disconnect(); log.Error("Authentication to NP server failed."); return; } - log.Info("NP connection successful, authenticating..."); // HTTP server @@ -148,8 +92,68 @@ namespace NPSharp.CommandLine.File log.InfoFormat("HTTP server now running on port {0}.", hport); log.InfoFormat("Access publisher files through http://{0}:{1}/pub/", IPAddress.Any, hport); log.InfoFormat("Access user files through http://{0}:{1}/user/", IPAddress.Any, hport); - Thread.Sleep(Timeout.Infinite); + log.Info("You can shut down the HTTP server by pressing any key."); + Console.ReadKey(); } } + private static void SetupLog4Net() + { + + if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX) + { + var appender = new ConsoleAppender + { +#if DEBUG + Threshold = Level.Debug, +#else + Threshold = Level.Info, +#endif + Layout = new PatternLayout("<%d{HH:mm:ss}> [%logger:%thread] %level: %message%newline"), + }; + BasicConfigurator.Configure(new IAppender[] { appender, new DebugAppender { Layout = appender.Layout, Threshold = Level.All } }); + } + else + { + var appender = new ColoredConsoleAppender + { +#if DEBUG + Threshold = Level.Debug, +#else + Threshold = Level.Info, +#endif + Layout = new PatternLayout("<%d{HH:mm:ss}> [%logger:%thread] %level: %message%newline"), + }; + appender.AddMapping(new ColoredConsoleAppender.LevelColors + { + Level = Level.Debug, + ForeColor = ColoredConsoleAppender.Colors.Cyan | ColoredConsoleAppender.Colors.HighIntensity + }); + appender.AddMapping(new ColoredConsoleAppender.LevelColors + { + Level = Level.Info, + ForeColor = ColoredConsoleAppender.Colors.Green | ColoredConsoleAppender.Colors.HighIntensity + }); + appender.AddMapping(new ColoredConsoleAppender.LevelColors + { + Level = Level.Warn, + ForeColor = ColoredConsoleAppender.Colors.Purple | ColoredConsoleAppender.Colors.HighIntensity + }); + appender.AddMapping(new ColoredConsoleAppender.LevelColors + { + Level = Level.Error, + ForeColor = ColoredConsoleAppender.Colors.Red | ColoredConsoleAppender.Colors.HighIntensity + }); + appender.AddMapping(new ColoredConsoleAppender.LevelColors + { + Level = Level.Fatal, + ForeColor = ColoredConsoleAppender.Colors.White | ColoredConsoleAppender.Colors.HighIntensity, + BackColor = ColoredConsoleAppender.Colors.Red + }); + appender.ActivateOptions(); + BasicConfigurator.Configure(new IAppender[] { appender, new DebugAppender { Layout = appender.Layout, Threshold = Level.All } }); + } + + } + } } \ No newline at end of file diff --git a/src/npfile/Properties/AssemblyInfo.cs b/src/npfile/Properties/AssemblyInfo.cs deleted file mode 100644 index 39a27f4..0000000 --- a/src/npfile/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die mit einer Assembly verknüpft sind. - -[assembly: AssemblyTitle("npfile")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Hewlett-Packard")] -[assembly: AssemblyProduct("npfile")] -[assembly: AssemblyCopyright("Copyright © Hewlett-Packard 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar -// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von -// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. - -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird - -[assembly: Guid("549e5fde-a94d-4154-9577-5743f8be3ed3")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/src/npfile/npfile.csproj b/src/npfile/npfile.csproj index fe27b7e..63fcec9 100644 --- a/src/npfile/npfile.csproj +++ b/src/npfile/npfile.csproj @@ -42,8 +42,9 @@ ..\..\packages\log4net.2.0.3\lib\net40-full\log4net.dll - - ..\..\packages\Newtonsoft.Json.5.0.8\lib\net45\Newtonsoft.Json.dll + + False + ..\..\packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll @@ -56,16 +57,18 @@ - - - {1a5ac63a-250e-4bc8-b81a-822ac31f5e37} - libnpsharp + + + + + {c6f941a5-82af-456a-9b3a-752e5b001035} + NPSharp.Client diff --git a/src/npfile/packages.config b/src/npfile/packages.config index 8dc73fc..5012bcf 100644 --- a/src/npfile/packages.config +++ b/src/npfile/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/src/npmotd/Properties/AssemblyInfo.cs b/src/npmotd/Properties/AssemblyInfo.cs deleted file mode 100644 index 419ffeb..0000000 --- a/src/npmotd/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die mit einer Assembly verknüpft sind. - -[assembly: AssemblyTitle("NPSharp MOTD test client")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Icedream")] -[assembly: AssemblyProduct("NPSharp Library")] -[assembly: AssemblyCopyright("© 2014 Icedream")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar -// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von -// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. - -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird - -[assembly: Guid("b91f9ba4-757a-4c72-b12a-c3e1f1b05715")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] - -[assembly: AssemblyVersion("0.1.*")] -[assembly: AssemblyFileVersion("0.1")] \ No newline at end of file diff --git a/src/npmotd/npmotd.csproj b/src/npmotd/npmotd.csproj index 178bdda..48ae89c 100644 --- a/src/npmotd/npmotd.csproj +++ b/src/npmotd/npmotd.csproj @@ -47,16 +47,18 @@ - - - {1a5ac63a-250e-4bc8-b81a-822ac31f5e37} - libnpsharp + + + + + {c6f941a5-82af-456a-9b3a-752e5b001035} + NPSharp.Client diff --git a/src/npserv/BrightstarDatabaseAuthenticationHandler.cs b/src/npserv/BrightstarDatabaseAuthenticationHandler.cs deleted file mode 100644 index 1957757..0000000 --- a/src/npserv/BrightstarDatabaseAuthenticationHandler.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Diagnostics; -using System.Globalization; -using System.Linq; -using log4net; -using NPSharp.CommandLine.Server.Database; -using NPSharp.Handlers; -using NPSharp.NP; -using NPSharp.RPC.Messages.Data; -using NPSharp.Steam; - -namespace NPSharp.CommandLine.Server -{ - internal class BrightstarDatabaseAuthenticationHandler : IAuthenticationHandler - { - private readonly BrightstarDatabaseContext _db; - private readonly ILog _log; - - public BrightstarDatabaseAuthenticationHandler(BrightstarDatabaseContext database) - { - _log = LogManager.GetLogger("AuthHandler"); - _db = database; - } - - public NPAuthenticationResult AuthenticateUser(NPServerClient client, string username, string password) - { - // Nah, authenticating this way is deprecated as fuck. - return new NPAuthenticationResult(); - } - - public NPAuthenticationResult AuthenticateUser(NPServerClient client, string token) - { - var ar = new NPAuthenticationResult(); - - // Check if token is valid - _db.ValidateSession(token, session => - { - if (session == null) - { - return; - } - - ar = - new NPAuthenticationResult(new CSteamID - { - AccountID = session.User.UserNumber, - AccountInstance = 1, - AccountType = EAccountType.Individual, - AccountUniverse = EUniverse.Public - }); - - _log.DebugFormat("Deleting validated session {0}", session.Id); - }); - _db.SaveChanges(); - - return ar; - } - - public NPAuthenticationResult AuthenticateServer(NPServerClient client, string licenseKey) - { - // TODO: AuthenticateServer - throw new NotImplementedException(); - } - - public TicketValidationResult ValidateTicket(NPServerClient client, NPServerClient server) - { - // TODO: ValidateTicket - throw new NotImplementedException(); - } - - ~BrightstarDatabaseAuthenticationHandler() - { - _db.Dispose(); - } - } -} \ No newline at end of file diff --git a/src/npserv/BrightstarDatabaseFileServingHandler.cs b/src/npserv/BrightstarDatabaseFileServingHandler.cs deleted file mode 100644 index 35792dc..0000000 --- a/src/npserv/BrightstarDatabaseFileServingHandler.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System.Globalization; -using System.Linq; -using System.Text; -using NPSharp.CommandLine.Server.Database; -using NPSharp.Handlers; -using NPSharp.NP; - -namespace NPSharp.CommandLine.Server -{ - internal class BrightstarDatabaseFileServingHandler : IFileServingHandler - { - private readonly BrightstarDatabaseContext _db; - - public BrightstarDatabaseFileServingHandler(BrightstarDatabaseContext database) - { - //_database = database; - _db = database; - } - - public byte[] ReadUserFile(NPServerClient client, string file) - { - var resultEnum = - _db.UserFiles.Where( - uf => - uf.User.Id == client.UserID.AccountID.ToString(CultureInfo.InvariantCulture) && - uf.FileName == file); - - return resultEnum.Any() ? resultEnum.Single().FileData : GetDefaultUserFile(file); - } - - public byte[] ReadPublisherFile(NPServerClient client, string file) - { - var resultEnum = - _db.PublisherFiles.Where(pf => pf.FileName == file).ToArray(); - - return resultEnum.Any() ? resultEnum.Single().FileData : GetDefaultPublisherFile(file); - } - - public void WriteUserFile(NPServerClient client, string file, byte[] data) - { - var resultEnum = - _db.UserFiles.Where( - uf => - uf.User.Id == client.UserID.AccountID.ToString(CultureInfo.InvariantCulture) && - uf.FileName == file) - .ToArray(); - - var userFile = resultEnum.Any() ? resultEnum.Single() : _db.UserFiles.Create(); - userFile.FileName = file; - userFile.FileData = data; - userFile.User = _db.Users.Single(u => u.Id == client.UserID.AccountID.ToString(CultureInfo.InvariantCulture)); - - _db.SaveChanges(); - } - - ~BrightstarDatabaseFileServingHandler() - { - _db.Dispose(); - } - - protected byte[] GetDefaultUserFile(string file) - { - switch (file) - { - case "iw4.stat": - return new byte[8*1024]; - default: - return null; - } - } - - protected byte[] GetDefaultPublisherFile(string file) - { - switch (file) - { - case "hello_world.txt": - case "motd-english.txt": - case "motd-german.txt": - case "motd-french.txt": - case "motd-russian.txt": - case "motd-spanish.txt": - return Encoding.UTF8.GetBytes("hello"); - case "playerlog.csv": - case "social_tu1.cfg": - case "heatmap.raw": - case "online_mp.img": - return new byte[0]; - default: - return null; - } - } - } -} \ No newline at end of file diff --git a/src/npserv/Database/BrightstarDatabaseContext.cs b/src/npserv/Database/BrightstarDatabaseContext.cs deleted file mode 100644 index ae1d7fb..0000000 --- a/src/npserv/Database/BrightstarDatabaseContext.cs +++ /dev/null @@ -1,498 +0,0 @@ -using System; -using System.Collections.Generic; -using BrightstarDB.Client; -using BrightstarDB.EntityFramework; - -namespace NPSharp.CommandLine.Server.Database -{ - public partial class BrightstarDatabaseContext : BrightstarEntityContext - { - private static readonly EntityMappingStore TypeMappings; - - static BrightstarDatabaseContext() - { - TypeMappings = new EntityMappingStore(); - var provider = new ReflectionMappingProvider(); - provider.AddMappingsForType(TypeMappings, typeof (IBan)); - TypeMappings.SetImplMapping(); - provider.AddMappingsForType(TypeMappings, typeof (ICheatDetection)); - TypeMappings.SetImplMapping(); - provider.AddMappingsForType(TypeMappings, typeof (IFriend)); - TypeMappings.SetImplMapping(); - provider.AddMappingsForType(TypeMappings, typeof (IPublisherFile)); - TypeMappings.SetImplMapping(); - provider.AddMappingsForType(TypeMappings, typeof (ISession)); - TypeMappings.SetImplMapping(); - provider.AddMappingsForType(TypeMappings, typeof (IUser)); - TypeMappings.SetImplMapping(); - provider.AddMappingsForType(TypeMappings, typeof (IUserFile)); - TypeMappings.SetImplMapping(); - } - - /// - /// Initialize a new entity context using the specified BrightstarDB - /// Data Object Store connection - /// - /// The connection to the BrightstarDB Data Object Store that will provide the entity objects - /// - /// OPTIONAL: A that overrides the default mappings generated - /// by reflection. - /// - public BrightstarDatabaseContext(IDataObjectStore dataObjectStore, EntityMappingStore typeMappings = null) - : base(typeMappings ?? TypeMappings, dataObjectStore) - { - InitializeContext(); - } - - /// - /// Initialize a new entity context using the specified Brightstar connection string - /// - /// The connection to be used to connect to an existing BrightstarDB store - /// OPTIONAL: If set to true optmistic locking will be applied to all entity updates - /// - /// OPTIONAL: The URI identifier of the graph to be updated with any new triples created by operations on the store. If - /// not defined, the default graph in the store will be updated. - /// - /// - /// OPTIONAL: The URI identifiers of the graphs that will be queried to retrieve entities and their properties. - /// If not defined, all graphs in the store will be queried. - /// - /// - /// OPTIONAL: The URI identifier of the graph that contains version number statements for entities. - /// If not defined, the will be used. - /// - /// - /// OPTIONAL: A that overrides the default mappings generated - /// by reflection. - /// - public BrightstarDatabaseContext( - string connectionString, - bool? enableOptimisticLocking = null, - string updateGraphUri = null, - IEnumerable datasetGraphUris = null, - string versionGraphUri = null, - EntityMappingStore typeMappings = null - ) - : base( - typeMappings ?? TypeMappings, connectionString, enableOptimisticLocking, updateGraphUri, - datasetGraphUris, versionGraphUri) - { - InitializeContext(); - } - - /// - /// Initialize a new entity context using the specified Brightstar - /// connection string retrieved from the configuration. - /// - /// - /// OPTIONAL: A that overrides the default mappings generated - /// by reflection. - /// - public BrightstarDatabaseContext(EntityMappingStore typeMappings = null) : base(typeMappings ?? TypeMappings) - { - InitializeContext(); - } - - // specified target graphs - /// - /// Initialize a new entity context using the specified Brightstar - /// connection string retrieved from the configuration and the - /// - /// - /// The URI identifier of the graph to be updated with any new triples created by operations on the store. If - /// set to null, the default graph in the store will be updated. - /// - /// - /// The URI identifiers of the graphs that will be queried to retrieve entities and their properties. - /// If set to null, all graphs in the store will be queried. - /// - /// - /// The URI identifier of the graph that contains version number statements for entities. - /// If set to null, the value of will be used. - /// - /// - /// OPTIONAL: A that overrides the default mappings generated - /// by reflection. - /// - public BrightstarDatabaseContext( - string updateGraphUri, - IEnumerable datasetGraphUris, - string versionGraphUri, - EntityMappingStore typeMappings = null - ) : base(typeMappings ?? TypeMappings, updateGraphUri, datasetGraphUris, versionGraphUri) - { - InitializeContext(); - } - - public IEntitySet Bans { get; private set; } - - public IEntitySet CheatDetections { get; private set; } - - public IEntitySet Friends { get; private set; } - - public IEntitySet PublisherFiles { get; private set; } - - public IEntitySet Sessions { get; private set; } - - public IEntitySet Users { get; private set; } - - public IEntitySet UserFiles { get; private set; } - - private void InitializeContext() - { - Bans = new BrightstarEntitySet(this); - CheatDetections = new BrightstarEntitySet(this); - Friends = new BrightstarEntitySet(this); - PublisherFiles = new BrightstarEntitySet(this); - Sessions = new BrightstarEntitySet(this); - Users = new BrightstarEntitySet(this); - UserFiles = new BrightstarEntitySet(this); - } - } -} - -namespace NPSharp.CommandLine.Server.Database -{ - public class Ban : BrightstarEntityObject, IBan - { - public Ban(BrightstarEntityContext context, IDataObject dataObject) : base(context, dataObject) - { - } - - public Ban() - { - } - - public String Id - { - get { return GetIdentity(); } - set { SetIdentity(value); } - } - - #region Implementation of NPSharp.CommandLine.Server.Database.IBan - - public IUser User - { - get { return GetRelatedObject("User"); } - } - - public String Reason - { - get { return GetRelatedProperty("Reason"); } - set { SetRelatedProperty("Reason", value); } - } - - public DateTime ExpiryTime - { - get { return GetRelatedProperty("ExpiryTime"); } - set { SetRelatedProperty("ExpiryTime", value); } - } - - #endregion - } -} - -namespace NPSharp.CommandLine.Server.Database -{ - public class CheatDetection : BrightstarEntityObject, ICheatDetection - { - public CheatDetection(BrightstarEntityContext context, IDataObject dataObject) : base(context, dataObject) - { - } - - public CheatDetection() - { - } - - public String Id - { - get { return GetIdentity(); } - set { SetIdentity(value); } - } - - #region Implementation of NPSharp.CommandLine.Server.Database.ICheatDetection - - public IUser User - { - get { return GetRelatedObject("User"); } - } - - public UInt32 CheatId - { - get { return GetRelatedProperty("CheatId"); } - set { SetRelatedProperty("CheatId", value); } - } - - public String Reason - { - get { return GetRelatedProperty("Reason"); } - set { SetRelatedProperty("Reason", value); } - } - - public DateTime ExpiryTime - { - get { return GetRelatedProperty("ExpiryTime"); } - set { SetRelatedProperty("ExpiryTime", value); } - } - - #endregion - } -} - -namespace NPSharp.CommandLine.Server.Database -{ - public class Friend : BrightstarEntityObject, IFriend - { - public Friend(BrightstarEntityContext context, IDataObject dataObject) : base(context, dataObject) - { - } - - public Friend() - { - } - - public String Id - { - get { return GetIdentity(); } - set { SetIdentity(value); } - } - - #region Implementation of NPSharp.CommandLine.Server.Database.IFriend - - public IUser User - { - get { return GetRelatedObject("User"); } - } - - public UInt32 FriendUserId - { - get { return GetRelatedProperty("FriendUserId"); } - set { SetRelatedProperty("FriendUserId", value); } - } - - public String FriendName - { - get { return GetRelatedProperty("FriendName"); } - set { SetRelatedProperty("FriendName", value); } - } - - #endregion - } -} - -namespace NPSharp.CommandLine.Server.Database -{ - public class PublisherFile : BrightstarEntityObject, IPublisherFile - { - public PublisherFile(BrightstarEntityContext context, IDataObject dataObject) : base(context, dataObject) - { - } - - public PublisherFile() - { - } - - public String Id - { - get { return GetIdentity(); } - set { SetIdentity(value); } - } - - #region Implementation of NPSharp.CommandLine.Server.Database.IPublisherFile - - public String FileName - { - get { return GetRelatedProperty("FileName"); } - set { SetRelatedProperty("FileName", value); } - } - - public Byte[] FileData - { - get { return GetRelatedProperty("FileData"); } - set { SetRelatedProperty("FileData", value); } - } - - #endregion - } -} - -namespace NPSharp.CommandLine.Server.Database -{ - public class Session : BrightstarEntityObject, ISession - { - public Session(BrightstarEntityContext context, IDataObject dataObject) : base(context, dataObject) - { - } - - public Session() - { - } - - public String Id - { - get { return GetIdentity(); } - set { SetIdentity(value); } - } - - #region Implementation of NPSharp.CommandLine.Server.Database.ISession - - public IUser User - { - get { return GetRelatedObject("User"); } - } - - public DateTime ExpiryTime - { - get { return GetRelatedProperty("ExpiryTime"); } - set { SetRelatedProperty("ExpiryTime", value); } - } - - #endregion - } -} - -namespace NPSharp.CommandLine.Server.Database -{ - public class User : BrightstarEntityObject, IUser - { - public User(BrightstarEntityContext context, IDataObject dataObject) : base(context, dataObject) - { - } - - public User() - { - } - - public String Id - { - get { return GetIdentity(); } - set { SetIdentity(value); } - } - - #region Implementation of NPSharp.CommandLine.Server.Database.IUser - - public String UserName - { - get { return GetRelatedProperty("UserName"); } - set { SetRelatedProperty("UserName", value); } - } - - public String UserMail - { - get { return GetRelatedProperty("UserMail"); } - set { SetRelatedProperty("UserMail", value); } - } - - public UInt32 UserNumber - { - get { return GetRelatedProperty("UserNumber"); } - set { SetRelatedProperty("UserNumber", value); } - } - - public String PasswordHash - { - get { return GetRelatedProperty("PasswordHash"); } - set { SetRelatedProperty("PasswordHash", value); } - } - - public DateTime LastLogin - { - get { return GetRelatedProperty("LastLogin"); } - set { SetRelatedProperty("LastLogin", value); } - } - - public ICollection Sessions - { - get { return GetRelatedObjects("Sessions"); } - set - { - if (value == null) throw new ArgumentNullException("value"); - SetRelatedObjects("Sessions", value); - } - } - - public ICollection Bans - { - get { return GetRelatedObjects("Bans"); } - set - { - if (value == null) throw new ArgumentNullException("value"); - SetRelatedObjects("Bans", value); - } - } - - public ICollection CheatDetections - { - get { return GetRelatedObjects("CheatDetections"); } - set - { - if (value == null) throw new ArgumentNullException("value"); - SetRelatedObjects("CheatDetections", value); - } - } - - public ICollection UserFiles - { - get { return GetRelatedObjects("UserFiles"); } - set - { - if (value == null) throw new ArgumentNullException("value"); - SetRelatedObjects("UserFiles", value); - } - } - - public ICollection FriendIDs - { - get { return GetRelatedObjects("FriendIDs"); } - set - { - if (value == null) throw new ArgumentNullException("value"); - SetRelatedObjects("FriendIDs", value); - } - } - - #endregion - } -} - -namespace NPSharp.CommandLine.Server.Database -{ - public class UserFile : BrightstarEntityObject, IUserFile - { - public UserFile(BrightstarEntityContext context, IDataObject dataObject) : base(context, dataObject) - { - } - - public UserFile() - { - } - - public String Id - { - get { return GetIdentity(); } - set { SetIdentity(value); } - } - - #region Implementation of NPSharp.CommandLine.Server.Database.IUserFile - - public IUser User - { - get { return GetRelatedObject("User"); } - set { SetRelatedObject("User", value); } - } - - public String FileName - { - get { return GetRelatedProperty("FileName"); } - set { SetRelatedProperty("FileName", value); } - } - - public Byte[] FileData - { - get { return GetRelatedProperty("FileData"); } - set { SetRelatedProperty("FileData", value); } - } - - #endregion - } -} \ No newline at end of file diff --git a/src/npserv/Database/BrightstarDatabaseContext.custom.cs b/src/npserv/Database/BrightstarDatabaseContext.custom.cs deleted file mode 100644 index 7185cd7..0000000 --- a/src/npserv/Database/BrightstarDatabaseContext.custom.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.Linq; - -namespace NPSharp.CommandLine.Server.Database -{ - public partial class BrightstarDatabaseContext - { - public IUser CreateUser(string name, string email, string password) - { - if (UserExists(name)) - throw new DatabaseUserExistsException(); - - var user = Users.Create(); - user.UserName = name; - user.UserMail = email; - user.PasswordHash = BCrypt.Net.BCrypt.HashPassword(password); - user.UserNumber = _genUserNumber(/*user.Id*/); - - return user; - } - - private uint _genUserNumber(/*string userId*/) - { - /* - // for some reason we sometimes get full URIs here. - userId = userId.Split('/').Last().Replace("-", ""); - - // Since the string is a hexified UNIQUE identifier, - // use the numeric representation of it. - var userNum = uint.Parse(userId, NumberStyles.HexNumber); - */ - - // The above doesn't work since the GUID has a few bits too much :P - // So instead - even though taking more queries - we will use the user - // count to approximate a new user ID. - var userNum = (uint)Users.Count() + 1; - while (Users.Count(u => u.UserNumber == userNum) > 0) - userNum++; - - return userNum; - } - - public bool UserExists(string userName) - { - return GetUser(userName) != null; - } - - public IUser GetUser(string userName) - { - var users = Users.Where(u => u.UserName == userName).ToArray(); - return users.Any() ? users.Single() : null; - } - - /// - /// Creates a user session. - /// - /// The user to assign the session to. - /// The time span in seconds. Default: 3 minutes. - /// The newly created user session - public ISession CreateSession(IUser user, uint validTimeSpan = 3 * 60) - { - var session = Sessions.Create(); - session.ExpiryTime = DateTime.Now + TimeSpan.FromSeconds(validTimeSpan); - - user.Sessions.Add(session); - - return session; - } - - /// - /// Tries to find the wanted session and drops it if it's valid, - /// therefore "using it". - /// - /// The token of the wanted session - /// The callback to use for session results (goes for both invalid and valid sessions) - /// The found session if the session is validated successfully, otherwise null. - public void ValidateSession(string sessionToken, Action callback) - { - var sessions = Sessions - .Where(s => s.Id == sessionToken).ToArray() // database level query - .Where(s => s.ExpiryTime > DateTime.Now).ToArray(); // local level query (seems like this isn't supported [yet]) - - // We have to use a callback here since deleting the object from database - // will also release it from .NET's management and therefore makes the object - // invalid. - if (!sessions.Any()) - callback(null); - else - { - var session = sessions.Single(); - callback(session); - DeleteObject(session); - } - } - } -} diff --git a/src/npserv/Database/BrightstarDatabaseContext.tt b/src/npserv/Database/BrightstarDatabaseContext.tt deleted file mode 100644 index effffeb..0000000 --- a/src/npserv/Database/BrightstarDatabaseContext.tt +++ /dev/null @@ -1,918 +0,0 @@ -<#@ template debug="true" hostSpecific="true" language="C#" #> -<#@ output extension=".cs" #> -<#@ assembly name="EnvDTE80" #> -<#@ import namespace="System" #> -<#@ import namespace="System.IO" #> -<#@ import namespace="System.Diagnostics" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Collections" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="EnvDTE" #> -<#@ import namespace="EnvDTE80" #> -<#@ import namespace="Microsoft.VisualStudio.TextTemplating"#> -<#@ include file="EF.Utility.CS.ttinclude"#> -<# -var code = new CodeGenerationTools(this); -var helper = new Helper(this); -var namespaceName = code.VsNamespaceSuggestion(); -var contextClassName = System.IO.Path.GetFileNameWithoutExtension(this.Host.TemplateFile); -WriteHeader(helper.GetExtraUsings().ToArray()); -BeginNamespace(code, namespaceName); -WriteContextClass(code, helper, contextClassName); -EndNamespace(namespaceName); -foreach(var i in helper.GetDecoratedInterfaces()) { - WriteEntityClass(code, helper, i); -} -#> -<#+ -public void WriteHeader(params string[] extraUsings) { -#> -// ----------------------------------------------------------------------- -// -// This code was generated from a template. -// -// Changes to this file may cause incorrect behaviour and will be lost -// if the code is regenerated. -// -//------------------------------------------------------------------------ -using System; -using System.Collections.Generic; -using System.Linq; -using BrightstarDB.Client; -using BrightstarDB.EntityFramework; - -<#=String.Join(String.Empty, extraUsings.Select(u => "using " + u + ";" + Environment.NewLine).ToArray())#> -<#+ -} - -public void BeginNamespace(CodeGenerationTools code, string namespaceName) -{ - CodeRegion region = new CodeRegion(this); - if (!String.IsNullOrEmpty(namespaceName)) - { -#> -namespace <#=code.EscapeNamespace(namespaceName) #> -{ -<#+ - PushIndent(CodeRegion.GetIndent(1)); - } -} - -public void EndNamespace(string namespaceName) { - if (!String.IsNullOrEmpty(namespaceName)) { - PopIndent(); - #> -} -<#+ - } -} - -private void WriteContextClass(CodeGenerationTools code, Helper helper, string contextClassName) { -#> -public partial class <#=code.Escape(contextClassName) #> : BrightstarEntityContext { - private static readonly EntityMappingStore TypeMappings; - - static <#= code.Escape(contextClassName) #>() - { - TypeMappings = new EntityMappingStore(); - var provider = new ReflectionMappingProvider(); -<#+ - foreach(var i in helper.GetDecoratedInterfaces()) - { -#> - provider.AddMappingsForType(TypeMappings, typeof(<#=i.InterfaceFullName#>)); - TypeMappings.SetImplMapping<<#=i.InterfaceFullName#>, <#=code.CreateFullName(i.InterfaceNamespaceName, i.ClassName)#>>(); -<#+ - } -#> - } - - /// - /// Initialize a new entity context using the specified BrightstarDB - /// Data Object Store connection - /// - /// The connection to the BrightstarDB Data Object Store that will provide the entity objects - /// OPTIONAL: A that overrides the default mappings generated by reflection. - public <#= code.Escape(contextClassName) #>(IDataObjectStore dataObjectStore, EntityMappingStore typeMappings = null) : base(typeMappings ?? TypeMappings, dataObjectStore) - { - InitializeContext(); - } - - /// - /// Initialize a new entity context using the specified Brightstar connection string - /// - /// The connection to be used to connect to an existing BrightstarDB store - /// OPTIONAL: If set to true optmistic locking will be applied to all entity updates - /// OPTIONAL: The URI identifier of the graph to be updated with any new triples created by operations on the store. If - /// not defined, the default graph in the store will be updated. - /// OPTIONAL: The URI identifiers of the graphs that will be queried to retrieve entities and their properties. - /// If not defined, all graphs in the store will be queried. - /// OPTIONAL: The URI identifier of the graph that contains version number statements for entities. - /// If not defined, the will be used. - /// OPTIONAL: A that overrides the default mappings generated by reflection. - public <#= code.Escape(contextClassName) #>( - string connectionString, - bool? enableOptimisticLocking=null, - string updateGraphUri = null, - IEnumerable datasetGraphUris = null, - string versionGraphUri = null, - EntityMappingStore typeMappings = null - ) : base(typeMappings ?? TypeMappings, connectionString, enableOptimisticLocking, updateGraphUri, datasetGraphUris, versionGraphUri) - { - InitializeContext(); - } - - /// - /// Initialize a new entity context using the specified Brightstar - /// connection string retrieved from the configuration. - /// - /// OPTIONAL: A that overrides the default mappings generated by reflection. - public <#= code.Escape(contextClassName) #>(EntityMappingStore typeMappings = null) : base(typeMappings ?? TypeMappings) - { - InitializeContext(); - } - - /// - /// Initialize a new entity context using the specified Brightstar - /// connection string retrieved from the configuration and the - // specified target graphs - /// - /// The URI identifier of the graph to be updated with any new triples created by operations on the store. If - /// set to null, the default graph in the store will be updated. - /// The URI identifiers of the graphs that will be queried to retrieve entities and their properties. - /// If set to null, all graphs in the store will be queried. - /// The URI identifier of the graph that contains version number statements for entities. - /// If set to null, the value of will be used. - /// OPTIONAL: A that overrides the default mappings generated by reflection. - public <#= code.Escape(contextClassName) #>( - string updateGraphUri, - IEnumerable datasetGraphUris, - string versionGraphUri, - EntityMappingStore typeMappings = null - ) : base(typeMappings ?? TypeMappings, updateGraphUri:updateGraphUri, datasetGraphUris:datasetGraphUris, versionGraphUri:versionGraphUri) - { - InitializeContext(); - } - - private void InitializeContext() - { -<#+ - foreach(var i in helper.GetDecoratedInterfaces()) { -#> - <#= code.Escape(i.PluralizedName) #> = new BrightstarEntitySet<<#=i.InterfaceFullName#>>(this); -<#+ - } -#> - } - -<#+ - foreach(var i in helper.GetDecoratedInterfaces()) - { -#> - <#=i.EntitySetAccessLevel#> IEntitySet<<#=i.InterfaceFullName#>> <#= code.Escape(i.PluralizedName) #> - { - get; private set; - } - -<#+ - } -#> -} -<#+ -} - -private void WriteEntityClass(CodeGenerationTools code, Helper helper, ResourceInterface iface) -{ - BeginNamespace(code, iface.InterfaceNamespaceName); - var identityProperty = iface.IdentityProperty; - WriteClassAttributes(code, helper, iface); -#> - -<#= code.SpaceAfter(iface.EntitySetAccessLevel)#>partial class <#= iface.ClassName #> : BrightstarEntityObject, <#= iface.InterfaceName #> -{ - public <#= iface.ClassName#>(BrightstarEntityContext context, IDataObject dataObject) : base(context, dataObject) { } - public <#= iface.ClassName#>() : base() { } -<#+ - if (identityProperty != null) - { - ValidateIdentityProperty(identityProperty); -#> - public <#= ((CodeProperty)identityProperty).Type.AsFullName #> <#= identityProperty.Name #> { get {return GetIdentity(); } set { SetIdentity(value); } } -<#+ - } - - WriteInterfaceImplementation(code, helper, iface); - foreach(var b in iface.AllInterfaces){ - WriteInterfaceImplementation(code, helper, b); - } - - #> -} -<#+ - EndNamespace(iface.InterfaceNamespaceName); -} - -private void WriteInterfaceImplementation(CodeGenerationTools code, Helper helper, ResourceInterface iface) -{#> - #region Implementation of <#= iface.InterfaceFullName #> -<#+ - foreach(var p in iface.Properties) { - if (!p.Equals(iface.IdentityProperty)) - { - bool isCollectionProperty; - if (ValidateProperty(p, helper, out isCollectionProperty)) - { - WritePropertyAttributes(code, helper, p); - if (isCollectionProperty) - { - string generic, t; - Helper.TryParseGenericTypeName(p.Type.AsFullName, out generic, out t); - generic = Helper.GetEntityGeneric(generic); - if (generic == null) - { - this.Error(String.Format("There is no known mapping for the generic type {0} on the property {1} of type {2}", - generic, p.Name, p.Type.AsFullName)); - } - else - { -#> - public <#= generic#><<#=t#>> <#= p.Name #> - { -<#+ - if (helper.GetDecoratedInterfaces().Any(x=>x.InterfaceFullName.Equals(t))) - { - #> - get { return GetRelatedObjects<<#=t#>>(<#= code.CreateLiteral(p.Name) #>); } - set { if (value == null) throw new ArgumentNullException("value"); SetRelatedObjects(<#= code.CreateLiteral(p.Name)#>, value); } - <#+ - } - else - { - #> - get { return GetRelatedLiteralPropertiesCollection<<#=t#>>(<#= code.CreateLiteral(p.Name) #>); } - set { if (value == null) throw new ArgumentNullException("value"); SetRelatedLiteralPropertiesCollection<<#=t#>>(<#= code.CreateLiteral(p.Name)#>, value); } -<#+ - } -#> - } -<#+ - } - } - else - { - var itemType = GetPropertyTypeName(p.Type); -#> - - public <#= itemType #> <#= p.Name #> - { -<#+ - PushIndent(CodeRegion.GetIndent(2)); - if (IsValidLiteralType(helper, p.Type)) - { -#> - get { return GetRelatedProperty<<#= itemType #>>(<#=code.CreateLiteral(p.Name)#>); } - set { SetRelatedProperty(<#=code.CreateLiteral(p.Name)#>, value); } -<#+ - } - else - { - if (p.Getter != null) WriteSingleGetter(code, p); - if (p.Setter != null) WriteSingleSetter(code, p); - } - PopIndent(); -#> - } -<#+ - } - } - } - } -#> - #endregion -<#+ -} - -private void WriteCustomAttribute(Helper helper, CodeAttribute attr) -{ - if (attr.FullName.Equals("BrightstarDB.EntityFramework.ClassAttributeAttribute")) - { - var e = attr.Children.GetEnumerator(); - if (e.MoveNext()) - { - var classAttributeArg = e.Current as EnvDTE80.CodeAttributeArgument; - if (classAttributeArg != null) { - #><#=helper.Unquote(classAttributeArg.Value)#><#+ - } - } - } - if (attr.FullName.StartsWith("BrightstarDB.EntityFramework")) - { - return; - } - #> - - [<#= attr.FullName#><#+ - var childEnumerator = attr.Children.GetEnumerator(); - if (childEnumerator.MoveNext()) - { - bool keepGoing = true; - #>(<#+ - while (keepGoing) { - if (childEnumerator.Current is EnvDTE80.CodeAttributeArgument) - { - var arg = childEnumerator.Current as EnvDTE80.CodeAttributeArgument; - if (!String.IsNullOrEmpty(arg.Name)) { - #><#=arg.Name#>=<#=arg.Value#><#+ - } - else - { - #><#=arg.Value#><#+ - } - keepGoing = childEnumerator.MoveNext(); - if (keepGoing) { - #>, <#+ - } - } - } - #>)<#+ - } - #>]<#+ -} - -private void WriteClassAttributes(CodeGenerationTools code, Helper helper, ResourceInterface iface) -{ - foreach(var x in iface.Interface.Attributes) - { - if (x is CodeAttribute) { - WriteCustomAttribute(helper, x as CodeAttribute); - } - } -} - -private void WritePropertyAttributes(CodeGenerationTools code, Helper helper, CodeProperty property) -{ - foreach(var x in property.Attributes) - { - if (x is CodeAttribute) - { - var attr = x as CodeAttribute; - WriteCustomAttribute(helper, attr); - - } - } -} - -private bool IsValidLiteralType(Helper helper, CodeTypeRef t) -{ - if (Constants.BasicTypes.Contains(t.AsFullName) || - IsByteArray(t) || - t.CodeType.IsDerivedFrom["System.Enum"]) { - return true; - } - - string genericName, typeName; - if (Helper.TryParseGenericTypeName(t.AsFullName, out genericName, out typeName) - && genericName.Equals("System.Nullable") - && helper.GetEnums().Any(e=>e.FullName.Equals(typeName))) { - return true; - } - - return false; -} - -private bool IsByteArray(CodeTypeRef t) -{ - return t.TypeKind == vsCMTypeRef.vsCMTypeRefArray && t.ElementType.AsFullName == "System.Byte"; -} - -private void WriteCollectionGetter(CodeGenerationTools code, CodeProperty property, string itemType) { - if (Constants.BasicTypes.Contains(itemType)) - { - #> -get { return GetRelatedProperties<<#= itemType #>>(<#=code.CreateLiteral(property.Name) #>); } - <#+ - } - else - { -#> -get { return GetRelatedObjects<<#= itemType #>>(<#=code.CreateLiteral(property.Name)#>); } -<#+ - } -} - -private void WriteCollectionSetter(CodeGenerationTools code, CodeProperty property, string itemType) { - if (Constants.BasicTypes.Contains(itemType)) - { -#> -set { SetRelatedProperties(<#= code.CreateLiteral(property.Name) #>, value); } -<#+ - } - else - { -#> -set { SetRelatedObjects(<#= code.CreateLiteral(property.Name) #>, value ); } -<#+ - } -} - -private void WriteSingleGetter(CodeGenerationTools code, CodeProperty property) -{ - var itemType = property.Type.AsFullName; -#> -get { return GetRelatedObject<<#= itemType #>>(<#=code.CreateLiteral(property.Name)#>); } -<#+ -} - -private void WriteSingleSetter(CodeGenerationTools code, CodeProperty property) { - var itemType = property.Type.AsFullName; -#> -set { SetRelatedObject<<#= itemType #>>(<#=code.CreateLiteral(property.Name)#>, value); } -<#+ -} - -private string GetPropertyTypeName(CodeTypeRef propertyType) -{ - if (propertyType.TypeKind == vsCMTypeRef.vsCMTypeRefArray) { - return propertyType.ElementType.AsFullName + "[]"; - } else { - return propertyType.AsFullName; - } -} - -private void ValidateIdentityProperty(CodeProperty property) { - if (!property.Type.AsFullName.Equals("System.String")) - { - Error(String.Format("The property '{0}' must be of type String to be used as the identity property for an entity. If this property is intended to be the identity property for the entity please change its type to String. If it is not intended to be the identity property, either rename this property or create an identity property and decorate it with the [{1}] attribute.", - property.FullName, Constants.IdentityAttributeShortName)); - } - if (property.Setter != null) { - Error(String.Format("The property '{0}' must not have a setter to be used as the identity property for an entity. If this property is intended to be the identity property for the entity please remove the setter. If it is not intended to be the identity property, either rename this property or create an identity propertyn and decorate it with the [{1}] attribute.", - property.FullName, Constants.IdentityAttributeShortName)); - } -} - -private bool ValidateProperty(CodeProperty property, Helper helper, out bool isCollection) -{ - var propertyTypeName = property.Type.AsFullName; - isCollection = false; - bool isValid = false; - - if (IsValidLiteralType(helper, property.Type) || - helper.GetDecoratedInterfaces().Any(i=>i.InterfaceFullName.Equals(propertyTypeName))) - { - isValid = true; - } - else - { - string generic, t; - if (Helper.TryParseGenericTypeName(propertyTypeName, out generic, out t)) - { - if (Constants.CollectionTypes.Contains(generic) && - (Constants.BasicTypes.Contains(t) || helper.GetDecoratedInterfaces().Any(i=>i.InterfaceFullName.Equals(t)))) - { - isCollection = true; - isValid = true; - propertyTypeName = t; - } - } - } - if (!isValid) - { - Error("Invalid property: " + property.FullName + " - the property type " + propertyTypeName + " is not supported by Entity Framework."); - isCollection = false; - return false; - } - - var inversePropertyAttr = property.Attributes.OfType().FirstOrDefault( - attr => attr.FullName.Equals(Constants.InversePropertyAttributeName)); - if (inversePropertyAttr != null) - { - var arg = inversePropertyAttr.Children.OfType().FirstOrDefault(); - var inversePropertyName = arg.Value.Trim('\"'); - var targetInterface = helper.GetDecoratedInterfaces().FirstOrDefault(i=>i.InterfaceFullName.Equals(propertyTypeName)); - if (targetInterface == null) - { - this.Error("Invalid InverseProperty attribute on property " + property.Name + ". The property type " + propertyTypeName + " must be marked as an Entity."); - return false; - } - - var targetProperty = targetInterface.Properties.FirstOrDefault(p=>p.Name.Equals(inversePropertyName)); - if (targetProperty == null) - { - this.Error("Invalid InverseProperty attribute on property " + property.Name + ". A property named '" + inversePropertyName + "' cannot be found on the target interface type '" + targetInterface.InterfaceFullName + "'."); - return false; - } - } - return true; -} - -static class Constants { - public const string IdentityAttributeName = "BrightstarDB.EntityFramework.IdentifierAttribute"; - public const string IdentityAttributeShortName = "Identifier"; - public const string EntityAttributeName = "BrightstarDB.EntityFramework.EntityAttribute"; - public const string InversePropertyAttributeName = "BrightstarDB.EntityFramework.InversePropertyAttribute"; - /// - /// The property types that are supported entity property types - /// - public static readonly List BasicTypes = new List - { - "System.Boolean", - "System.Int16", - "System.Int64", - "System.Int32", - "System.UInt16", - "System.UInt32", - "System.UInt64", - "System.String", - "System.DateTime", - "System.Decimal", - "System.Double", - "System.Single", - "System.Uri", - "System.Byte", - "System.Char", - "System.SByte", - "BrightstarDB.Rdf.PlainLiteral", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - "System.Nullable", - }; - - /// - /// The generic collection types that are supported entity collection property types - /// - public static readonly List CollectionTypes = new List - { - "System.Collections.Generic.ISet", - "System.Collections.Generic.ICollection", - }; - - public static readonly List CoreImports = new List { - "System", "System.Collections.Generic", "System.Linq", "BrightstarDB.Client", "BrightstarDB.EntityFramework" - }; -} - -class Helper { - - private DTE _dte; - public static TextTransformation _transformation; - private ProjectItem _templateProjectItem; - private Project _project; - - public Helper(TextTransformation transformation) { - _transformation = transformation; - _templateProjectItem = DTE.Solution.FindProjectItem(Host.TemplateFile); - _project = _templateProjectItem.ContainingProject; - } - - public ITextTemplatingEngineHost Host { - get { - return _transformation.GetType().GetProperty("Host").GetValue(_transformation, null) as ITextTemplatingEngineHost; - } - } - - public DTE DTE - { - get { - if (_dte == null) { - IServiceProvider hostServiceProvider = (IServiceProvider)Host; - _dte = hostServiceProvider.GetService(typeof(DTE)) as DTE; - } - return _dte; - } - } - - public IEnumerable GetInterfaces() { - foreach(var pi in GetCodeProjectItems()) { - foreach(CodeElement ce in GetInterfaces(pi.FileCodeModel.CodeElements)) { - yield return ce; - } - } - } - - public IEnumerable GetDecoratedInterfaces() { - return GetCodeProjectItems().SelectMany(pi=>GetDecoratedInterfaces(pi.FileCodeModel.CodeElements)).Select(x=>new ResourceInterface(x)); - } - - /// - /// Returns an enumeration of all distinct using statements contained - /// in the files that define BrightstarDB Entity Framework entity interfaces - /// - public IEnumerable GetExtraUsings() { - return GetCodeProjectItems() - .Where(pi=>GetDecoratedInterfaces(pi.FileCodeModel.CodeElements).Any()) - .SelectMany(pi=>pi.FileCodeModel.CodeElements.OfType().Select(ce=>ce.Namespace)) - .Distinct().Except(Constants.CoreImports); - } - - /// - /// Returns an enumeration over all the enums types defined in the project - /// - /// - public IEnumerable GetEnums() { - foreach(var pi in GetCodeProjectItems()) { - foreach(CodeElement ce in GetEnums(pi.FileCodeModel.CodeElements)) { - yield return (CodeEnum)ce; - } - } - } - - /// - /// Pass-through write operation to allow this class to contain template output - /// - /// - public void Write(string text) { - _transformation.Write(text); - } - - /// - /// Pass-through write operation to allow this class to contain template output - /// - /// - public void Write(string msg, object[] args) { - _transformation.Write(msg, args); - } - - public static IEnumerable GetDecoratedInterfaces(CodeElements container) { - return GetInterfaces(container).Where(i=>i.Children.OfType().Any(c=>c.Kind == vsCMElement.vsCMElementAttribute && c.FullName.Equals(Constants.EntityAttributeName))); - } - - public static IEnumerable GetInterfaces(CodeElements container) { - foreach(CodeElement ce in container) { - if (ce.Kind == vsCMElement.vsCMElementInterface) { - yield return ce; - } else { - foreach(var child in GetInterfaces(ce.Children)) { - yield return child; - } - } - } - } - - public static IEnumerable GetEnums(CodeElements container) { - foreach(CodeElement ce in container) { - if (ce.Kind == vsCMElement.vsCMElementEnum) { - yield return ce; - } else { - foreach(var child in GetEnums(ce.Children)) { - yield return child; - } - } - } - } - - public static bool TryParseGenericTypeName(string genericTypeName, out string generic, out string t) - { - var regex = new System.Text.RegularExpressions.Regex(@"^([a-zA-Z0-9\.]+)<([^>]+)>$"); - var match = regex.Match(genericTypeName); - if (match.Success) - { - generic=match.Groups[1].Value; - t = match.Groups[2].Value; - return true; - } - else - { - generic = t = null; - return false; - } - } - - public static string GetEntityGeneric(string genericTypeName) - { - if (genericTypeName.Equals("System.Collections.Generic.ICollection")) - { - return "System.Collections.Generic.ICollection"; - } - return null; - } - - public IEnumerable GetCodeProjectItems() { - foreach(var pi in GetCodeProjectItems(_project.ProjectItems)) { - yield return pi; - } - } - - public string Unquote(string quotedString) - { - if(quotedString.StartsWith("\"")) - { - return quotedString.Trim('\"').Replace("\\\"", "\""); - } - else if (quotedString.StartsWith("@\"")) - { - return quotedString.TrimStart('@','\"').TrimEnd('\"'); - } - else - { - return quotedString; - } - } - private IEnumerable GetCodeProjectItems(ProjectItems projectItems) { - foreach(ProjectItem pi in projectItems) { - if (pi.Equals(_templateProjectItem)) { - continue; - } - if (pi.FileCodeModel != null) { - yield return pi; - } - if (pi.ProjectItems != null) { - foreach(var childItem in GetCodeProjectItems(pi.ProjectItems)) { - yield return childItem; - } - } - } - } -} - -class ResourceInterface { - private CodeInterface _interfaceCE; - private CodeProperty _identityProperty; - private string _className; - - public ResourceInterface(CodeInterface interfaceCE){ - _interfaceCE = interfaceCE; - _identityProperty = (CodeProperty)FindIdentityProperty(); - } - - public ResourceInterface(CodeElement rootElement) - { - _interfaceCE = ((CodeInterface)rootElement); - _identityProperty = (CodeProperty)FindIdentityProperty(); - } - - public IEnumerable Properties { - get - { - return _interfaceCE.Children - .OfType() - .Where(c=>c.Kind == vsCMElement.vsCMElementProperty) - .Select(c=>(CodeProperty)c); - } - } - - public CodeInterface Interface { - get { return _interfaceCE; } - } - - public IEnumerable BaseInterfaces - { - get - { - foreach(var baseInterface in _interfaceCE.Bases.OfType().Where(HasEntityAttribute)) - { - yield return new ResourceInterface(baseInterface); - } - } - } - - private bool HasEntityAttribute(CodeInterface iface) - { - try - { - return iface.Children.OfType().Any(c=>c.Kind == vsCMElement.vsCMElementAttribute && c.FullName.Equals(Constants.EntityAttributeName)); - } - catch - { - return false; - } - } - - public void GetAllInterfaces(List interfaces) - { - foreach (var ri in BaseInterfaces) - { - if (!interfaces.Contains(ri)) - { - interfaces.Add(ri); - } - ri.GetAllInterfaces(interfaces); - } - } - - public IEnumerable AllInterfaces { - get { - var resourceInterfaces = new List(); - GetAllInterfaces(resourceInterfaces); - return resourceInterfaces; - } - } - - private CodeProperty FindIdentityProperty() - { - // Find the identity property on the interface (if any) - var ret = Properties.Where( c=> - c.Attributes.OfType().Any( - attr => attr.FullName.Equals(Constants.IdentityAttributeName))).FirstOrDefault(); - if (ret == null) - ret = Properties.Where( c=> - (c.Name.Equals(ClassName+"Id") || c.Name.Equals(ClassName+"ID"))).FirstOrDefault(); - if (ret == null) - { - ret = Properties.Where( c=> - (c.Name.Equals("Id") || c.Name.Equals("ID"))).FirstOrDefault(); - } - - // if there is no indication on this class of an id property then check the interfaces we inherit from - if (ret == null) - { - foreach (var bi in AllInterfaces){ - ret = bi.FindIdentityProperty(); - if (ret != null) return ret; - } - } else { - foreach (var bi in AllInterfaces){ - var aret = bi.FindIdentityProperty(); - if (aret != null && (!aret.Name.Equals(ret.Name))) { - Helper._transformation.Error("Invalid identity property " + ret.Name + " on " + _interfaceCE.Name + " it differs from ancestor id " + aret.Name + " on " + bi.InterfaceName); - - } - } - } - - return ret; - } - - public void ValidateIdentityProperty(CodeProperty identityProperty){ - foreach (var bi in AllInterfaces){ - var aret = bi.FindIdentityProperty(); - if (aret != null && (aret.Name != identityProperty.Name)) { - throw new Exception("Invalid identity property. It differs from ancestor identity."); - } - } - } - - public string ClassName { - get { - if (_className == null) { - if (_interfaceCE.Name.StartsWith("I")) { - _className = _interfaceCE.Name.Substring(1); - } else { - _className = _interfaceCE.Name + "Impl"; - } - } - return _className; - } - } - - public string InterfaceName - { - get { return _interfaceCE.Name; } - } - - public string InterfaceFullName - { - get { return _interfaceCE.FullName; } - } - - public string InterfaceNamespaceName - { - get { return _interfaceCE.Namespace.FullName; } - } - - public CodeProperty IdentityProperty { - get {return _identityProperty; } - } - - public string PluralizedName { - get { return Pluralize(_interfaceCE.Name.StartsWith("I") ? _interfaceCE.Name.Substring(1) : _interfaceCE.Name); } - } - - public string Pluralize(string name) - { - if (name.EndsWith("y")) { - return name.Substring(0, name.Length - 1) + "ies"; - } - return name + "s"; - } - - public string EntitySetAccessLevel - { - get - { - switch (_interfaceCE.Access) { - case vsCMAccess.vsCMAccessPublic : - return "public"; - case vsCMAccess.vsCMAccessPrivate : - return "private"; - case vsCMAccess.vsCMAccessProject : - case vsCMAccess.vsCMAccessAssemblyOrFamily: - return "internal"; - default : - return "private"; - } - } - } -} -#> diff --git a/src/npserv/Database/DatabaseUserExistsException.cs b/src/npserv/Database/DatabaseUserExistsException.cs deleted file mode 100644 index 5f7cea7..0000000 --- a/src/npserv/Database/DatabaseUserExistsException.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace NPSharp.CommandLine.Server.Database -{ - class DatabaseUserExistsException : Exception - { - } -} diff --git a/src/npserv/Database/IBan.cs b/src/npserv/Database/IBan.cs deleted file mode 100644 index 874fbbf..0000000 --- a/src/npserv/Database/IBan.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using BrightstarDB.EntityFramework; - -namespace NPSharp.CommandLine.Server.Database -{ - [Entity] - public interface IBan - { - string Id { get; } - - IUser User { get; } - - string Reason { get; set; } - - DateTime ExpiryTime { get; set; } - } -} \ No newline at end of file diff --git a/src/npserv/Database/ICheatDetection.cs b/src/npserv/Database/ICheatDetection.cs deleted file mode 100644 index 2c99b6b..0000000 --- a/src/npserv/Database/ICheatDetection.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using BrightstarDB.EntityFramework; - -namespace NPSharp.CommandLine.Server.Database -{ - [Entity] - public interface ICheatDetection - { - string Id { get; } - - IUser User { get; } - - uint CheatId { get; set; } - - string Reason { get; set; } - - DateTime ExpiryTime { get; set; } - } -} \ No newline at end of file diff --git a/src/npserv/Database/IFriend.cs b/src/npserv/Database/IFriend.cs deleted file mode 100644 index c87ef9d..0000000 --- a/src/npserv/Database/IFriend.cs +++ /dev/null @@ -1,16 +0,0 @@ -using BrightstarDB.EntityFramework; - -namespace NPSharp.CommandLine.Server.Database -{ - [Entity] - public interface IFriend - { - string Id { get; } - - IUser User { get; } - - uint FriendUserId { get; set; } - - string FriendName { get; set; } - } -} \ No newline at end of file diff --git a/src/npserv/Database/IPublisherFile.cs b/src/npserv/Database/IPublisherFile.cs deleted file mode 100644 index 14b046b..0000000 --- a/src/npserv/Database/IPublisherFile.cs +++ /dev/null @@ -1,14 +0,0 @@ -using BrightstarDB.EntityFramework; - -namespace NPSharp.CommandLine.Server.Database -{ - [Entity] - public interface IPublisherFile - { - string Id { get; } - - string FileName { get; set; } - - byte[] FileData { get; set; } - } -} \ No newline at end of file diff --git a/src/npserv/Database/ISession.cs b/src/npserv/Database/ISession.cs deleted file mode 100644 index 272e522..0000000 --- a/src/npserv/Database/ISession.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using BrightstarDB.EntityFramework; - -namespace NPSharp.CommandLine.Server.Database -{ - [Entity] - public interface ISession - { - [Identifier] - string Id { get; } - - IUser User { get; } - - DateTime ExpiryTime { get; set; } - } -} \ No newline at end of file diff --git a/src/npserv/Database/IUser.cs b/src/npserv/Database/IUser.cs deleted file mode 100644 index 7e1e033..0000000 --- a/src/npserv/Database/IUser.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using BrightstarDB.EntityFramework; - -namespace NPSharp.CommandLine.Server.Database -{ - [Entity] - public interface IUser - { - [Identifier] - string Id { get; } - - string UserName { get; set; } - - string UserMail { get; set; } - - uint UserNumber { get; set; } - - string PasswordHash { get; set; } - - DateTime LastLogin { get; set; } - - [InverseProperty("User")] - ICollection Sessions { get; set; } - - [InverseProperty("User")] - ICollection Bans { get; set; } - - [InverseProperty("User")] - ICollection CheatDetections { get; set; } - - [InverseProperty("User")] - ICollection UserFiles { get; set; } - - [InverseProperty("User")] - ICollection FriendIDs { get; set; } - } -} \ No newline at end of file diff --git a/src/npserv/Database/IUserFile.cs b/src/npserv/Database/IUserFile.cs deleted file mode 100644 index fde87fc..0000000 --- a/src/npserv/Database/IUserFile.cs +++ /dev/null @@ -1,16 +0,0 @@ -using BrightstarDB.EntityFramework; - -namespace NPSharp.CommandLine.Server.Database -{ - [Entity] - public interface IUserFile - { - string Id { get; } - - IUser User { get; set; } - - string FileName { get; set; } - - byte[] FileData { get; set; } - } -} \ No newline at end of file diff --git a/src/npserv/LICENSE.txt b/src/npserv/LICENSE.txt deleted file mode 100644 index d2109f0..0000000 --- a/src/npserv/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (c) 2006 Damien Miller (jBCrypt) -Copyright (c) 2013 Ryan D. Emerle (.Net port) - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/src/npserv/Program.cs b/src/npserv/Program.cs deleted file mode 100644 index 48cde44..0000000 --- a/src/npserv/Program.cs +++ /dev/null @@ -1,269 +0,0 @@ -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using log4net; -using log4net.Appender; -using log4net.Config; -using log4net.Core; -using log4net.Layout; -using NPSharp.Authentication; -using NPSharp.CommandLine.Server.Database; -using NPSharp.NP; - -namespace NPSharp.CommandLine.Server -{ - internal class Program - { - private static ILog _log; - private static SessionAuthenticationServer _authServer; - private static NPServer _np; - - private static void Main() - { - InitializeLogging(); - _log.Info("NP server is about to start up, this might take a few seconds..."); - - InitializeDatabase(); - InitializeAuthServer(); - InitializeNPServer(); - - _log.Info("NP server started up successfully."); - Thread.Sleep(Timeout.Infinite); - } - - private static BrightstarDatabaseContext OpenDatabase(string store = "NP") - { - return - new BrightstarDatabaseContext( - "type=embedded;storesdirectory=Database\\;storename=" + store, - true); - } - - private static void InitializeDatabase() - { - _log.Debug("Preparing database..."); - - using (var db = OpenDatabase()) - { - // Skip user creation if there are already registered users - - // ReSharper disable once UseMethodAny.0 - // since SPARQL-to-LINQ does not have support for Any() yet - if (db.Users.Count() > 0) - return; - - // Create first user - var testUser = db.CreateUser("test", "test@localhost", "test"); - db.SaveChanges(); - - _log.InfoFormat( - "Created first user with following details:" + Environment.NewLine + Environment.NewLine + - "Username: {0}" + Environment.NewLine + - "Password: {1}" + Environment.NewLine, - testUser.UserName, - "test"); - } - - // Cleanup thread - Task.Factory.StartNew(() => - { - while (true) - { - using (var dbForCleanup = OpenDatabase()) - { - _log.Debug("Starting cleanup..."); - - foreach (var session in dbForCleanup.Sessions.Where(s => s.ExpiryTime < DateTime.Now).ToArray()) - { - _log.DebugFormat("Session {0} became invalid", session.Id); - dbForCleanup.DeleteObject(session); - } - - foreach (var ban in dbForCleanup.Bans.Where(s => s.ExpiryTime < DateTime.Now).ToArray()) - { - _log.DebugFormat("Ban {0} became invalid", ban.Id); - dbForCleanup.DeleteObject(ban); - } - - foreach (var cheatDetection in dbForCleanup.CheatDetections.Where(s => s.ExpiryTime < DateTime.Now).ToArray()) - { - _log.DebugFormat("Cheat detection {0} became invalid", cheatDetection.Id); - dbForCleanup.DeleteObject(cheatDetection); - } - - dbForCleanup.SaveChanges(); - - _log.Debug("Cleanup done."); - } - - Thread.Sleep(TimeSpan.FromSeconds(30)); - } - - // TODO: implement some way to cancel this loop - // ReSharper disable once FunctionNeverReturns - }); - } - - private static void InitializeAuthServer() - { - _log.Debug("Starting authentication server..."); - _authServer = new SessionAuthenticationServer(); - _authServer.Authenticating += (loginUsername, loginPassword) => - { - using (var db = OpenDatabase()) - { - var user = db.GetUser(loginUsername); - - - if (user == null || !BCrypt.Net.BCrypt.Verify(loginPassword, user.PasswordHash)) - return new SessionAuthenticationResult {Reason = "Invalid credentials"}; - - // Check for bans - var bans = user.Bans.Where(b => b.ExpiryTime > DateTime.Now).ToArray(); - if (bans.Any()) - { - var ban = bans.First(); - return new SessionAuthenticationResult - { - Reason = string.Format("You're banned: {0} (until {1})", ban.Reason, ban.ExpiryTime) - }; - } - - // Check for cheat detections - var cheatDetections = - user.CheatDetections.Where(c => c.ExpiryTime > DateTime.Now).ToArray(); - if (cheatDetections.Any()) - { - var cheatDetection = cheatDetections.First(); - return new SessionAuthenticationResult - { - Reason = - string.Format("Detected cheat #{0}: {1} (until {2})", cheatDetection.CheatId, - cheatDetection.Reason, cheatDetection.ExpiryTime) - }; - } - - // Create user session - var session = db.CreateSession(user); - _log.DebugFormat("Created session {0}", session.Id); - - // Update user's last login data - user.LastLogin = DateTime.Now; - - // Save to database - db.SaveChanges(); - - // Return session information - return new SessionAuthenticationResult - { - Success = true, - SessionToken = session.Id, - UserID = user.UserNumber, - UserMail = user.UserMail, - UserName = user.UserName - }; - } - } - ; - _authServer.Start(); - } - - private static void InitializeNPServer() - { - _log.Debug("Starting NP server..."); - _np = new NPServer(3036) - { - AuthenticationHandler = new BrightstarDatabaseAuthenticationHandler(OpenDatabase()), - FileServingHandler = new BrightstarDatabaseFileServingHandler(OpenDatabase()), - FriendsHandler = null, - UserAvatarHandler = null - }; - _np.Start(); - } - - private static void InitializeLogging() - { - if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX) - { - var appender = new ConsoleAppender - { -#if DEBUG - Threshold = Level.Debug, -#else - Threshold = Level.Info, -#endif - Layout = new PatternLayout("<%d{HH:mm:ss}> [%logger:%thread] %level: %message%newline"), - }; - - BasicConfigurator.Configure( - new IAppender[] - { - appender, - new DebugAppender {Layout = appender.Layout, Threshold = Level.All} - }); - } - else - { - var appender = new ColoredConsoleAppender - { -#if DEBUG - Threshold = Level.Debug, -#else - Threshold = Level.Info, -#endif - Layout = new PatternLayout("<%d{HH:mm:ss}> [%logger:%thread] %level: %message%newline"), - }; - - appender.AddMapping( - new ColoredConsoleAppender.LevelColors - { - Level = Level.Debug, - ForeColor = ColoredConsoleAppender.Colors.Cyan | ColoredConsoleAppender.Colors.HighIntensity - }); - appender.AddMapping( - new ColoredConsoleAppender.LevelColors - { - Level = Level.Info, - ForeColor = - ColoredConsoleAppender.Colors.Green | ColoredConsoleAppender.Colors.HighIntensity - } - ); - - appender.AddMapping( - new ColoredConsoleAppender.LevelColors - { - Level = Level.Warn, - ForeColor = - ColoredConsoleAppender.Colors.Purple | ColoredConsoleAppender.Colors.HighIntensity - }); - - appender.AddMapping( - new ColoredConsoleAppender.LevelColors - { - Level = Level.Error, - ForeColor = ColoredConsoleAppender.Colors.Red | ColoredConsoleAppender.Colors.HighIntensity - } - ); - appender.AddMapping( - new ColoredConsoleAppender.LevelColors - { - Level = Level.Fatal, - ForeColor = - ColoredConsoleAppender.Colors.White | ColoredConsoleAppender.Colors.HighIntensity, - BackColor = ColoredConsoleAppender.Colors.Red - }); - - appender.ActivateOptions(); - BasicConfigurator.Configure( - new IAppender[] - { - appender, - new DebugAppender {Layout = appender.Layout, Threshold = Level.All} - }); - } - - _log = LogManager.GetLogger("Main"); - } - } -} \ No newline at end of file diff --git a/src/npserv/npserv.csproj b/src/npserv/npserv.csproj deleted file mode 100644 index 795cedd..0000000 --- a/src/npserv/npserv.csproj +++ /dev/null @@ -1,124 +0,0 @@ - - - - - Debug - AnyCPU - {1FF77692-D07C-4131-95AE-21AD2A74CA11} - Exe - Properties - NPSharp.CommandLine.Server - npserv - v4.5 - 512 - ..\..\ - true - - - true - full - false - DEBUG;TRACE - prompt - 4 - false - false - - - pdbonly - true - TRACE - prompt - 4 - false - false - - - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ - $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ - $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ - $(SolutionDir)\bin\$(Configuration)\$(Platform)\ - - - - ..\..\packages\BCrypt-Official.0.1.109\lib\BCrypt.Net.dll - - - ..\..\packages\BrightstarDBLibs.1.6.2.0\lib\net45\BrightstarDB.dll - - - ..\..\packages\dotNetRDF.1.0.4.3225\lib\net40\dotNetRDF.dll - - - ..\..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll - - - ..\..\packages\log4net.2.0.3\lib\net40-full\log4net.dll - - - ..\..\packages\Newtonsoft.Json.5.0.8\lib\net45\Newtonsoft.Json.dll - - - ..\..\packages\BrightstarDBLibs.1.6.2.0\lib\net45\Remotion.Linq.dll - - - - - - ..\..\packages\uHttpSharp.0.1.4.8\lib\net40\uhttpsharp.dll - - - ..\..\packages\VDS.Common.1.2.0\lib\net40-client\VDS.Common.dll - - - - - - - - - - - - - - - - True - True - BrightstarDatabaseContext.tt - - - - - - - - TextTemplatingFileGenerator - BrightstarDatabaseContext.cs - - - - - - {1a5ac63a-250e-4bc8-b81a-822ac31f5e37} - libnpsharp - - - - - - - - - - - - \ No newline at end of file diff --git a/src/npserv/packages.config b/src/npserv/packages.config deleted file mode 100644 index 396e698..0000000 --- a/src/npserv/packages.config +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/libnpsharp/Authentication/SessionAuthenticationServer.cs b/src/server/Authentication/SessionAuthenticationServer.cs similarity index 100% rename from src/libnpsharp/Authentication/SessionAuthenticationServer.cs rename to src/server/Authentication/SessionAuthenticationServer.cs diff --git a/src/libnpsharp/Events/ClientEventArgs.cs b/src/server/Events/ClientEventArgs.cs similarity index 100% rename from src/libnpsharp/Events/ClientEventArgs.cs rename to src/server/Events/ClientEventArgs.cs diff --git a/src/libnpsharp/Events/ClientEventHandler.cs b/src/server/Events/ClientEventHandler.cs similarity index 100% rename from src/libnpsharp/Events/ClientEventHandler.cs rename to src/server/Events/ClientEventHandler.cs diff --git a/src/libnpsharp/Handlers/IAuthenticationHandler.cs b/src/server/Handlers/IAuthenticationHandler.cs similarity index 100% rename from src/libnpsharp/Handlers/IAuthenticationHandler.cs rename to src/server/Handlers/IAuthenticationHandler.cs diff --git a/src/libnpsharp/Handlers/IFileServingHandler.cs b/src/server/Handlers/IFileServingHandler.cs similarity index 100% rename from src/libnpsharp/Handlers/IFileServingHandler.cs rename to src/server/Handlers/IFileServingHandler.cs diff --git a/src/libnpsharp/Handlers/IFriendsHandler.cs b/src/server/Handlers/IFriendsHandler.cs similarity index 100% rename from src/libnpsharp/Handlers/IFriendsHandler.cs rename to src/server/Handlers/IFriendsHandler.cs diff --git a/src/libnpsharp/Handlers/IUserAvatarHandler.cs b/src/server/Handlers/IUserAvatarHandler.cs similarity index 100% rename from src/libnpsharp/Handlers/IUserAvatarHandler.cs rename to src/server/Handlers/IUserAvatarHandler.cs diff --git a/src/server/Master/MasterServer.cs b/src/server/Master/MasterServer.cs new file mode 100644 index 0000000..d3746e0 --- /dev/null +++ b/src/server/Master/MasterServer.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; +using log4net; +using NPSharp.Master.Messages; +using NPSharp.Master.Messages.Client; +using NPSharp.NP; + +namespace NPSharp.Master +{ + public class MasterServer + { + // TODO: !! Avoid socket fail if stopping then restarting + private readonly Socket _socket4 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + private readonly Socket _socket6 = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp); + + private readonly ILog _log; + private readonly ushort _port; + + private readonly List>> _callbacks = + new List>>(); + + // TODO: Use the same kind of interfaces as in NP server to handle server addition and deletion + private readonly List _registeredServers = new List(); + + public MasterServer(ushort port = 20810) + { + _port = port; + _log = LogManager.GetLogger("MasterServer"); + + // Internal callbacks + AddCallback(messages => + { + + }); + } + + internal void AddCallback(Action callback) where T : MasterClientMessage + { + _callbacks.Add( + new KeyValuePair>( + typeof(T), + msg => callback.Invoke((T)msg))); + } + + /// + /// Starts up the NP server. + /// + public void Start() + { + if (_socket4.IsBound || _socket6.IsBound) + throw new InvalidOperationException("This server is already running"); + + try + { + // ReSharper disable once ObjectCreationAsStatement + // TODO: fix this shit permission code + new SocketPermission(NetworkAccess.Accept, TransportType.Udp, "", _port); + } + catch + { + _log.Error("Socket permission request failed, can't start server."); + throw new SocketException(10013 /* Permission denied */); + } + + _socket4.Bind(new IPEndPoint(IPAddress.Any, _port)); + _socket4.Listen(100); + + _socket6.Bind(new IPEndPoint(IPAddress.IPv6Any, _port)); + _socket6.Listen(100); + + + // TODO: Implement IPv4 handling + + Task.Factory.StartNew(() => + { + _log.Debug("Listener loop (IPv6) started"); + + while (_socket6 != null && _socket6.IsBound) + { + var mergedBuffer = new List(); + while (true) + { + var buffer = new byte[1400]; + var clientEndPoint = (EndPoint)new IPEndPoint(IPAddress.IPv6Any, 0); + var recvLength = _socket6.ReceiveFrom(buffer, ref clientEndPoint); + if (recvLength <= buffer.Length) + mergedBuffer.AddRange(buffer); + if (recvLength < 1400) + break; + _handleClient(buffer, clientEndPoint); + } + } + _log.Debug("Listener loop (IPv6) shut down"); + }); + } + + private void _handleClient(byte[] buffer, EndPoint ep) + { + _log.DebugFormat("Handle client {0}", ep); + + var message = MasterClientMessage.Deserialize(buffer); + if (message == null) + { + _log.WarnFormat("Received invalid or empty request from {0}", ep); + return; + } + + // Invoke (internal) callbacks for fitting message types + foreach (var callback in _callbacks.Where(i => i.Key == message.GetType()).Select(i => i.Value)) + { + callback.Invoke(message); + } + + _log.DebugFormat("Not handling client {0} anymore", ep); + } + + } +} diff --git a/src/libnpsharp/Master/Messages/MasterServerMessage.cs b/src/server/Master/Messages/MasterServerMessage.cs similarity index 60% rename from src/libnpsharp/Master/Messages/MasterServerMessage.cs rename to src/server/Master/Messages/MasterServerMessage.cs index 8e1d2da..02ee2da 100644 --- a/src/libnpsharp/Master/Messages/MasterServerMessage.cs +++ b/src/server/Master/Messages/MasterServerMessage.cs @@ -32,7 +32,35 @@ namespace NPSharp.Master.Messages get { return GetType().GetCustomAttribute().Name; } } - internal MasterServerMessage Deserialize(Socket sock) + internal static MasterServerMessage Deserialize(byte[] buffer) + { + + var header = buffer.Take(4).ToArray(); + var command = Encoding.ASCII.GetString(buffer, 4, buffer.Length - 4).Trim(); + var commandSplit = command.Split(new[] { '\t', '\r', '\n', '\0', ' ' }, // TODO: Response consists of multipart messages separated by \ instead of ?? Try to be stay as close to client messages as possible. + StringSplitOptions.RemoveEmptyEntries); + + var commandName = commandSplit[0]; + var commandArguments = commandSplit.Skip(1).ToArray(); + + // Search for a message class which fits to the commandName + var message = + (MasterServerMessage)Activator.CreateInstance(Assembly.GetExecutingAssembly() + .GetTypes() + .Single( + t => + t.IsSubclassOf(typeof(MasterServerMessage)) && + t.GetCustomAttribute() + .Name.Equals(commandName, StringComparison.OrdinalIgnoreCase))); + + // Call the individual deserialize method + message.Deserialize(commandArguments); + message.Header = header; + + return message; + } + + internal static MasterServerMessage DeserializeTcp(Socket sock) { while (sock.Connected && !sock.Poll(2000, SelectMode.SelectRead)) { @@ -51,35 +79,14 @@ namespace NPSharp.Master.Messages Log.Debug("Received 0 bytes"); return null; } + if (length < 4) { Log.ErrorFormat("Received incomplete 4-byte header (received {0} bytes instead)", length); throw new ProtocolViolationException("Received incomplete header"); } - var header = buffer.Take(4).ToArray(); - var command = Encoding.ASCII.GetString(buffer, 4, length - 4).Trim(); - var commandSplit = command.Split(new[] {'\t', '\r', '\n', '\0', ' '}, // TODO: Response consists of multipart messages separated by \ instead of ?? Try to be stay as close to client messages as possible. - StringSplitOptions.RemoveEmptyEntries); - - var commandName = commandSplit[0]; - var commandArguments = commandSplit.Skip(1).ToArray(); - - // Search for a message class which fits to the commandName - var message = - (MasterServerMessage) Activator.CreateInstance(Assembly.GetExecutingAssembly() - .GetTypes() - .Single( - t => - t.IsSubclassOf(typeof (MasterServerMessage)) && - t.GetCustomAttribute() - .Name.Equals(commandName, StringComparison.OrdinalIgnoreCase))); - - // Call the individual deserialize method - message.Deserialize(commandArguments); - message.Header = header; - - return message; + return Deserialize(buffer.Take(length).ToArray()); } catch (SocketException) { diff --git a/src/libnpsharp/Master/Messages/MasterServerMessageAttribute.cs b/src/server/Master/Messages/MasterServerMessageAttribute.cs similarity index 79% rename from src/libnpsharp/Master/Messages/MasterServerMessageAttribute.cs rename to src/server/Master/Messages/MasterServerMessageAttribute.cs index 8aa2dc6..0ee0ad4 100644 --- a/src/libnpsharp/Master/Messages/MasterServerMessageAttribute.cs +++ b/src/server/Master/Messages/MasterServerMessageAttribute.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; namespace NPSharp.Master.Messages { diff --git a/src/libnpsharp/Master/README.txt b/src/server/Master/README.txt similarity index 100% rename from src/libnpsharp/Master/README.txt rename to src/server/Master/README.txt diff --git a/src/libnpsharp/NP/NPServer.cs b/src/server/NP/NPServer.cs similarity index 100% rename from src/libnpsharp/NP/NPServer.cs rename to src/server/NP/NPServer.cs diff --git a/src/libnpsharp/NP/NPServerClient.cs b/src/server/NP/NPServerClient.cs similarity index 99% rename from src/libnpsharp/NP/NPServerClient.cs rename to src/server/NP/NPServerClient.cs index e569d8a..72c1df5 100644 --- a/src/libnpsharp/NP/NPServerClient.cs +++ b/src/server/NP/NPServerClient.cs @@ -56,4 +56,4 @@ namespace NPSharp.NP _presence[key] = value; } } -} \ No newline at end of file +} diff --git a/src/server/NPSharp.Server.csproj b/src/server/NPSharp.Server.csproj new file mode 100644 index 0000000..095b1ee --- /dev/null +++ b/src/server/NPSharp.Server.csproj @@ -0,0 +1,102 @@ + + + + + Debug + AnyCPU + {1A5AC63A-250E-4BC8-B81A-822AC31F5E37} + Library + Properties + NPSharp + npsharp_server + v4.5 + 512 + + 12.0.0 + 2.0 + ..\..\ + true + + + true + full + false + TRACE;DEBUG;COMPILE_RPC,COMPILE_NP,COMPILE_AUTH + prompt + 4 + false + + + pdbonly + true + TRACE;COMPILE_RPC,COMPILE_NP,COMPILE_AUTH + prompt + 4 + false + + + $(SolutionDir)\bin\$(Configuration)\$(Platform)\ + $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ + $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ + $(SolutionDir)\obj\$(TargetName)\$(Configuration)\$(Platform)\ + $(SolutionDir)\bin\$(Configuration)\$(Platform)\ + + + + False + ..\..\packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll + + + + + ..\..\packages\log4net.2.0.3\lib\net40-full\log4net.dll + + + ..\..\packages\protobuf-net.2.0.0.668\lib\net40\protobuf-net.dll + + + + + False + ..\..\packages\uHttpSharp.0.1.4.8\lib\net40\uhttpsharp.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {c6f941a5-82af-456a-9b3a-752e5b001035} + NPSharp.Client + + + + \ No newline at end of file diff --git a/src/libnpsharp/Properties/AssemblyInfo.cs b/src/server/Properties/AssemblyInfo.cs similarity index 81% rename from src/libnpsharp/Properties/AssemblyInfo.cs rename to src/server/Properties/AssemblyInfo.cs index cf6e283..f4c8dac 100644 --- a/src/libnpsharp/Properties/AssemblyInfo.cs +++ b/src/server/Properties/AssemblyInfo.cs @@ -4,13 +4,12 @@ using System.Runtime.InteropServices; // Allgemeine Informationen über eine Assembly werden über die folgenden // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, // die mit einer Assembly verknüpft sind. - -[assembly: AssemblyTitle("NPSharp Library")] +[assembly: AssemblyTitle("NPSharp server library")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Icedream")] -[assembly: AssemblyProduct("NPSharp Library")] -[assembly: AssemblyCopyright("© 2014 Icedream")] +[assembly: AssemblyCompany("Carl Kittelberger")] +[assembly: AssemblyProduct("NPSharp")] +[assembly: AssemblyCopyright("© 2014 Carl Kittelberger")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -35,5 +34,5 @@ using System.Runtime.InteropServices; // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.1.*")] -[assembly: AssemblyFileVersion("0.1")] \ No newline at end of file +[assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyFileVersion("1.0")] \ No newline at end of file diff --git a/src/libnpsharp/RPC/RPCServerStream.cs b/src/server/RPC/RPCServerStream.cs similarity index 84% rename from src/libnpsharp/RPC/RPCServerStream.cs rename to src/server/RPC/RPCServerStream.cs index 32f04f6..fb24e91 100644 --- a/src/libnpsharp/RPC/RPCServerStream.cs +++ b/src/server/RPC/RPCServerStream.cs @@ -1,4 +1,6 @@ -using System.Net.Sockets; +#if COMPILE_RPC||COMPILE_NP + +using System.Net.Sockets; using NPSharp.RPC.Messages; namespace NPSharp.RPC @@ -12,4 +14,6 @@ namespace NPSharp.RPC { } } -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/src/libnpsharp/app.config b/src/server/app.config similarity index 100% rename from src/libnpsharp/app.config rename to src/server/app.config diff --git a/src/libnpsharp/packages.config b/src/server/packages.config similarity index 95% rename from src/libnpsharp/packages.config rename to src/server/packages.config index ed29535..22b9207 100644 --- a/src/libnpsharp/packages.config +++ b/src/server/packages.config @@ -1,8 +1,8 @@ - - - - - - - + + + + + + + \ No newline at end of file