protected override void Process(Entities.Server s)
        {
            uint ErrorCode = GetuInt(0);

            if (ErrorCode == 1)
            {
                string globalKey  = GetString(1);
                string serverName = GetString(2);
                string ipAddress  = GetString(3);
                int    port       = GetInt(4);
                byte   type       = GetByte(5);

                Core.Enums.ServerTypes enumType = Core.Enums.ServerTypes.Normal;
                if (System.Enum.IsDefined(typeof(Core.Enums.ServerTypes), type))
                {
                    enumType = (Core.Enums.ServerTypes)type;
                }
                else
                {
                    s.Disconnect(); return;
                }

                byte serverId = Managers.ServerManager.Instance.Add(s, serverName, ipAddress, port, enumType);
                if (serverId > 0)
                {
                    s.Send(new Packets.Internal.Authorize(serverId));
                    ServerLogger.Instance.Append(ServerLogger.AlertLevel.Information, "Authorized a new server as " + serverId.ToString());
                }
                else
                {
                    s.Send(new Packets.Internal.Authorize(Core.Enums.Internal.AuthorizationErrorCodes.MaxServersReached));
                    s.Disconnect();
                    ServerLogger.Instance.Append(ServerLogger.AlertLevel.ServerError, "Rejecting Server " + s.Displayname + ". Limit reached");
                }
            }
            else
            {
                s.Disconnect();
            }
        }
        protected override void Process(Entities.Server s)
        {
            ushort errorCode = GetUShort(0);

            if (Enum.IsDefined(typeof(Core.Networking.ErrorCodes), errorCode))
            {
                Core.Networking.ErrorCodes enumErrorCode = (Core.Networking.ErrorCodes)errorCode;
                uint   targetId    = GetuInt(1);
                string username    = GetString(3);
                byte   accessLevel = GetByte(4);
                switch (enumErrorCode)
                {
                // A new player logs in.
                //Raptor 1/6/18: Added more checks just in case someone managed to perform a MiM while another player is choosing server.
                //That would lead to a registered, not active session which could be stolen if targetId is known

                case Core.Networking.ErrorCodes.Success:
                {
                    Session session = Managers.SessionManager.Instance.Get(targetId);
                    if (session != null)
                    {
                        if (!session.IsActivated && session.Name == username && (byte)session.AccessLevel == accessLevel)
                        {
                            session.Activate((byte)s.ID);
                            s.Send(new Packets.Internal.PlayerAuthentication(session));
                        }
                        else
                        {
                            s.Send(new Packets.Internal.PlayerAuthentication(Core.Networking.ErrorCodes.EntityAlreadyAuthorized, targetId));
                        }
                    }
                    else
                    {
                        s.Send(new Packets.Internal.PlayerAuthentication(Core.Networking.ErrorCodes.InvalidKeyOrSession, targetId));
                    }

                    break;
                }

                // Update the information of a player.
                //TODO: DARK INVESTIGATE THIS
                case Core.Networking.ErrorCodes.Update:
                {
                    Session session = Managers.SessionManager.Instance.Get(targetId);
                    if (session != null)
                    {
                    }
                    else
                    {
                        // Force a closure of the connection.
                        s.Send(new Packets.Internal.PlayerAuthentication(Core.Networking.ErrorCodes.InvalidKeyOrSession, targetId));
                    }

                    break;
                }

                // A player logs out of the server.
                case Core.Networking.ErrorCodes.EndConnection:
                {
                    Session session = Managers.SessionManager.Instance.Get(targetId);
                    if (session != null)
                    {
                        if (session.IsActivated)
                        {
                            session.End();
                        }
                    }
                    break;
                }

                default:
                {
                    // Unused.
                    break;
                }
                }
            }
            else
            {
                Console.WriteLine(string.Concat("Unknown PlayerAuthorization error: ", errorCode));
            }
        }
Esempio n. 3
0
        protected override void Process(Entities.Server s)
        {
            uint ErrorCode = GetuInt(0);

            if (ErrorCode == Core.Networking.Constants.ERROR_OK)
            {
                string globalKey  = GetString(1);
                string serverName = GetString(2);
                string ipAddress  = GetString(3);
                int    port       = GetInt(4);
                byte   type       = GetByte(5);

                if (globalKey == Config.GAMESERVERKEY) //attempt to match server keys
                {
                    Core.GameConstants.ServerTypes serverType;

                    //check for an existing server type.
                    if (System.Enum.IsDefined(typeof(Core.GameConstants.ServerTypes), type))
                    {
                        serverType = (Core.GameConstants.ServerTypes)type;

                        //check if name is already in use, reject server if affirmative
                        foreach (Entities.Server authorizedServer in Managers.ServerManager.Instance.GetAllAuthorized())
                        {
                            //Already authorized?
                            if (authorizedServer.IP == ipAddress)
                            {
                                s.Send(new Packets.Internal.Authorize(Core.Networking.ErrorCodes.EntityAlreadyAuthorized));
                                Log.Information("Rejected server " + serverName + " . Server already authorized");
                                s.Disconnect();
                                return;
                            }

                            if (authorizedServer.ServerName == serverName)
                            {
                                s.Send(new Packets.Internal.Authorize(Core.Networking.ErrorCodes.ServerNameInUse));
                                Log.Information("Rejected server " + serverName + " . Name already in use");
                                s.Disconnect();
                                return;
                            }
                        }

                        byte serverId = Managers.ServerManager.Instance.Add(s, serverName, ipAddress, port, serverType);

                        if (serverId > 0)
                        {
                            s.Send(new Packets.Internal.Authorize(serverId));
                            Log.Information("New server registered as: " + serverName);
                        }
                        else
                        {
                            s.Send(new Packets.Internal.Authorize(Core.Networking.ErrorCodes.ServerLimitReached));
                            s.Disconnect();
                        }
                    }
                    else
                    {
                        s.Send(new Packets.Internal.Authorize(Core.Networking.ErrorCodes.InvalidServerType));
                        s.Disconnect();
                    }
                }
                else
                {
                    s.Send(new Packets.Internal.Authorize(Core.Networking.ErrorCodes.InvalidKeyOrSession));
                    Log.Information("Rejecting server " + serverName + ": invalid key");
                    s.Disconnect();
                }
            }
            else
            {
                s.Disconnect();
            }
        }
