From 89571174ec679e29f14e38fa8930e43135df44d2 Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sat, 25 May 2013 20:13:39 -0400 Subject: [PATCH] Changed login event to prelogin and postlogin, if you set the args of prelogin to true, the login is ignored. In this case, if the server is loginbeforejoin, you need to kick the player with whatever reason otherwise bad things will happen. --- TShockAPI/Commands.cs | 10 +++++++-- TShockAPI/GetDataHandlers.cs | 6 +++++- TShockAPI/Hooks/PlayerHooks.cs | 37 ++++++++++++++++++++++++++-------- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 7e4770c9..a6a561e7 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -381,17 +381,22 @@ namespace TShockAPI TShock.Utils.Kick(args.Player, "Too many invalid login attempts."); return; } - + User user = TShock.Users.GetUserByName(args.Player.Name); string encrPass = ""; if (args.Parameters.Count == 1) { + if (Hooks.PlayerHooks.OnPlayerPreLogin(args.Player, args.Player.Name, args.Parameters[0])) + return; user = TShock.Users.GetUserByName(args.Player.Name); encrPass = TShock.Utils.HashPassword(args.Parameters[0]); } else if (args.Parameters.Count == 2 && TShock.Config.AllowLoginAnyUsername) { + if (Hooks.PlayerHooks.OnPlayerPreLogin(args.Player, args.Parameters[0], args.Parameters[1])) + return; + user = TShock.Users.GetUserByName(args.Parameters[0]); encrPass = TShock.Utils.HashPassword(args.Parameters[1]); if (String.IsNullOrEmpty(args.Parameters[0])) @@ -408,6 +413,7 @@ namespace TShockAPI } try { + // TODO: Is this needed? It seems to be an unreachable case if (user == null) { args.Player.SendErrorMessage("A user by that name does not exist."); @@ -464,7 +470,7 @@ namespace TShockAPI } - Hooks.PlayerHooks.OnPlayerLogin(args.Player); + Hooks.PlayerHooks.OnPlayerPostLogin(args.Player); } else { diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index d1d892f0..46f112b8 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1336,6 +1336,10 @@ namespace TShockAPI return true; string password = Encoding.UTF8.GetString(args.Data.ReadBytes((int) (args.Data.Length - args.Data.Position - 1))); + + if (Hooks.PlayerHooks.OnPlayerPreLogin(args.Player, args.Player.Name, password)) + return true; + var user = TShock.Users.GetUserByName(args.Player.Name); if (user != null && !TShock.Config.DisableLoginBeforeJoin) { @@ -1385,7 +1389,7 @@ namespace TShockAPI } args.Player.SendMessage("Authenticated as " + args.Player.Name + " successfully.", Color.LimeGreen); Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user " + args.Player.Name + "."); - Hooks.PlayerHooks.OnPlayerLogin(args.Player); + Hooks.PlayerHooks.OnPlayerPostLogin(args.Player); return true; } TShock.Utils.ForceKick(args.Player, "Invalid user account password.", true); diff --git a/TShockAPI/Hooks/PlayerHooks.cs b/TShockAPI/Hooks/PlayerHooks.cs index 4b46a35d..fde3619f 100644 --- a/TShockAPI/Hooks/PlayerHooks.cs +++ b/TShockAPI/Hooks/PlayerHooks.cs @@ -6,15 +6,22 @@ using System.Text; namespace TShockAPI.Hooks { - public class PlayerLoginEventArgs + public class PlayerPostLoginEventArgs { public TSPlayer Player { get; set; } - public PlayerLoginEventArgs(TSPlayer ply) + public PlayerPostLoginEventArgs(TSPlayer ply) { Player = ply; } } + public class PlayerPreLoginEventArgs : HandledEventArgs + { + public TSPlayer Player { get; set; } + public string LoginName { get; set; } + public string Password { get; set; } + } + public class PlayerCommandEventArgs : HandledEventArgs { public TSPlayer Player { get; set; } @@ -25,20 +32,24 @@ namespace TShockAPI.Hooks public static class PlayerHooks { - public delegate void PlayerLoginD(PlayerLoginEventArgs e); - public static event PlayerLoginD PlayerLogin; + public delegate void PlayerPostLoginD(PlayerPostLoginEventArgs e); + public static event PlayerPostLoginD PlayerPostLogin; + + public delegate void PlayerPreLoginD(PlayerPreLoginEventArgs e); + public static event PlayerPreLoginD PlayerPreLogin; + public delegate void PlayerCommandD(PlayerCommandEventArgs e); public static event PlayerCommandD PlayerCommand; - public static void OnPlayerLogin(TSPlayer ply) + public static void OnPlayerPostLogin(TSPlayer ply) { - if(PlayerLogin == null) + if(PlayerPostLogin == null) { return; } - PlayerLoginEventArgs args = new PlayerLoginEventArgs(ply); - PlayerLogin(args); + PlayerPostLoginEventArgs args = new PlayerPostLoginEventArgs(ply); + PlayerPostLogin(args); } public static bool OnPlayerCommand(TSPlayer player, string cmdName, string cmdText, List args) @@ -58,5 +69,15 @@ namespace TShockAPI.Hooks PlayerCommand(playerCommandEventArgs); return playerCommandEventArgs.Handled; } + + public static bool OnPlayerPreLogin(TSPlayer ply, string name, string pass) + { + if (PlayerPreLogin == null) + return false; + + var args = new PlayerPreLoginEventArgs {Player = ply, LoginName = name, Password = pass}; + PlayerPreLogin(args); + return args.Handled; + } } }