Exemple #1
0
 /// <summary>
 /// Gets called before the login request packet is sent. Use this opportunity to modify the packet or add additional parameters to the packet.
 /// </summary>
 /// <param name="req"></param>
 protected virtual void OnBeforeLoginRequest(PacketLoginRequest req)
 {
     if (BeforeLoginRequest != null)
     {
         BeforeLoginRequest(req);
     }
 }
Exemple #2
0
 /// <summary>
 /// Gets called when the login attempt from the cluster server has resolved.  Return false from this method to prevent login.
 /// Be sure to call base.OnClusterServerLoginResolved to register necessary packet handler
 /// </summary>
 protected override bool OnClusterServerLoginResolved(PacketLoginRequest login, bool result)
 {
     if (base.OnClusterServerLoginResolved(login, result))
     {
     }
     return(result);
 }
Exemple #3
0
 /// <summary>
 /// Gets called when the player login/transfer request has been resolved - i.e. the player connected and gave us login credentials.  Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved
 /// if you override this method so that all necessary packet handlers can be registered.
 /// </summary>
 protected virtual bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg)
 {
     if (result)
     {
     }
     return(result);
 }
Exemple #4
0
        private void OnLineSecured(INetworkConnection con, Packet p)
        {
            PacketLineSecured msg = p as PacketLineSecured;

            Log.LogMsg("Got Rijndael reply. Verifying key...");
            // Server got our encrypted Rijndael key.  Make sure it's all good still.
            if (m_ConnectionKey.Equals(CryptoManager.RijDecrypt(msg.Key, m_ConnectionKey)) && msg.ReplyCode == ReplyType.OK)
            {
                KillConnection("Failed to secure the connection.  Closing socket. " + msg.ReplyMessage);
                return;
            }
            Log.LogMsg("Line secured. Sending login request.");

            // FireLineSecuredEvent
            FireSocketSecured(this, EventArgs.Empty);

            // Send the login request, encrypting our user name and password
            PacketLoginRequest plr = (PacketLoginRequest)CreatePacket((int)PacketType.LoginRequest, 0, true, true);

            plr.AccountName         = m_AccountName;
            plr.Password            = m_Password;
            plr.IsNewAccount        = IsNewAccount;
            plr.LoginConnectionType = m_ConnectionType;
            OnBeforeLoginRequest(plr);
            Send(plr);
        }
Exemple #5
0
 private void FireOnBeforeLoginRequest(INetworkConnection con, PacketLoginRequest login)
 {
     if (BeforeLoginRequestInvoker != null)
     {
         BeforeLoginRequestInvoker(con, login);
     }
 }
 /// <summary>
 /// Gets called when the player login/transfer request has been resolved - i.e. the player connected and gave us login credentials.  Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved 
 /// if you override this method so that all necessary packet handlers can be registered.
 /// </summary>
 protected virtual bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg)
 {
     if (result)
     {
     }
     return result;
 }
Exemple #7
0
        /// <summary>
        /// Gets called when a player sends a login request ticket.
        /// </summary>
        private void OnPlayerLoginRequest(INetworkConnection con, Packet msg)
        {
            try
            {
                string             loginMsg           = "";
                PacketLoginRequest packetLoginRequest = msg as PacketLoginRequest;
                msg.NeedsReply = false; // handle sending ourselves because we dont want OnConnectionReady to fire before the player gets the login result.

                ServerUser su = null;
                su = ConnectionManager.GetAuthorizedUser(packetLoginRequest.AccountName, MyServer, packetLoginRequest.LoginConnectionType);;

                PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                if (su == null || su.AuthTicket.ToString() != packetLoginRequest.Password)
                {
                    OnPlayerLoginResolved(packetLoginRequest, false, ref loginMsg);
                    lrf.IsCritical   = true;
                    lrf.ReplyCode    = ReplyType.Failure;
                    lrf.ReplyMessage = "Account credentials refused by server! " + loginMsg;
                    msg.ReplyPacket  = lrf;
                    return;
                }

                lrf.ReplyCode    = ReplyType.OK;
                lrf.ReplyMessage = su.AccountName + ", ready to play!";
                lrf.Parms.SetProperty("ServerName", 1, MyServer.ServerName);
                msg.ReplyPacket = lrf;

                ServerUser.CurrentCharacter = su.CurrentCharacter;
                su.MyConnection             = this;
                ServerUser.MyConnection     = null;
                this.ServerUser             = su;

                if (!OnPlayerLoginResolved(packetLoginRequest, true, ref loginMsg))
                {
                    lrf.ReplyCode    = ReplyType.Failure;
                    lrf.IsCritical   = true;
                    lrf.ReplyMessage = "Login Failed! " + loginMsg;
                    return;
                }

                Log1.Logger("Server.Inbound.Login").Info(packetLoginRequest.AccountName + ": " + lrf.ReplyMessage);

                lrf.Parms.SetProperty(-1, ServerUser.Profile.UserRoles);
                lrf.Parms.SetProperty(-2, ServerUser.Profile.MaxCharacters);
                msg.NeedsReply = false; // don't want to fire OnConnectionReady before the client gets the login reply
                Send(lrf);              // " "

                OnConnectionReady();
            }
            catch (Exception e)
            {
                Log1.Logger("Server.Inbound.Login").Error("InboundPlayerConnection::OnPlayerLoginRequest failed. ", e);
                PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                lrf.ReplyCode    = ReplyType.Failure;
                lrf.IsCritical   = true;
                lrf.ReplyMessage = "Login Failed! " + e.Message;
                msg.ReplyPacket  = lrf;
            }
        }
        /// <summary>
        /// Gets called when the central server login request gets resolved.  Return false from this method to prevent the login.
        /// Be sure to call base.OnCentralServerLoginResolved to ensure that all necessary packet handlers get registered.
        /// </summary>
        protected override bool OnClusterServerLoginResolved(PacketLoginRequest login, bool result)
        {
            if (base.OnClusterServerLoginResolved(login, result))
            {

            }
            return result;
        }
 /// <summary>
 /// Gets called when the login attempt from the cluster server has resolved.  Return false from this method to prevent login.
 /// Be sure to call base.OnClusterServerLoginResolved to register necessary packet handler
 /// </summary>
 protected virtual bool OnClusterServerLoginResolved(PacketLoginRequest login, bool authenticationResult)
 {
     if (authenticationResult)
     {
         RegisterPacketHandler((int)ServerPacketType.RequestPlayerHandoff, OnPlayerHandoffRequest);
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.CharacterTransferComplete, OnCharacterHandoffComplete);
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.CharacterDisconnected, OnRemoteCharacterDisconnected);
     }
     return(authenticationResult);
 }
