Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions FactorioWebInterface/Pages/Admin/AccountOverview.cshtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
@page
@model FactorioWebInterface.Pages.Admin.AccountOverviewModel
@{
ViewData["Title"] = "Account Overview";
}

@section Scripts {
@await Html.PartialAsync("_ValidationScriptsPartial")
}

<div class="container">

<h2 class="title is-2">Account Overview</h2>

<div class="columns">
<div class="column is-4">
<form method="post">
<h4 class="title is-4">Create User</h4>
<hr />
<div asp-validation-summary="All" class="has-text-danger"></div>
<div class="field">
<label asp-for="Input.UserName" class="label"></label>
<div class="control">
<input asp-for="Input.UserName" class="input" />
</div>
<span asp-validation-for="Input.UserName" class="help is-danger"></span>
</div>
<div class="field">
<label asp-for="Input.Roles" class="label"></label>
<div class="control">
@for (var i = 0; i < Model.Input.Roles.Count(); i++)
{
<input asp-for="Input.Roles[i].IsSelected" type="checkbox" checked="@await Model.IsInRole(Model.Input.User, Model.Input.Roles[i].Role)" /> @Model.Input.Roles[i].Role<br />
}
</div>
<span asp-validation-for="Input.Roles" class="help is-danger"></span>
</div>
<button type="submit" asp-page-handler="UpdateAccount" class="button is-link">Update account</button>
</form>
<hr />
<form method="post">
<button type="submit" asp-page-handler="ResetPassword" class="button is-link">Reset password</button>
</form>

@if (Model.GeneratedPassword != null && Model.GeneratedPassword.Length > 0)
{
<hr />
<p>New password generated:</p>
<br />
<p>@Model.GeneratedPassword</p>
<br />
<p>Please advice recipient to change password ASAP</p>
}
</div>
</div>
</div>


198 changes: 198 additions & 0 deletions FactorioWebInterface/Pages/Admin/AccountOverview.cshtml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
using FactorioWebInterface.Data;
using FactorioWebInterface.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace FactorioWebInterface.Pages.Admin
{
//[Authorize(Roles = Constants.AdminRole + Constants.RootRole) ]
public class AccountOverviewModel : PageModel
{
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly IWebAccountManager _accountManager;
private readonly ILogger<AccountModel> _logger;

public AccountOverviewModel(
IWebAccountManager accountManager,
SignInManager<ApplicationUser> signInManager,
ILogger<AccountModel> logger
)
{
_accountManager = accountManager;
_signInManager = signInManager;
_logger = logger;
}

public ApplicationUser ManagingUser { get; set; }
public string? GeneratedPassword { get; set; }

public class AccountRole
{
public string Role { get; set; }

public bool IsSelected { get; set; } = false;
}

[BindProperty]
public InputModel Input { get; set; } = default!;

public class InputModel
{
public ApplicationUser User { get; set; } = default!;

[DataType(DataType.Text)]
[Display(Name = "Username")]
public string UserName { get; set; } = default!;

[Display(Name = "Select role")]
public List<AccountRole> Roles { get; } = GenerateAccountRoleList();

private static List<AccountRole> GenerateAccountRoleList()
{
var adminRole = new AccountRole
{
Role = Constants.AdminRole
};
var rootRole = new AccountRole
{
Role = Constants.RootRole
};
return new List<AccountRole>() { adminRole, rootRole };
}
}

public async Task<bool> IsInRole(ApplicationUser user, string role)
{
return await _accountManager.IsInRoleAsync(user, role);
}

public async Task<IActionResult> OnGetAsync(string userId, string generatedPassword)
{
var user = await _accountManager.GetUserAsync(User);

if (user == null || user.Suspended)
{
HttpContext.Session.SetString("returnUrl", "account");
return RedirectToPage("signIn");
}

ManagingUser = await _accountManager.FindByIdAsync(userId);

GeneratedPassword = generatedPassword;

return Page();
}

public async Task<IActionResult> OnPostAsync(string userId)
{
var user = await _accountManager.GetUserAsync(User);
if (user == null || user.Suspended)
{
HttpContext.Session.SetString("returnUrl", "accountoverview");
return RedirectToPage("signIn");
}

ManagingUser = await _accountManager.FindByIdAsync(userId);

return Page();
}

private void PopulateInputModel(ApplicationUser user)
{
Input.User = user;
Input.UserName = user.UserName;
}

public async Task<IActionResult> OnPostUpdateAccountAsync()
{

var user = await _accountManager.GetUserAsync(User);

if (user == null || user.Suspended)
{
HttpContext.Session.SetString("returnUrl", "account");
return RedirectToPage("signIn");
}

if (!ModelState.IsValid)
{
return Page();
}

if (Input.UserName != Input.User.UserName)
{
await _accountManager.ChangeUsernameAsync(Input.User, Input.UserName);
}
foreach (var role in Input.Roles)
{
var inRole = await _accountManager.IsInRoleAsync(Input.User, role.Role);
if (role.IsSelected && inRole)
{
break;
}

if (role.IsSelected && !inRole)
{
var result = await _accountManager.AddRoleAsync(Input.User, role.Role);
if (!result.Succeeded)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}

return Page();
}
break;
}

if (!role.IsSelected && inRole)
{
var result = await _accountManager.RemoveRoleAsync(Input.User, role.Role);
if (!result.Succeeded)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}

return Page();
}
}
}

