From 1d11cee5201a7f07657540e938987bbcd0712424 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 3 Nov 2024 14:10:43 -0500 Subject: [PATCH] admin panel work --- EpinelPS/Controllers/AccountController.cs | 10 +- .../{ => AdminPanel}/AdminController.cs | 21 ++-- .../Controllers/AdminPanel/UsersController.cs | 102 ++++++++++++++++++ EpinelPS/Views/Admin/Configuration.cshtml | 8 ++ EpinelPS/Views/Admin/Database.cshtml | 8 ++ EpinelPS/Views/Admin/Events.cshtml | 8 ++ EpinelPS/Views/Admin/Mail.cshtml | 8 ++ EpinelPS/Views/Admin/users.cshtml | 8 -- EpinelPS/Views/Shared/_Layout.cshtml | 2 +- EpinelPS/Views/Users/Delete.cshtml | 57 ++++++++++ EpinelPS/Views/Users/Index.cshtml | 46 ++++++++ EpinelPS/Views/Users/Modify.cshtml | 45 ++++++++ EpinelPS/Views/Users/SetPassword.cshtml | 30 ++++++ 13 files changed, 330 insertions(+), 23 deletions(-) rename EpinelPS/Controllers/{ => AdminPanel}/AdminController.cs (72%) create mode 100644 EpinelPS/Controllers/AdminPanel/UsersController.cs create mode 100644 EpinelPS/Views/Admin/Configuration.cshtml create mode 100644 EpinelPS/Views/Admin/Database.cshtml create mode 100644 EpinelPS/Views/Admin/Events.cshtml create mode 100644 EpinelPS/Views/Admin/Mail.cshtml delete mode 100644 EpinelPS/Views/Admin/users.cshtml create mode 100644 EpinelPS/Views/Users/Delete.cshtml create mode 100644 EpinelPS/Views/Users/Index.cshtml create mode 100644 EpinelPS/Views/Users/Modify.cshtml create mode 100644 EpinelPS/Views/Users/SetPassword.cshtml diff --git a/EpinelPS/Controllers/AccountController.cs b/EpinelPS/Controllers/AccountController.cs index 85f8f77..1e30676 100644 --- a/EpinelPS/Controllers/AccountController.cs +++ b/EpinelPS/Controllers/AccountController.cs @@ -83,7 +83,15 @@ namespace EpinelPS.Controllers } } - var user = new User() { ID = uid, Password = req.password, RegisterTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), Username = req.account, PlayerName = "Player_" + Rng.RandomString(8) }; + var user = new User() + { + ID = uid, + Password = req.password, + RegisterTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), + Username = req.account, + PlayerName = "Player_" + Rng.RandomString(8), + IsAdmin = JsonDb.Instance.Users.Count == 0 + }; JsonDb.Instance.Users.Add(user); diff --git a/EpinelPS/Controllers/AdminController.cs b/EpinelPS/Controllers/AdminPanel/AdminController.cs similarity index 72% rename from EpinelPS/Controllers/AdminController.cs rename to EpinelPS/Controllers/AdminPanel/AdminController.cs index 6c980a3..84ccd66 100644 --- a/EpinelPS/Controllers/AdminController.cs +++ b/EpinelPS/Controllers/AdminPanel/AdminController.cs @@ -14,9 +14,9 @@ namespace EpinelPS.Controllers _logger = logger; } - private bool CheckAuth() + public static bool CheckAuth(HttpContext context) { - string? token = HttpContext.Request.Cookies["token"]; + string? token = context.Request.Cookies["token"]; if (token == null) return false; @@ -26,45 +26,40 @@ namespace EpinelPS.Controllers } return false; } + [Route("dashboard")] public IActionResult Dashboard() { - if (!CheckAuth()) return Redirect("/admin/"); + if (!CheckAuth(HttpContext)) return Redirect("/admin/"); return View(); } [Route("Events")] public IActionResult Events() { - if (!CheckAuth()) return Redirect("/admin/"); + if (!CheckAuth(HttpContext)) return Redirect("/admin/"); return View(); } [Route("Configuration")] public IActionResult Configuration() { - if (!CheckAuth()) return Redirect("/admin/"); + if (!CheckAuth(HttpContext)) return Redirect("/admin/"); return View(); } - [Route("Users")] - public IActionResult Users() - { - if (!CheckAuth()) return Redirect("/admin/"); - return View(); - } [Route("Mail")] public IActionResult Mail() { - if (!CheckAuth()) return Redirect("/admin/"); + if (!CheckAuth(HttpContext)) return Redirect("/admin/"); return View(); } [Route("Database")] public IActionResult Database() { - if (!CheckAuth()) return Redirect("/admin/"); + if (!CheckAuth(HttpContext)) return Redirect("/admin/"); return View(); } diff --git a/EpinelPS/Controllers/AdminPanel/UsersController.cs b/EpinelPS/Controllers/AdminPanel/UsersController.cs new file mode 100644 index 0000000..eff7d45 --- /dev/null +++ b/EpinelPS/Controllers/AdminPanel/UsersController.cs @@ -0,0 +1,102 @@ +using EpinelPS.Database; +using EpinelPS.Models; +using Microsoft.AspNetCore.Mvc; +using System.Diagnostics; +using System.Security.Cryptography; +using System.Text; + +namespace EpinelPS.Controllers +{ + [Route("admin/Users")] + public class UsersController : Controller + { + private readonly ILogger _logger; + private static MD5 sha = MD5.Create(); + + public UsersController(ILogger logger) + { + _logger = logger; + } + + public IActionResult Index() + { + if (!AdminController.CheckAuth(HttpContext)) return Redirect("/admin/"); + + return View(JsonDb.Instance.Users); + } + + [Route("Modify/{id}")] + public IActionResult Modify(ulong id) + { + if (!AdminController.CheckAuth(HttpContext)) return Redirect("/admin/"); + + if (id == null) + { + return NotFound(); + } + + var user = JsonDb.Instance.Users.Where(x => x.ID == id).FirstOrDefault(); + if (user == null) + { + return NotFound(); + } + + return View(user); + } + + [Route("SetPassword/{id}")] + public IActionResult SetPassword(ulong id) + { + if (!AdminController.CheckAuth(HttpContext)) return Redirect("/admin/"); + + if (id == null) + { + return NotFound(); + } + + var user = JsonDb.Instance.Users.Where(x => x.ID == id).FirstOrDefault(); + if (user == null) + { + return NotFound(); + } + + user.Password = ""; // do not return the password + + return View(user); + } + + + // To protect from overposting attacks, please enable the specific properties you want to bind to, for + // more details see http://go.microsoft.com/fwlink/?LinkId=317598. + [Route("SetPassword")] + [HttpPost, ActionName("SetPassword")] + [ValidateAntiForgeryToken] + public async Task SetPasswordConfirm(ulong? id) + { + if (!AdminController.CheckAuth(HttpContext)) return Redirect("/admin/"); + + if (id == null) + { + return NotFound(); + } + + string? newPw = Request.Form["PasswordHash"]; + if (string.IsNullOrEmpty(newPw)) + { + return BadRequest(); + } + + // TODO: use bcrypt + + var userToUpdate = JsonDb.Instance.Users.Where(s => s.ID == id).FirstOrDefault(); + if (userToUpdate == null) + { + return NotFound(); + } + + userToUpdate.Password = Convert.ToHexString(sha.ComputeHash(Encoding.ASCII.GetBytes(newPw))).ToLower(); ; + + return View(userToUpdate); + } + } +} diff --git a/EpinelPS/Views/Admin/Configuration.cshtml b/EpinelPS/Views/Admin/Configuration.cshtml new file mode 100644 index 0000000..1a4e171 --- /dev/null +++ b/EpinelPS/Views/Admin/Configuration.cshtml @@ -0,0 +1,8 @@ +@{ + ViewData["Title"] = "Configuration"; +} + +
+

Configuration

+

Coming soon!

+
diff --git a/EpinelPS/Views/Admin/Database.cshtml b/EpinelPS/Views/Admin/Database.cshtml new file mode 100644 index 0000000..81ca1e6 --- /dev/null +++ b/EpinelPS/Views/Admin/Database.cshtml @@ -0,0 +1,8 @@ +@{ + ViewData["Title"] = "Database configuration"; +} + +
+

Database configuration

+

Coming soon!

+
diff --git a/EpinelPS/Views/Admin/Events.cshtml b/EpinelPS/Views/Admin/Events.cshtml new file mode 100644 index 0000000..9654638 --- /dev/null +++ b/EpinelPS/Views/Admin/Events.cshtml @@ -0,0 +1,8 @@ +@{ + ViewData["Title"] = "Event configuration"; +} + +
+

Event configuration

+

Coming soon!

+
diff --git a/EpinelPS/Views/Admin/Mail.cshtml b/EpinelPS/Views/Admin/Mail.cshtml new file mode 100644 index 0000000..52ba9af --- /dev/null +++ b/EpinelPS/Views/Admin/Mail.cshtml @@ -0,0 +1,8 @@ +@{ + ViewData["Title"] = "Mail"; +} + +
+

In-game Mail

+

Coming soon!

+
diff --git a/EpinelPS/Views/Admin/users.cshtml b/EpinelPS/Views/Admin/users.cshtml deleted file mode 100644 index 5e8164e..0000000 --- a/EpinelPS/Views/Admin/users.cshtml +++ /dev/null @@ -1,8 +0,0 @@ -@{ - ViewData["Title"] = "Users"; -} - -
-

Users

- -
diff --git a/EpinelPS/Views/Shared/_Layout.cshtml b/EpinelPS/Views/Shared/_Layout.cshtml index e0f802a..8bce6f5 100644 --- a/EpinelPS/Views/Shared/_Layout.cshtml +++ b/EpinelPS/Views/Shared/_Layout.cshtml @@ -26,7 +26,7 @@ Events