Exemple #10
0
        private void DoLocalLogin(INetworkConnection con, Packet pMsg)
        {
            bool authd = IsLocalConnection();

            try
            {
                PacketLoginRequest p = pMsg as PacketLoginRequest;
                ServerUser.AccountName = p.AccountName;
                Log1.Logger("Zeus").Info("Local user " + Environment.UserName + " is attempting login...");

                bool hasAccountAccess = authd;

                if (!hasAccountAccess)
                {
                    PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                    lrf.IsCritical   = true; // this along with reply code failure forces D/C
                    lrf.ReplyCode    = ReplyType.Failure;
                    lrf.ReplyMessage = string.Format(p.AccountName + " failed to authenticate local IP address.");
                    pMsg.ReplyPacket = lrf;

                    Log1.Logger("Zeus").Info(lrf.ReplyMessage);
                    return;
                }

                PacketLoginResult result = CreateLoginResultPacket();
                if (result.ReplyCode == ReplyType.OK)
                {
                    ServerUser.AuthTicket      = Guid.NewGuid();
                    ServerUser.IsAuthenticated = true;
                    MembershipUser mu = Membership.GetUser(p.AccountName, true);
                    if (mu != null)
                    {
                        ServerUser.ID = (Guid)mu.ProviderUserKey;
                    }
                    else if (authd)
                    {
                        ServerUser.ID = Guid.NewGuid();
                    }

                    ConnectionManager.AuthorizeUser(ServerUser, false);
                    ServerUser.Profile.UserRoles = new string[] { "Administrator" };
                    result.Parms.SetProperty(-1, ServerUser.Profile.UserRoles);
                    result.Parms.SetProperty(-2, ServerUser.Profile.MaxCharacters);
                    LoggedInAndReady();
                }

                pMsg.ReplyPacket = result;
                Log1.Logger("Zeus").Info("Zeus client *" + Environment.UserName + "* authentication: " + result.ReplyCode.ToString() + ". " + result.ReplyMessage);
            }
            catch (Exception e)
            {
                Log1.Logger("Zeus").Error("Exception thrown whilst player attempted login. " + e.Message, e);
                KillConnection("Error logging in.");
            }
        }
 /// <summary>
 /// Gets called when the login request has been resolved.  Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved
 /// if you override this method.
 /// </summary>
 /// <param name="login"></param>
 /// <param name="result"></param>
 protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg)
 {
     if (base.OnPlayerLoginResolved(login, result, ref msg))
     {
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestSelectCharacter, OnCharacterSelectRequest);
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestDeleteCharacter, OnCharacterDeleteRequest);
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestCreateCharacter, OnCharacterCreateRequest);
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestCharacterListing, OnCharacterListingRequest);
     }
     return(result);
 }
 /// <summary>
 /// Gets called when the player login/transfer request has been resolved - i.e. the player connected and gave us login credentials.  Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved 
 /// if you override this method so that all necessary packet handlers can be registered.
 /// </summary>
 protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg)
 {
     if (base.OnPlayerLoginResolved(login, result, ref msg))
     {
         if (ServerUser.CurrentCharacter != null)
         {
             CharacterCache.CacheCharacter(ServerUser.CurrentCharacter, MyServer.ServerUserID, TimeSpan.FromMinutes(60));
         }
     }
     return result;
 }
 /// <summary>
 /// Gets called when the player login/transfer request has been resolved - i.e. the player connected and gave us login credentials.  Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved
 /// if you override this method so that all necessary packet handlers can be registered.
 /// </summary>
 protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg)
 {
     if (base.OnPlayerLoginResolved(login, result, ref msg))
     {
         if (ServerUser.CurrentCharacter != null)
         {
             CharacterCache.CacheCharacter(ServerUser.CurrentCharacter, MyServer.ServerUserID, TimeSpan.FromMinutes(60));
         }
     }
     return(result);
 }
        protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg)
        {
            // register packet handlers if we're logged in, i.e. authenticated - so that we will start listening for those packets.
            if (result && base.OnPlayerLoginResolved(login, result, ref msg))
            {
                RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.CreateGame, OnCreateNewGame);
                RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.JoinGame, OnPlayerJoinGame);
                RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestGameListing, OnGameListingRequest);
                RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestQuickMatch, OnQuickMatchRequest);
            }

            return(result);
        }
        /// <summary>
        /// Gets called when a parent server is requesting to be connected with this server.
        /// There is no account in the accounts DB for the parent servers... there is only a shared secret which is shared among all servers in the clusters.
        /// The shared secret is defined in the App.Config.
        /// </summary>
        private void OnClusterServerLoginRequest(INetworkConnection con, Packet msg)
        {
            PacketLoginRequest p = msg as PacketLoginRequest;

            m_ServerUser.AccountName = p.AccountName;

            // send login result
            PacketLoginResult lr = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);

            //lr.ReplyMessage = ServerBase.ServerName;
            lr.Parms.SetProperty(1, MyServer.ServerName);
            lr.ReplyCode = (p.Password.ToUpper() == SharedSecretWithClusterServers.ToString().ToUpper()) ? ReplyType.OK : ReplyType.Failure;
            if (lr.ReplyCode == ReplyType.Failure)
            {
                lr.ReplyMessage = "Bad credentials.";
            }

            if (!OnClusterServerLoginResolved(p, lr.ReplyCode == ReplyType.OK))
            {
                lr.ReplyCode = ReplyType.Failure;
            }

            if (lr.ReplyCode == ReplyType.OK)
            {
                lr.Parms.SetProperty((int)PropertyID.Name, MyServer.ServerUserID);
                m_ServerUser.AccountName = p.AccountName;
                m_ServerUser.IsAuthorizedClusterServer = true;
                m_ServerUser.RenewAuthorizationTicket(); // make sure we dont time out
            }

            msg.ReplyPacket = lr;

            if (lr.ReplyCode != ReplyType.OK)
            {
                lr.IsCritical = true;
                Log1.Logger("Server.Inbound.Login").Info("Failed authentication for " + p.AccountName + ", using password *" + p.Password + "* . Killing connection.");
                return;
            }

            RegisterPacketHandler((int)PacketType.Null, OnPing);

            ConnectionManager.AddParentConnection(this, m_ServerUser);
            OnParentConnectionSet();
            OnConnectionReady();
        }