Esempio n. 4
0
        protected override void Process(Entities.Server s)
        {
            ushort errorCode = GetUShort(0);

            if (Enum.IsDefined(typeof(PlayerAuthorizationErrorCodes), errorCode))
            {
                PlayerAuthorizationErrorCodes enumErrorCode = (PlayerAuthorizationErrorCodes)errorCode;
                uint   targetId    = GetuInt(1);
                string username    = GetString(3);
                byte   accessLevel = GetByte(4);
                switch (enumErrorCode)
                {
                // A new player logs in.
                //Raptor 1/6/18: Added more checks just in case someone managed to perform a MiM while another player is choosing server.
                //That would lead to a registered, not active session which could be stolen if targetId is known
                case PlayerAuthorizationErrorCodes.Login: {
                    Session session = Managers.SessionManager.Instance.Get(targetId);
                    if (session != null)
                    {
                        if (!session.IsActivated && session.Name == username && session.AccessLevel == accessLevel)
                        {
                            session.Activate((byte)s.ID);
                            s.Send(new Packets.Internal.PlayerAuthorization(session));
                            ServerLogger.Instance.Append(ServerLogger.AlertLevel.Information, "Player with ID " + targetId.ToString() + " has been authorized");
                        }
                        else
                        {
                            s.Send(new Packets.Internal.PlayerAuthorization(PlayerAuthorizationErrorCodes.SessionAlreadyActivated, targetId));
                            ServerLogger.Instance.Append(ServerLogger.AlertLevel.ServerError, "Player with ID " + targetId.ToString() + " was not authorized because the session is already active");
                        }
                    }
                    else
                    {
                        s.Send(new Packets.Internal.PlayerAuthorization(PlayerAuthorizationErrorCodes.InvalidSession, targetId));
                        ServerLogger.Instance.Append(ServerLogger.AlertLevel.ServerError, "Player with ID " + targetId.ToString() + "rejected because the session is NOT valid");
                    }

                    break;
                }

                // Update the information of a player.
                //TODO: DARK INVESTIGATE THIS
                case PlayerAuthorizationErrorCodes.Update: {
                    Session session = Managers.SessionManager.Instance.Get(targetId);
                    if (session != null)
                    {
                        /* Packet Structure v2
                         *
                         * Connection Time
                         * Ping
                         *
                         * [Sub Type]
                         *  - 1 - Update Channel
                         *  - 2 - Update Session Information
                         *  - 3 - Update Action
                         *  - 4 - Update Lobby Room information
                         *  - 5 - Update Ingame Room information
                         *
                         * [Data Blocks]
                         *  - [1] - Update Channel
                         *      - Current channel Id
                         *      - Channel Slot
                         *
                         *  - [2] - Update Session Information
                         *      - Session - Kills
                         *      - Session - Deaths
                         *      - Session - Xp Earned
                         *      - Session - Dinar Earned
                         *      - Session - Dinar Spend
                         *
                         *  - [3] - Update Action
                         *      - Update Type:
                         *
                         *          [1]: Join Room
                         *               - Room ID
                         *               - Room Slot
                         *               - Room Is Master
                         *
                         *          [2]: Leave Room
                         *              - Room ID
                         *              - Room Old Slot
                         *              - Room Was Master?
                         *                  - New master slot
                         *
                         *          [3]: Room Start
                         *              - Team
                         *
                         *          [4]: Room Stop
                         *              - Kills
                         *              - Deaths
                         *              - Flags
                         *              - Points
                         *              - Xp Earned
                         *              - Dinar Earned
                         *              - xp Bonusses (%-Name:%-Name)
                         *              - dinar bonusses (%-Name:%-Name)
                         *
                         *  - [4] - Update Lobby Room information
                         *      - Update Type:
                         *
                         *          [1]: Switch Side
                         *               - Room ID
                         *               - Room Slot
                         *               - Room Is Master
                         *
                         *          [2]:
                         *
                         *  - [5] - Update Ingame Room information
                         *      - Update Type:
                         *
                         *          [1]: Score Update (Player Kill/Player Death)
                         *               - Room ID
                         *               - Room Kills
                         *               - Room Deaths
                         *               - Room Flags
                         *               - Room Points
                         *
                         *          [2]:
                         */
                    }
                    else
                    {
                        // Force a closure of the connection.
                        s.Send(new Packets.Internal.PlayerAuthorization(PlayerAuthorizationErrorCodes.InvalidSession, targetId));
                    }

                    break;
                }

                // A player logs out of the server.
                case PlayerAuthorizationErrorCodes.Logout: {
                    Session session = Managers.SessionManager.Instance.Get(targetId);
                    if (session != null)
                    {
                        if (session.IsActivated)
                        {
                            session.End();
                            ServerLogger.Instance.Append(ServerLogger.AlertLevel.Information, "Player with ID " + targetId.ToString() + " has logged out");
                        }
                    }
                    break;
                }

                default: {
                    // Unused.
                    break;
                }
                }
            }
            else
            {
                Console.WriteLine(string.Concat("Unknown PlayerAuthorization error: ", errorCode));
            }
        }