Exemplo n.º 1
0
        private static async Task AsyncMain(IManagedNetworkClient <AuthenticationClientPayload, AuthenticationServerPayload> client)
        {
            try
            {
                if (!await client.ConnectAsync("127.0.0.1", 5050).ConfigureAwait(false))
                {
                    Console.WriteLine("Failed to connect");
                }

                AuthChallengeData challenge = new AuthChallengeData(ProtocolVersion.ProtocolVersionTwo, GameType.WoW, ExpansionType.WrathOfTheLichKing, 3, 5,
                                                                    ClientBuild.Wotlk_3_3_5a, PlatformType.x86, OperatingSystemType.Win, LocaleType.enUS,
                                                                    IPAddress.Parse("127.0.0.1"), "Glader");

                await client.SendMessage(new AuthLogonChallengeRequest(challenge))
                .ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error: {e.Message}");
            }

            while (true)
            {
                var response = (await client.ReadMessageAsync()).Payload;

                Console.WriteLine("Recieved payload");

                AuthenticationLogonChallengeResponseMessageHandler handler = new AuthenticationLogonChallengeResponseMessageHandler();

                AuthenticationLogonProofResponseMessageHandler proofHandler = new AuthenticationLogonProofResponseMessageHandler();

                RealmListResponseMessageHandler realmListResponseHandler = new RealmListResponseMessageHandler(bytes => Serializer.Deserialize <RealmListContainer>(bytes));

                if (response is AuthLogonChallengeResponse challengeResponse)
                {
                    Console.WriteLine($"Response: Valid: {challengeResponse.isValid} Result: {challengeResponse.Result} SRP: {challengeResponse.Challenge}");

                    await handler.HandleMessage(new DefaultPeerMessageContext <AuthenticationClientPayload>(client, client, new PayloadInterceptMessageSendService <AuthenticationClientPayload>(client, client)), challengeResponse);
                }
                else if (response is AuthRealmListResponse realmListResponse)
                {
                    await realmListResponseHandler.HandleMessage(new DefaultPeerMessageContext <AuthenticationClientPayload>(client, client, new PayloadInterceptMessageSendService <AuthenticationClientPayload>(client, client)), realmListResponse);
                }
                else if (response is AuthLogonProofResponse proofResponse)
                {
                    await proofHandler.HandleMessage(new DefaultPeerMessageContext <AuthenticationClientPayload>(client, client, new PayloadInterceptMessageSendService <AuthenticationClientPayload>(client, client)), proofResponse);
                }
            }
        }
        /// <inheritdoc />
        public async Task HandleMessage(IPeerSessionMessageContext <AuthenticationServerPayload> context, AuthLogonChallengeRequest payload)
        {
            using (var repo = AccountRepository.Create())
            {
                AuthChallengeData challenge = payload.Challenge;

                bool accountExists = await repo.DoesAccountExists(challenge.Identity)
                                     .ConfigureAwait(false);

                if (Logger.IsDebugEnabled)
                {
                    Logger.Debug($"Account: {challenge.Identity} Exists: {accountExists} ConnectionId: {context.Details.ConnectionId}");
                }

                //Depending on if it exists we build an appropriate response
                AuthLogonChallengeResponse response = accountExists
                                        ? await BuildSuccessResponse(await repo.GetAccount(challenge.Identity).ConfigureAwait(false), context.Details.ConnectionId)
                                        : BuildFailureResponse();

                await context.PayloadSendService.SendMessage(response)
                .ConfigureAwait(false);
            }
        }