Exemple #1
0
        private static void AccountSelectCallback(Account account, Session session)
        {
            log.DebugFormat("ConnectRequest TS: {0}", session.Network.ConnectionData.ServerTime);
            var connectRequest = new PacketOutboundConnectRequest(session.Network.ConnectionData.ServerTime, 0, session.Network.ClientId, ISAAC.ServerSeed, ISAAC.ClientSeed);

            session.Network.EnqueueSend(connectRequest);

            if (account == null)
            {
                session.SendCharacterError(CharacterError.AccountDoesntExist);
                return;
            }

            if (WorldManager.Find(account.Name) != null)
            {
                var foundSession = WorldManager.Find(account.Name);

                if (foundSession.State == SessionState.AuthConnected)
                {
                    session.SendCharacterError(CharacterError.AccountInUse);
                }
                return;
            }

            /*if (glsTicket != digest)
             * {
             * }*/

            // TODO: check for account bans

            session.SetAccount(account.AccountId, account.Name, account.AccessLevel);
            session.State = SessionState.AuthConnectResponse;
        }
Exemple #2
0
        private static void AccountSelectCallback(Account account, Session session)
        {
            var connectResponse = new PacketOutboundConnectRequest(ISAAC.ServerSeed, ISAAC.ClientSeed);

            session.Network.EnqueueSend(connectResponse);

            if (account == null)
            {
                session.SendCharacterError(CharacterError.AccountDoesntExist);
                return;
            }

            if (WorldManager.Find(account.Name) != null)
            {
                session.SendCharacterError(CharacterError.AccountInUse);
                return;
            }

            /*if (glsTicket != digest)
             * {
             * }*/

            /*if (WorldManager.ServerIsFull())
             * {
             *  session.SendCharacterError(CharacterError.LogonServerFull);
             *  return;
             * }*/

            // TODO: check for account bans

            session.SetAccount(account.AccountId, account.Name, account.AccessLevel);
            session.State = SessionState.AuthConnectResponse;
        }
Exemple #3
0
        private static void SubscriptionSelectCallback(Subscription subscription, Session session, string clientAccountString, string loggingIdentifier)
        {
            if (subscription == null)
            {
                log.Debug("subscription null in SubscriptionSelectCallback.");
                session.SendCharacterError(CharacterError.AccountDoesntExist);
                return;
            }

            var connectRequest = new PacketOutboundConnectRequest(session.Network.ConnectionData.ServerTime, 0, session.Network.ClientId, ISAAC.ServerSeed, ISAAC.ClientSeed);

            session.Network.EnqueueSend(connectRequest);

            if (WorldManager.Find(subscription.SubscriptionId) != null)
            {
                var foundSession = WorldManager.Find(subscription.SubscriptionId);
                log.Debug($"found session for {subscription.SubscriptionGuid}");

                if (foundSession.State == SessionState.AuthConnected)
                {
                    session.SendCharacterError(CharacterError.AccountInUse);
                }
                return;
            }

            session.SetSubscription(subscription, clientAccountString, loggingIdentifier);
            session.State = SessionState.AuthConnectResponse;
        }
Exemple #4
0
        public static void SendLoginRequestReject(Session session, CharacterError error)
        {
            // First we must send the connect request response
            var connectRequest = new PacketOutboundConnectRequest(
                Timers.PortalYearTicks,
                session.Network.ConnectionData.ConnectionCookie,
                session.Network.ClientId,
                session.Network.ConnectionData.ServerSeed,
                session.Network.ConnectionData.ClientSeed);

            session.Network.ConnectionData.DiscardSeeds();
            session.Network.EnqueueSend(connectRequest);

            // Then we send the error
            session.SendCharacterError(error);

            session.Network.Update();
        }
Exemple #5
0
        private static void SendLoginRequestReject(IPEndPoint endPoint, CharacterError error)
        {
            var tempSession = new Session(endPoint, (ushort)(sessionMap.Length + 1), ServerId);

            // First we must send the connect request response
            var connectRequest = new PacketOutboundConnectRequest(
                tempSession.Network.ConnectionData.ServerTime,
                tempSession.Network.ConnectionData.ConnectionCookie,
                tempSession.Network.ClientId,
                tempSession.Network.ConnectionData.ServerSeed,
                tempSession.Network.ConnectionData.ClientSeed);

            tempSession.Network.ConnectionData.DiscardSeeds();
            tempSession.Network.EnqueueSend(connectRequest);

            // Then we send the error
            tempSession.SendCharacterError(error);

            tempSession.Network.Update();
        }
