private static void ReceiveCallback(IAsyncResult ar) { try { var state = (StateObject)ar.AsyncState; var client = state.WorkSocket; var bytesRead = client.EndReceive(ar); if (bytesRead > 0) { var msg = new CCMessage(state.Buffer, bytesRead); short magic = 0; ByteArray packet = new CCMessage(); if (msg.Read(ref magic) && magic == Magic && msg.Read(ref packet)) { CCMessage.MessageType coreId = 0; var message = new CCMessage(packet); message.Read(ref coreId); switch (coreId) { case CCMessage.MessageType.Notify: { var info = ""; message.Read(ref info); if (info.Contains("<region>") && info.Contains("</region>")) { info = info.Replace("<region>", ""); info = info.Replace("</region>", ""); if (info == "S4Violet362") { var sendmsg = new CCMessage(); sendmsg.Write(Constants.LoginWindow.GetUsername()); sendmsg.Write(Constants.LoginWindow.GetPassword()); sendmsg.Write(FingerPrint.Value()); sendmsg.Write("test"); RmiSend(client, 15, sendmsg); Constants.LoginWindow.UpdateLabel("Connecting..."); } else { Constants.LoginWindow.UpdateLabel("Error"); } } break; } case CCMessage.MessageType.Rmi: { short rmiId = 0; if (!message.Read(ref rmiId)) { Constants.LoginWindow.UpdateLabel("Received corrupted Rmi message."); } else { switch (rmiId) { case 16: { var success = false; if (message.Read(ref success) && success) { ReceiveDone.Set(); var code = ""; message.Read(ref code); Constants.LoginWindow.UpdateLabel( $""); Constants.LoginWindow.Ready(code); _connected = true; var sendmsg = new CCMessage(); RmiSend(client, 17, sendmsg); client.Disconnect(false); client.Close(); Process.Start("S4client.exe", string.Format("-rc:eu -lac:eng -auth_server_ip:{0} -aeria_acc_code:{1}", Constants.ConnectEndPoint.Address, Constants.LoginWindow.AuthCode)); Environment.Exit(0); } else { ReceiveDone.Set(); var errcode = ""; message.Read(ref errcode); Constants.LoginWindow.UpdateLabel($"Failed: {errcode}"); Constants.LoginWindow.Reset(); _connected = true; client.Disconnect(false); client.Close(); } } break; default: Constants.LoginWindow.UpdateLabel($"Received unknown rmiId. {rmiId}"); break; } } break; } case CCMessage.MessageType.Encrypted: { break; } } if (!_connected) { client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, ReceiveCallback, state); } } else { ReceiveDone.Set(); client.Disconnect(true); } } } catch (Exception e) { // ignored #if DEBUG Constants.LoginWindow.UpdateLabel($"Error -> {e.ToString()}"); #endif } }
private static void ReceiveCallback(IAsyncResult ar) { try { var state = (StateObject)ar.AsyncState; var client = state.WorkSocket; var bytesRead = client.EndReceive(ar); if (bytesRead > 0) { var msg = new CCMessage(state.Buffer, bytesRead); short magic = 0; ByteArray packet = new CCMessage(); if (msg.Read(ref magic) && magic == Magic && msg.Read(ref packet)) { CCMessage.MessageType coreId = 0; var message = new CCMessage(packet); message.Read(ref coreId); switch (coreId) { case CCMessage.MessageType.Notify: { var info = ""; message.Read(ref info); if (info.Contains("<region>") && info.Contains("</region>")) { info = info.Replace("<region>", ""); info = info.Replace("</region>", ""); if (info == "EU-S4MAX") { var sendmsg = new CCMessage(); sendmsg.Write(Constants.LoginWindow.GetUsername()); sendmsg.Write(Constants.LoginWindow.GetPassword()); sendmsg.Write(false); RmiSend(client, 15, sendmsg); Constants.LoginWindow.UpdateLabel("Authenticating.."); } else { Constants.LoginWindow.UpdateLabel("Error"); Constants.LoginWindow.UpdateErrorLabel("Wrong region/server"); } } break; } case CCMessage.MessageType.Rmi: { short rmiId = 0; if (!message.Read(ref rmiId)) { Constants.LoginWindow.UpdateLabel("Received corrupted Rmi message."); } else { switch (rmiId) { case 16: { var success = false; if (message.Read(ref success) && success) { ReceiveDone.Set(); var code = ""; message.Read(ref code); Constants.LoginWindow.UpdateLabel( $"Authentication succeeded. code={code}"); Constants.LoginWindow.Ready(code); _connected = true; var sendmsg = new CCMessage(); RmiSend(client, 17, sendmsg); client.Disconnect(false); client.Close(); } else { ReceiveDone.Set(); var errcode = ""; message.Read(ref errcode); Constants.LoginWindow.Reset(); Constants.LoginWindow.UpdateErrorLabel($"Failed: {errcode}"); _connected = true; client.Disconnect(false); client.Close(); } } break; default: Constants.LoginWindow.UpdateLabel($"Received unknown rmiId. {rmiId}"); break; } } break; } case CCMessage.MessageType.Encrypted: { break; } } if (!_connected) { client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, ReceiveCallback, state); } } else { ReceiveDone.Set(); client.Disconnect(true); } } } catch (Exception e) { // ignored #if DEBUG Constants.LoginWindow.UpdateLabel($"Error -> {e.ToString()}"); #endif } }
public override void ChannelRead(IChannelHandlerContext context, object messageData) { var buffer = messageData as IByteBuffer; var data = new byte[0]; if (buffer != null) { data = buffer.ToArray(); } var msg = new CCMessage(data, data.Length); short magic = 0; var message = new ByteArray(); if (msg.Read(ref magic) && magic == Magic && msg.Read(ref message)) { var receivedMessage = new CCMessage(message); CCMessage.MessageType coreId = 0; if (!receivedMessage.Read(ref coreId)) { return; } switch (coreId) { case CCMessage.MessageType.Rmi: short rmiId = 0; if (receivedMessage.Read(ref rmiId)) { switch (rmiId) { case 15: { var username = ""; var password = ""; var register = false; var korealogin = false; if (receivedMessage.Read(ref username) && receivedMessage.Read(ref password) && receivedMessage.Read(ref register)) { //receivedMessage.Read(ref korealogin); using (var db = AuthDatabase.Open()) { Logger.Information("Authentication login from {endpoint}", context.Channel.RemoteAddress.ToString()); if (username.Length > 5 && password.Length > 5) { var result = db.Find <AccountDto>(statement => statement .Where($"{nameof(AccountDto.Username):C} = @{nameof(username)}") .Include <BanDto>(join => @join.LeftOuterJoin()) .WithParameters(new { Username = username })); var account = result.FirstOrDefault(); if (account == null && (Config.Instance.NoobMode || Config.Instance.AutoRegister)) { account = new AccountDto { Username = username }; var newSalt = new byte[24]; using (var csprng = new RNGCryptoServiceProvider()) { csprng.GetBytes(newSalt); } var hash = new Rfc2898DeriveBytes(password, newSalt, 24000).GetBytes(24); account.Password = Convert.ToBase64String(hash); account.Salt = Convert.ToBase64String(newSalt); db.InsertAsync(account); } var salt = Convert.FromBase64String(account?.Salt ?? ""); var passwordGuess = new Rfc2898DeriveBytes(password, salt, 24000).GetBytes(24); var actualPassword = Convert.FromBase64String(account?.Password ?? ""); var difference = (uint)passwordGuess.Length ^ (uint)actualPassword.Length; for (var i = 0; i < passwordGuess.Length && i < actualPassword.Length; i++) { difference |= (uint)(passwordGuess[i] ^ actualPassword[i]); } if ((difference != 0 || string.IsNullOrWhiteSpace(account?.Password ?? "")) && !Config.Instance.NoobMode) { Logger.Error( "Wrong authentication credentials for {username} / {endpoint}", username, context.Channel.RemoteAddress.ToString()); var ack = new CCMessage(); ack.Write(false); ack.Write("Login failed"); RmiSend(context, 16, ack); } else { if (account != null) { account.LoginToken = AuthHash .GetHash256( $"{context.Channel.RemoteAddress}-{account.Username}-{account.Password}") .ToLower(); account.LastLogin = $"{DateTimeOffset.Now}"; account.AuthToken = ""; account.newToken = ""; db.UpdateAsync(account); var ack = new CCMessage(); ack.Write(true); ack.Write(account.LoginToken); //ack.Write(korealogin); RmiSend(context, 16, ack); } Logger.Information("Authentication success for {username}", username); } } else { Logger.Error( "Wrong authentication credentials for {username} / {endpoint}", username, context.Channel.RemoteAddress.ToString()); var ack = new CCMessage(); ack.Write(false); ack.Write("Invalid length of username/password"); RmiSend(context, 16, ack); } } } else { Logger.Error("Wrong login for {endpoint}", context.Channel.RemoteAddress.ToString()); var ack = new CCMessage(); ack.Write(false); ack.Write("Invalid loginpacket"); RmiSend(context, 16, ack); } break; } case 17: context.CloseAsync(); break; default: Logger.Error("Received unknown rmiId{rmi} from {endpoint}", rmiId, context.Channel.RemoteAddress.ToString()); break; } } break; case CCMessage.MessageType.Notify: context.CloseAsync(); //var info = ""; //receivedMessage.Read(ref info); //Logger.Information("Received info! -> {received}", info); break; default: Logger.Error("Received unknown coreID{coreid} from {endpoint}", coreId, context.Channel.RemoteAddress.ToString()); break; } } else { Logger.Error("Received invalid packetstruct from {endpoint}", context.Channel.RemoteAddress.ToString()); context.CloseAsync(); } }
public override void ChannelRead(IChannelHandlerContext context, object messageData) { var buffer = messageData as IByteBuffer; var data = new byte[0]; if (buffer != null) { data = buffer.GetIoBuffer().ToArray(); } var msg = new CCMessage(data, data.Length); short magic = 0; var message = new ByteArray(); if (msg.Read(ref magic) && magic == Magic && msg.Read(ref message)) { var receivedMessage = new CCMessage(message); CCMessage.MessageType coreId = 0; if (!receivedMessage.Read(ref coreId)) { return; } switch (coreId) { case CCMessage.MessageType.Rmi: short rmiId = 0; if (receivedMessage.Read(ref rmiId)) { switch (rmiId) { case 15: var username = string.Empty; var password = string.Empty; var hwid = string.Empty; var secretkey = string.Empty; if (receivedMessage.Read(ref secretkey) && receivedMessage.Read(ref hwid) && receivedMessage.Read(ref username) && receivedMessage.Read(ref password)) { LoginAsync(context, username, password, hwid, secretkey); } else { var error = new CCMessage(); error.Write(false); error.Write("Login error"); RmiSend(context, 16, error); } break; case 17: context.CloseAsync(); break; default: Logger.Error("Received unknown rmiId{rmi} from {endpoint}", rmiId, context.Channel.RemoteAddress.ToString()); break; } } break; case CCMessage.MessageType.Notify: context.CloseAsync(); break; default: Logger.Error("Received unknown coreID{coreid} from {endpoint}", coreId, context.Channel.RemoteAddress.ToString()); break; } } else { Logger.Error("Received invalid packetstruct from {endpoint}", context.Channel.RemoteAddress.ToString()); context.CloseAsync(); } }