From 9b1c5fd230c92798fa7600d8c8c5078af479a57c Mon Sep 17 00:00:00 2001 From: Graham Cantin Date: Thu, 21 Jul 2011 04:14:42 -0700 Subject: [PATCH] Readded all my changes, I think. --- TShockAPI/Commands.cs | 144 ++++++++++++++++++------------------ TShockAPI/DB/UserManager.cs | 71 +++++++++++++++++- 2 files changed, 142 insertions(+), 73 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 8c7f2d3b..e35164d2 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -157,8 +157,8 @@ namespace TShockAPI ChatCommands.Add(new Command(PartyChat, "p")); ChatCommands.Add(new Command(Rules, "rules")); ChatCommands.Add(new Command("logs", DisplayLogs, "displaylogs")); - ChatCommands.Add(new Command(PasswordUser, "password") { DoLog = false }); - ChatCommands.Add(new Command(RegisterUser, "register") { DoLog = false }); + ChatCommands.Add(new Command(PasswordUser, "password") { DoLog = false }); + ChatCommands.Add(new Command(RegisterUser, "register") { DoLog = false }); ChatCommands.Add(new Command("root-only", ManageUsers, "user") { DoLog = false }); ChatCommands.Add(new Command("root-only", GrabUserIP, "ip")); ChatCommands.Add(new Command("root-only", AuthVerify, "auth-verify")); @@ -333,76 +333,76 @@ namespace TShockAPI } - private static void PasswordUser(CommandArgs args) - { - - try - { - if (args.Player.IsLoggedIn && args.Parameters.Count == 2) - { - var user = TShock.Users.GetUserByName(args.Player.UserAccountName); - string encrPass = Tools.HashPassword(args.Parameters[0]); - string[] exr = TShock.Users.FetchHashedPasswordAndGroup(args.Player.UserAccountName); - if (exr[0].ToUpper() == encrPass.ToUpper()) - { - args.Player.SendMessage("You changed your password!", Color.Green); - TShock.Users.SetUserPassword(user, args.Parameters[1]); // SetUserPassword will hash it for you. - Log.ConsoleInfo(args.Player.IP + " named " + args.Player.Name + " changed the password of Account " + user.Name); - } - else - { - args.Player.SendMessage("You failed to change your password!", Color.Red); - Log.ConsoleError(args.Player.IP + " named " + args.Player.Name + " failed to change password for Account: " + user.Name); - } - } - else - { - args.Player.SendMessage("Not Logged in or Invalid syntax! Proper syntax: /password ", Color.Red); - } - } - catch (UserManagerException ex) - { - args.Player.SendMessage("Sorry, an error occured: " + ex.Message, Color.Green); - Log.ConsoleError("RegisterUser returned an error: " + ex.ToString()); - } - } - - private static void RegisterUser(CommandArgs args) - { - try - { - if (args.Parameters.Count == 2) - { - var user = new User(); - user.Name = args.Parameters[0]; - user.Password = args.Parameters[1]; - user.Group = "default"; // FIXME -- we should get this from the DB. - - if (TShock.Users.GetUserByName(user.Name) == null) // Cheap way of checking for existance of a user - { - args.Player.SendMessage("Account " + user.Name + " has been registered.", Color.Green); - TShock.Users.AddUser(user); - Log.ConsoleInfo(args.Player.Name + " registered an Account: " + user.Name); - } - else - { - args.Player.SendMessage("Account " + user.Name + " has already been registered.", Color.Green); - Log.ConsoleInfo(args.Player.Name + " failed to register an existing Account: " + user.Name); - } - - } - else - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /register ", Color.Red); - } - } - catch (UserManagerException ex) - { - args.Player.SendMessage("Sorry, an error occured: " + ex.Message, Color.Green); - Log.ConsoleError("RegisterUser returned an error: " + ex.ToString()); - } - } - + private static void PasswordUser(CommandArgs args) + { + + try + { + if (args.Player.IsLoggedIn && args.Parameters.Count == 2) + { + var user = TShock.Users.GetUserByName(args.Player.UserAccountName); + string encrPass = Tools.HashPassword(args.Parameters[0]); + string[] exr = TShock.Users.FetchHashedPasswordAndGroup(args.Player.UserAccountName); + if (exr[0].ToUpper() == encrPass.ToUpper()) + { + args.Player.SendMessage("You changed your password!", Color.Green); + TShock.Users.SetUserPassword(user, args.Parameters[1]); // SetUserPassword will hash it for you. + Log.ConsoleInfo(args.Player.IP + " named " + args.Player.Name + " changed the password of Account " + user.Name); + } + else + { + args.Player.SendMessage("You failed to change your password!", Color.Red); + Log.ConsoleError(args.Player.IP + " named " + args.Player.Name + " failed to change password for Account: " + user.Name); + } + } + else + { + args.Player.SendMessage("Not Logged in or Invalid syntax! Proper syntax: /password ", Color.Red); + } + } + catch (UserManagerException ex) + { + args.Player.SendMessage("Sorry, an error occured: " + ex.Message, Color.Green); + Log.ConsoleError("RegisterUser returned an error: " + ex.ToString()); + } + } + + private static void RegisterUser(CommandArgs args) + { + try + { + if (args.Parameters.Count == 2) + { + var user = new User(); + user.Name = args.Parameters[0]; + user.Password = args.Parameters[1]; + user.Group = "default"; // FIXME -- we should get this from the DB. + + if (TShock.Users.GetUserByName(user.Name) == null) // Cheap way of checking for existance of a user + { + args.Player.SendMessage("Account " + user.Name + " has been registered.", Color.Green); + TShock.Users.AddUser(user); + Log.ConsoleInfo(args.Player.Name + " registered an Account: " + user.Name); + } + else + { + args.Player.SendMessage("Account " + user.Name + " has already been registered.", Color.Green); + Log.ConsoleInfo(args.Player.Name + " failed to register an existing Account: " + user.Name); + } + + } + else + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /register ", Color.Red); + } + } + catch (UserManagerException ex) + { + args.Player.SendMessage("Sorry, an error occured: " + ex.Message, Color.Green); + Log.ConsoleError("RegisterUser returned an error: " + ex.ToString()); + } + } + //Todo: Add separate help text for '/user add' and '/user del'. Also add '/user addip' and '/user delip' private static void ManageUsers(CommandArgs args) diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index 81d056c0..9143ae8a 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -99,7 +99,10 @@ namespace TShockAPI.DB } } - + /// + /// Adds a given username to the database + /// + /// User user public void AddUser(User user) { try @@ -129,6 +132,10 @@ namespace TShockAPI.DB } } + /// + /// Removes a given username from the database + /// + /// User user public void RemoveUser(User user) { try @@ -159,6 +166,68 @@ namespace TShockAPI.DB } } + + /// + /// Sets the Hashed Password for a given username + /// + /// User user + /// string password + public void SetUserPassword(User user, string password) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "UPDATE Users SET Password = @password WHERE Username = @name;"; + com.AddParameter("@name", user.Name); + com.AddParameter("@password", Tools.HashPassword(password)); + + using (var reader = com.ExecuteReader()) + { + if (reader.RecordsAffected < 1) + throw new UserExistsException(user.Name); + } + } + } + catch (Exception ex) + { + throw new UserManagerException("SetUserPassword SQL returned an error", ex); + } + } + + /// + /// Sets the group for a given username + /// + /// User user + /// string group + public void SetUserGroup(User user, string group) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "UPDATE Users SET UserGroup = @group WHERE Username = @name;"; + com.AddParameter("@name", user.Name); + + if (!TShock.Groups.GroupExists(group)) + throw new GroupNotExistsException(group); + + com.AddParameter("@group", group); + + using (var reader = com.ExecuteReader()) + { + if (reader.RecordsAffected < 1) + throw new UserExistsException(user.Name); + } + } + } + catch (Exception ex) + { + throw new UserManagerException("SetUserGroup SQL returned an error", ex); + } + } + + /// /// Fetches the hashed password and group for a given username ///