Exemple #6
0
        public static void HandleWorldLoginRequest(ClientPacket packet, Session session)
        {
            PacketInboundWorldLoginRequest loginRequest = new PacketInboundWorldLoginRequest(packet);
            ulong connectionKey = loginRequest.ConnectionKey;

            if (session.WorldConnectionKey == 0)
            {
                session = WorldManager.Find(connectionKey);
            }

            if (connectionKey != session.WorldConnectionKey || connectionKey == 0)
            {
                session.SendCharacterError(CharacterError.EnterGamePlayerAccountMissing);
                return;
            }

            session.State = SessionState.WorldConnectResponse;

            PacketOutboundConnectRequest connectRequest = new PacketOutboundConnectRequest(ISAAC.WorldServerSeed, ISAAC.WorldClientSeed);

            session.WorldSession.EnqueueSend(connectRequest);
        }
        private static void AccountSelectCallback(Account account, Session session, PacketInboundLoginRequest loginRequest)
        {
            packetLog.DebugFormat("ConnectRequest TS: {0}", Timers.PortalYearTicks);

            if (session.Network.ConnectionData.ServerSeed == null || session.Network.ConnectionData.ClientSeed == null)
            {
                // these are null if ConnectionData.DiscardSeeds() is called because of some other error condition.
                session.Terminate(SessionTerminationReason.BadHandshake, new GameMessageCharacterError(CharacterError.ServerCrash1));
                return;
            }

            var connectRequest = new PacketOutboundConnectRequest(
                Timers.PortalYearTicks,
                session.Network.ConnectionData.ConnectionCookie,
                session.Network.ClientId,
                session.Network.ConnectionData.ServerSeed,
                session.Network.ConnectionData.ClientSeed);

            session.Network.ConnectionData.DiscardSeeds();

            session.Network.EnqueueSend(connectRequest);

            if (loginRequest.NetAuthType < NetAuthType.AccountPassword)
            {
                if (loginRequest.Account == "acservertracker:jj9h26hcsggc")
                {
                    //log.Info($"Incoming ping from a Thwarg-Launcher client... Sending Pong...");

                    session.Terminate(SessionTerminationReason.PongSentClosingConnection, new GameMessageCharacterError(CharacterError.ServerCrash1));

                    return;
                }

                if (WorldManager.WorldStatus == WorldManager.WorldStatusState.Open)
                {
                    log.Info($"client {loginRequest.Account} connected with no Password or GlsTicket included so booting");
                }
                else
                {
                    log.Debug($"client {loginRequest.Account} connected with no Password or GlsTicket included so booting");
                }

                session.Terminate(SessionTerminationReason.NotAuthorizedNoPasswordOrGlsTicketIncludedInLoginReq, new GameMessageCharacterError(CharacterError.AccountInvalid));

                return;
            }

            if (account == null)
            {
                session.Terminate(SessionTerminationReason.NotAuthorizedAccountNotFound, new GameMessageCharacterError(CharacterError.AccountDoesntExist));
                return;
            }

            if (!PropertyManager.GetBool("account_login_boots_in_use").Item)
            {
                if (NetworkManager.Find(account.AccountName) != null)
                {
                    session.Terminate(SessionTerminationReason.AccountInUse, new GameMessageCharacterError(CharacterError.Logon));
                    return;
                }
            }

            if (loginRequest.NetAuthType == NetAuthType.AccountPassword)
            {
                if (!account.PasswordMatches(loginRequest.Password))
                {
                    if (WorldManager.WorldStatus == WorldManager.WorldStatusState.Open)
                    {
                        log.Info($"client {loginRequest.Account} connected with non matching password so booting");
                    }
                    else
                    {
                        log.Debug($"client {loginRequest.Account} connected with non matching password so booting");
                    }

                    session.Terminate(SessionTerminationReason.NotAuthorizedPasswordMismatch, new GameMessageBootAccount(session, " because the password entered for this account was not correct."));

                    // TO-DO: temporary lockout of account preventing brute force password discovery
                    // exponential duration of lockout for targeted account

                    return;
                }

                if (PropertyManager.GetBool("account_login_boots_in_use").Item)
                {
                    var previouslyConnectedAccount = NetworkManager.Find(account.AccountName);

                    if (previouslyConnectedAccount != null)
                    {
                        previouslyConnectedAccount.Terminate(SessionTerminationReason.AccountLoggedIn, new GameMessageCharacterError(CharacterError.Logon));
                    }
                }

                if (WorldManager.WorldStatus == WorldManager.WorldStatusState.Open)
                {
                    log.Info($"client {loginRequest.Account} connected with verified password");
                }
                else
                {
                    log.Debug($"client {loginRequest.Account} connected with verified password");
                }
            }
            else if (loginRequest.NetAuthType == NetAuthType.GlsTicket)
            {
                if (WorldManager.WorldStatus == WorldManager.WorldStatusState.Open)
                {
                    log.Info($"client {loginRequest.Account} connected with GlsTicket which is not implemented yet so booting");
                }
                else
                {
                    log.Debug($"client {loginRequest.Account} connected with GlsTicket which is not implemented yet so booting");
                }

                session.Terminate(SessionTerminationReason.NotAuthorizedGlsTicketNotImplementedToProcLoginReq, new GameMessageCharacterError(CharacterError.AccountInvalid));

                return;
            }

            // TODO: check for account bans

            account.UpdateLastLogin(session.EndPoint.Address);

            session.SetAccount(account.AccountId, account.AccountName, (AccessLevel)account.AccessLevel);
            session.State = SessionState.AuthConnectResponse;
        }
