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; }
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; }
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; }
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(); }
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(); }
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; }
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; }
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; }