diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs
index 6f5d6d25..e18c9d92 100755
--- a/TShockAPI/Commands.cs
+++ b/TShockAPI/Commands.cs
@@ -301,7 +301,7 @@ namespace TShockAPI
}
string encrPass = Tools.HashPassword(args.Parameters[1]);
- string[] exr = Tools.FetchHashedPasswordAndGroup(args.Parameters[0]);
+ string[] exr = TShock.Users.FetchHashedPasswordAndGroup(args.Parameters[0]);
if (exr[0] == encrPass)
{
args.Player.Group = Tools.GetGroup(exr[1]);
@@ -329,21 +329,28 @@ namespace TShockAPI
{
if (args.Parameters[0] == "add")
{
+ int returnval = 0;
if (args.Parameters[1].Split(':').Length == 2)
{
- TextWriter tw = new StreamWriter(FileTools.UsersPath, true);
- tw.WriteLine("\n" + args.Parameters[1].Split(':')[0] + ":" + Tools.HashPassword(args.Parameters[1].Split(':')[1]) + " " + args.Parameters[2]);
- tw.Close();
- args.Player.SendMessage("This player can now login!", Color.Green);
+ if ((returnval = TShock.Users.AddUser("", args.Parameters[1].Split(':')[0], args.Parameters[1].Split(':')[1], args.Parameters[2])) == 1)
+ args.Player.SendMessage("This player can now login!", Color.Green);
+ else if(returnval == 2)
+ args.Player.SendMessage("Invalid Group", Color.Green);
+ else
+ args.Player.SendMessage("Could not add user", Color.Green);
return;
}
else if (args.Parameters[1].Split(':').Length == 1)
{
- TextWriter tw = new StreamWriter(FileTools.UsersPath, true);
- tw.WriteLine("\n" + args.Parameters[1] + " " + args.Parameters[2]);
- tw.Close();
- args.Player.SendMessage("IP address admin added. If they're logged in, tell them to rejoin.", Color.Green);
- args.Player.SendMessage("WARNING: This is insecure! It would be better to use a user account instead.", Color.Red);
+ if ((returnval = TShock.Users.AddUser(args.Parameters[1], "", "", args.Parameters[2])) == 1)
+ {
+ args.Player.SendMessage("IP address admin added. If they're logged in, tell them to rejoin.", Color.Green);
+ args.Player.SendMessage("WARNING: This is insecure! It would be better to use a user account instead.", Color.Red);
+ }
+ else if (returnval == 2)
+ args.Player.SendMessage("Invalid Group", Color.Green);
+ else
+ args.Player.SendMessage("Could not add user", Color.Green);
return;
}
else
diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs
index a885def8..659cc82e 100644
--- a/TShockAPI/DB/BanManager.cs
+++ b/TShockAPI/DB/BanManager.cs
@@ -37,7 +37,7 @@ namespace TShockAPI.DB
using (var com = database.CreateCommand())
{
com.CommandText =
- "CREATE TABLE IF NOT EXISTS \"Bans\" (\"IP\" VARCHAR(15) NOT NULL UNIQUE , \"Name\" VARCHAR(32) NOT NULL , \"Reason\" VARCHAR(255) NOT NULL );";
+ "CREATE TABLE IF NOT EXISTS 'Bans' ('IP' TEXT UNIQUE , 'Name' TEXT, 'Reason' TEXT);";
com.ExecuteNonQuery();
}
}
diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs
new file mode 100644
index 00000000..b432bf3a
--- /dev/null
+++ b/TShockAPI/DB/GroupManager.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Data;
+using Community.CsharpSqlite.SQLiteClient;
+
+namespace TShockAPI.DB
+{
+ public class GroupManager
+ {
+ private IDbConnection database;
+
+ public GroupManager(IDbConnection db)
+ {
+ database = db;
+ }
+
+ public bool GroupExists(string group)
+ {
+ return true;
+ }
+ }
+}
diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs
index da09fbbb..5da10316 100644
--- a/TShockAPI/DB/RegionManager.cs
+++ b/TShockAPI/DB/RegionManager.cs
@@ -43,7 +43,7 @@ namespace TShockAPI.DB
using (var com = database.CreateCommand())
{
com.CommandText =
- "CREATE TABLE IF NOT EXISTS \"Regions\" (\"X1\" INTEGER(11) NOT NULL, \"Y1\" INTEGER(11) NOT NULL, \"X2\" INTEGER(11) NOT NULL, \"Y2\" INTEGER(11) NOT NULL, \"RegionName\" VARCHAR(32) NOT NULL, \"WorldID\" VARCHAR(255) NOT NULL, \"UserIds\" VARCHAR(255) NOT NULL, \"Protected\" INTEGER(1));";
+ "CREATE TABLE IF NOT EXISTS 'Regions' ('X1' INTEGER(11) NOT NULL, 'Y1' INTEGER(11) NOT NULL, 'X2' INTEGER(11) NOT NULL, 'Y2' INTEGER(11) NOT NULL, 'RegionName' VARCHAR(32) NOT NULL, 'WorldID' VARCHAR(255) NOT NULL, 'UserIds' VARCHAR(255) NOT NULL, 'Protected' INTEGER(1));";
com.ExecuteNonQuery();
}
}
@@ -101,7 +101,7 @@ namespace TShockAPI.DB
{
using (var com = database.CreateCommand())
{
- com.CommandText = "UPDATE Regions SET Protected='@bool' WHERE RegionName=@name WorldID=@worldid";
+ com.CommandText = "UPDATE Regions SET Protected=@bool WHERE RegionName=@name WorldID=@worldid";
com.AddParameter("@name", name);
if (state)
com.AddParameter("@bool", 1);
diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs
index 975b0360..59c8419d 100644
--- a/TShockAPI/DB/UserManager.cs
+++ b/TShockAPI/DB/UserManager.cs
@@ -21,6 +21,7 @@ using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
+using Community.CsharpSqlite.SQLiteClient;
namespace TShockAPI.DB
{
@@ -35,9 +36,109 @@ namespace TShockAPI.DB
using (var com = database.CreateCommand())
{
com.CommandText =
- "CREATE TABLE IF NOT EXISTS 'Users' ('ID' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , 'Username' VARCHAR(32) UNIQUE , 'Password' CHAR(32), 'Group' VARCHAR(50));";
+ "CREATE TABLE IF NOT EXISTS 'Users' ('ID' INTEGER PRIMARY KEY, 'Username' TEXT UNIQUE, 'Password' TEXT, 'UserGroup' TEXT, 'IP' TEXT);";
+ com.ExecuteNonQuery();
+
+ com.CommandText = "INSERT INTO Users (UserGroup, IP) VALUES (@group, @ip);";
+ com.AddParameter("@group", "superadmin");
+ com.AddParameter("@ip", "127.0.0.1");
com.ExecuteNonQuery();
}
}
+
+ public int AddUser(string ip = "" , string name = "", string password = "", string group = "default")
+ {
+ try
+ {
+ using (var com = database.CreateCommand())
+ {
+ com.CommandText = "INSERT INTO Users (Username, Password, UserGroup, IP) VALUES (@name, @password, @group, @ip);";
+ com.AddParameter("@name", name.ToLower());
+ com.AddParameter("@password", Tools.HashPassword(password));
+
+ if(TShock.Groups.GroupExists(group))
+ com.AddParameter("@group", group);
+ else
+ //Return code 2 (Group not exist)
+ return 2;
+
+ com.AddParameter("@ip", ip);
+
+ using (var reader = com.ExecuteReader())
+ {
+ if (reader.RecordsAffected > 0)
+ //Return code 1 (User added)
+ return 1;
+ else
+ //Return code 0 (Add failed)
+ return 0;
+ }
+ }
+ }
+ catch (SqliteExecutionException ex)
+ {
+ //Return code 0 (Add failed)
+ return 0;
+ }
+ }
+
+ ///
+ /// Fetches the hashed password and group for a given username
+ ///
+ /// string username
+ /// string[] {password, group}
+ public string[] FetchHashedPasswordAndGroup(string username)
+ {
+ string[] returndata = new string[2];
+ try
+ {
+ using (var com = database.CreateCommand())
+ {
+ com.CommandText = "SELECT * FROM Users WHERE Username=@name";
+ com.AddParameter("@name", username.ToLower());
+ using (var reader = com.ExecuteReader())
+ {
+ if (reader.Read())
+ {
+ returndata[0] = reader.Get("Password");
+ returndata[1] = reader.Get("UserGroup");
+ return returndata;
+ }
+ }
+ }
+ }
+ catch (SqliteExecutionException ex)
+ {
+ }
+ return returndata;
+ }
+
+ ///
+ /// Returns a Group for a ip from the database
+ ///
+ /// string ip
+ public Group GetGroupForIP(string ip)
+ {
+ try
+ {
+ using (var com = database.CreateCommand())
+ {
+ com.CommandText = "SELECT * FROM Users WHERE IP=@ip";
+ com.AddParameter("@ip", ip);
+ using (var reader = com.ExecuteReader())
+ {
+ if (reader.Read())
+ {
+ string group = reader.Get("UserGroup");
+ return Tools.GetGroup(group);
+ }
+ }
+ }
+ }
+ catch (SqliteExecutionException ex)
+ {
+ }
+ return Tools.GetGroup("default");
+ }
}
}
diff --git a/TShockAPI/DB/WarpsManager.cs b/TShockAPI/DB/WarpsManager.cs
index cb543b87..e52e8b1d 100644
--- a/TShockAPI/DB/WarpsManager.cs
+++ b/TShockAPI/DB/WarpsManager.cs
@@ -43,7 +43,7 @@ namespace TShockAPI.DB
using (var com = database.CreateCommand())
{
com.CommandText =
- "CREATE TABLE IF NOT EXISTS \"Warps\" (\"X\" INTEGER(11) NOT NULL, \"Y\" INTEGER(11) NOT NULL, \"WarpName\" VARCHAR(32) NOT NULL UNIQUE, \"WorldID\" VARCHAR(255) NOT NULL );";
+ "CREATE TABLE IF NOT EXISTS 'Warps' ('X' INTEGER(11) NOT NULL, 'Y' INTEGER(11) NOT NULL, 'WarpName' TEXT UNIQUE, 'WorldID' TEXT);";
com.ExecuteNonQuery();
}
}
diff --git a/TShockAPI/RegionManager.cs b/TShockAPI/RegionManager.cs
deleted file mode 100644
index 8d29309b..00000000
--- a/TShockAPI/RegionManager.cs
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
-TShock, a server mod for Terraria
-Copyright (C) 2011 The TShock Team
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see .
-*/
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Xml;
-using Microsoft.Xna.Framework;
-using Terraria;
-
-namespace TShockAPI
-{
- public class RegionManager
- {
- public static List Regions = new List();
-
- public static bool AddRegion(int tx, int ty, int width, int height, string regionname, string worldname)
- {
- foreach (Region nametest in Regions)
- {
- if (regionname.ToLower() == nametest.RegionName.ToLower())
- {
- return false;
- }
- }
- Regions.Add(new Region(new Rectangle(tx, ty, width, height), regionname, true, worldname));
- WriteSettings();
- return true;
- }
-
- public static bool AddNewUser(string regionName, string IP)
- {
- foreach (Region nametest in Regions)
- {
- if (regionName.ToLower() == nametest.RegionName.ToLower())
- {
- nametest.RegionAllowedIPs.Add(IP.ToLower());
- return true;
- }
- }
- return false;
- }
-
- public static bool DeleteRegion(string name)
- {
- foreach (Region nametest in Regions)
- {
- if (name.ToLower() == nametest.RegionName.ToLower() && nametest.WorldRegionName == Main.worldName)
- {
- Regions.Remove(nametest);
- WriteSettings();
- return true;
- }
- }
- return false;
- }
-
- public static bool SetRegionState(string name, bool state)
- {
- foreach (Region nametest in Regions)
- {
- if (name.ToLower() == nametest.RegionName.ToLower())
- {
- nametest.DisableBuild = state;
- WriteSettings();
- return true;
- }
- }
- return false;
- }
-
- public static bool InProtectedArea(int X, int Y, string IP)
- {
- foreach(Region region in Regions)
- {
- if (X >= region.RegionArea.Left && X <= region.RegionArea.Right &&
- Y >= region.RegionArea.Top && Y <= region.RegionArea.Bottom &&
- region.DisableBuild && Main.worldName == region.WorldRegionName &&
- (!AllowedUser(region.RegionName, IP.ToLower()) || region.RegionAllowedIPs.Count == 0))
- {
- return true;
- }
- }
- return false;
- }
-
- public static int GetRegionIndex(string regionName)
- {
- for(int i = 0; i< Regions.Count;i++)
- {
- if(Regions[i].RegionName == regionName)
- return i;
- }
- return -1;
- }
-
- public static bool AllowedUser(string regionName, string playerIP)
- {
- int ID = -1;
- if ((ID = GetRegionIndex(regionName)) != -1)
- {
- for (int i = 0; i < Regions[ID].RegionAllowedIPs.Count; i++)
- {
- if (Regions[ID].RegionAllowedIPs[i].ToLower() == playerIP.ToLower())
- {
- return true;
- }
- }
- }
- return false;
- }
-
- public static void WriteSettings()
- {
- try
- {
- XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
- xmlWriterSettings.Indent = true;
- xmlWriterSettings.NewLineChars = Environment.NewLine;
-
- using (XmlWriter settingsw = XmlWriter.Create(FileTools.RegionsPath, xmlWriterSettings))
- {
- settingsw.WriteStartDocument();
- settingsw.WriteStartElement("Regions");
-
- foreach (Region region in Regions)
- {
- settingsw.WriteStartElement("ProtectedRegion");
- settingsw.WriteElementString("RegionName", region.RegionName);
- settingsw.WriteElementString("Point1X", region.RegionArea.X.ToString());
- settingsw.WriteElementString("Point1Y", region.RegionArea.Y.ToString());
- settingsw.WriteElementString("Point2X", region.RegionArea.Width.ToString());
- settingsw.WriteElementString("Point2Y", region.RegionArea.Height.ToString());
- settingsw.WriteElementString("Protected", region.DisableBuild.ToString());
- settingsw.WriteElementString("WorldName", region.WorldRegionName);
-
- settingsw.WriteElementString("AllowedUserCount", region.RegionAllowedIPs.Count.ToString());
- for (int i = 0; i < region.RegionAllowedIPs.Count; i++)
- {
- settingsw.WriteElementString("IP", region.RegionAllowedIPs[i]);
- }
-
- settingsw.WriteEndElement();
- }
-
- settingsw.WriteEndElement();
- settingsw.WriteEndDocument();
- }
- Log.Info("Wrote Regions");
- }
- catch
- {
- Log.Warn("Could not write Regions");
- }
- }
-
- public static void ReadAllSettings()
- {
- try
- {
- XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
- xmlReaderSettings.IgnoreWhitespace = true;
-
- using (XmlReader settingr = XmlReader.Create(FileTools.RegionsPath, xmlReaderSettings))
- {
- while (settingr.Read())
- {
- if (settingr.IsStartElement())
- {
- switch (settingr.Name)
- {
- case "Regions":
- {
- break;
- }
- case "ProtectedRegion":
- {
- if (settingr.Read())
- {
- string name = null;
- int x = 0;
- int y = 0;
- int width = 0;
- int height = 0;
- bool state = true;
- string worldname = null;
- int playercount = 0;
-
- settingr.Read();
- if (settingr.Value != "" || settingr.Value != null)
- name = settingr.Value;
- else
- Log.Warn("Region name is empty");
-
-
- settingr.Read();
- settingr.Read();
- settingr.Read();
- if (settingr.Value != "" || settingr.Value != null)
- Int32.TryParse(settingr.Value, out x);
- else
- Log.Warn("x for region " + name + " is empty");
-
- settingr.Read();
- settingr.Read();
- settingr.Read();
- if (settingr.Value != "" || settingr.Value != null)
- Int32.TryParse(settingr.Value, out y);
- else
- Log.Warn("y for region " + name + " is empty");
-
- settingr.Read();
- settingr.Read();
- settingr.Read();
- if (settingr.Value != "" || settingr.Value != null)
- Int32.TryParse(settingr.Value, out width);
- else
- Log.Warn("Width for region " + name + " is empty");
-
- settingr.Read();
- settingr.Read();
- settingr.Read();
- if (settingr.Value != "" || settingr.Value != null)
- Int32.TryParse(settingr.Value, out height);
- else
- Log.Warn("Height for region " + name + " is empty");
-
- settingr.Read();
- settingr.Read();
- settingr.Read();
- if (settingr.Value != "" || settingr.Value != null)
- bool.TryParse(settingr.Value, out state);
- else
- Log.Warn("State for region " + name + " is empty");
-
- settingr.Read();
- settingr.Read();
- settingr.Read();
- if (settingr.Value != "" || settingr.Value != null)
- worldname = settingr.Value;
- else
- Log.Warn("Worldname for region " + name + " is empty");
-
- settingr.Read();
- settingr.Read();
- settingr.Read();
- if (settingr.Value != "" || settingr.Value != null)
- Int32.TryParse(settingr.Value, out playercount);
- else
- Log.Warn("Playercount for region " + name + " is empty");
-
- AddRegion(x, y, width, height, name, worldname);
-
- if (playercount > 0)
- {
- for (int i = 0; i < playercount; i++)
- {
- settingr.Read();
- settingr.Read();
- settingr.Read();
- if (settingr.Value != "" || settingr.Value != null)
- {
- int ID = RegionManager.GetRegionIndex(name);
- Regions[ID].RegionAllowedIPs.Add(settingr.Value);
- }
- else
- Log.Warn("PlayerIP " + i + " for region " + name + " is empty");
- }
- }
- }
- break;
- }
- }
- }
- }
- }
- Log.Info("Read Regions");
- }
- catch
- {
- Log.Warn("Could not read Regions");
- WriteSettings();
- }
- }
- }
-
- public class Region
- {
- public Rectangle RegionArea { get; set; }
- public string RegionName { get; set; }
- public bool DisableBuild { get; set; }
- public string WorldRegionName { get; set; }
- public List RegionAllowedIPs = new List();
-
- public Region(Rectangle region, string name, bool disablebuild, string worldname)
- {
- RegionArea = region;
- RegionName = name;
- DisableBuild = disablebuild;
- WorldRegionName = worldname;
- }
-
- public Region()
- {
- RegionArea = Rectangle.Empty;
- RegionName = string.Empty;
- DisableBuild = true;
- WorldRegionName = string.Empty;
- }
- }
-}
diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs
index 73914e8c..2c6410ce 100755
--- a/TShockAPI/TShock.cs
+++ b/TShockAPI/TShock.cs
@@ -47,6 +47,8 @@ namespace TShockAPI
public static WarpManager Warps;
public static RegionManager Regions;
public static BackupManager Backups;
+ public static GroupManager Groups;
+ public static UserManager Users;
public static ConfigFile Config { get; set; }
@@ -114,6 +116,8 @@ namespace TShockAPI
Bans = new BanManager(DB);
Warps = new WarpManager(DB);
Regions = new RegionManager(DB);
+ Groups = new GroupManager(DB);
+ Users = new UserManager(DB);
Log.ConsoleInfo(string.Format("TShock Version {0} ({1}) now running.", Version, VersionCodename));
@@ -270,7 +274,7 @@ namespace TShockAPI
private void OnJoin(int ply, HandledEventArgs handler)
{
var player = new TSPlayer(ply);
- player.Group = Tools.GetGroupForIP(player.IP);
+ player.Group = TShock.Users.GetGroupForIP(player.IP);
if (Tools.ActivePlayers() + 1 > TShock.Config.MaxSlots && !player.Group.HasPermission("reservedslot"))
{
@@ -294,8 +298,6 @@ namespace TShockAPI
}
Players[ply] = player;
-
-
}
private void OnLeave(int ply)
diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj
index beca9b7b..21cd8e28 100644
--- a/TShockAPI/TShockAPI.csproj
+++ b/TShockAPI/TShockAPI.csproj
@@ -78,6 +78,7 @@
+
@@ -88,7 +89,7 @@
-
+
True
diff --git a/TShockAPI/Tools.cs b/TShockAPI/Tools.cs
index 5963829c..e120064b 100755
--- a/TShockAPI/Tools.cs
+++ b/TShockAPI/Tools.cs
@@ -533,90 +533,6 @@ namespace TShockAPI
return new Group("null");
}
- ///
- /// Returns a Group for a ip from users.txt
- ///
- /// string ip
- public static Group GetGroupForIP(string ip)
- {
- ip = GetRealIP(ip);
-
- StreamReader sr = new StreamReader(FileTools.UsersPath);
- string data = sr.ReadToEnd();
- data = data.Replace("\r", "");
- string[] lines = data.Split('\n');
-
- for (int i = 0; i < lines.Length; i++)
- {
- string[] args = lines[i].Split(' ');
- if (args.Length < 2)
- {
- continue;
- }
- if (args[0].Contains(":"))
- {
- continue;
- }
- if (lines[i].StartsWith("#"))
- {
- continue;
- }
- try
- {
- var hi = GetIPv4Address(args[0]);
- if (GetIPv4Address(args[0]).Equals(ip))
- return GetGroup(args[1]);
- }
- catch (Exception ex)
- { Log.Error(ex.ToString()); }
- }
- sr.Close();
- return GetGroup("default");
- }
- ///
- /// Fetches the hashed password and group for a given username
- ///
- /// string username
- /// string[] {password, group}
- public static string[] FetchHashedPasswordAndGroup(string username)
- {
-
- StreamReader sr = new StreamReader(FileTools.UsersPath);
- string data = sr.ReadToEnd();
- data = data.Replace("\r", "");
- string[] lines = data.Split('\n');
- string[] result = {"null", "null"};
-
- for (int i = 0; i < lines.Length; i++)
- {
- string[] args = lines[i].Split(' ');
- if (args.Length < 2)
- {
- continue;
- }
- if (lines[i].StartsWith("#"))
- {
- continue;
- }
- if (!lines[i].Contains(":"))
- {
- continue;
- }
- try
- {
- if (args[0].Split(':')[0].ToLower() == username.ToLower())
- {
- result = new string[] {args[0].Split(':')[1], args[1]};
- return result;
- }
- }
- catch (Exception ex)
- { Log.Error(ex.ToString()); }
- }
- sr.Close();
- return result;
- }
-
///
/// Returns an IPv4 address from a DNS query
///