public static void HandleFlagSync(ClientObject client, byte[] messageData) { string flagPath = Path.Combine(Server.universeDirectory, "Flags"); using (MessageReader mr = new MessageReader(messageData)) { FlagMessageType messageType = (FlagMessageType)mr.Read <int>(); string playerName = mr.Read <string>(); if (playerName != client.playerName) { Messages.ConnectionEnd.SendConnectionEnd(client, "Kicked for sending a flag for another player"); return; } switch (messageType) { case FlagMessageType.LIST: { //Send the list back List <string> serverFlagFileNames = new List <string>(); List <string> serverFlagOwners = new List <string>(); List <string> serverFlagShaSums = new List <string>(); string[] clientFlags = mr.Read <string[]>(); string[] clientFlagShas = mr.Read <string[]>(); string[] serverFlags = Directory.GetFiles(flagPath, "*", SearchOption.AllDirectories); foreach (string serverFlag in serverFlags) { string trimmedName = Path.GetFileName(serverFlag); string flagOwnerPath = Path.GetDirectoryName(serverFlag); string flagOwner = flagOwnerPath.Substring(Path.GetDirectoryName(flagOwnerPath).Length + 1); bool isMatched = false; bool shaDifferent = false; for (int i = 0; i < clientFlags.Length; i++) { if (clientFlags[i].ToLower() == trimmedName.ToLower()) { isMatched = true; shaDifferent = (Common.CalculateSHA256Hash(serverFlag) != clientFlagShas[i]); } } if (!isMatched || shaDifferent) { if (flagOwner == client.playerName) { DarkLog.Debug("Deleting flag " + trimmedName); File.Delete(serverFlag); ServerMessage newMessage = new ServerMessage(); newMessage.type = ServerMessageType.FLAG_SYNC; using (MessageWriter mw = new MessageWriter()) { mw.Write <int>((int)FlagMessageType.DELETE_FILE); mw.Write <string>(trimmedName); newMessage.data = mw.GetMessageBytes(); ClientHandler.SendToAll(client, newMessage, false); } if (Directory.GetFiles(flagOwnerPath).Length == 0) { Directory.Delete(flagOwnerPath); } } else { DarkLog.Debug("Sending flag " + serverFlag + " from " + flagOwner + " to " + client.playerName); ServerMessage newMessage = new ServerMessage(); newMessage.type = ServerMessageType.FLAG_SYNC; using (MessageWriter mw = new MessageWriter()) { mw.Write <int>((int)FlagMessageType.FLAG_DATA); mw.Write <string>(flagOwner); mw.Write <string>(trimmedName); mw.Write <byte[]>(File.ReadAllBytes(serverFlag)); newMessage.data = mw.GetMessageBytes(); ClientHandler.SendToClient(client, newMessage, false); } } } //Don't tell the client we have a different copy of the flag so it is reuploaded if (File.Exists(serverFlag)) { serverFlagFileNames.Add(trimmedName); serverFlagOwners.Add(flagOwner); serverFlagShaSums.Add(Common.CalculateSHA256Hash(serverFlag)); } } ServerMessage listMessage = new ServerMessage(); listMessage.type = ServerMessageType.FLAG_SYNC; using (MessageWriter mw2 = new MessageWriter()) { mw2.Write <int>((int)FlagMessageType.LIST); mw2.Write <string[]>(serverFlagFileNames.ToArray()); mw2.Write <string[]>(serverFlagOwners.ToArray()); mw2.Write <string[]>(serverFlagShaSums.ToArray()); listMessage.data = mw2.GetMessageBytes(); } ClientHandler.SendToClient(client, listMessage, false); } break; case FlagMessageType.DELETE_FILE: { string flagName = mr.Read <string>(); string playerFlagPath = Path.Combine(flagPath, client.playerName); if (Directory.Exists(playerFlagPath)) { string flagFile = Path.Combine(playerFlagPath, flagName); if (File.Exists(flagFile)) { File.Delete(flagFile); } if (Directory.GetFiles(playerFlagPath).Length == 0) { Directory.Delete(playerFlagPath); } } ServerMessage newMessage = new ServerMessage(); newMessage.type = ServerMessageType.FLAG_SYNC; using (MessageWriter mw = new MessageWriter()) { mw.Write <int>((int)FlagMessageType.DELETE_FILE); mw.Write <string>(flagName); newMessage.data = mw.GetMessageBytes(); } ClientHandler.SendToAll(client, newMessage, false); } break; case FlagMessageType.UPLOAD_FILE: { string flagName = mr.Read <string>(); byte[] flagData = mr.Read <byte[]>(); string playerFlagPath = Path.Combine(flagPath, client.playerName); if (!Directory.Exists(playerFlagPath)) { Directory.CreateDirectory(playerFlagPath); } DarkLog.Debug("Saving flag " + flagName + " from " + client.playerName); File.WriteAllBytes(Path.Combine(playerFlagPath, flagName), flagData); ServerMessage newMessage = new ServerMessage(); newMessage.type = ServerMessageType.FLAG_SYNC; using (MessageWriter mw = new MessageWriter()) { mw.Write <int>((int)FlagMessageType.FLAG_DATA); mw.Write <string>(client.playerName); mw.Write <string>(flagName); mw.Write <byte[]>(flagData); } ClientHandler.SendToAll(client, newMessage, false); } break; } } }
public void HandleMessage(byte[] messageData) { using (MessageReader mr = new MessageReader(messageData, false)) { FlagMessageType messageType = (FlagMessageType)mr.Read <int>(); switch (messageType) { case FlagMessageType.LIST: { //List code string[] serverFlagFiles = mr.Read <string[]>(); string[] serverFlagOwners = mr.Read <string[]>(); string[] serverFlagShaSums = mr.Read <string[]>(); for (int i = 0; i < serverFlagFiles.Length; i++) { FlagInfo fi = new FlagInfo(); fi.owner = serverFlagOwners[i]; fi.shaSum = serverFlagShaSums[i]; serverFlags[Path.GetFileNameWithoutExtension(serverFlagFiles[i])] = fi; } syncComplete = true; //Check if we need to upload the flag flagChangeEvent = true; } break; case FlagMessageType.FLAG_DATA: { FlagRespondMessage frm = new FlagRespondMessage(); frm.flagInfo.owner = mr.Read <string>(); frm.flagName = mr.Read <string>(); frm.flagData = mr.Read <byte[]>(); frm.flagInfo.shaSum = Common.CalculateSHA256Hash(frm.flagData); newFlags.Enqueue(frm); } break; case FlagMessageType.DELETE_FILE: { string flagName = mr.Read <string>(); string flagFile = Path.Combine(flagPath, flagName); if (File.Exists(flagFile)) { try { if (File.Exists(flagFile)) { DarkLog.Debug("Deleting flag " + flagFile); File.Delete(flagFile); } } catch (Exception e) { DarkLog.Debug("Error deleting flag " + flagFile + ", exception: " + e); } } } break; } } }