Exemple #16
0
        private void DoNoAuthLogin(INetworkConnection con, Packet pMsg)
        {
            try
            {
                PacketLoginRequest p = pMsg as PacketLoginRequest;
                ServerUser.AccountName  = Guid.NewGuid().ToString(); // assign random session name
                ServerUser.OwningServer = MyServer.ServerUserID;
                Log1.Logger("LoginServer.Inbound.Login").Info("No-auth assigned user name " + ServerUser.AccountName + " from " + RemoteIP + " is attempting login...");
                Log1.Logger("LoginServer.UserIPMap").Info("User [" + p.AccountName + "] from [" + RemoteIP + "] is attempting login.");
                string msg = "";

                if (!HaveServersForService())
                {
                    PacketLoginResult ns = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                    ns.ReplyMessage  = "No servers available for service.\r\n\r\nTry again later.";
                    ns.IsCritical    = true;
                    ns.ReplyCode     = ReplyType.Failure;
                    pMsg.ReplyPacket = ns;
                    return;
                }

                PacketLoginResult result = CreateLoginResultPacket();
                if (result.ReplyCode == ReplyType.OK)
                {
                    ServerUser.AuthTicket      = Guid.NewGuid();
                    ServerUser.IsAuthenticated = true;
                    ServerUser.ID = Guid.NewGuid(); // generate random ID for this session

                    RegisterPacketHandler((int)PacketType.RequestHandoffToServer, OnClusterHandoffRequest);
                    ServerUser.Profile.UserRoles = new string[0];
                    result.Parms.SetProperty("AccountName", ServerUser.AccountName);
                    result.Parms.SetProperty(-1, ServerUser.Profile.UserRoles);
                    result.Parms.SetProperty(-2, ServerUser.Profile.MaxCharacters);
                    ConnectionManager.AuthorizeUser(ServerUser);
                }
                pMsg.ReplyPacket = result;
                Log1.Logger("LoginServer.Inbound.Login").Info("Game client *" + ServerUser.AccountName + "* authentication: " + result.ReplyCode.ToString() + ". " + result.ReplyMessage);
            }
            catch (Exception e)
            {
                Log1.Logger("LoginServer.Inbound.Login").Error("Exception thrown whilst player attempted login. " + e.Message, e);
                KillConnection("Error logging in.");
            }
        }
Exemple #17
0
 protected virtual void OnBeforeLoginServerLoginRequest(PacketLoginRequest req)
 {
 }
Exemple #18
0
 protected override void OnBeforeLoginRequest(PacketLoginRequest req)
 {
     // Add our game creation/join parms to the login packet.
     base.OnBeforeLoginRequest(req);
     FireOnBeforeLoginRequest(this, req);
 }
Exemple #19
0
 void OnGameServer_OnBeforeLoginRequest(INetworkConnection con, PacketLoginRequest login)
 {
     Log.LogMsg("Appending target game options [" + TargetGameOptions.PropertyCount.ToString() + " properties] to login request. Login parms count before append is [" + login.Parms.PropertyCount.ToString() + "].");
     login.Parms.UpdateWithValues(TargetGameOptions);
     Log.LogMsg("Login parms count after append is [" + login.Parms.PropertyCount.ToString() + "].");
 }
Exemple #20
0
        /// <summary>
        /// Begin an asynchronous connection attempt
        /// </summary>
        /// <param name="serverAddress">the address of the target server.</param>
        /// <param name="port">the port of the target server</param>
        /// <param name="username">the username with which to authenticate, if any</param>
        /// <param name="password">the password with which to authenticate, if any</param>
        /// <param name="listenForUDP">If this connection object should listen for UDP traffic (all connections can already send UDP data). On a server, this property should be false as servers make use of a global UDP listener.  On a client, this property should be true. This parameter is ignored on Silverlight.</param>
        public void BeginConnect(string serverAddress, int port, string username, string password, PacketLoginRequest.ConnectionType connectionType)
        {
            if (IsAlive || ConnectionInProgress || ConnectionWasInitiated)
            {
                return;
            }

            if (username == null)
            {
                username = "";
            }
            if (password == null)
            {
                password = "";
            }

            m_ConnectionType = connectionType;

            Log.LogMsg("Connecting to " + serverAddress + ":" + port.ToString() + " as " + username);
            m_ConnectionWasInitiated = true;
            m_ConnectionInProgress = true;
            AccountName = username;
            Password = password;
            m_ServerAddress = serverAddress;
            m_Port = port;

            try
            {
                MyTCPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                SocketAsyncEventArgs arg = CreateNewSaeaForConnect();
                DnsEndPoint dne = new DnsEndPoint(serverAddress, m_Port);
                arg.RemoteEndPoint = dne;

                arg.UserToken = MyTCPSocket;
                bool willRaiseEvent = MyTCPSocket.ConnectAsync(arg);
                if (!willRaiseEvent)
                {
                    OnConnectEvent_Completed(this, arg);
                }
            }
            catch (Exception e)
            {
                FireConnectedEvent(false, "Unable to resolve server IPAddress. " + e.Message);
                return;
            }
        }
