예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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();
                }
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
 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();
     }
 }
예제 #5
0
 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;
             }
         }
     }
 }
예제 #6
0
        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);
                }
            }
        }
예제 #7
0
 public static void HandlePing(StarNetPacket _packet, IPEndPoint source, InterNodeNetwork network)
 {
     // Do nothing, this is handled at a lower level
 }