public static async Task InvokeHandler <T>(Packet reader, NodeSession session) { var message = reader.Header.Message; Tuple <MethodInfo, Type, SessionState> data; if (MessageHandlers.TryGetValue(message, out data)) { if ((session.State & data.Item3) == SessionState.None) { var clientInfo = session.GetClientInfo(); Log.Debug($"Client '{clientInfo}': Received not allowed packet for state '{session.State}'."); Log.Debug($"Disconnecting '{clientInfo}'."); session.Dispose(); return; } var handlerObj = Activator.CreateInstance(data.Item2) as ClientPacket; handlerObj.Packet = reader; await Task.Run(() => handlerObj.Read()); if (handlerObj.IsReadComplete) { data.Item1.Invoke(null, new object[] { handlerObj, session }); } else { Log.Error($"Packet read for '{data.Item2.Name}' failed."); } } else { var msgName = Enum.GetName(typeof(ClientMessage), message) ?? Enum.GetName(typeof(GlobalClientMessage), message); if (msgName == null) { Log.Error($"Received unknown opcode '0x{message:X}, Length: {reader.Data.Length}'."); } else { Log.Error($"Packet handler for '{msgName} (0x{message:X}), Length: {reader.Data.Length}' not implemented."); } } }
public static async void HandleAuthContinuedSession(AuthContinuedSession authContinuedSession, NodeSession session) { var accountInfo = Manager.Redirect.GetAccountInfo(authContinuedSession.Key); // Delete redirect key Manager.Redirect.DeleteCharacterRedirect(authContinuedSession.Key); if (accountInfo != null) { var sha1 = new SHA1Managed(); var emailBytes = Encoding.UTF8.GetBytes(accountInfo.Item1.AccountId + "#" + accountInfo.Item1.Index); var sessionKeyBytes = accountInfo.Item1.SessionKey.ToByteArray(); var challengeBytes = BitConverter.GetBytes(session.Challenge); sha1.TransformBlock(emailBytes, 0, emailBytes.Length, emailBytes, 0); sha1.TransformBlock(sessionKeyBytes, 0, 40, sessionKeyBytes, 0); sha1.TransformFinalBlock(challengeBytes, 0, 4); if (sha1.Hash.Compare(authContinuedSession.Digest)) { session.State = SessionState.Authenticated; session.Account = DB.Auth.Single <Account>(a => a.Id == accountInfo.Item1.AccountId); session.GameAccount = accountInfo.Item1; session.Crypt = new Framework.Cryptography.WoW.WoWCrypt(); session.Crypt.Initialize(accountInfo.Item1.SessionKey.ToByteArray(), session.ClientSeed, session.ServerSeed); // Resume on the new connection await session.Send(new ResumeComms()); return; } } session.Dispose(); }