Exemple #21
0
        /// <summary>
        /// Begin an asynchronous connection attempt
        /// </summary>
        /// <param name="serverAddress">the address of the target server.</param>
        /// <param name="port">the port of the target server</param>
        /// <param name="username">the username with which to authenticate, if any</param>
        /// <param name="password">the password with which to authenticate, if any</param>        
        public void BeginConnect(string serverAddress, int port, string username, string password, PacketLoginRequest.ConnectionType connectionType)
        {
            if (IsAlive || ConnectionInProgress || ConnectionWasInitiated)
            {
                return;
            }

            if (username == null)
            {
                username = "";
            }

            if (password == null)
            {
                password = "";
            }

            m_ConnectionType = connectionType;

            Log.LogMsg("Connecting to " + serverAddress + ":" + port.ToString() + " as " + username);
            m_ConnectionWasInitiated = true;
            m_ConnectionInProgress = true;
            AccountName = username;
            Password = password;
            m_ServerAddress = serverAddress;
            m_Port = port;

            Log.LogMsg("Resolving host [" + serverAddress + "]");
            Dns.BeginGetHostAddresses(serverAddress, new AsyncCallback(OnHostResolve), null);
        }
Exemple #22
0
 /// <summary>
 /// Gets called before the login request packet is sent. Use this opportunity to modify the packet or add additional parameters to the packet.
 /// </summary>
 /// <param name="req"></param>
 protected virtual void OnBeforeLoginRequest(PacketLoginRequest req)
 {
     if (BeforeLoginRequest != null)
     {
         BeforeLoginRequest(req);
     }
 }
Exemple #23
0
 void OnGameServer_OnBeforeLoginRequest(INetworkConnection con, PacketLoginRequest login)
 {
     Log.LogMsg("Appending target game options [" + TargetGameOptions.PropertyCount.ToString() + " properties] to login request. Login parms count before append is [" + login.Parms.PropertyCount.ToString() + "].");
     login.Parms.UpdateWithValues(TargetGameOptions);
     Log.LogMsg("Login parms count after append is [" + login.Parms.PropertyCount.ToString() + "].");
 }
