public static void Login(LoginClient pClient, Packet pPacket) { string hash; string username; if (!pPacket.TryReadString(out username, 32) || !pPacket.TryReadString(out hash, 32)) { Log.WriteLine(LogLevel.Warn, "Could not read user token."); SendFailedLogin(pClient, ServerError.EXCEPTION); return; } Log.WriteLine(LogLevel.Debug, "{0} tries to login.", username); User user; if (Program.Entity.Users.Count() > 0 && (user = Program.Entity.Users.First(u => u.Username == username)) != null) { if (user.Password.ToLower() == hash.ToLower()) { if (ClientManager.Instance.IsLoggedIn(user.Username)) { Log.WriteLine(LogLevel.Warn, "{0} is trying dual login. Disconnecting.", user.Username); pClient.Disconnect(); } else if (user.Banned) { SendFailedLogin(pClient, ServerError.BLOCKED); } else { pClient.IsAuthenticated = true; pClient.Username = user.Username; pClient.AccountID = user.ID; pClient.Admin = user.Admin; AllowFiles(pClient, true); WorldList(pClient, false); } } else SendFailedLogin(pClient, ServerError.INVALID_CREDENTIALS); } else SendFailedLogin(pClient, ServerError.INVALID_CREDENTIALS); }
public static void CreateCharHandler(WorldClient client, Packet packet) { string name; byte slot, jobGender, hair, color, style; if (!packet.TryReadByte(out slot) || !packet.TryReadString(out name, 20) || !packet.TryReadByte(out jobGender) || !packet.TryReadByte(out hair) || !packet.TryReadByte(out color) || !packet.TryReadByte(out style)) { Log.WriteLine(LogLevel.Warn, "Error reading create char for {0}", client.Username); return; } if (DatabaseChecks.IsCharNameUsed(name)) { SendCharCreationError(client, CreateCharError.NameTaken); return; } else if (DataProvider.Instance.IsBadName(name)) { SendCharCreationError(client, CreateCharError.NameInUse); return; } byte isMaleByte = (byte)((jobGender >> 7) & 0x01); byte classIDByte = (byte)((jobGender >> 2) & 0x1F); Job job = (Job)classIDByte; switch (job) { case Job.Archer: case Job.Cleric: case Job.Fighter: case Job.Mage: case Job.Trickster: //create character here try { WorldCharacter wchar = client.CreateCharacter(name, slot, hair, color, style, job, Convert.ToBoolean(isMaleByte)); SendCharOKResponse(client, wchar); } catch (Exception ex) { Log.WriteLine(LogLevel.Exception, "Error creating character for {0}: {1}", client.Username, ex.InnerException.ToString()); SendCharCreationError(client, CreateCharError.FailedToCreate); return; } break; default: SendCharCreationError(client, CreateCharError.WrongClass); Log.WriteLine(LogLevel.Warn, "Invalid job ID at char creation from {0}", client.Username); break; } }
public static void FileHash(LoginClient pClient, Packet pPacket) { string hash; if (!pPacket.TryReadString(out hash)) { Log.WriteLine(LogLevel.Warn, "Empty filehash received."); SendFailedLogin(pClient, ServerError.EXCEPTION); } else { //allowfiles here f***s shit up? } }
public static void TransferKey(WorldClient client, Packet packet) { string key; if (!packet.ReadSkip(256) || !packet.TryReadString(out key, 64)) { Log.WriteLine(LogLevel.Warn, "Invalid connection request."); client.Disconnect(); return; } ClientTransfer transfer = ClientManager.Instance.GetTransfer(key); if (transfer != null) { // Check if client does not connect from localhost or LAN, // and if it's connecting from the correct IP. // When this check is not done, people can remote hack someone. if (!client.Host.StartsWith("127.0") && !client.Host.StartsWith("192.") && transfer.HostIP != client.Host) { Log.WriteLine(LogLevel.Warn, "Remotehack from {0}", client.Host); SendError(client, ServerError.INVALID_CREDENTIALS); } else { if (ClientManager.Instance.RemoveTransfer(transfer.Hash) && (!Program.Maintenance || transfer.Admin > 0)) //admins can still login { client.Authenticated = true; client.AccountID = transfer.AccountID; client.Admin = transfer.Admin; client.Username = transfer.Username; client.lastPing = DateTime.Now; //this is so pongthread can start checking him client.Pong = true; client.RandomID = MathUtils.RandomizeUShort(ushort.MaxValue); Log.WriteLine(LogLevel.Debug, "{0} authenticated.", client.Username); SendCharacterList(client); } } } else { Log.WriteLine(LogLevel.Warn, "Invalid client authentication from {0}", client.Host); SendError(client, ServerError.INVALID_CREDENTIALS); } }
public static void TransferKeyHandler(ZoneClient client, Packet packet) { ushort randomID; string characterName, checksums; //TODO: check in securityclient if (!packet.TryReadUShort(out randomID) || !packet.TryReadString(out characterName, 16) || !packet.TryReadString(out checksums, 832)) { Log.WriteLine(LogLevel.Warn, "Invalid game transfer."); return; } ClientTransfer transfer = ClientManager.Instance.GetTransfer(characterName); if (transfer == null || transfer.HostIP != client.Host || transfer.RandID != randomID) { Log.WriteLine(LogLevel.Warn, "{0} tried to login without a valid client transfer.", client.Host); //Handler3.SendError(client, ServerError.INVALID_CREDENTIALS); Handler4.SendConnectError(client, ConnectErrors.RequestedCharacterIDNotMatching); return; } try { ClientManager.Instance.RemoveTransfer(characterName); ZoneCharacter character = new ZoneCharacter(characterName); if (character.AccountID != transfer.AccountID) { Log.WriteLine(LogLevel.Warn, "Character is logging in with wrong account ID."); Handler4.SendConnectError(client, ConnectErrors.RequestedCharacterIDNotMatching); //Handler3.SendError(client, ServerError.INVALID_CREDENTIALS); return; } client.Authenticated = true; client.Admin = transfer.Admin; client.AccountID = transfer.AccountID; client.Username = transfer.Username; client.Character = character; character.Client = client; if (ClientManager.Instance.AddClient(client)) { character.SendGetIngameChunk(); //TODO: world server notification over WCF? Log.WriteLine(LogLevel.Debug, "{0} logged in successfully!", character.Name); } } catch (Exception ex) { Log.WriteLine(LogLevel.Exception, "Error loading character {0}: {1} - {2}", characterName, ex.ToString(), ex.StackTrace); Handler4.SendConnectError(client, ConnectErrors.ErrorInCharacterInfo); } }
public static void ShoutHandler(ZoneClient client, Packet packet) { ZoneCharacter character = client.Character; byte len; string message; if (!packet.TryReadByte(out len) || !packet.TryReadString(out message, len)) { Log.WriteLine(LogLevel.Warn, "Could not read shout from {0}.", character.Name); return; } int shoutcheck = character.ShoutCheck(); if (shoutcheck > 0) { Handler2.SendChatBlock(character, shoutcheck); } else { ChatLog.Instance.LogChat(client.Character.Name, message, true); using (var broad = Shout(character.Name, message)) { character.Map.Broadcast(broad); } } }
public static void NormalChatHandler(ZoneClient client, Packet packet) { byte len; string text; if (!packet.TryReadByte(out len) || !packet.TryReadString(out text, len)) { Log.WriteLine(LogLevel.Warn, "Could not parse normal chat from {0}.", client.Character.Name); return; } if (client.Admin > 0 && (text.StartsWith("&") || text.StartsWith("/"))) { CommandLog.Instance.LogCommand(client.Character.Name, text); CommandStatus status = CommandHandler.Instance.ExecuteCommand(client.Character, text.Split(' ')); switch (status) { case CommandStatus.ERROR: client.Character.DropMessage("Error executing command."); break; case CommandStatus.GM_LEVEL_TOO_LOW: client.Character.DropMessage("You do not have the privileges for this command."); break; case CommandStatus.NOT_FOUND: client.Character.DropMessage("Command not found."); break; } } else { int chatblock = client.Character.ChatCheck(); if (chatblock == -1) { ChatLog.Instance.LogChat(client.Character.Name, text, false); SendNormalChat(client.Character, text, client.Admin > 0 ? (byte)0x03 : (byte)0x2a); } else { Handler2.SendChatBlock(client.Character, chatblock); } } }