コード例 #1
0
        public static Room DecodeHashlink(String hashlink)
        {
            Room room = new Room();

            hashlink = hashlink.Trim();

            if (hashlink.StartsWith("arlnk://"))
            {
                hashlink = hashlink.Substring(8);
            }

            try
            {
                if (hashlink.ToUpper().StartsWith("CHATROOM:")) // not encrypted
                {
                    hashlink = hashlink.Substring(9);
                    int split = hashlink.IndexOf(":");
                    room.IP   = IPAddress.Parse(hashlink.Substring(0, split));
                    hashlink  = hashlink.Substring(split + 1);
                    split     = hashlink.IndexOf("|");
                    room.Port = ushort.Parse(hashlink.Substring(0, split));
                    room.Name = hashlink.Substring(split + 1);
                    return(room);
                }
                else // encrypted
                {
                    byte[] buf = Convert.FromBase64String(hashlink);
                    buf = d67(buf, 28435);
                    buf = Zip.Decompress(buf);

                    TCPPacketReader packet = new TCPPacketReader(buf);
                    packet.SkipBytes(32);
                    room.IP   = packet;
                    room.Port = packet;
                    packet.SkipBytes(4);
                    room.Name = packet.ReadString();

                    return(room);
                }
            }
            catch // badly formed hashlink
            {
                return(null);
            }
        }
コード例 #2
0
        private void ServiceAresSockets(ulong time)
        {
            foreach (AresClient client in UserPool.AUsers)
            {
                if (!String.IsNullOrEmpty(client.DNS))
                {
                    if (client.IsHTML)
                    {
                        if (Settings.Get <bool>("enabled", "web"))
                        {
                            UserPool.CreateIb0tClient(client, time);
                        }
                        else
                        {
                            client.Disconnect();
                        }
                        break;
                    }

                    if (client.IsWebWorker)
                    {
                        UserPool.CreateWW(client);
                        client.Disconnect();
                        break;
                    }

                    TCPPacket packet = null;

                    while ((packet = client.NextReceivedPacket) != null && client.SocketConnected)
                    {
                        if (packet.Msg == TCPMsg.MSG_CHAT_CLIENTCOMPRESSED)
                        {
                            client.InsertUnzippedData(Zip.Decompress(packet.Packet.ToArray()));
                        }
                        else
                        {
                            try
                            {
                                TCPProcessor.Eval(client, packet, time);

                                if (client.IsLeaf)
                                {
                                    break;
                                }
                            }
                            catch (Exception e)
                            {
                                client.Disconnect();

                                if (packet.Msg != TCPMsg.MSG_CHAT_ADVANCED_FEATURES_PROTOCOL)
                                {
                                    Log("packet read fail from " + client.ExternalIP + " " + packet.Msg, e);
                                }
                                else if (packet.Packet.ToArray().Length >= 3)
                                {
                                    Log(
                                        "packet read fail from " + client.ExternalIP + " " +
                                        (TCPMsg)packet.Packet.ToArray()[2], e);
                                }
                                else
                                {
                                    Log("packet read fail from " + client.ExternalIP + " (Advanced Protocol Exploit)", e);
                                }


                                break;
                            }
                        }
                    }

                    if (client.IsLeaf)
                    {
                        continue;
                    }

                    client.SendReceive();

                    if (client.SocketConnected)
                    {
                        client.EnforceRules(time);
                    }
                }
            }

            UserPool.AUsers.ForEachWhere(x => x.Disconnect(), x => !x.SocketConnected);
            UserPool.AUsers.RemoveAll(x => !x.SocketConnected || x.IsLeaf);
        }