Exemple #24
0
        private void DoDatabaseLogin(INetworkConnection con, Packet pMsg)
        {
            try
            {
                PacketLoginRequest p = pMsg as PacketLoginRequest;
                ServerUser.AccountName  = p.AccountName;
                ServerUser.OwningServer = MyServer.ServerUserID;
                Log1.Logger("LoginServer.Inbound.Login").Info("User " + p.AccountName + " from " + RemoteIP + " is attempting login...");
                Log1.Logger("LoginServer.UserIPMap").Info("User [" + p.AccountName + "] from [" + RemoteIP + "] is attempting login.");

                if (!HaveServersForService())
                {
                    PacketLoginResult ns = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                    ns.ReplyMessage  = "No servers available for service.\r\n\r\nTry again later.";
                    ns.IsCritical    = true;
                    ns.ReplyCode     = ReplyType.Failure;
                    pMsg.ReplyPacket = ns;
                    return;
                }

                string msg = "";
                if (p.IsNewAccount && (!LoginServer.AllowNewAccountsOnTheFly || !CanCreateNewAccount(pMsg, ref msg) || !CreateNewAccount(p.AccountName, p.Password, p.AccountName, ref msg)))
                {
                    if (!LoginServer.AllowNewAccountsOnTheFly)
                    {
                        Log1.Logger("LoginServer.Inboud.Login").Warn("Login packet specified new account request flag but server config disallows this. Check 'AllowNewAccountsOnTheFly' in the config file. Default setting is FALSE.");
                    }
                    PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                    lrf.IsCritical   = true; // this along with reply code failure forces D/C
                    lrf.ReplyCode    = ReplyType.Failure;
                    lrf.ReplyMessage = msg;
                    pMsg.ReplyPacket = lrf;

                    Log1.Logger("LoginServer.Inbound.Login").Info(p.AccountName + " failed to create new account. " + lrf.ReplyMessage);
                    return;
                }

                bool hasAccountAccess = Membership.ValidateUser(p.AccountName, p.Password);

                if (!hasAccountAccess)
                {
                    PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                    lrf.IsCritical   = true; // this along with reply code failure forces D/C
                    lrf.ReplyCode    = ReplyType.Failure;
                    lrf.ReplyMessage = string.Format(p.AccountName + " authentication Failed. No account matching these credentials was found. Goodbye.");
                    pMsg.ReplyPacket = lrf;

                    Log1.Logger("LoginServer.Inbound.Login").Info(lrf.ReplyMessage);
                    return;
                }

                ServerUser.Profile.Load(MyServer.RequireAuthentication);

                foreach (AccountProfile.Session s in ServerUser.Profile.AllSessions)
                {
                    System.Diagnostics.Debug.WriteLine(ServerUser.AccountName + ": " + s.LoginUTC.ToLongTimeString() + " to " + s.LogoutUTC.ToLongTimeString() + " (duration " + s.Duration.TotalMinutes + " mins). From " + s.IP);
                }

                ServerUser.Profile.Save(MyServer.RequireAuthentication);

                // check if suspension needs to be lifted
                DateTime suspensionRelease = ServerUser.Profile.AddedProperties.GetDateTimeProperty("SuspensionRelease").GetValueOrDefault(DateTime.MinValue);
                bool     isSuspended       = false;
                if (suspensionRelease != DateTime.MinValue)
                {
                    isSuspended = true;
                    // currently suspended.  need to lift suspension?
                    if (suspensionRelease >= DateTime.UtcNow)
                    {
                        DB.Instance.User_Unsuspend(ServerUser.ID, "System", suspensionRelease, "Suspension expired.  Time served.", -1);
                        isSuspended = false;
                    }
                }

                if (isSuspended)
                {
                    PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                    lrf.IsCritical   = true; // this along with reply code failure forces D/C
                    lrf.ReplyCode    = ReplyType.Failure;
                    lrf.ReplyMessage = "[" + p.AccountName + "] is currently suspended until " + suspensionRelease.ToString("g") + " UTC. Please log in to this account through our website for details. Goodbye.";
                    pMsg.ReplyPacket = lrf;

                    Log1.Logger("LoginServer.Inbound.Login").Info(lrf.ReplyMessage);
                    return;
                }

                bool accountIsActive = ServerUser.Profile.IsUserInRole("ActiveUser");
                if (!accountIsActive)
                {
                    PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                    lrf.IsCritical   = true; // this along with reply code failure forces D/C
                    lrf.ReplyCode    = ReplyType.Failure;
                    lrf.ReplyMessage = p.AccountName + " this account is currently not active.  Please log in to this account through our website for details. Goodbye.";
                    pMsg.ReplyPacket = lrf;

                    Log1.Logger("LoginServer.Inbound.Login").Info(lrf.ReplyMessage);
                    return;
                }

                PacketLoginResult result = CreateLoginResultPacket();
                if (result.ReplyCode == ReplyType.OK)
                {
                    ServerUser.AuthTicket      = Guid.NewGuid();
                    ServerUser.IsAuthenticated = true;
                    ServerUser.ID = (Guid)Membership.GetUser(p.AccountName).ProviderUserKey;

                    RegisterPacketHandler((int)PacketType.RequestHandoffToServer, OnClusterHandoffRequest);

                    // load the user profile and add it to the packet.
                    result.Parms.SetProperty(-1, ServerUser.Profile.UserRoles);
                    result.Parms.SetProperty(-2, ServerUser.Profile.MaxCharacters);
                    ConnectionManager.AuthorizeUser(ServerUser);
                }

                pMsg.ReplyPacket = result;



                Log1.Logger("LoginServer.Inbound.Login").Info("Game client *" + ServerUser.AccountName + "* authentication: " + result.ReplyCode.ToString() + ". " + result.ReplyMessage);
            }
            catch (Exception e)
            {
                Log1.Logger("LoginServer.Inbound.Login").Error("Exception thrown whilst player attempted login. " + e.Message, e);
                KillConnection("Error logging in.");
            }
        }
        protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg)
        {
            ///.............
            if (!base.OnPlayerLoginResolved(login, result, ref msg))
            {
                return result;
            }

            if(ServerUser.CurrentCharacter == null)
            {
                msg = "Can't join or create games without an active character.";
                return false;
            }

            Guid gameId = Guid.Empty;
            GameServerGame sg = null;
            PacketMatchNotification note = (PacketMatchNotification)CreatePacket((int)LobbyPacketType.MatchNotification, 0, false, false);

            // Requesting to join as observer?
            bool observeOnly = login.Parms.GetBoolProperty("Observe").GetValueOrDefault(false);

            if (login.Parms.GetBoolProperty("IsNewGame").GetValueOrDefault(false))
            {
                Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] logging in with NEW GAME request.");
                note.Kind = MatchNotificationType.MatchCreated;
                note.NeedsReply = false;
                note.ReplyCode = ReplyType.Failure;

                // new game. create it.
                Game g = new Game();
                g.Name = login.Parms.GetStringProperty((int)PropertyID.Name);
                g.MaxPlayers = login.Parms.GetIntProperty((int)PropertyID.MaxPlayers).GetValueOrDefault(1);
                g.MaxObservers = login.Parms.GetIntProperty((int)PropertyID.MaxObservers).GetValueOrDefault(0);
                g.Owner = ServerUser.CurrentCharacter.ID;

                // Create the actual game object, specific to the game type we are serving.
                sg = OnCreateNewGameServerGame(g);
                //sg = null;

                if (sg != null)
                {
                    // Track the new game object on this server
                    if (!GameManager.Instance.CreateNewGame(sg, true))
                    {
                        msg = "Failed to create game on server.  Internal server error.";
                        note.ReplyMessage = msg;
                        Send(note);
                        TransferToLobbyOrDisconnect();
                        return true;
                    }

                    // Report the new game in the database
                    if (!DB.Instance.Lobby_TrackGameForServer(MyServer.ServerUserID, sg, DateTime.UtcNow, ServerUser))
                    {
                        msg = "Failed to register the game in the database.  Internal server error.";
                        note.ReplyMessage = msg;
                        Send(note);
                        TransferToLobbyOrDisconnect();
                        return true;
                    }

                    // Update player counts for this server, based on the expected player count for the new game.
                    if (DB.Instance.Server_Register(MyServer.ServerUserID, MyServer.ServerAddress, MyServer.ListenOnPort, DateTime.UtcNow, "content", ConnectionManager.PaddedConnectionCount, MyServer.MaxConnections))
                    {
                        note.ReplyCode = ReplyType.OK;
                    }
                    else
                    {
                        DB.Instance.Lobby_UntrackGameForServer(sg.GameID);
                        note.ReplyMessage = "Failed to register game with master game listing. Internal server error.";
                        Send(note);
                        TransferToLobbyOrDisconnect();
                        return true;
                    }
                }
                else
                {
                    msg = "Unable to create game at this time.";
                    Log1.Logger("Server").Debug("Failed to create NEW GAME for player [" + ServerUser.AccountName + "].");
                    login.ReplyPacket.Parms.SetProperty("CreateReply", msg);
                    note.ReplyMessage = msg;
                    Send(note);
                    TransferToLobbyOrDisconnect();
                    return true;
                }

            }
            else // it's a join - get game reference from existing games table
            {
                Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] logging in with request to JOIN EXISTING game. [Observe = " + observeOnly.ToString() + "]");
                note = (PacketMatchNotification)CreatePacket((int)LobbyPacketType.MatchNotification, 0, false, false);

                if (observeOnly)
                {
                    note.Kind = MatchNotificationType.ObserverAdded;
                }
                else
                {
                    note.Kind = MatchNotificationType.PlayerAdded;
                }

                note.TargetPlayer = ServerUser.CurrentCharacter.CharacterInfo;
                note.ReplyCode = ReplyType.Failure;

                Guid targetGame = login.Parms.GetGuidProperty((int)PropertyID.GameId);
                if (targetGame == Guid.Empty)
                {
                    msg = "Failed to join game. No target game specified.";
                    Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to JOIN EXISTING game.  No target game specified in join request.");
                    note.ReplyMessage = msg;
                    Send(note);
                    TransferToLobbyOrDisconnect();
                    return true;
                }

                if (!GameManager.Instance.GetGame(targetGame, out sg))
                {
                    Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to JOIN EXISTING game.  Target game specified does not currently exist.");
                    msg = "Failed to join game. Target game [" + targetGame.ToString() + "] does not currently exist on [" + MyServer.ServerUserID + "].";
                    note.ReplyMessage = msg;
                    Send(note);
                    TransferToLobbyOrDisconnect();
                    return true;
                }
            }

            if (sg == null)
            {
                Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to locate game. Internal Server Error.");
                msg = "Unable to locate game. Internal Server Error."; // should never happen
                note.ReplyMessage = msg;
                Send(note);
                TransferToLobbyOrDisconnect();
                return true;
            }

            // join game as player or observer
            if (!observeOnly && sg.AddPlayer(ServerUser.CurrentCharacter, ref msg))
            {
                login.ReplyPacket.Parms.SetProperty("TargetGame", (ISerializableWispObject)sg.Game);
                RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestStartGame, OnRequestStartGame);
            }
            else if (observeOnly && sg.AddObserver(ServerUser.CurrentCharacter, ref msg))
            {
                login.ReplyPacket.Parms.SetProperty("TargetGame", (ISerializableWispObject)sg.Game);
            }
            else
            {
                msg = "Unable to join game.";
                note.ReplyMessage = msg;
                Send(note);
                TransferToLobbyOrDisconnect();
                return true;
            }

            RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.LeaveGame, OnPlayerLeaveGame);
            return result;
        }
 protected override void OnBeforeLoginRequest(PacketLoginRequest req)
 {
     // Add our game creation/join parms to the login packet.
     base.OnBeforeLoginRequest(req);
     FireOnBeforeLoginRequest(this, req);
 }
