示例#1
0
        private async Task <LoginFailureReason> ParseFailReasonAsync(string rawHTML)
        {
            //Searches for parseCause( and get the value after it
            //Might be better for performance to separate the html by line first.
            var loginURL = Regex.Match(rawHTML, @"replace\(([^)]*)\)").Groups[1].Value;

            loginURL = loginURL.Replace('"', ' ').Trim();

            using (var client = new HttpClient())
            {
                var response = await client.GetAsync(loginURL);

                var loginHtml = await response.Content.ReadAsStringAsync();

                var reason = Regex.Match(loginHtml, @"deniedCause = parseCause\(([^)]*)").Groups[1].Value;

                //Remove "
                reason = reason.Replace('\"', ' ');
                reason = reason.Trim();

                LoginFailureReason parsedReason = (LoginFailureReason)int.Parse(reason);

                return(parsedReason);
            }
        }
        private async void HandleLogonResponse2(BncsReader dr)
        {
            int success = dr.ReadInt32();

            if (success == 0)
            {
                OnLoginSucceeded();
                ClassicProduct product = _settings.Client;
                if (product.UsesUdpPing)
                {
                    BncsPacket pck = new BncsPacket(BncsPacketId.UdpPingResponse, _storage.Acquire());
                    pck.InsertDwordString("bnet");
                    await pck.SendAsync(_connection);
                }

                EnterChat();
            }
            else
            {
                LoginFailureReason reason = LoginFailureReason.Unknown;
                switch (success)
                {
                case 1:     // account DNE
                    reason = LoginFailureReason.AccountDoesNotExist; break;

                case 2:     // invalid password
                    reason = LoginFailureReason.InvalidAccountOrPassword; break;

                case 6:     // account closed
                    reason = LoginFailureReason.AccountClosed; break;
                }
                LoginFailedEventArgs args = new LoginFailedEventArgs(reason, success, dr.ReadCString());
                OnLoginFailed(args);
            }
        }
示例#3
0
        /// <summary>
        /// Reads the <see cref="LoginFailedMessage"/> from the specified <see cref="MessageReader"/>.
        /// </summary>
        /// <param name="reader">
        /// <see cref="MessageReader"/> that will be used to read the <see cref="LoginFailedMessage"/>.
        /// </param>
        /// <exception cref="ArgumentNullException"><paramref name="reader"/> is null.</exception>
        public override void ReadMessage(MessageReader reader)
        {
            ThrowIfReaderNull(reader);

            Reason = (LoginFailureReason)reader.ReadInt32(); // Returned 2 when data is not valid.

            FingerprintJson = reader.ReadString();           // null

            Hostname            = reader.ReadString();       // stage.clashofclans.com
            ContentUrl          = reader.ReadString();       // http://b46f744d64acd2191eda-3720c0374d47e9a0dd52be4d281c260f.r11.cf2.rackcdn.com/
            MarketUrl           = reader.ReadString();       // market://details?id=com.supercell.clashofclans
            Message             = reader.ReadString();
            MaintenanceDuration = TimeSpan.FromSeconds(reader.ReadInt32());

            Unknown4 = reader.ReadByte(); // 0

            //TODO: Implement Compressed String in MessageWriter and MessageReader.
            var fingerprintData = reader.ReadBytes();

            if (fingerprintData != null)
            {
                using (var br = new BinaryReader(new MemoryStream(fingerprintData)))
                {
                    var decompressedLength    = br.ReadInt32();
                    var compressedFingerprint = br.ReadBytes(fingerprintData.Length - 4);
                    var fingerprintJson       = ZlibStream.UncompressString(compressedFingerprint);
                    FingerprintJsonCompressed = fingerprintJson;
                }
            }

            Unknown6 = reader.ReadInt32(); // -1
            Unknown7 = reader.ReadInt32(); // 2
            Unknown8 = reader.ReadInt32(); // 0
            Unknown9 = reader.ReadInt32(); // -1
        }
 public void ReadPacket(PacketReader reader)
 {
     FailureReason = (LoginFailureReason)reader.ReadInt32();
     var fingerprintJson = reader.ReadString();
     if (fingerprintJson != null)
         Fingerprint = new Fingerprint(fingerprintJson);
     HostName = reader.ReadString();
     RackcdnUrl = reader.ReadString();
     iTunesUrl = reader.ReadString();
     Unknown1 = reader.ReadString();
     Unknown2 = reader.ReadString();
     Unknown3 = (byte)reader.ReadByte();
     CompressedFingerprintJson = reader.ReadByteArray();
     Unknown4 = reader.ReadString();
 }
