示例#1
0
        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;
                }
            }
        }
示例#2
0
        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;
                }
            }
        }