Exemple #27
0
 void OnLoginServer_BeforeLoginRequest(PacketLoginRequest req)
 {
     OnBeforeLoginServerLoginRequest(req);
 }
 /// <summary>
 /// Gets called when the login request has been resolved.  Return false to prevent login. Don't forget to call base.OnPlayerLoginResolved 
 /// if you override this method.
 /// </summary>
 /// <param name="login"></param>
 /// <param name="result"></param>
 protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg)
 {
     if (base.OnPlayerLoginResolved(login, result, ref msg))
     {
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestSelectCharacter, OnCharacterSelectRequest);
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestDeleteCharacter, OnCharacterDeleteRequest);
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestCreateCharacter, OnCharacterCreateRequest);
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.RequestCharacterListing, OnCharacterListingRequest);
     }
     return result;
 }
Exemple #29
0
    /// <summary>
    /// Connect to a sub-server in the target cluster.  Connection info (address, port, auth ticket) comes from the central server.
    /// </summary>
    /// <returns>true, if the attempt kicked off successfully</returns>
    protected bool ConnectToGameServer(string serverName, string serverIP, int serverPort, Guid targetResource, Guid authTicket, PropertyBag parms, bool isBlocking, PacketLoginRequest.ConnectionType connectionType)
    {
        SetupGameServerConnection(isBlocking);
        m_GameServer.AuthTicket = User.AuthTicket = authTicket;
        #if SILVERLIGHT
        m_GameServer.BeginConnect(serverIP, serverPort, User.AccountName, authTicket.ToString(), connectionType);
        #else
        m_GameServer.BeginConnect(serverIP, serverPort, User.AccountName, authTicket.ToString(), connectionType);
        #endif

        Client.ConnectionPhase = ClientConnectionPhase.WorldServerInitiatedConnection;
        return true;
    }
Exemple #30
0
        /// <summary>
        /// User requests login to the system.  This method attempts to authenticate the player (or create a new account, depending on method parms)
        /// </summary>
        public void DoDatabaseLogin(INetworkConnection con, Packet pMsg)
        {
            PacketLoginRequest p = pMsg as PacketLoginRequest;

            ServerUser.AccountName = p.AccountName;
            Log1.Logger("Zeus").Info("User " + p.AccountName + " from " + RemoteIP + " is attempting login...");

            string msg = "";

#if DEBUG
            DateTime start = DateTime.Now;
#endif
            bool isLocal          = IsLocalConnection();
            bool hasAccountAccess = isLocal || Membership.ValidateUser(p.AccountName, p.Password);


#if DEBUG
            DateTime end = DateTime.Now;
            TimeSpan len = end - start;
            Log1.Logger("Zeus").Debug("DB call to validate user took " + len.TotalSeconds.ToString() + " seconds.");
#endif

            if (!hasAccountAccess)
            {
                PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                lrf.IsCritical   = true; // this along with reply code failure forces D/C
                lrf.ReplyCode    = ReplyType.Failure;
                lrf.ReplyMessage = string.Format("Authentication Failed. No account matching these credentials was found. Goodbye.");
                pMsg.ReplyPacket = lrf;

                Log1.Logger("Zeus").Info(p.AccountName + ": " + lrf.ReplyMessage);
                return;
            }

            MembershipUser usr = Membership.GetUser(p.AccountName, true);
            if (usr == null && isLocal)
            {
                usr = new MembershipUser("CustomizedMembershipProvider", Environment.MachineName + "\\" + Environment.UserName, Guid.NewGuid(), "", "", "", true, false, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.MinValue);
            }

            ServerUser.ID = (Guid)usr.ProviderUserKey;
            // Cache this user's profile data
            ServerUser.Profile.Load(MyServer.RequireAuthentication);

            if (isLocal)
            {
                ServerUser.Profile.UserRoles = new string[] { "Administrator" };
            }

            // check if suspension needs to be lifted
            DateTime suspensionRelease = ServerUser.Profile.AddedProperties.GetDateTimeProperty("SuspensionRelease").GetValueOrDefault(DateTime.MinValue);
            bool     isSuspended       = false;
            if (suspensionRelease != DateTime.MinValue)
            {
                isSuspended = true;
                // currently suspended.  need to lift suspension?
                if (suspensionRelease < DateTime.UtcNow)
                {
                    DB.Instance.User_Unsuspend(ServerUser.ID, "System", suspensionRelease, "Suspension expired.  Time served.", -1);
                    isSuspended = false;
                }
            }

            if (isSuspended && !ServerUser.Profile.IsUserInRole("Administrator"))
            {
                PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                lrf.IsCritical   = true; // this along with reply code failure forces D/C
                lrf.ReplyCode    = ReplyType.Failure;
                lrf.ReplyMessage = "[" + p.AccountName + "] is currently suspended until " + suspensionRelease.ToString("g") + " UTC. Access to Zeus is denied.";
                pMsg.ReplyPacket = lrf;

                Log1.Logger("LoginServer.Inbound.Login").Info(lrf.ReplyMessage);
                return;
            }

            bool accountIsActive = isLocal || ServerUser.Profile.IsUserInRole("ActiveCustomerService");
            if (!accountIsActive)
            {
                PacketLoginResult lrf = (PacketLoginResult)CreatePacket((int)PacketType.LoginResult, 0, true, true);
                lrf.IsCritical   = true; // this along with reply code failure forces D/C
                lrf.ReplyCode    = ReplyType.Failure;
                lrf.ReplyMessage = "Authentication Failed. This account does not have the proper credential to connect. Goodbye.";
                pMsg.ReplyPacket = lrf;

                Log1.Logger("Zeus.Inbound.Client.Login").Info(p.AccountName + ": " + lrf.ReplyMessage);
                return;
            }

            PacketLoginResult result = CreateLoginResultPacket();
            if (result.ReplyCode == ReplyType.OK)
            {
                ServerUser.AuthTicket      = Guid.NewGuid();
                ServerUser.IsAuthenticated = true;
                ServerUser.ID = (Guid)usr.ProviderUserKey;

                ConnectionManager.AuthorizeUser(ServerUser, false);
                result.Parms.SetProperty(-1, ServerUser.Profile.UserRoles);
                result.Parms.SetProperty(-2, ServerUser.Profile.MaxCharacters);
                result.Parms.SetProperty((int)PropertyID.Name, MyServer.ServerUserID);
                LoggedInAndReady();
            }
            pMsg.ReplyPacket = result;

            Log1.Logger("Zeus").Info("Zeus client *" + ServerUser.AccountName + "* authentication: " + result.ReplyCode.ToString() + ". " + result.ReplyMessage);
        }
 protected void FireBeforeLoginRequest(PacketLoginRequest req)
 {
     if (BeforeLoginRequestInvoker != null)
     {
         BeforeLoginRequestInvoker(req);
     }
 }
