public static void HandleLoginStart(StsSession session, ClientLoginStartMessage loginStart) { session.EnqueueEvent(new TaskGenericEvent <Account>(AuthDatabase.GetAccountAsync(loginStart.LoginName), account => { if (account == null) { session.EnqueueMessageError(new ServerErrorMessage((int)ErrorCode.InvalidAccountNameOrPassword)); return; } session.Account = account; byte[] s = account.S.ToByteArray(); byte[] v = account.V.ToByteArray(); session.KeyExchange = new Srp6Provider(account.Email, s, v); byte[] B = session.KeyExchange.GenerateServerCredentials(); using (MemoryStream stream = new MemoryStream()) using (BinaryWriter writer = new BinaryWriter(stream)) { writer.Write(s.Length); writer.Write(s, 0, s.Length); writer.Write(B.Length); writer.Write(B, 0, B.Length); session.EnqueueMessageOk(new ServerLoginStartMessage { KeyData = Convert.ToBase64String(stream.ToArray()) }); } session.State = SessionState.LoginStart; })); }
public static void HandleHelloRealm(WorldSession session, ClientHelloRealm helloRealm) { // prevent packets from being processed until asynchronous account select task is complete session.CanProcessPackets = false; session.EnqueueEvent(new TaskGenericEvent <Account>(AuthDatabase.GetAccountAsync(helloRealm.Email, helloRealm.SessionKey), account => { if (account == null) { throw new InvalidPacketValueException($"Failed to find account, Id:{helloRealm.AccountId}, Email:{helloRealm.Email}, SessionKey:{helloRealm.SessionKey}!"); } session.Initialise(account); session.SetEncryptionKey(helloRealm.SessionKey); session.CanProcessPackets = true; })); }
public static void HandleHelloAuth(AuthSession session, ClientHelloAuth helloAuth) { session.EnqueueEvent(new TaskGenericEvent <Account>(AuthDatabase.GetAccountAsync(helloAuth.Email, helloAuth.GameToken.Guid), account => { if (account == null) { // TODO: send error return; } session.EnqueueMessageEncrypted(new ServerAuthAccepted()); session.EnqueueMessageEncrypted(new ServerRealmMessages { MessageGroup = { new ServerRealmMessages.Message { Index = 0, Messages = { "Welcome to this NexusForever server!\nVisit: https://github.com/Rawaho/NexusForever" } } } }); byte[] sessionKey = RandomProvider.GetBytes(16u); session.EnqueueEvent(new TaskEvent(AuthDatabase.UpdateAccountSessionKey(account, sessionKey), () => { ServerManager.ServerInfo server = ServerManager.Servers.First(); session.EnqueueMessageEncrypted(new ServerRealmInfo { AccountId = account.Id, SessionKey = sessionKey, Realm = server.Model.Name, Host = server.Address, Port = server.Model.Port, Type = server.Model.Type }); })); })); }
public static void HandleHelloAuth(AuthSession session, ClientHelloAuth helloAuth) { session.EnqueueEvent(new TaskGenericEvent<Account>(AuthDatabase.GetAccountAsync(helloAuth.Email, helloAuth.GameToken.Guid), account => { if (account == null) { // TODO: send error return; } session.EnqueueMessageEncrypted(new ServerAuthAccepted()); session.EnqueueMessageEncrypted(new ServerRealmMessages { Messages = ServerManager.ServerMessages .Select(m => new ServerRealmMessages.Message { Index = m.Index, Messages = m.Messages }) .ToList() }); byte[] sessionKey = RandomProvider.GetBytes(16u); session.EnqueueEvent(new TaskEvent(AuthDatabase.UpdateAccountSessionKey(account, sessionKey), () => { ServerInfo server = ServerManager.Servers.First(); session.EnqueueMessageEncrypted(new ServerRealmInfo { AccountId = account.Id, SessionKey = sessionKey, Realm = server.Model.Name, Host = server.Address, Port = server.Model.Port, Type = server.Model.Type }); })); })); }
public static void HandleHelloAuth(AuthSession session, ClientHelloAuth helloAuth) { void SendServerAuthDenied(NpLoginResult result) { session.EnqueueMessageEncrypted(new ServerAuthDenied { LoginResult = result }); } if (helloAuth.Build != 16042) { SendServerAuthDenied(NpLoginResult.ClientServerVersionMismatch); return; } session.EnqueueEvent(new TaskGenericEvent <Account>(AuthDatabase.GetAccountAsync(helloAuth.Email, helloAuth.GameToken.Guid), account => { if (account == null) { SendServerAuthDenied(NpLoginResult.ErrorInvalidToken); return; } // TODO: might want to make this smarter in the future, eg: select a server the user has characters on ServerInfo server = ServerManager.Instance.Servers.FirstOrDefault(); if (server == null) { SendServerAuthDenied(NpLoginResult.NoRealmsAvailableAtThisTime); return; } session.EnqueueMessageEncrypted(new ServerAuthAccepted()); session.EnqueueMessageEncrypted(new ServerRealmMessages { Messages = ServerManager.Instance.ServerMessages .Select(m => new NetworkMessage { Index = m.Index, Messages = m.Messages }) .ToList() }); byte[] sessionKey = RandomProvider.GetBytes(16u); session.EnqueueEvent(new TaskEvent(AuthDatabase.UpdateAccountSessionKey(account, sessionKey), () => { session.EnqueueMessageEncrypted(new ServerRealmInfo { AccountId = account.Id, SessionKey = sessionKey, Realm = server.Model.Name, Address = server.Address, Port = server.Model.Port, Type = server.Model.Type }); })); })); }