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