Exemple #32
0
        /// <summary>
        /// Returns the authorized user object, or null if the user isn't currently authorized
        /// </summary>
        /// <param name="account"></param>
        /// <returns></returns>
        public static ServerUser GetAuthorizedUser(string account, ServerBase server, PacketLoginRequest.ConnectionType conType)
        {
            ServerUser u = null;

            if (conType == PacketLoginRequest.ConnectionType.AssistedTransfer)
            {
                lock (m_AuthorizedAccountsSyncRoot)
                {
                    AuthorizedAccounts.TryGetValue(account.ToLower(), out u);
                }
            }

            else if (conType == PacketLoginRequest.ConnectionType.UnassistedTransfer)
            {
                Guid ticket = Guid.Empty;
                string authServer = "";
                DateTime whenAuthd = DateTime.MinValue;
                int character = -1;
                string targetServerID = "";
                Guid accountID = Guid.Empty;
                if (!DB.Instance.User_GetAuthorizationTicket(account, out authServer, out ticket, out whenAuthd, out character, out targetServerID, out accountID) || ticket == Guid.Empty)
                {
                    return null;
                }

                if (targetServerID != server.ServerUserID)
                {
                    // we weren't authorized to be on this server.
                    Log1.Logger(server.ServerUserID).Error("[" + account + "] attempted unassisted transfer to [" + server.ServerUserID + "], but that user was only authorized to transfer to target server ID [" + targetServerID+ "]. Connection denied.");
                    return null;
                }

                if (whenAuthd + AuthTicketLifetime < DateTime.UtcNow)
                {
                    // ticket expired.
                    Log1.Logger(server.ServerUserID).Error("[" + account + "] attempted unassisted transfer to [" + server.ServerUserID + "], but that user's auth ticket is expired. Connection denied.");
                    return null;
                }

                // Got a ticket.  Load up the user from the DB.
                u = new ServerUser();

                u.OwningServer = server.ServerUserID;
                u.AuthTicket = ticket;
                u.ID = accountID;
                u.AccountName = account;

                // load the profile
                AccountProfile ap = new AccountProfile(account);
                u.Profile = ap;
                ap.Load(server.RequireAuthentication);

                // load the character
                if (character > -1)
                {
                    string msg = "";
                    u.CurrentCharacter = CharacterUtil.Instance.LoadCharacter(u, character, ref msg);
                    if (u.CurrentCharacter == null)
                    {
                        // Couldn't load character.
                        Log1.Logger(server.ServerUserID).Error("[" + account + "] attempted unassisted transfer with characer [" + character + "], but that character could not be loaded from the DB: [" + msg + "]. Connection denied.");
                        return null;
                    }
                    u.CurrentCharacter.OwningAccount = u;
                    CharacterCache.CacheCharacter(u.CurrentCharacter, server.ServerUserID);
                }
            }

            AuthorizeUser(u); // gotta call this to activate/renew the auth ticket on this server.
            return u;
        }
 /// <summary>
 /// Gets called before the login request packet is sent. Use this opportunity to modify the packet or add additional parameters to the packet.
 /// </summary>
 /// <param name="req"></param>
 protected virtual void OnBeforeLoginRequest(PacketLoginRequest req)
 {
     FireBeforeLoginRequest(req);
 }
        protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg)
        {
            // register packet handlers if we're logged in, i.e. authenticated - so that we will start listening for those packets.
            if (result && base.OnPlayerLoginResolved(login, result, ref msg))
            {
                RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.CreateGame, OnCreateNewGame);
                RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.JoinGame, OnPlayerJoinGame);
                RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestGameListing, OnGameListingRequest);
                RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestQuickMatch, OnQuickMatchRequest);
            }

            return result;
        }