示例#5
0
        public void ReadPacket(PacketReader reader)
        {
            FailureReason = (LoginFailureReason)reader.ReadInt32();
            var fingerprintJson = reader.ReadString();

            if (fingerprintJson != null)
            {
                Fingerprint = new Fingerprint(fingerprintJson);
            }
            HostName   = reader.ReadString();
            RackcdnUrl = reader.ReadString();
            iTunesUrl  = reader.ReadString();
            Unknown1   = reader.ReadString();
            Unknown2   = reader.ReadString();
            Unknown3   = (byte)reader.ReadByte();
            CompressedFingerprintJson = reader.ReadByteArray();
            Unknown4 = reader.ReadString();
        }
示例#6
0
        /// <summary>
        /// Sends a failed <see cref="LoginResponsePacket"/> with the given reason and message.
        /// </summary>
        /// <param name="connectionId">Connection ID</param>
        /// <param name="failureReason">Failure reason</param>
        /// <param name="failureMessage">Failure message</param>
        private void sendFailedLoginResponsePacket(string connectionId, LoginFailureReason failureReason, string failureMessage)
        {
            RaiseLogEntry(new LogEventArgs(string.Format("Sending failed LoginResponsePacket to connection {0}", connectionId), LogLevel.DEBUG));

            // Create and pack a response
            LoginResponsePacket response = new LoginResponsePacket
            {
                Success        = false,
                FailureReason  = failureReason,
                FailureMessage = failureMessage
            };
            Any packedResponse = ProtobufPacketHelper.Pack(response);

            // Send it on its way
            if (!netServer.TrySend(connectionId, MODULE_NAME, packedResponse.ToByteArray()))
            {
                RaiseLogEntry(new LogEventArgs("Failed to send LoginResponsePacket to connection " + connectionId, LogLevel.ERROR));
            }
        }
        private void HandleLogonResponse2(ParseData data)
        {
            DataReader dr      = new DataReader(data.Data);
            int        success = dr.ReadInt32();

            if (success == 0)
            {
                OnLoginSucceeded(BaseEventArgs.GetEmpty(data));
                Product product = Product.GetByProductCode(m_settings.Client);
                if (product.UsesUdpPing)
                {
                    BncsPacket pck = new BncsPacket((byte)BncsPacketId.UdpPingResponse);
                    pck.InsertDwordString("bnet");
                    Send(pck);
                }

                EnterChat();
            }
            else
            {
                LoginFailureReason reason = LoginFailureReason.Unknown;
                switch (success)
                {
                case 1:     // account DNE
                    reason = LoginFailureReason.AccountDoesNotExist; break;

                case 2:     // invalid password
                    reason = LoginFailureReason.InvalidAccountOrPassword; break;

                case 6:     // account closed
                    reason = LoginFailureReason.AccountClosed; break;
                }
                LoginFailedEventArgs args = new LoginFailedEventArgs(reason, success, dr.ReadCString())
                {
                    EventData = data
                };
                OnLoginFailed(args);
            }
        }
 public CharacterLoginFailed(LoginFailureReason code) : base(ServerOpcodes.CharacterLoginFailed)
 {
     Code = code;
 }
 /// <summary>
 /// Creates a new <see>LoginFailedEventArgs</see> that does supports extended information.
 /// </summary>
 /// <param name="reason">The login failure reason associated with this event.</param>
 /// <param name="statusCode">The underlying message status code, which may be useful if the <paramref name="reason"/> parameter is 
 /// <see cref="LoginFailureReason">Unknown</see>.</param>
 /// <param name="description">Additional textual information optionally provided by the Battle.net server.</param>
 public LoginFailedEventArgs(LoginFailureReason reason, int statusCode, string description)
     : this(reason, statusCode)
 {
     _description = description;
     _supportsExtendedInformation = true;
 }
示例#10
0
 /// <summary>
 /// Creates a new <see>LoginFailedEventArgs</see> that does not support extended information.
 /// </summary>
 /// <param name="reason">The login failure reason associated with this event.</param>
 /// <param name="statusCode">The underlying message status code, which may be useful if the <paramref name="reason"/> parameter is 
 /// <see cref="LoginFailureReason">Unknown</see>.</param>
 public LoginFailedEventArgs(LoginFailureReason reason, int statusCode)
 {
     _reason = reason;
     _statusCode = statusCode;
 }
示例#11
0
 /// <summary>
 /// Creates a new failed <see cref="LoginEventArgs"/> with the given failure reason and message.
 /// </summary>
 /// <param name="failureReason">Field that caused login failure</param>
 /// <param name="failureMessage">Message from the server</param>
 public LoginEventArgs(LoginFailureReason failureReason, string failureMessage)
 {
     this.FailureReason  = failureReason;
     this.FailureMessage = failureMessage;
 }