_logger.LogInformation($"The account {UserName} has been updated");

return RedirectToPage(new {UserId = Input.User.Id, PasswordReset = false});
}

public async Task<IActionResult> OnPostResetPasswordAsync()
{
var user = await _accountManager.GetUserAsync(User);

if (user == null || user.Suspended)
{
HttpContext.Session.SetString("returnUrl", "account");
return RedirectToPage("signIn");
}

if (!ModelState.IsValid)
{
return Page();
}

var password = await _accountManager.ResetPasswordAsync(user);

_logger.LogInformation($"User {user.UserName} changed password");

return RedirectToPage(new { Password = true });
}
}
}
64 changes: 64 additions & 0 deletions FactorioWebInterface/Pages/Admin/CreateAccount.cshtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
@page
@model FactorioWebInterface.Pages.Admin.CreateAccountModel
@{
ViewData["Title"] = "Create New Account";
}

@section Scripts {
@await Html.PartialAsync("_ValidationScriptsPartial")
}

<div class="container">

<h2 class="title is-2">Create New Account</h2>

<div class="columns">
<div class="column is-4">
<form method="post">
<h4 class="title is-4">Create User</h4>
<hr />
<div asp-validation-summary="All" class="has-text-danger"></div>
<div class="field">
<label asp-for="Input.UserName" class="label"></label>
<div class="control">
<input asp-for="Input.UserName" class="input" />
</div>
<span asp-validation-for="Input.UserName" class="help is-danger"></span>
</div>
<div class="field">
<label asp-for="Input.Password" class="label"></label>
<div class="control">
<input asp-for="Input.Password" class="input" />
</div>
<span asp-validation-for="Input.Password" class="help is-danger"></span>
</div>
<div class="field">
<label asp-for="Input.ConfirmPassword" class="label"></label>
<div class="control">
<input asp-for="Input.ConfirmPassword" class="input" />
</div>
<span asp-validation-for="Input.ConfirmPassword" class="help is-danger"></span>
</div>
<div class="field">
<label asp-for="Input.Role" class="label"></label>
<div class="control">
@foreach (var item in Model.Roles)
{
<input asp-for="Input.Role" type="radio" value="@item" /> @item
}
</div>
<span asp-validation-for="Input.Role" class="help is-danger"></span>
</div>
<button type="submit" asp-page-handler="CreateAccount" class="button is-link">Create new account</button>
</form>

@if (Model.AccountCreated)
{
<hr />
<p>Account created</p>
}
</div>
</div>
</div>


Loading