Skip to content

Commit

Permalink
Add "download personal data" button to account admin view
Browse files Browse the repository at this point in the history
  • Loading branch information
PJB3005 committed Jun 15, 2024
1 parent 4895705 commit e421079
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 17 deletions.
10 changes: 7 additions & 3 deletions SS14.Web/Areas/Admin/Pages/Users/ViewUser.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
<label for="patron" class="col-sm-2 col-form-label">Patron tier</label>
<input disabled id="patron" class="form-control col-sm-10" value="@(Model.PatronTier)"/>
</div>

<div class="form-group row">
<div class="col-sm-10 offset-sm-2">
<div class="form-check">
Expand All @@ -83,7 +83,7 @@
</div>
</div>
</div>

<div class="form-group row">
<label asp-for="Input.AdminNotes" class="col-sm-2 col-form-label"></label>
<textarea asp-for="Input.AdminNotes" class="form-control col-sm-10"></textarea>
Expand All @@ -105,7 +105,11 @@
<button id="logout-button" type="submit" asp-page-handler="Logout" asp-route-id="@Model.SpaceUser.Id" class="btn btn-primary btn-sm">Log out all sessions</button>
</form>

<form method="post">
<button id="download-personal-data-button" type="submit" asp-page-handler="DownloadPersonalData" asp-route-id="@Model.SpaceUser.Id" class="btn btn-primary btn-sm">Download personal data</button>
</form>


@section Scripts {
<partial name="_ValidationScriptsPartial"/>
}
}
47 changes: 33 additions & 14 deletions SS14.Web/Areas/Admin/Pages/Users/ViewUser.cshtml.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.Net.Mime;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
Expand All @@ -22,6 +24,7 @@ public class ViewUser : PageModel
private readonly ApplicationDbContext _dbContext;
private readonly RoleManager<SpaceRole> _roleManager;
private readonly AccountLogManager _accountLogManager;
private readonly PersonalDataCollector _personalDataCollector;

public SpaceUser SpaceUser { get; set; }

Expand All @@ -30,7 +33,7 @@ public class ViewUser : PageModel
[BindProperty] public InputModel Input { get; set; }

public string PatronTier { get; set; }

public class InputModel
{
[EmailAddress]
Expand All @@ -43,9 +46,9 @@ public class InputModel

[Display(Name = "Is Auth Hub Admin?")] public bool HubAdmin { get; set; }
[Display(Name = "Is Server Hub Admin?")] public bool ServerHubAdmin { get; set; }

[Display(Name = "2FA enabled?")] public bool TfaEnabled { get; set; }

[Display(Name = "Locked?")]
public bool AdminLocked { get; set; }

Expand All @@ -54,13 +57,14 @@ public class InputModel
}

public ViewUser(
SpaceUserManager userManager,
SpaceUserManager userManager,
IEmailSender emailSender,
SessionManager sessionManager,
PatreonDataManager patreonDataManager,
ApplicationDbContext dbContext,
RoleManager<SpaceRole> roleManager,
AccountLogManager accountLogManager)
AccountLogManager accountLogManager,
PersonalDataCollector personalDataCollector)
{
_userManager = userManager;
_emailSender = emailSender;
Expand All @@ -69,6 +73,7 @@ public ViewUser(
_dbContext = dbContext;
_roleManager = roleManager;
_accountLogManager = accountLogManager;
_personalDataCollector = personalDataCollector;
}

public async Task<IActionResult> OnGetAsync(Guid id)
Expand All @@ -87,14 +92,14 @@ public async Task<IActionResult> OnGetAsync(Guid id)

public async Task<IActionResult> OnPostSaveAsync(Guid id)
{
await using var tx = await _dbContext.Database.BeginTransactionAsync();
await using var tx = await _dbContext.Database.BeginTransactionAsync();

var actor = await _userManager.GetUserAsync(User);
SpaceUser = await _userManager.FindByIdAsync(id.ToString());

// Field becomes null if empty.
Input.AdminNotes ??= "";

if (SpaceUser == null)
{
return NotFound("That user does not exist!");
Expand All @@ -117,7 +122,7 @@ public async Task<IActionResult> OnPostSaveAsync(Guid id)
await _accountLogManager.LogNameChanged(SpaceUser, SpaceUser.UserName, Input.Username);
SpaceUser.UserName = Input.Username;
}

if (SpaceUser.EmailConfirmed != Input.EmailConfirmed)
{
await _accountLogManager.Log(SpaceUser, new AccountLogEmailConfirmedChanged(Input.EmailConfirmed));
Expand All @@ -129,7 +134,7 @@ public async Task<IActionResult> OnPostSaveAsync(Guid id)
await _accountLogManager.Log(SpaceUser, new AccountLogAdminNotesChanged(Input.AdminNotes));
SpaceUser.AdminNotes = Input.AdminNotes;
}

if (SpaceUser.AdminLocked != Input.AdminLocked)
{
await _accountLogManager.Log(SpaceUser, new AccountLogAdminLockedChanged(Input.AdminLocked));
Expand All @@ -156,7 +161,7 @@ async Task CheckRole(bool set, string roleName)
{
var role = await _roleManager.FindByNameAsync(roleName);
var roleGuid = Guid.Parse(await _roleManager.GetRoleIdAsync(role));

if (set)
{
await _userManager.AddToRoleAsync(SpaceUser, roleName);
Expand All @@ -181,7 +186,7 @@ public async Task<IActionResult> OnPostResendConfirmationAsync(Guid id)
{
return NotFound("That user does not exist!");
}

var code = await _userManager.GenerateEmailConfirmationTokenAsync(SpaceUser);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var confirmLink = Url.Page(
Expand Down Expand Up @@ -217,7 +222,7 @@ public async Task<IActionResult> OnPostLogoutAsync(Guid id)
await _userManager.UpdateSecurityStampAsync(SpaceUser);

StatusMessage = "All sessions logged out";

return RedirectToPage(new {id});
}

Expand All @@ -237,4 +242,18 @@ private async Task LoadAsync()

PatronTier = await _patreonDataManager.GetPatreonTierAsync(SpaceUser);
}
}

public async Task<IActionResult> OnPostDownloadPersonalDataAsync(Guid id, CancellationToken cancel)
{
SpaceUser = await _userManager.FindByIdAsync(id.ToString());

if (SpaceUser == null)
{
return NotFound("That user does not exist!");
}

var data = await _personalDataCollector.CollectPersonalData(SpaceUser, cancel);
Response.Headers.Add("Content-Disposition", $"attachment; filename={SpaceUser.UserName}-PersonalData.zip");
return new FileStreamResult(data, MediaTypeNames.Application.Zip);
}
}

0 comments on commit e421079

Please sign in to comment.