public override void Write(System.IO.BinaryWriter Writer, ConstantPool Pool) { base.Write(Writer, Pool); MemoryStream TmpStream = new MemoryStream(); BinaryWriter TmpWriter = new BinaryWriter(TmpStream); TmpWriter.Write((byte)ParamsAnnotations.Length); for (int i = 0; i < ParamsAnnotations.Length; i++) { TmpWriter.WriteBE((ushort)ParamsAnnotations[i].Count); foreach (Annotation A in ParamsAnnotations[i]) { A.Write(TmpWriter, Pool); } } byte[] ByteArray = TmpStream.ToArray(); TmpStream.Close(); Writer.WriteBE(ByteArray.Length); Writer.Write(ByteArray); }
public byte[] Pack() { using (var ms = new MemoryStream()) { using (var bw = new BinaryWriter(ms)) { bw.WriteBE((uint)0x4B616D65); // 'Kamek\0\0\1' bw.WriteBE((uint)0x6B000001); bw.WriteBE((uint)_bssSize); bw.WriteBE((uint)_codeBlob.Length); bw.Write(_codeBlob); } return ms.ToArray(); } }
public override bool doProcess(string[] args) { if (!hasPermission()) { permissionError(); return false; } this.client.sendCommandMessage("Teleporting to your home planet."); MemoryStream packetWarp = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packetWarp); uint warp = (uint)WarpType.WarpToHomePlanet; string sector = ""; int x = 0; int y = 0; int z = 0; int planet = 0; int satellite = 0; string player = ""; packetWrite.WriteBE(warp); packetWrite.WriteStarString(sector); packetWrite.WriteBE(x); packetWrite.WriteBE(y); packetWrite.WriteBE(z); packetWrite.WriteBE(planet); packetWrite.WriteBE(satellite); packetWrite.WriteStarString(player); client.sendServerPacket(Packet.WarpCommand, packetWarp.ToArray()); return true; }
public override bool doProcess(string[] args) { if (!hasPermission()) { permissionError(); return false; } string player = string.Join(" ", args).Trim(); uint warp; if (player == null || player.Length < 1) { this.client.sendCommandMessage("Teleporting to your ship."); player = ""; warp = (uint)WarpType.WarpToOwnShip; } else { PlayerData targetPlayer = StarryboundServer.clients[player].playerData; if (!hasPermission(true)) { permissionError(2); return false; } if (!this.player.canAccessShip(targetPlayer)) { this.client.sendCommandMessage("You cannot access this player's ship due to their ship's access settings."); return false; } this.client.sendCommandMessage("Teleporting to " + player + " ship!"); warp = (uint)WarpType.WarpToPlayerShip; } MemoryStream packetWarp = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packetWarp); string sector = ""; int x = 0; int y = 0; int z = 0; int planet = 0; int satellite = 0; packetWrite.WriteBE(warp); packetWrite.WriteStarString(sector); packetWrite.WriteBE(x); packetWrite.WriteBE(y); packetWrite.WriteBE(z); packetWrite.WriteBE(planet); packetWrite.WriteBE(satellite); packetWrite.WriteStarString(player); client.sendServerPacket(Packet.WarpCommand, packetWarp.ToArray()); return true; }
public override void Write(System.IO.BinaryWriter Writer, ConstantPool Pool) { if (Value == null) { return; } base.Write(Writer, Pool); Writer.WriteBE((ushort)Value.Length); for (int i = 0; i < Value.Length; i++) { Value[i].Write(Writer, Pool); } }
public override void Write(System.IO.BinaryWriter Writer, ConstantPool Pool) { base.Write(Writer, Pool); MemoryStream TmpStream = new MemoryStream(); BinaryWriter TmpWriter = new BinaryWriter(TmpStream); DefaultValue.Write(TmpWriter, Pool); byte[] ByteArray = TmpStream.ToArray(); TmpStream.Close(); Writer.WriteBE(ByteArray.Length); Writer.Write(ByteArray); }
public override bool doProcess(string[] args) { if (!hasPermission()) { permissionError(); return false; } this.client.sendCommandMessage("Teleporting to orbited planet."); MemoryStream packetWarp = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packetWarp); uint warp = (uint)WarpType.WarpToOrbitedPlanet; string player = ""; packetWrite.WriteBE(warp); packetWrite.Write(new WorldCoordinate()); packetWrite.WriteStarString(player); client.sendServerPacket(Packet.WarpCommand, packetWarp.ToArray()); return true; }
public override bool doProcess(string[] args) { if (!hasPermission()) { permissionError(); return false; } if (StarryboundServer.serverConfig.useDefaultWorldCoordinate && StarryboundServer.spawnPlanet != null) { MemoryStream packetWarp = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packetWarp); packetWrite.WriteBE((uint)WarpType.MoveShip); packetWrite.Write(StarryboundServer.spawnPlanet); packetWrite.WriteStarString(""); client.sendServerPacket(Packet.WarpCommand, packetWarp.ToArray()); this.client.sendCommandMessage("Teleporting your ship to the spawn planet."); return true; } this.client.sendCommandMessage("Spawn planet not enabled."); return false; }
public override void Write(System.IO.BinaryWriter Writer, ConstantPool Pool) { base.Write(Writer, Pool); MemoryStream TmpStream = new MemoryStream(); BinaryWriter TmpWriter = new BinaryWriter(TmpStream); TmpWriter.WriteBE((ushort)Annotations.Count); foreach (Annotation A in Annotations) { A.Write(TmpWriter, Pool); } byte[] ByteArray = TmpStream.ToArray(); TmpStream.Close(); Writer.WriteBE(ByteArray.Length); Writer.Write(ByteArray); }
public override bool doProcess(string[] args) { if (!hasPermission()) { permissionError(); return false; } string player = string.Join(" ", args).Trim(); WorldCoordinate loc = this.player.loc; if (player == null || player.Length < 1) { showHelpText(); return false; } else { Client target = StarryboundServer.getClient(player); if (target != null) { loc = target.playerData.loc; if (loc == null) { this.client.sendCommandMessage("Unable to find an exact location for " + player + "."); return false; } this.client.sendCommandMessage("Warping ship to " + player + " [" + loc.ToString() + "]"); } else { this.client.sendCommandMessage("Player '" + player + "' not found."); return false; } } MemoryStream packetWarp = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packetWarp); packetWrite.WriteBE((uint)WarpType.MoveShip); packetWrite.Write(loc); packetWrite.WriteStarString(""); client.sendServerPacket(Packet.WarpCommand, packetWarp.ToArray()); return true; }
public override void Write(System.IO.BinaryWriter Writer, ConstantPool Pool) { base.Write(Writer, Pool); MemoryStream TmpStream = new MemoryStream(); BinaryWriter TmpWriter = new BinaryWriter(TmpStream); TmpWriter.WriteBE(MaxStack); TmpWriter.WriteBE(MaxLocals); TmpWriter.WriteBE((uint)CodeBytes.Length); TmpWriter.Write(CodeBytes); TmpWriter.WriteBE((ushort)ExceptionTable.Count); foreach (Exception Exception in ExceptionTable) { TmpWriter.WriteBE(Exception.StartPC); TmpWriter.WriteBE(Exception.EncPC); TmpWriter.WriteBE(Exception.HandlerPC); TmpWriter.WriteBE(Exception.CatchType); } TmpWriter.WriteBE((ushort)Attributes.Count); foreach (Attribute Attribute in Attributes) { Attribute.Write(TmpWriter, Pool); } TmpWriter.Flush(); TmpWriter.Seek(0, SeekOrigin.Begin); byte[] CodeAttrBytes = TmpStream.ToArray(); TmpWriter.Close(); Writer.WriteBE((uint)CodeAttrBytes.Length); Writer.Write(CodeAttrBytes); }
public void run() { try { this.cIn = new BinaryReader(this.cSocket.GetStream()); this.cOut = new BinaryWriter(this.cSocket.GetStream()); IPEndPoint ipep = (IPEndPoint)this.cSocket.Client.RemoteEndPoint; IPAddress ipa = ipep.Address; this.playerData.ip = ipep.Address.ToString(); StarryboundServer.logInfo("[" + playerData.client + "] Accepting new connection."); if(StarryboundServer.serverState != ServerState.Running) { MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteBE(StarryboundServer.ProtocolVersion); this.sendClientPacket(Packet.ProtocolVersion, packet.ToArray()); rejectPreConnected("Connection Failed: The server is not ready yet."); return; } sSocket = new TcpClient(); IAsyncResult result = sSocket.BeginConnect(IPAddress.Loopback, StarryboundServer.config.serverPort, null, null); bool success = result.AsyncWaitHandle.WaitOne(3000, true); if (!success) { StarryboundServer.failedConnections++; if (StarryboundServer.failedConnections >= StarryboundServer.config.maxFailedConnections) { StarryboundServer.logFatal(StarryboundServer.failedConnections + " clients failed to connect in a row. Restarting..."); StarryboundServer.serverState = ServerState.Crashed; } MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteBE(StarryboundServer.ProtocolVersion); this.sendClientPacket(Packet.ProtocolVersion, packet.ToArray()); rejectPreConnected("Connection Failed: Unable to connect to the parent server."); return; } this.sIn = new BinaryReader(this.sSocket.GetStream()); this.sOut = new BinaryWriter(this.sSocket.GetStream()); // Forwarding for data from SERVER (sIn) to CLIENT (cOut) this.ServerForwarder = new Thread(new ThreadStart(new ForwardThread(this, this.sIn, this.cOut, Direction.Server).run)); ServerForwarder.Start(); // Forwarding for data from CLIENT (cIn) to SERVER (sOut) this.ClientForwarder = new Thread(new ThreadStart(new ForwardThread(this, this.cIn, this.sOut, Direction.Client).run)); ClientForwarder.Start(); StarryboundServer.failedConnections = 0; } catch (Exception e) { StarryboundServer.logException("ClientThread Exception: " + e.ToString()); StarryboundServer.failedConnections++; MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteBE(StarryboundServer.ProtocolVersion); this.sendClientPacket(Packet.ProtocolVersion, packet.ToArray()); rejectPreConnected("Connection Failed: A internal server error occurred (1)"); } }
public override void onSend() { if (tmpArray.Count < 5) return; MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); ChatReceiveContext sContext = (ChatReceiveContext)tmpArray["context"]; string sWorld = (string)tmpArray["world"]; uint sClientID = (uint)tmpArray["entityID"]; // Player entity ID string sName = (string)tmpArray["name"]; // Name string sMessage = (string)tmpArray["message"]; // Message packetWrite.Write((byte)sContext); packetWrite.WriteStarString(sWorld); packetWrite.WriteBE(sClientID); packetWrite.WriteStarString(sName); packetWrite.WriteStarString(sMessage); this.client.sendClientPacket(Packet.ChatReceive, packet.ToArray()); }
private void Write(ShapefileHeader header, BinaryWriter stream, int fileLength) { stream.BaseStream.Seek(0, SeekOrigin.Begin); stream.WriteBE(9994); stream.WriteBE(0); stream.WriteBE(0); stream.WriteBE(0); stream.WriteBE(0); stream.WriteBE(0); stream.WriteBE(fileLength); stream.Write(1000); stream.Write((int)header.ShapeType); stream.Write(header.Bounds.Minimum.X); stream.Write(header.Bounds.Minimum.Y); stream.Write(header.Bounds.Maximum.X); stream.Write(header.Bounds.Maximum.Y); }
public void run() { try { for (;;) { if (!this.client.connectionAlive) { this.client.forceDisconnect(direction, "Connection no longer alive"); return; } if (this.client.kickTargetTimestamp != 0) { if (this.client.kickTargetTimestamp < Utils.getTimestamp()) { this.client.closeConnection(); return; } continue; } #region Process Packet //Packet ID and Vaildity Check. uint temp = this.incoming.ReadVarUInt32(); if (temp < 1 || temp > 48) { this.client.forceDisconnect(direction, "Sent invalid packet ID [" + temp + "]."); return; } Packet packetID = (Packet)temp; //Packet Size and Compression Check. bool compressed = false; int packetSize = this.incoming.ReadVarInt32(); if (packetSize < 0) { packetSize = -packetSize; compressed = true; } //Create buffer for forwarding byte[] dataBuffer = this.incoming.ReadFully(packetSize); //Do decompression MemoryStream ms = new MemoryStream(); if (compressed) { ZlibStream compressedStream = new ZlibStream(new MemoryStream(dataBuffer), CompressionMode.Decompress); byte[] buffer = new byte[32768]; for (;;) { int read = compressedStream.Read(buffer, 0, buffer.Length); if (read <= 0) break; ms.Write(buffer, 0, read); } ms.Seek(0, SeekOrigin.Begin); } else { ms = new MemoryStream(dataBuffer); } //Create packet parser BinaryReader packetData = new BinaryReader(ms); #endregion //Return data for packet processor object returnData = true; if (packetID != Packet.Heartbeat && packetID != Packet.UniverseTimeUpdate) { if (direction == Direction.Client) #region Handle Client Packets { #region Protocol State Security ClientState curState = this.client.state; if (curState != ClientState.Connected) { if (curState == ClientState.PendingConnect && packetID != Packet.ClientConnect) { this.client.rejectPreConnected("Violated PendingConnect protocol state with " + packetID); return; } else if (curState == ClientState.PendingAuthentication && packetID != Packet.HandshakeResponse) { this.client.rejectPreConnected("Violated PendingAuthentication protocol state with " + packetID); return; } else if (curState == ClientState.PendingConnectResponse) { int startTime = Utils.getTimestamp(); while (true) { if (this.client.state == ClientState.Connected) break; if (Utils.getTimestamp() > startTime + StarryboundServer.config.connectTimeout) { this.client.rejectPreConnected("Connection Failed: Server did not respond in time."); return; } } } } #endregion if (packetID == Packet.ChatSend) { returnData = new Packet11ChatSend(this.client, packetData, this.direction).onReceive(); } else if (packetID == Packet.ClientConnect) { this.client.state = ClientState.PendingAuthentication; returnData = new Packet7ClientConnect(this.client, packetData, this.direction).onReceive(); MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); passwordSalt = Utils.GenerateSecureSalt(); packetWrite.WriteStarString(""); packetWrite.WriteStarString(passwordSalt); packetWrite.WriteBE(StarryboundServer.config.passwordRounds); this.client.sendClientPacket(Packet.HandshakeChallenge, packet.ToArray()); } else if (packetID == Packet.HandshakeResponse) { string claimResponse = packetData.ReadStarString(); string passwordHash = packetData.ReadStarString(); string verifyHash = Utils.StarHashPassword(StarryboundServer.config.proxyPass, this.client.playerData.account + passwordSalt, StarryboundServer.config.passwordRounds); if (passwordHash != verifyHash) { this.client.rejectPreConnected("Your password was incorrect."); return; } this.client.state = ClientState.PendingConnectResponse; returnData = false; } else if (packetID == Packet.WarpCommand) { WarpType cmd = (WarpType)packetData.ReadUInt32BE(); WorldCoordinate coord = packetData.ReadStarWorldCoordinate(); string player = packetData.ReadStarString(); if (cmd == WarpType.WarpToPlayerShip) { Client target = StarryboundServer.getClient(player); if (target != null) { if (!this.client.playerData.canAccessShip(target.playerData)) { this.client.sendChatMessage("^#5dc4f4;You cannot access this player's ship due to their ship access settings."); StarryboundServer.logDebug("ShipAccess", "Preventing " + this.client.playerData.name + " from accessing " + target.playerData.name + "'s ship."); MemoryStream packetWarp = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packetWarp); packetWrite.WriteBE((uint)WarpType.WarpToOwnShip); packetWrite.Write(new WorldCoordinate()); packetWrite.WriteStarString(""); client.sendServerPacket(Packet.WarpCommand, packetWarp.ToArray()); returnData = false; } } } StarryboundServer.logDebug("WarpCommand", "[" + this.client.playerData.client + "][" + cmd + "]" + (coord != null ? "[" + coord.ToString() + "]" : "") + "[" + player + "]"); } else if (packetID == Packet.ModifyTileList || packetID == Packet.DamageTileGroup || packetID == Packet.DamageTile || packetID == Packet.ConnectWire || packetID == Packet.DisconnectAllWires) { if(!this.client.playerData.canIBuild()) returnData = false; } else if (packetID == Packet.EntityCreate) { while(true) { EntityType type = (EntityType)packetData.Read(); if(type == EntityType.EOF) break; byte[] entityData = packetData.ReadStarByteArray(); int entityId = packetData.ReadVarInt32(); if(type == EntityType.Projectile) { BinaryReader entity = new BinaryReader(new MemoryStream(entityData)); string projectileKey = entity.ReadStarString(); object projParams = entity.ReadStarVariant(); if (StarryboundServer.config.projectileBlacklist.Contains(projectileKey)) { MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteVarInt32(entityId); packetWrite.Write(false); this.client.sendClientPacket(Packet.EntityDestroy, packet.ToArray()); returnData = false; } if (StarryboundServer.serverConfig.useDefaultWorldCoordinate && StarryboundServer.config.spawnWorldProtection) { if (this.client.playerData.loc != null) { if (StarryboundServer.config.projectileBlacklistSpawn.Contains(projectileKey) && StarryboundServer.spawnPlanet.Equals(this.client.playerData.loc) && !this.client.playerData.group.hasPermission("admin.spawnbuild") && !this.client.playerData.inPlayerShip) { MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteVarInt32(entityId); packetWrite.Write(false); this.client.sendClientPacket(Packet.EntityDestroy, packet.ToArray()); returnData = false; } } else { MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteVarInt32(entityId); packetWrite.Write(false); this.client.sendClientPacket(Packet.EntityDestroy, packet.ToArray()); returnData = false; } } } else if (type == EntityType.Object || type == EntityType.Plant || type == EntityType.PlantDrop || type == EntityType.Monster) { if (!this.client.playerData.canIBuild()) { MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteVarInt32(entityId); packetWrite.Write(false); this.client.sendClientPacket(Packet.EntityDestroy, packet.ToArray()); returnData = false; } } } } else if (packetID == Packet.SpawnEntity) { while(true) { EntityType type = (EntityType)packetData.Read(); if (type == EntityType.EOF) break; byte[] entityData = packetData.ReadStarByteArray(); if (type == EntityType.Projectile) { BinaryReader entity = new BinaryReader(new MemoryStream(entityData)); string projectileKey = entity.ReadStarString(); object projParams = entity.ReadStarVariant(); if (StarryboundServer.config.projectileBlacklist.Contains(projectileKey)) { returnData = false; } if (StarryboundServer.serverConfig.useDefaultWorldCoordinate && StarryboundServer.config.spawnWorldProtection) { if (this.client.playerData.loc != null) { if (StarryboundServer.config.projectileBlacklistSpawn.Contains(projectileKey) ^ StarryboundServer.config.projectileSpawnListIsWhitelist) { if (StarryboundServer.spawnPlanet.Equals(this.client.playerData.loc) && !this.client.playerData.group.hasPermission("admin.spawnbuild") && !this.client.playerData.inPlayerShip) { returnData = false; } } } else { returnData = false; } } } else if (type == EntityType.Object || type == EntityType.Plant || type == EntityType.PlantDrop || type == EntityType.Monster) { if (!this.client.playerData.canIBuild()) returnData = false; } } } } #endregion else #region Handle Server Packets { if (packetID == Packet.ChatReceive) { returnData = new Packet5ChatReceive(this.client, packetData, this.direction).onReceive(); } else if (packetID == Packet.ProtocolVersion) { uint protocolVersion = packetData.ReadUInt32BE(); if (protocolVersion != StarryboundServer.ProtocolVersion) { MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteBE(protocolVersion); this.client.sendClientPacket(Packet.ProtocolVersion, packet.ToArray()); this.client.rejectPreConnected("Connection Failed: Unable to handle parent server protocol version."); return; } } else if (packetID == Packet.HandshakeChallenge) { string claimMessage = packetData.ReadString(); string passwordSalt = packetData.ReadStarString(); int passwordRounds = packetData.ReadInt32BE(); MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); string passwordHash = Utils.StarHashPassword(StarryboundServer.privatePassword, passwordSalt, passwordRounds); packetWrite.WriteStarString(""); packetWrite.WriteStarString(passwordHash); this.client.sendServerPacket(Packet.HandshakeResponse, packet.ToArray()); returnData = false; } else if (packetID == Packet.ConnectResponse) { int startTime = Utils.getTimestamp(); while (true) { if (this.client.state == ClientState.PendingConnectResponse) break; if (Utils.getTimestamp() > startTime + StarryboundServer.config.connectTimeout) { this.client.rejectPreConnected("Connection Failed: Client did not respond with handshake."); return; } } returnData = new Packet2ConnectResponse(this.client, packetData, this.direction).onReceive(); } else if (packetID == Packet.WorldStart) { if (!this.client.playerData.sentMotd) { this.client.sendChatMessage(Config.GetMotd()); if (!this.client.playerData.group.hasPermission("world.build")) this.client.sendChatMessage("^#f75d5d;" + StarryboundServer.config.buildErrorMessage); this.client.playerData.sentMotd = true; } byte[] planet = packetData.ReadStarByteArray(); byte[] worldStructure = packetData.ReadStarByteArray(); byte[] sky = packetData.ReadStarByteArray(); byte[] serverWeather = packetData.ReadStarByteArray(); float spawnX = packetData.ReadSingleBE(); float spawnY = packetData.ReadSingleBE(); uint mapParamsSize = packetData.ReadVarUInt32(); Dictionary<string, object> mapParams = new Dictionary<string, object>(); int isPlayerShip = 0; for (int i = 0; i < mapParamsSize; i++) { string key = packetData.ReadStarString(); var value = packetData.ReadStarVariant(); mapParams.Add(key, value); if(key == "fuel.level") { isPlayerShip++; } else if(key == "fuel.max") { isPlayerShip++; } } this.client.playerData.inPlayerShip = (isPlayerShip == 2); uint clientID = packetData.ReadUInt32BE(); bool bool1 = packetData.ReadBoolean(); WorldCoordinate coords = Utils.findGlobalCoords(sky); if (coords != null) { this.client.playerData.loc = coords; StarryboundServer.logDebug("WorldStart", "[" + this.client.playerData.client + "][" + bool1 + ":" + clientID + "] CurLoc:[" + this.client.playerData.loc.ToString() + "][" + this.client.playerData.inPlayerShip + "]"); } else StarryboundServer.logDebug("WorldStart", "[" + this.client.playerData.client + "][" + bool1 + ":" + clientID + "] InPlayerShip:[" + this.client.playerData.inPlayerShip + "]"); } else if (packetID == Packet.WorldStop) { string status = packetData.ReadStarString(); } else if (packetID == Packet.GiveItem) { string name = packetData.ReadStarString(); uint count = packetData.ReadVarUInt32(); var itemDesc = packetData.ReadStarVariant(); } else if (packetID == Packet.EnvironmentUpdate) { byte[] sky = packetData.ReadStarByteArray(); byte[] serverWeather = packetData.ReadStarByteArray(); if (this.client.playerData.loc == null) { WorldCoordinate coords = Utils.findGlobalCoords(sky); if (coords != null) { this.client.playerData.loc = coords; StarryboundServer.logDebug("EnvUpdate", "[" + this.client.playerData.client + "] CurLoc:[" + this.client.playerData.loc.ToString() + "]"); } } } else if (packetID == Packet.ClientContextUpdate) { try { byte[] clientContextData = packetData.ReadStarByteArray(); if (clientContextData.Length != 0) { BinaryReader clientContextReader = new BinaryReader(new MemoryStream(clientContextData)); byte[] data = clientContextReader.ReadStarByteArray(); if (data.Length > 8) //Should at least be more than 8 bytes for it to contain the data we want. { BinaryReader dataReader = new BinaryReader(new MemoryStream(data)); byte dataBufferLength = dataReader.ReadByte(); if (dataBufferLength == 2) { byte arrayLength = dataReader.ReadByte(); if (arrayLength == 2 || arrayLength == 4) //Only observed these being used so far for what we want. { byte dataType = dataReader.ReadByte(); //04 = String, 0E = CelestialLog if (dataType == 4) { string string1 = dataReader.ReadStarString(); if (dataReader.BaseStream.Position != dataReader.BaseStream.Length) { if (string1 == "null") { byte[] worldHeader = dataReader.ReadStarByteArray(); //0008020A000C byte[] worldData = dataReader.ReadStarByteArray(); byte typeByte = dataReader.ReadByte(); //0E = CelestialLog if (typeByte == 14) { Dictionary<string, WorldCoordinate> log = dataReader.ReadStarCelestialLog(); log.TryGetValue("loc", out this.client.playerData.loc); if (!log.TryGetValue("home", out this.client.playerData.home)) this.client.playerData.home = this.client.playerData.loc; StarryboundServer.logDebug("ClientContext", "[" + this.client.playerData.client + "] CurLoc:[" + this.client.playerData.loc.ToString() + "][" + this.client.playerData.inPlayerShip + "]"); StarryboundServer.logDebug("ClientContext", "[" + this.client.playerData.client + "] CurHome:[" + this.client.playerData.home.ToString() + "]"); } } } } else if (dataType == 14) { Dictionary<string, WorldCoordinate> log = dataReader.ReadStarCelestialLog(); log.TryGetValue("loc", out this.client.playerData.loc); if (!log.TryGetValue("home", out this.client.playerData.home)) this.client.playerData.home = this.client.playerData.loc; StarryboundServer.logDebug("ClientContext", "[" + this.client.playerData.client + "] CurLoc:[" + this.client.playerData.loc.ToString() + "][" + this.client.playerData.inPlayerShip + "]"); StarryboundServer.logDebug("ClientContext", "[" + this.client.playerData.client + "] CurHome:[" + this.client.playerData.home.ToString() + "]"); } } } } } } catch (Exception e) { StarryboundServer.logDebug("ClientContext", "[" + this.client.playerData.client + "] Failed to parse ClientContextUpdate from Server: " + e.ToString()); } } else if (packetID == Packet.EntityCreate) { MemoryStream sendStream = new MemoryStream(); BinaryWriter sendWriter = new BinaryWriter(sendStream); bool test = true; while (true) { EntityType type = (EntityType)packetData.Read(); if (type == EntityType.EOF) break; byte[] entityData = packetData.ReadStarByteArray(); int entityId = packetData.ReadVarInt32(); if (type == EntityType.Player) { byte[] buffer = new byte[16]; Buffer.BlockCopy(entityData, 0, buffer, 0, 16); buffer = Utils.HashUUID(buffer); Buffer.BlockCopy(buffer, 0, entityData, 0, 16); returnData = test = false; } sendWriter.Write((byte)type); sendWriter.WriteVarUInt64((ulong)entityData.Length); sendWriter.Write(entityData); sendWriter.WriteVarInt32(entityId); } if(test == false) { this.outgoing.WriteVarUInt32((uint)packetID); this.outgoing.WriteVarInt32((int)sendStream.Length); this.outgoing.Write(sendStream.ToArray()); this.outgoing.Flush(); } } } #endregion } //Check return data if (returnData is Boolean) { if ((Boolean)returnData == false) continue; } else if (returnData is int) { if ((int)returnData == -1) { this.client.forceDisconnect(direction, "Command processor requested to drop client"); return; } } #region Forward Packet //Write data to dest this.outgoing.WriteVarUInt32((uint)packetID); if (compressed) { this.outgoing.WriteVarInt32(-packetSize); this.outgoing.Write(dataBuffer, 0, packetSize); } else { this.outgoing.WriteVarInt32(packetSize); this.outgoing.Write(dataBuffer, 0, packetSize); } this.outgoing.Flush(); #endregion //If disconnect was forwarded to client, lets disconnect. if(packetID == Packet.ServerDisconnect && direction == Direction.Server) { this.client.closeConnection(); } } } catch (ThreadAbortException) { } catch (EndOfStreamException) { this.client.forceDisconnect(direction, "End of stream"); } catch (Exception e) { if(e.InnerException != null) { if(e.InnerException is System.Net.Sockets.SocketException) { this.client.forceDisconnect(direction, e.InnerException.Message); return; } } this.client.forceDisconnect(direction, "ForwardThread Exception: " + e.ToString()); } }
public void run() { try { for (;;) { if (!this.mParent.connectionAlive) { this.mParent.forceDisconnect("Connection Lost"); return; } if (this.mParent.kickTargetTimestamp != 0) { if (this.mParent.kickTargetTimestamp < Utils.getTimestamp()) { this.mParent.forceDisconnect("Kicked from server"); return; } continue; } #region Process Packet //Packet ID and Vaildity Check. uint temp = this.mInput.ReadVarUInt32(); if (temp < 1 || temp > 48) { this.mParent.errorDisconnect(mDirection, "Sent invalid packet ID [" + temp + "]."); return; } Packet packetID = (Packet)temp; //Packet Size and Compression Check. bool compressed = false; int packetSize = this.mInput.ReadVarInt32(); if (packetSize < 0) { packetSize = -packetSize; compressed = true; } //Create buffer for forwarding byte[] dataBuffer = this.mInput.ReadFully(packetSize); //Do decompression MemoryStream ms = new MemoryStream(); if (compressed) { ZlibStream compressedStream = new ZlibStream(new MemoryStream(dataBuffer), CompressionMode.Decompress); byte[] buffer = new byte[32768]; for (;;) { int read = compressedStream.Read(buffer, 0, buffer.Length); if (read <= 0) break; ms.Write(buffer, 0, read); } ms.Seek(0, SeekOrigin.Begin); } else { ms = new MemoryStream(dataBuffer); } //Create packet parser BinaryReader packetData = new BinaryReader(ms); #endregion //Return data for packet processor object returnData = true; if (packetID != Packet.Heartbeat && packetID != Packet.UniverseTimeUpdate) { if (mDirection == Direction.Client) #region Handle Client Packets { #region Protocol State Security ClientState curState = this.mParent.clientState; if (curState != ClientState.Connected) { if (curState == ClientState.PendingConnect && packetID != Packet.ClientConnect) { this.mParent.forceDisconnect("Violated PendingConnect protocol state with " + packetID); } else if (curState == ClientState.PendingAuthentication && packetID != Packet.HandshakeResponse) { this.mParent.forceDisconnect("Violated PendingAuthentication protocol state with " + packetID); } else if (curState == ClientState.PendingConnectResponse) { this.mParent.forceDisconnect("Violated PendingConnectResponse protocol state with " + packetID); } } #endregion if (packetID == Packet.ChatSend) { returnData = new Packet11ChatSend(this.mParent, packetData, this.mDirection).onReceive(); } else if (packetID == Packet.ClientConnect) { this.mParent.clientState = ClientState.PendingAuthentication; returnData = new Packet7ClientConnect(this.mParent, packetData, this.mDirection).onReceive(); MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); passwordSalt = Utils.GenerateSecureSalt(); packetWrite.WriteStarString(""); packetWrite.WriteStarString(passwordSalt); packetWrite.WriteBE(StarryboundServer.config.passwordRounds); this.mParent.sendClientPacket(Packet.HandshakeChallenge, packet.ToArray()); } else if (packetID == Packet.HandshakeResponse) { string claimResponse = packetData.ReadStarString(); string passwordHash = packetData.ReadStarString(); string verifyHash = Utils.StarHashPassword(StarryboundServer.config.proxyPass, this.mParent.playerData.account + passwordSalt, StarryboundServer.config.passwordRounds); if (passwordHash != verifyHash) { this.mParent.rejectPreConnected("Your password was incorrect."); } this.mParent.clientState = ClientState.PendingConnectResponse; returnData = false; } else if (packetID == Packet.WarpCommand) { uint warp = packetData.ReadUInt32BE(); WorldCoordinate coord = packetData.ReadStarWorldCoordinate(); string player = packetData.ReadStarString(); WarpType cmd = (WarpType)warp; if (cmd == WarpType.WarpToHomePlanet) { this.mParent.playerData.inPlayerShip = false; } else if (cmd == WarpType.WarpToOrbitedPlanet) { this.mParent.playerData.inPlayerShip = false; } else if (cmd == WarpType.WarpToOwnShip) { this.mParent.playerData.inPlayerShip = true; } else if (cmd == WarpType.WarpToPlayerShip) { this.mParent.playerData.inPlayerShip = true; } StarryboundServer.logDebug("WarpCommand", "[" + this.mParent.playerData.client + "][" + warp + "]" + (coord != null ? "[" + coord.ToString() + "]" : "") + "[" + player + "]"); } else if (packetID == Packet.ModifyTileList || packetID == Packet.DamageTileGroup || packetID == Packet.DamageTile || packetID == Packet.ConnectWire || packetID == Packet.DisconnectAllWires) { if (!this.mParent.playerData.canBuild) continue; if (this.mParent.playerData.loc != null) { string planetCheck = this.mParent.playerData.loc.ToString(); string spawnPlanet = StarryboundServer.serverConfig.defaultWorldCoordinate; if (StarryboundServer.serverConfig.defaultWorldCoordinate.Split(':').Length == 5) spawnPlanet = spawnPlanet + ":0"; if ((planetCheck == spawnPlanet) && !this.mParent.playerData.group.hasPermission("admin.spawnbuild") && !this.mParent.playerData.inPlayerShip) { continue; } } } } #endregion else #region Handle Server Packets { if (packetID == Packet.ChatReceive) { returnData = new Packet5ChatReceive(this.mParent, packetData, this.mDirection).onReceive(); } else if (packetID == Packet.ProtocolVersion) { uint protocolVersion = packetData.ReadUInt32BE(); if (protocolVersion != StarryboundServer.ProtocolVersion) { MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteBE(protocolVersion); this.mParent.sendClientPacket(Packet.ProtocolVersion, packet.ToArray()); this.mParent.rejectPreConnected("Starrybound Server was unable to handle the parent server protocol version."); returnData = false; } } else if (packetID == Packet.HandshakeChallenge) { string claimMessage = packetData.ReadString(); string passwordSalt = packetData.ReadStarString(); int passwordRounds = packetData.ReadInt32BE(); MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); string passwordHash = Utils.StarHashPassword(StarryboundServer.config.serverPass, StarryboundServer.config.serverAccount + passwordSalt, passwordRounds); packetWrite.WriteStarString(""); packetWrite.WriteStarString(passwordHash); this.mParent.sendServerPacket(Packet.HandshakeResponse, packet.ToArray()); returnData = false; } else if (packetID == Packet.ConnectResponse) { while (this.mParent.clientState != ClientState.PendingConnectResponse) { } //TODO: needs timeout returnData = new Packet2ConnectResponse(this.mParent, packetData, this.mDirection).onReceive(); } else if (packetID == Packet.WorldStart) { if (!this.mParent.playerData.sentMotd) { this.mParent.sendChatMessage(Config.GetMotd()); this.mParent.playerData.sentMotd = true; } byte[] planet = packetData.ReadStarByteArray(); byte[] worldStructure = packetData.ReadStarByteArray(); byte[] sky = packetData.ReadStarByteArray(); byte[] serverWeather = packetData.ReadStarByteArray(); float spawnX = packetData.ReadSingleBE(); float spawnY = packetData.ReadSingleBE(); uint mapParamsSize = packetData.ReadVarUInt32(); Dictionary<string, object> mapParams = new Dictionary<string, object>(); for (int i = 0; i < mapParamsSize; i++) { mapParams.Add(packetData.ReadStarString(), packetData.ReadStarVariant()); } uint clientID = packetData.ReadUInt32BE(); bool bool1 = packetData.ReadBoolean(); WorldCoordinate coords = Utils.findGlobalCoords(sky); if (coords != null) { this.mParent.playerData.loc = coords; StarryboundServer.logDebug("WorldStart", "[" + this.mParent.playerData.client + "][" + bool1 + ":" + clientID + "] CurLoc:[" + this.mParent.playerData.loc.ToString() + "][" + this.mParent.playerData.inPlayerShip + "]"); } } else if (packetID == Packet.WorldStop) { string status = packetData.ReadStarString(); } else if (packetID == Packet.GiveItem) { string name = packetData.ReadStarString(); uint count = packetData.ReadVarUInt32(); List<object> itemDesc = packetData.ReadStarVariant(); } else if (packetID == Packet.EnvironmentUpdate) { byte[] sky = packetData.ReadStarByteArray(); byte[] serverWeather = packetData.ReadStarByteArray(); /*WorldCoordinate coords = Utils.findGlobalCoords(sky); if (coords != null) { this.mParent.playerData.loc = coords; StarryboundServer.logDebug("EnvUpdate", "[" + this.mParent.playerData.client + "] CurLoc:[" + this.mParent.playerData.loc.ToString() + "]"); }*/ } else if (packetID == Packet.ClientContextUpdate) { try { byte[] clientContextData = packetData.ReadStarByteArray(); if (clientContextData.Length != 0) { BinaryReader clientContextReader = new BinaryReader(new MemoryStream(clientContextData)); byte[] data = clientContextReader.ReadStarByteArray(); if (data.Length > 8) //Should at least be more than 8 bytes for it to contain the data we want. { BinaryReader dataReader = new BinaryReader(new MemoryStream(data)); byte dataBufferLength = dataReader.ReadByte(); if (dataBufferLength == 2) { byte arrayLength = dataReader.ReadByte(); if (arrayLength == 2 || arrayLength == 4) //Only observed these being used so far for what we want. { byte dataType = dataReader.ReadByte(); //04 = String, 0E = CelestialLog if (dataType == 4) { string string1 = dataReader.ReadStarString(); if (dataReader.BaseStream.Position != dataReader.BaseStream.Length) { if (string1 == "null") { byte[] worldHeader = dataReader.ReadStarByteArray(); //0008020A000C byte[] worldData = dataReader.ReadStarByteArray(); byte typeByte = dataReader.ReadByte(); //0E = CelestialLog if (typeByte == 14) { Dictionary<string, WorldCoordinate> log = dataReader.ReadStarCelestialLog(); log.TryGetValue("loc", out this.mParent.playerData.loc); if (!log.TryGetValue("home", out this.mParent.playerData.home)) this.mParent.playerData.home = this.mParent.playerData.loc; StarryboundServer.logDebug("ClientContext", "[" + this.mParent.playerData.client + "] CurLoc:[" + this.mParent.playerData.loc.ToString() + "][" + this.mParent.playerData.inPlayerShip + "]"); StarryboundServer.logDebug("ClientContext", "[" + this.mParent.playerData.client + "] CurHome:[" + this.mParent.playerData.home.ToString() + "]"); } } } } else if (dataType == 14) { Dictionary<string, WorldCoordinate> log = dataReader.ReadStarCelestialLog(); log.TryGetValue("loc", out this.mParent.playerData.loc); if (!log.TryGetValue("home", out this.mParent.playerData.home)) this.mParent.playerData.home = this.mParent.playerData.loc; StarryboundServer.logDebug("ClientContext", "[" + this.mParent.playerData.client + "] CurLoc:[" + this.mParent.playerData.loc.ToString() + "][" + this.mParent.playerData.inPlayerShip + "]"); StarryboundServer.logDebug("ClientContext", "[" + this.mParent.playerData.client + "] CurHome:[" + this.mParent.playerData.home.ToString() + "]"); } } } } } } catch (Exception e) { StarryboundServer.logException("[" + this.mParent.playerData.client + "] Failed to parse ClientContextUpdate from Server: " + e.Message); } } } #endregion } #if DEBUG if(packetID != Packet.Heartbeat) { //if (ms.Position != ms.Length) //StarryboundServer.logDebug("ForwardThread", "[" + this.mParent.playerData.client + "] [" + this.mDirection.ToString() + "][" + packetID + "] failed parse (" + ms.Position + " != " + ms.Length + ")"); //StarryboundServer.logDebug("ForwardThread", "[" + this.mParent.playerData.client + "] [" + this.mDirection.ToString() + "][" + packetID + "] Dumping " + ms.Length + " bytes: " + Utils.ByteArrayToString(ms.ToArray())); } #endif //Check return data if (returnData is Boolean) { if ((Boolean)returnData == false) continue; } else if (returnData is int) { if ((int)returnData == -1) { this.mParent.forceDisconnect("Command processor requested to drop client"); } } #region Forward Packet //Write data to dest this.mOutput.WriteVarUInt32((uint)packetID); if (compressed) { this.mOutput.WriteVarInt32(-packetSize); this.mOutput.Write(dataBuffer, 0, packetSize); } else { this.mOutput.WriteVarInt32(packetSize); this.mOutput.Write(dataBuffer, 0, packetSize); } this.mOutput.Flush(); #endregion //If disconnect was forwarded to client, lets disconnect. if(packetID == Packet.ServerDisconnect && mDirection == Direction.Server) { this.mParent.forceDisconnect(); } } } catch (EndOfStreamException) { this.mParent.forceDisconnect(); } catch (Exception e) { this.mParent.errorDisconnect(mDirection, "ForwardThread Exception: " + e.ToString()); } }
public void run() { try { this.cIn = new BinaryReader(this.cSocket.GetStream()); this.cOut = new BinaryWriter(this.cSocket.GetStream()); IPEndPoint ipep = (IPEndPoint)this.cSocket.Client.RemoteEndPoint; IPAddress ipa = ipep.Address; this.playerData.ip = ipep.Address.ToString(); StarryboundServer.logInfo("[" + playerData.client + "] Accepting new connection."); sSocket = new TcpClient(); sSocket.Connect(IPAddress.Loopback, StarryboundServer.config.serverPort); this.sIn = new BinaryReader(this.sSocket.GetStream()); this.sOut = new BinaryWriter(this.sSocket.GetStream()); if (!sSocket.Connected) { MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteBE(StarryboundServer.ProtocolVersion); this.sendClientPacket(Packet.ProtocolVersion, packet.ToArray()); rejectPreConnected("Starrybound server was unable to connect to the parent server."); return; } // Forwarding for data from SERVER (sIn) to CLIENT (cOut) new Thread(new ThreadStart(new ForwardThread(this, this.sIn, this.cOut, Direction.Server).run)).Start(); // Forwarding for data from CLIENT (cIn) to SERVER (sOut) new Thread(new ThreadStart(new ForwardThread(this, this.cIn, this.sOut, Direction.Client).run)).Start(); } catch (Exception e) { MemoryStream packet = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packet); packetWrite.WriteBE(StarryboundServer.ProtocolVersion); this.sendClientPacket(Packet.ProtocolVersion, packet.ToArray()); rejectPreConnected("Starrybound server was unable to connect to the parent server."); StarryboundServer.logException("ClientThread Exception: " + e.Message); } }
public override bool doProcess(string[] args) { if (!hasPermission()) { permissionError(); return false; } string player = string.Join(" ", args).Trim(); uint warp; if (player == null || player.Length < 1) { this.client.sendCommandMessage("Teleporting to your ship."); player = ""; warp = (uint)WarpType.WarpToOwnShip; } else { if (!hasPermission(true)) { permissionError(2); return false; } Client target = StarryboundServer.getClient(player); if (target != null) { PlayerData targetPlayer = target.playerData; if (!this.player.canAccessShip(targetPlayer)) { this.client.sendCommandMessage("You cannot access this player's ship due to their ship's access settings."); return false; } this.client.sendCommandMessage("Teleporting to " + player + " ship!"); warp = (uint)WarpType.WarpToPlayerShip; } else { this.client.sendCommandMessage("Player '" + player + "' not found."); return false; } } MemoryStream packetWarp = new MemoryStream(); BinaryWriter packetWrite = new BinaryWriter(packetWarp); packetWrite.WriteBE(warp); packetWrite.Write(new WorldCoordinate()); packetWrite.WriteStarString(player); client.sendServerPacket(Packet.WarpCommand, packetWarp.ToArray()); return true; }
public override void Write(System.IO.BinaryWriter Writer, ConstantPool Pool) { base.Write(Writer, Pool); Writer.WriteBE(Pool.AddConstant(new Java.Constants.Utf8(Class))); }
public override void Write(System.IO.BinaryWriter Writer, ConstantPool Pool) { base.Write(Writer, Pool); Writer.WriteBE(Pool.AddConstant(new Java.Constants.Integer(Value))); }