Exemple #8
0
        private static void AccountSelectCallback(Account account, Session session, PacketInboundLoginRequest loginRequest)
        {
            packetLog.DebugFormat("ConnectRequest TS: {0}", session.Network.ConnectionData.ServerTime);
            var connectRequest = new PacketOutboundConnectRequest(session.Network.ConnectionData.ServerTime, 0, session.Network.ClientId, ISAAC.ServerSeed, ISAAC.ClientSeed);

            session.Network.EnqueueSend(connectRequest);

            if (loginRequest.NetAuthType < NetAuthType.AccountPassword)
            {
                log.Info($"client {loginRequest.Account} connected with no Password or GlsTicket included so booting");

                session.SendCharacterError(CharacterError.AccountInUse);
                session.State = SessionState.NetworkTimeout;

                return;
            }

            if (account == null)
            {
                session.SendCharacterError(CharacterError.AccountDoesntExist);
                session.State = SessionState.NetworkTimeout;
                return;
            }

            if (WorldManager.Find(account.AccountName) != null)
            {
                var foundSession = WorldManager.Find(account.AccountName);

                if (foundSession.State == SessionState.AuthConnected)
                {
                    session.SendCharacterError(CharacterError.AccountInUse);
                    session.State = SessionState.NetworkTimeout;
                }
                return;
            }

            if (loginRequest.NetAuthType == NetAuthType.AccountPassword)
            {
                if (!account.PasswordMatches(loginRequest.Password))
                {
                    log.Info($"client {loginRequest.Account} connected with non matching password does so booting");

                    session.SendCharacterError(CharacterError.AccountInUse);
                    session.State = SessionState.NetworkTimeout;

                    return;
                }

                log.Info($"client {loginRequest.Account} connected with verified password");
            }
            else if (loginRequest.NetAuthType == NetAuthType.GlsTicket)
            {
                log.Info($"client {loginRequest.Account} connected with GlsTicket which is not implemented yet so booting");

                session.SendCharacterError(CharacterError.AccountInUse);
                session.State = SessionState.NetworkTimeout;

                return;
            }

            // TODO: check for account bans

            session.SetAccount(account.AccountId, account.AccountName, (AccessLevel)account.AccessLevel);
            session.State = SessionState.AuthConnectResponse;
        }
Exemple #9
0
        private static void AccountSelectCallback(Account account, Session session, PacketInboundLoginRequest loginRequest)
        {
            packetLog.DebugFormat("ConnectRequest TS: {0}", session.Network.ConnectionData.ServerTime);

            var connectRequest = new PacketOutboundConnectRequest(
                session.Network.ConnectionData.ServerTime,
                session.Network.ConnectionData.ConnectionCookie,
                session.Network.ClientId,
                session.Network.ConnectionData.ServerSeed,
                session.Network.ConnectionData.ClientSeed);

            session.Network.ConnectionData.DiscardSeeds();

            session.Network.EnqueueSend(connectRequest);

            if (loginRequest.NetAuthType < NetAuthType.AccountPassword)
            {
                if (loginRequest.Account == "acservertracker:jj9h26hcsggc")
                {
                    log.Info($"Incoming ping from a Thwarg-Launcher client... Sending Pong...");

                    session.BootSession("Pong sent, closing connection.", new GameMessageCharacterError(CharacterError.Undefined));

                    return;
                }

                log.Info($"client {loginRequest.Account} connected with no Password or GlsTicket included so booting");

                session.BootSession("Not Authorized: No password or GlsTicket included in login request", new GameMessageCharacterError(CharacterError.AccountInUse));

                return;
            }

            if (account == null)
            {
                session.BootSession("Not Authorized: Account Not Found", new GameMessageCharacterError(CharacterError.AccountDoesntExist));
                return;
            }

            if (WorldManager.Find(account.AccountName) != null)
            {
                session.SendCharacterError(CharacterError.AccountInUse);
                session.BootSession("Account In Use: Found another session already logged in for this account.", new GameMessageCharacterError(CharacterError.AccountInUse));
                return;
            }

            if (loginRequest.NetAuthType == NetAuthType.AccountPassword)
            {
                if (!account.PasswordMatches(loginRequest.Password))
                {
                    log.Info($"client {loginRequest.Account} connected with non matching password does so booting");

                    session.BootSession("Not Authorized: Password does not match.", new GameMessageCharacterError(CharacterError.AccountInUse));

                    // TO-DO: temporary lockout of account preventing brute force password discovery
                    // exponential duration of lockout for targeted account

                    return;
                }

                log.Info($"client {loginRequest.Account} connected with verified password");
            }
            else if (loginRequest.NetAuthType == NetAuthType.GlsTicket)
            {
                log.Info($"client {loginRequest.Account} connected with GlsTicket which is not implemented yet so booting");

                session.SendCharacterError(CharacterError.AccountInUse);
                session.BootSession("Not Authorized: GlsTicket is not implemented to process login request", new GameMessageCharacterError(CharacterError.AccountInUse));

                return;
            }

            // TODO: check for account bans

            session.SetAccount(account.AccountId, account.AccountName, (AccessLevel)account.AccessLevel);
            session.State = SessionState.AuthConnectResponse;
        }