aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS.Server.WebAdmin/Program.cs
diff options
context:
space:
mode:
authorMichael <[email protected]>2017-02-12 18:35:15 -0500
committerMichael <[email protected]>2017-02-12 18:35:15 -0500
commitf54f01494101f931b8987e64a65f7bc8f2314d09 (patch)
tree871676195aad4705dbe1679a4e05f8f0d502ae0e /ShiftOS.Server.WebAdmin/Program.cs
parentf5ef64e87d4ec61f630ab28235c4906bfb08a2e1 (diff)
downloadshiftos_thereturn-f54f01494101f931b8987e64a65f7bc8f2314d09.tar.gz
shiftos_thereturn-f54f01494101f931b8987e64a65f7bc8f2314d09.tar.bz2
shiftos_thereturn-f54f01494101f931b8987e64a65f7bc8f2314d09.zip
More admin panel work.
Diffstat (limited to 'ShiftOS.Server.WebAdmin/Program.cs')
-rw-r--r--ShiftOS.Server.WebAdmin/Program.cs370
1 files changed, 337 insertions, 33 deletions
diff --git a/ShiftOS.Server.WebAdmin/Program.cs b/ShiftOS.Server.WebAdmin/Program.cs
index 91e4831..b624ee7 100644
--- a/ShiftOS.Server.WebAdmin/Program.cs
+++ b/ShiftOS.Server.WebAdmin/Program.cs
@@ -45,6 +45,24 @@ namespace ShiftOS.Server.WebAdmin
{
templateParams.Add("{logout}", "<li><a href=\"/mudadmin/logout\">Log out</a></li>");
}
+ if (SystemManager.MudIsRunning())
+ {
+ templateParams.Add("{mud_power}", "<li><a href='/mudadmin/poweroff'><span class='glyphicon glyphicon-power-off'></span> Power off</a></li>");
+ templateParams.Add("{mud_restart}", "<li><a href='/mudadmin/restart'><span class='glyphicon glyphicon-refresh'></span> Restart</a></li>");
+ }
+ else
+ {
+ templateParams.Add("{mud_power}", "<li><a href='/mudadmin/poweron'><span class='glyphicon glyphicon-power-on'></span> Power on</a></li>");
+ templateParams.Add("{mud_restart}", "");
+ }
+
+ if(templateParams["{logout}"] == "")
+ {
+ templateParams["{mud_power}"] = "";
+ templateParams["{mud_restart}"] = "";
+
+ }
+
switch (page)
{
case "status":
@@ -97,23 +115,61 @@ namespace ShiftOS.Server.WebAdmin
public static class SystemManager
{
+ public static bool MudIsRunning()
+ {
+ var processes = System.Diagnostics.Process.GetProcessesByName("ShiftOS.Server");
+ return processes.Length > 0;
+ }
+
+ public static void KillMud()
+ {
+ var processes = System.Diagnostics.Process.GetProcessesByName("ShiftOS.Server");
+ for(int i = 0; i < processes.Length; i++)
+ {
+ try
+ {
+ processes[i].Kill();
+ }
+ catch
+ {
+ }
+ }
+ }
+
public static List<string> GetClaims(string username)
{
- foreach (var user in JsonConvert.DeserializeObject<List<MudUser>>(ShiftOS.Server.Program.ReadEncFile("users.json")))
+ foreach(var save in GetSaves())
{
- if(user.Username == username)
+ if (save.IsMUDAdmin)
{
- return user.Claims;
+ return new List<string> { "User", "Admin" };
}
}
return new List<string>(new[] { "User" });
}
+ public static Save[] GetSaves()
+ {
+ List<Save> saves = new List<Save>();
+ if (Directory.Exists("saves"))
+ {
+ foreach(var saveFile in Directory.GetFiles("saves"))
+ {
+ try
+ {
+ saves.Add(JsonConvert.DeserializeObject<Save>(Server.Program.ReadEncFile(saveFile)));
+ }
+ catch { }
+ }
+ }
+ return saves.ToArray();
+ }
+
public static bool Login(string username, string password, out Guid id)
{
- foreach (var user in JsonConvert.DeserializeObject<List<MudUser>>(ShiftOS.Server.Program.ReadEncFile("users.json")))
+ foreach (var user in GetSaves())
{
- if (user.Username == username && user.Password == Encryption.Encrypt(password))
+ if (user.Username == username && user.Password == password)
{
id = user.ID;
return true;
@@ -184,6 +240,40 @@ namespace ShiftOS.Server.WebAdmin
return new Channel();
}
+ public static string BuildSaveListing(Save[] list)
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.AppendLine("<table class=\"table\">");
+
+ sb.AppendLine(@"<tr>
+ <td><strong>Username</strong></td>
+ <td><strong>System Name</strong></td>
+ <td><strong>Codepoints</strong></td>
+ <td><strong>Shiftorium Upgrades</strong></td>
+ <td><strong>Is MUD Admin</strong></td>
+ <td><strong>Actions</strong></td>
+</tr>");
+
+ foreach(var save in list)
+ {
+ sb.AppendLine($@"<tr>
+ <td>{save.Username}</td>
+ <td>{save.SystemName}</td>
+ <td>{save.Codepoints}</td>
+ <td>{save.CountUpgrades()} installed, {save.Upgrades.Count} total</td>
+ <td>{save.IsMUDAdmin}</td>
+ <td>
+ <a href=""/mudadmin/toggleadmin/{save.ID}"" class=""btn btn-danger"">Toggle admin</a>
+ <a href=""/mudadmin/deletesave/{save.Username}"" class=""btn btn-danger"">Delete save</a>
+ </td>
+</tr>");
+ }
+
+ sb.AppendLine("</table>");
+ return sb.ToString();
+ }
+
+
public static string GetAllChats()
{
StringBuilder sb = new StringBuilder();
@@ -208,15 +298,40 @@ namespace ShiftOS.Server.WebAdmin
<td>{chat.DiscordBotToken}</td>
<td>
<a href=""/mudadmin/editchat/{chat.ID}"" class=""btn btn-default""><span class=""glyphicon glyphicon-pencil""></span>Edit</a>
- <a href=""/mudadmin/deletechat/{chat.ID}"" class=""btn btn-default""><span class=""glyphicon glyphicon-delete""></span>Delete</a>
+ <a href=""#"" class=""btn btn-default"" data-toggle=""modal"" data-target=""#modal_{chat.ID}""><span class=""glyphicon glyphicon-delete""></span> Delete</a>
</td>
</tr>");
+ sb.AppendLine(CreateModal(chat.ID, "Delete " + chat.Name + "?", "Are you sure you want to delete this chat?", "/deletechat/" + chat.ID));
}
}
sb.AppendLine("</table>");
return sb.ToString();
}
+ public static string CreateModal(string id, string title, string msg, string callbackUrl)
+ {
+ return $@"<div id=""modal_{id}"" class=""modal fade"" role=""dialog"">
+ <div class=""modal-dialog"">
+
+ <!-- Modal content-->
+ <div class=""modal-content"">
+ <div class=""modal-header"">
+ <button type=""button"" class=""close"" data-dismiss=""modal"">&times;</button>
+ <h4 class=""modal-title"">{title}</h4>
+ </div>
+ <div class=""modal-body"">
+ <p>{msg}</p>
+ </div>
+ <div class=""modal-footer"">
+ <a href=""/mudadmin{callbackUrl}"" class=""btn btn-danger"">Yes</a>
+ <button type=""button"" class=""btn btn-default"" data-dismiss=""modal"">No</button>
+ </div>
+ </div>
+
+ </div>
+</div>";
+ }
+
public static string GetCPWorth()
{
if (System.IO.Directory.Exists("saves"))
@@ -253,7 +368,7 @@ namespace ShiftOS.Server.WebAdmin
public static MudUserIdentity GetIdentity(Guid id)
{
- foreach (var user in JsonConvert.DeserializeObject<List<MudUser>>(ShiftOS.Server.Program.ReadEncFile("users.json")))
+ foreach (var user in GetSaves())
{
if (user.ID == id)
{
@@ -262,13 +377,50 @@ namespace ShiftOS.Server.WebAdmin
}
return null;
}
+
+ internal static void MakeAdmin(string username)
+ {
+ Save sav = null;
+ foreach(var save in GetSaves())
+ {
+ if (save.Username == username)
+ sav = save;
+ }
+ if(sav != null)
+ {
+ sav.IsMUDAdmin = true;
+ Server.Program.WriteEncFile("saves/" + username + ".save", JsonConvert.SerializeObject(sav));
+ }
+ }
+
+ internal static Save[] GetAdmins()
+ {
+ var saves = new List<Save>();
+ foreach(var save in GetSaves())
+ {
+ if(save.IsMUDAdmin == true)
+ {
+ saves.Add(save);
+ }
+ }
+ return saves.ToArray();
+ }
}
public class MudUser
{
+ [FriendlyName("Username")]
+ [FriendlyDescription("The username you will appear as in-game.")]
public string Username { get; set; }
+
+ [FriendlyName("Password")]
+ [FriendlyDescription("A password that you will use to log in to the admin panel and the game.")]
public string Password { get; set; }
- public List<string> Claims { get; set; }
+
+ [FriendlyName("System name")]
+ [FriendlyDescription("An in-game hostname for your account. In ShiftOS, your user ID is always yourusername@yoursystemname. Be creative.")]
+ public string SystemName { get; set; }
+
public Guid ID { get; set; }
}
@@ -299,18 +451,30 @@ namespace ShiftOS.Server.WebAdmin
{
Get["/login"] = parameters =>
{
- if (System.IO.File.Exists("users.json"))
+ if (SystemManager.GetSaves().Length > 0)
{
- return PageBuilder.Build("login", new Dictionary<string, string>
+ if (SystemManager.GetAdmins().Length > 0)
+ {
+ return PageBuilder.Build("login", new Dictionary<string, string>
{
{"{logout}", "" }
});
+ }
+ else
+ {
+ return PageBuilder.Build("initialsetup", new Dictionary<string, string>
+ {
+ {"{logout}", "" },
+ {"{savelist}", BuildSaveList() }
+ });
+ }
}
else
{
- return PageBuilder.Build("initialsetup", new Dictionary<string, string>
+ return PageBuilder.Build("bla", new Dictionary<string, string>
{
- {"{logout}", "" }
+ {"{body}", Properties.Resources.NoUsersFound },
+ {"{user_create_form}", SystemManager.BuildFormFromObject(new MudUser()) }
});
}
};
@@ -322,54 +486,169 @@ namespace ShiftOS.Server.WebAdmin
Post["/login"] = parameters =>
{
- var p = this.Bind<LoginRequest>();
- Guid id = new Guid();
- if (System.IO.File.Exists("users.json"))
+ if (SystemManager.GetSaves().Length > 0)
{
- if (SystemManager.Login(p.username, p.password, out id) == true)
+ if (SystemManager.GetAdmins().Length == 0)
{
- return this.Login(id);
+ var user = this.Bind<LoginRequest>();
+ SystemManager.MakeAdmin(user.username);
+ Guid id = new Guid();
+ if(SystemManager.Login(user.username, user.password, out id) == true)
+ {
+ return this.Login(id);
+ }
+ return new UserModule().Redirect("/login");
}
else
{
- return PageBuilder.Build("loginFailed", new Dictionary<string, string>
- {
- {"{logout}", "" }
- });
+ var user = this.Bind<LoginRequest>();
+ Guid id = new Guid();
+ if (SystemManager.Login(user.username, user.password, out id) == true)
+ {
+ return this.Login(id);
+ }
+ return new UserModule().Redirect("/login");
}
}
else
{
- var mudUser = new MudUser();
- mudUser.Username = p.username;
- mudUser.Password = Encryption.Encrypt(p.password);
- mudUser.Claims = new List<string>(new[] { "Admin" });
- mudUser.ID = Guid.NewGuid();
- id = mudUser.ID;
- List<MudUser> users = new List<MudUser>(new[] { mudUser });
- ShiftOS.Server.Program.WriteEncFile("users.json", JsonConvert.SerializeObject(users, Formatting.Indented));
- return this.Login(id);
+ var newUser = this.Bind<MudUser>();
+ var save = new Save();
+ save.Username = newUser.Username;
+ save.SystemName = newUser.SystemName;
+ save.Password = newUser.Password;
+ save.Codepoints = 0;
+ save.MyShop = "";
+ save.Upgrades = new Dictionary<string, bool>();
+ save.IsMUDAdmin = true;
+ save.StoryPosition = 1;
+
+ if (!Directory.Exists("saves"))
+ Directory.CreateDirectory("saves");
+ save.ID = Guid.NewGuid();
+
+ Server.Program.WriteEncFile("saves/" + save.Username + ".save", JsonConvert.SerializeObject(save));
+ return this.Login(save.ID);
}
};
}
+
+ private string BuildSaveList()
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.AppendLine("<table class='table'>");
+ sb.AppendLine($@"<tr>
+ <td><strong>Username</strong></td>
+ <td><strong>System name</strong></td>
+ <td><strong>Codepoints</strong></td>
+ <td><strong>Actions</strong></td>
+</tr>");
+
+ foreach(var save in SystemManager.GetSaves())
+ {
+ sb.AppendLine($@"<tr>
+ <td>{save.Username}</td>
+ <td>{save.SystemName}</td>
+ <td>{save.Codepoints}</td>
+ <td><form method='post' action=''>
+ <input type='hidden' name='username' value='{save.Username}'/><input type='hidden' name='password' value='{save.Password}'/>
+ <input type='submit' value='Choose' class='btn btn-default'/>
+ </form></td>
+</tr>");
+ }
+
+ sb.AppendLine("</table>");
+ return sb.ToString();
+ }
}
public class UserModule : NancyModule
{
+ public string Redirect(string url)
+ {
+ return $@"<html>
+ <head>
+ <meta http-equiv=""refresh"" content=""0; url=/mudadmin{url}"" />
+ </ head>
+</html>";
+ }
+
public UserModule()
{
this.RequiresAuthentication();
this.RequiresClaims("Admin");
Get["/"] = _ =>
{
- return statusBuilder();
+ return Redirect("/status");
+ };
+
+ Get["/toggleadmin/{id}"] = parameters =>
+ {
+ string id = parameters.id;
+ for (int i = 0; i < SystemManager.GetSaves().Length; i++)
+ {
+ var save = SystemManager.GetSaves()[i];
+ if(save.ID.ToString() == id)
+ {
+ save.IsMUDAdmin = !save.IsMUDAdmin;
+ Server.Program.WriteEncFile("saves/" + save.Username + ".save", JsonConvert.SerializeObject(save));
+ }
+ }
+ return Redirect("/saves");
+
};
+
+ Get["/deletesave/{username}"] = parameters =>
+ {
+
+
+ string id = parameters.username;
+ for (int i = 0; i < SystemManager.GetSaves().Length; i++)
+ {
+ if (SystemManager.GetSaves()[i].Username.ToString() == id)
+ {
+ File.Delete("saves/" + SystemManager.GetSaves()[i].Username + ".save");
+ }
+ }
+ return Redirect("/saves");
+ };
+
+
+ Get["/saves"] = _ =>
+ {
+ return PageBuilder.Build("bla", new Dictionary<string, string>
+ {
+ { "{body}", Properties.Resources.GenericTableList },
+ { "{listtitle}", "Test subjects" },
+ { "{listdesc}", "Below is a list of test subjects (save files) on your multi-user domain. You can see their username, system name, Codepoints, amount of installed upgrades, and you can also perform basic actions on each save." },
+ { "{list}", SystemManager.BuildSaveListing(SystemManager.GetSaves()) }
+ });
+ };
+
Get["/status"] = _ =>
{
return statusBuilder();
};
+
+ Get["/deletechat/{id}"] = parameters =>
+ {
+ string chatID = parameters.id;
+ var chats = JsonConvert.DeserializeObject<List<Channel>>(File.ReadAllText("chats.json"));
+ for(int i = 0; i < chats.Count; i++)
+ {
+ try
+ {
+ if (chats[i].ID == chatID)
+ chats.RemoveAt(i);
+ }
+ catch { }
+ }
+ File.WriteAllText("chats.json", JsonConvert.SerializeObject(chats, Formatting.Indented));
+ return Redirect("/chats");
+ };
+
Get["/chats"] = _ =>
{
return chatsListBuilder();
@@ -410,7 +689,7 @@ namespace ShiftOS.Server.WebAdmin
File.WriteAllText("chats.json", JsonConvert.SerializeObject(chats, Formatting.Indented));
- return chatsListBuilder();
+ return Redirect("/chats");
};
Get["/editchat/{id}"] = parameters =>
@@ -447,9 +726,34 @@ namespace ShiftOS.Server.WebAdmin
}
File.WriteAllText("chats.json", JsonConvert.SerializeObject(chats, Formatting.Indented));
- return chatsListBuilder();
+ return Redirect("/chats");
+ };
+
+ Get["/poweron"] = _ =>
+ {
+ if (!SystemManager.MudIsRunning())
+ {
+ System.Diagnostics.Process.Start("ShiftOS.Server.exe");
+ }
+ return Redirect("/");
};
+ Get["/poweroff"] = _ =>
+ {
+ if (SystemManager.MudIsRunning())
+ {
+ SystemManager.KillMud();
+ }
+ return Redirect("/");
+ };
+ Get["/restart"] = _ =>
+ {
+ if (SystemManager.MudIsRunning())
+ {
+ SystemManager.KillMud();
+ }
+ return Redirect("/poweron");
+ };
}
private string statusBuilder()