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; + } } }