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); } }
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); }