public static void HandleAddNewUser(StarNetPacket _packet, IPEndPoint source, InterNodeNetwork network) { var packet = (AddNewUserPacket)_packet; if (source.Address.Equals(IPAddress.Loopback)) { using (var session = network.LocalNode.Database.SessionFactory.OpenSession()) { if (session.Query <User>().Any(u => u.AccountName == packet.AccountName)) { Console.WriteLine("Warning: Attempted to add account that already exists."); return; } using (var transaction = session.BeginTransaction()) { var user = new User { AccountName = packet.AccountName, Password = packet.Password, NetworkAdmin = packet.NetworkAdmin }; session.SaveOrUpdate(user); transaction.Commit(); } Console.WriteLine("Added user {0} at request of {1}", packet.AccountName, source); } } }
private static void SendPacket(StarNetPacket packet, IPEndPoint endPoint, EventHandler confirmation, Action timedOut) { var network = new InterNodeNetwork(new CryptoProvider(ServerKey)); network.Start(); var reset = new ManualResetEvent(false); DateTime sent = default(DateTime); packet.ConfirmationReceived += (sender, e) => { if (confirmation != null) { confirmation(sender, e); } reset.Set(); }; sent = DateTime.Now; network.Send(packet, endPoint); if (confirmation == null) { return; } if (!reset.WaitOne(10000)) { if (timedOut != null) { timedOut(); } } }
public void Send(StarNetPacket packet, IPEndPoint destination) { var memory = new MemoryStream(); var stream = new BinaryWriter(memory); stream.Write(packet.GetType().Name); stream.Write((byte)packet.Flags); if (packet.AssignTransactionId) { packet.Transaction = GetTransactionNumber(); } stream.Write(packet.Transaction); stream.Write(DateTime.UtcNow.Ticks); packet.Write(stream); var payload = new byte[memory.Position]; memory.Seek(0, SeekOrigin.Begin); memory.Read(payload, 0, payload.Length); var signature = CryptoProvider.SignMessage(payload); memory.Write(signature, 0, signature.Length); payload = new byte[memory.Position]; memory.Seek(0, SeekOrigin.Begin); memory.Read(payload, 0, payload.Length); packet.Destination = destination; packet.ScheduledRetry = DateTime.UtcNow.AddSeconds(10); if (packet.Retries == 0 && (packet.Flags & MessageFlags.ConfirmationRequired) > 0) { lock (NetworkLock) PacketRetryList.Add(packet); } NetworkClient.Send(payload, payload.Length, destination); }
public static void HandleShutdown(StarNetPacket _packet, IPEndPoint source, InterNodeNetwork network) { if (source.Address.Equals(IPAddress.Loopback)) { Console.WriteLine("Shutting down node at request of {0}.", source); network.LocalNode.Shutdown(); } }
private void HandleConfirmation(StarNetPacket packet) { lock (NetworkLock) { for (int i = 0; i < PacketRetryList.Count; i++) { if (PacketRetryList[i].Transaction == packet.Transaction) { PacketRetryList[i].OnConfirmationReceived(); PacketRetryList.RemoveAt(i); break; } } } }
public static void HandleDropUser(StarNetPacket _packet, IPEndPoint source, InterNodeNetwork network) { var packet = (DropUserPacket)_packet; if (source.Address.Equals(IPAddress.Loopback)) { using (var session = network.LocalNode.Database.SessionFactory.OpenSession()) { var user = session.Query <User>().SingleOrDefault(u => u.AccountName == packet.AccountName); if (user == null) { Console.WriteLine("Warning: Attempted to drop account that does not exist."); return; } using (var transaction = session.BeginTransaction()) { session.Delete(user); transaction.Commit(); } Console.WriteLine("Dropped user {0} at request of {1}", packet.AccountName, source); } } }
public static void HandlePing(StarNetPacket _packet, IPEndPoint source, InterNodeNetwork network) { // Do nothing, this is handled at a lower level }