Exemple #35
0
        protected override bool OnPlayerLoginResolved(PacketLoginRequest login, bool result, ref string msg)
        {
            ///.............
            if (!base.OnPlayerLoginResolved(login, result, ref msg))
            {
                return(result);
            }

            if (ServerUser.CurrentCharacter == null)
            {
                msg = "Can't join or create games without an active character.";
                return(false);
            }

            Guid                    gameId = Guid.Empty;
            GameServerGame          sg     = null;
            PacketMatchNotification note   = (PacketMatchNotification)CreatePacket((int)LobbyPacketType.MatchNotification, 0, false, false);

            // Requesting to join as observer?
            bool observeOnly = login.Parms.GetBoolProperty("Observe").GetValueOrDefault(false);

            if (login.Parms.GetBoolProperty("IsNewGame").GetValueOrDefault(false))
            {
                Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] logging in with NEW GAME request.");
                note.Kind       = MatchNotificationType.MatchCreated;
                note.NeedsReply = false;
                note.ReplyCode  = ReplyType.Failure;

                // new game. create it.
                Game g = new Game();
                g.Name         = login.Parms.GetStringProperty((int)PropertyID.Name);
                g.MaxPlayers   = login.Parms.GetIntProperty((int)PropertyID.MaxPlayers).GetValueOrDefault(1);
                g.MaxObservers = login.Parms.GetIntProperty((int)PropertyID.MaxObservers).GetValueOrDefault(0);
                g.Owner        = ServerUser.CurrentCharacter.ID;

                // Create the actual game object, specific to the game type we are serving.
                sg = OnCreateNewGameServerGame(g);
                //sg = null;

                if (sg != null)
                {
                    // Track the new game object on this server
                    if (!GameManager.Instance.CreateNewGame(sg, true))
                    {
                        msg = "Failed to create game on server.  Internal server error.";
                        note.ReplyMessage = msg;
                        Send(note);
                        TransferToLobbyOrDisconnect();
                        return(true);
                    }

                    // Report the new game in the database
                    if (!DB.Instance.Lobby_TrackGameForServer(MyServer.ServerUserID, sg, DateTime.UtcNow, ServerUser))
                    {
                        msg = "Failed to register the game in the database.  Internal server error.";
                        note.ReplyMessage = msg;
                        Send(note);
                        TransferToLobbyOrDisconnect();
                        return(true);
                    }

                    // Update player counts for this server, based on the expected player count for the new game.
                    if (DB.Instance.Server_Register(MyServer.ServerUserID, MyServer.ServerAddress, MyServer.ListenOnPort, DateTime.UtcNow, "content", ConnectionManager.PaddedConnectionCount, MyServer.MaxConnections))
                    {
                        note.ReplyCode = ReplyType.OK;
                    }
                    else
                    {
                        DB.Instance.Lobby_UntrackGameForServer(sg.GameID);
                        note.ReplyMessage = "Failed to register game with master game listing. Internal server error.";
                        Send(note);
                        TransferToLobbyOrDisconnect();
                        return(true);
                    }
                }
                else
                {
                    msg = "Unable to create game at this time.";
                    Log1.Logger("Server").Debug("Failed to create NEW GAME for player [" + ServerUser.AccountName + "].");
                    login.ReplyPacket.Parms.SetProperty("CreateReply", msg);
                    note.ReplyMessage = msg;
                    Send(note);
                    TransferToLobbyOrDisconnect();
                    return(true);
                }
            }
            else // it's a join - get game reference from existing games table
            {
                Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] logging in with request to JOIN EXISTING game. [Observe = " + observeOnly.ToString() + "]");
                note = (PacketMatchNotification)CreatePacket((int)LobbyPacketType.MatchNotification, 0, false, false);

                if (observeOnly)
                {
                    note.Kind = MatchNotificationType.ObserverAdded;
                }
                else
                {
                    note.Kind = MatchNotificationType.PlayerAdded;
                }

                note.TargetPlayer = ServerUser.CurrentCharacter.CharacterInfo;
                note.ReplyCode    = ReplyType.Failure;

                Guid targetGame = login.Parms.GetGuidProperty((int)PropertyID.GameId);
                if (targetGame == Guid.Empty)
                {
                    msg = "Failed to join game. No target game specified.";
                    Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to JOIN EXISTING game.  No target game specified in join request.");
                    note.ReplyMessage = msg;
                    Send(note);
                    TransferToLobbyOrDisconnect();
                    return(true);
                }

                if (!GameManager.Instance.GetGame(targetGame, out sg))
                {
                    Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to JOIN EXISTING game.  Target game specified does not currently exist.");
                    msg = "Failed to join game. Target game [" + targetGame.ToString() + "] does not currently exist on [" + MyServer.ServerUserID + "].";
                    note.ReplyMessage = msg;
                    Send(note);
                    TransferToLobbyOrDisconnect();
                    return(true);
                }
            }

            if (sg == null)
            {
                Log1.Logger("Server").Debug("Player [" + ServerUser.AccountName + "] failed to locate game. Internal Server Error.");
                msg = "Unable to locate game. Internal Server Error."; // should never happen
                note.ReplyMessage = msg;
                Send(note);
                TransferToLobbyOrDisconnect();
                return(true);
            }

            // join game as player or observer
            if (!observeOnly && sg.AddPlayer(ServerUser.CurrentCharacter, ref msg))
            {
                login.ReplyPacket.Parms.SetProperty("TargetGame", (ISerializableWispObject)sg.Game);
                RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.RequestStartGame, OnRequestStartGame);
            }
            else if (observeOnly && sg.AddObserver(ServerUser.CurrentCharacter, ref msg))
            {
                login.ReplyPacket.Parms.SetProperty("TargetGame", (ISerializableWispObject)sg.Game);
            }
            else
            {
                msg = "Unable to join game.";
                note.ReplyMessage = msg;
                Send(note);
                TransferToLobbyOrDisconnect();
                return(true);
            }

            RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericLobbyMessageType.LeaveGame, OnPlayerLeaveGame);
            return(result);
        }
 private void FireOnBeforeLoginRequest(INetworkConnection con, PacketLoginRequest login)
 {
     if (BeforeLoginRequestInvoker != null)
     {
         BeforeLoginRequestInvoker(con, login);
     }
 }
 /// <summary>
 /// Gets called when the login attempt from the cluster server has resolved.  Return false from this method to prevent login.
 /// Be sure to call base.OnClusterServerLoginResolved to register necessary packet handler
 /// </summary>
 protected virtual bool OnClusterServerLoginResolved(PacketLoginRequest login, bool authenticationResult)
 {
     if (authenticationResult)
     {
         RegisterPacketHandler((int)ServerPacketType.RequestPlayerHandoff, OnPlayerHandoffRequest);
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.CharacterTransferComplete, OnCharacterHandoffComplete);
         RegisterPacketHandler((int)PacketType.PacketGenericMessage, (int)GenericMessageType.CharacterDisconnected, OnRemoteCharacterDisconnected);
     }
     return authenticationResult;
 }