From 4a345bff2cb768bb2d439df79221b6fa29d41c06 Mon Sep 17 00:00:00 2001 From: Jared Goodwin Date: Mon, 24 Feb 2020 23:19:58 -0800 Subject: [PATCH] Change organization management to use Razor Pages model binding. New accounts are created in current organization. --- .../API/OrganizationManagementController.cs | 103 +++++++++++------- .../Pages/Account/Manage/Options.cshtml | 8 +- .../Pages/Account/Manage/Organization.cshtml | 70 ++++++------ .../Account/Manage/Organization.cshtml.cs | 99 ++++++++++++++++- Server/Services/DataService.cs | 15 ++- .../scripts/Pages/OrganizationManagement.js | 60 +--------- .../Pages/OrganizationManagement.js.map | 2 +- .../scripts/Pages/OrganizationManagement.ts | 60 +--------- Shared/ViewModels/Organization/Invite.cs | 1 - 9 files changed, 220 insertions(+), 198 deletions(-) diff --git a/Server/API/OrganizationManagementController.cs b/Server/API/OrganizationManagementController.cs index 409485ef..0fdffef9 100644 --- a/Server/API/OrganizationManagementController.cs +++ b/Server/API/OrganizationManagementController.cs @@ -73,22 +73,24 @@ namespace Remotely.Server.API return Ok("ok"); } - [HttpPut("Name")] + [HttpDelete("DeleteUser/{userID}")] [ServiceFilter(typeof(ApiAuthorizationFilter))] - public IActionResult Name([FromBody]string organizationName) + public async Task DeleteUser(string userID) { if (User.Identity.IsAuthenticated && !DataService.GetUserByName(User.Identity.Name).IsAdministrator) { return Unauthorized(); } - if (organizationName.Length > 25) + + if (User.Identity.IsAuthenticated && + DataService.GetUserByName(User.Identity.Name).Id == userID) { - return BadRequest(); + return BadRequest("You can't delete yourself here. You must go to the Personal Data page to delete your own account."); } Request.Headers.TryGetValue("OrganizationID", out var orgID); - DataService.UpdateOrganizationName(orgID, organizationName.Trim()); + await DataService.RemoveUserFromOrganization(orgID, userID); return Ok("ok"); } @@ -131,27 +133,55 @@ namespace Remotely.Server.API return Ok(deviceGroupID); } - [HttpDelete("DeleteUser/{userID}")] + [HttpGet("GenerateResetUrl")] [ServiceFilter(typeof(ApiAuthorizationFilter))] - public async Task DeleteUser(string userID) + public async Task GenerateResetUrl(string userEmail) + { + if (User.Identity.IsAuthenticated && + !DataService.GetUserByName(User.Identity.Name).IsAdministrator) + { + return Unauthorized(); + } + + Request.Headers.TryGetValue("OrganizationID", out var orgID); + + var user = await UserManager.FindByEmailAsync(userEmail); + + if (user.OrganizationID != orgID) + { + return Unauthorized(); + } + + var code = await UserManager.GeneratePasswordResetTokenAsync(user); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + var callbackUrl = Url.Page( + "/Account/ResetPassword", + pageHandler: null, + values: new { area = "Identity", code }, + protocol: Request.Scheme); + + return Ok(callbackUrl); + + } + + [HttpPut("Name")] + [ServiceFilter(typeof(ApiAuthorizationFilter))] + public IActionResult Name([FromBody]string organizationName) { if (User.Identity.IsAuthenticated && !DataService.GetUserByName(User.Identity.Name).IsAdministrator) { return Unauthorized(); } - - if (User.Identity.IsAuthenticated && - DataService.GetUserByName(User.Identity.Name).Id == userID) + if (organizationName.Length > 25) { - return BadRequest("You can't delete yourself here. You must go to the Personal Data page to delete your own account."); + return BadRequest(); } Request.Headers.TryGetValue("OrganizationID", out var orgID); - await DataService.RemoveUserFromOrganization(orgID, userID); + DataService.UpdateOrganizationName(orgID, organizationName.Trim()); return Ok("ok"); } - [HttpPost("SendInvite")] [ServiceFilter(typeof(ApiAuthorizationFilter))] public async Task SendInvite([FromBody]Invite invite) @@ -166,54 +196,49 @@ namespace Remotely.Server.API return BadRequest(); } - var newUserMessage = ""; + Request.Headers.TryGetValue("OrganizationID", out var orgID); + + if (!DataService.DoesUserExist(invite.InvitedUser)) - { - var user = new RemotelyUser { UserName = invite.InvitedUser, Email = invite.InvitedUser }; + { + var user = new RemotelyUser { UserName = invite.InvitedUser, Email = invite.InvitedUser, OrganizationID = orgID }; var result = await UserManager.CreateAsync(user); if (result.Succeeded) { + if (!DataService.SetNewUserProperties(user.UserName, orgID, invite.IsAdmin)) + { + return BadRequest(); + } + + user = await UserManager.FindByEmailAsync(invite.InvitedUser); await UserManager.ConfirmEmailAsync(user, await UserManager.GenerateEmailConfirmationTokenAsync(user)); - var code = await UserManager.GeneratePasswordResetTokenAsync(user); - code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); - var callbackUrl = Url.Page( - "/Account/ResetPassword", - pageHandler: null, - values: new { area = "Identity", code }, - protocol: Request.Scheme); - - invite.ResetUrl = callbackUrl; - - newUserMessage = $@"

Since you don't have an account yet, one has been created for you. - You will need to set a password first before attempting to join the organization.

- Set your password by clicking here. Your username/email - is {invite.InvitedUser}."; + return Ok(); } else { return BadRequest("There was an issue creating the new account."); } } + else + { + var newInvite = DataService.AddInvite(orgID, invite); - Request.Headers.TryGetValue("OrganizationID", out var orgID); - - var newInvite = DataService.AddInvite(orgID, invite); - - var inviteURL = $"{Request.Scheme}://{Request.Host}/Invite?id={newInvite.ID}"; - await EmailSender.SendEmailAsync(invite.InvitedUser, "Invitation to Organization in Remotely", - $@" + var inviteURL = $"{Request.Scheme}://{Request.Host}/Invite?id={newInvite.ID}"; + await EmailSender.SendEmailAsync(invite.InvitedUser, "Invitation to Organization in Remotely", + $@"

Hello!

You've been invited to join an organization in Remotely. - {newUserMessage}

You can join the organization by clicking here."); - return Ok(newInvite); + return Ok(); + } + } } } diff --git a/Server/Areas/Identity/Pages/Account/Manage/Options.cshtml b/Server/Areas/Identity/Pages/Account/Manage/Options.cshtml index b28c4801..e2798ffa 100644 --- a/Server/Areas/Identity/Pages/Account/Manage/Options.cshtml +++ b/Server/Areas/Identity/Pages/Account/Manage/Options.cshtml @@ -7,13 +7,7 @@
- @if (!string.IsNullOrWhiteSpace(Model.Message)) - { - - } +
diff --git a/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml b/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml index 4061405d..77687aa7 100644 --- a/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml +++ b/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml @@ -12,6 +12,10 @@ @if (isAdmin) { + + +
+
@* Organization ID *@ @@ -73,25 +77,28 @@ User Name Administrator + Reset Password Remove @for (var i = 0; i < Model.Users.Count; i++) { - - - @if (currentUser.Id == Model.Users[i].ID) - { - @Html.CheckBoxFor(x => x.Users[i].IsAdmin, new { user = Model.Users[i].ID, @class = "user-is-admin-checkbox", disabled = "disabled" }) - - } - else - { - @Html.CheckBoxFor(x => x.Users[i].IsAdmin, new { user = Model.Users[i].ID, @class = "user-is-admin-checkbox" }) - - } - + + + @if (currentUser.Id == Model.Users[i].ID) + { + @Html.CheckBoxFor(x => x.Users[i].IsAdmin, new { user = Model.Users[i].ID, @class = "user-is-admin-checkbox", disabled = "disabled" }) + + + } + else + { + @Html.CheckBoxFor(x => x.Users[i].IsAdmin, new { user = Model.Users[i].ID, @class = "user-is-admin-checkbox" }) + + + } + } @@ -120,15 +127,10 @@ { - @Html.CheckBoxFor(x => x.Invites[i].IsAdmin, new { disabled = "disabled" }) + @Html.CheckBoxFor(x => x.Invites[i].IsAdmin, new { disabled = "disabled" }) @@ -144,22 +146,26 @@ @* Send Invites *@
-
-
- -
- Admin? -
-
-
- +
+ +
+
+ +
+ Admin? +
+
+
+ +
+
+
+
-
- -
-
+ +
diff --git a/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs b/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs index d4492f87..bb9a0e5e 100644 --- a/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs +++ b/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs @@ -8,14 +8,21 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using Remotely.Shared.ViewModels.Organization; using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using System.Text.Encodings.Web; +using Microsoft.AspNetCore.Identity.UI.Services; +using System; namespace Remotely.Server.Areas.Identity.Pages.Account.Manage { public class OrganizationModel : PageModel { - public OrganizationModel(DataService dataService) + public OrganizationModel(DataService dataService, UserManager userManager, IEmailSender emailSender) { DataService = dataService; + UserManager = userManager; + EmailSender = emailSender; } public List DeviceGroups { get; } = new List(); @@ -29,8 +36,31 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage [Display(Name = "Users")] public List Users { get; set; } + public class InputModel + { + public bool IsAdmin { get; set; } + + [EmailAddress] + public string UserEmail { get; set; } + } + + [BindProperty] + public InputModel Input { get; set; } = new InputModel(); + + [TempData] + public string StatusMessage { get; set; } + private DataService DataService { get; } + + private UserManager UserManager { get; } + private IEmailSender EmailSender { get; } + public void OnGet() + { + PopulateViewModel(); + } + + private void PopulateViewModel() { OrganizationName = DataService.GetOrganizationName(User.Identity.Name); @@ -50,10 +80,73 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage ID = x.ID, InvitedUser = x.InvitedUser, IsAdmin = x.IsAdmin, - DateSent = x.DateSent, - ResetUrl = x.ResetUrl + DateSent = x.DateSent }).ToList(); } + + public async Task OnPostSendInviteAsync() + { + var currentUser = await UserManager.FindByEmailAsync(User.Identity.Name); + if (!currentUser.IsAdministrator) + { + return RedirectToPage("Index"); + } + + if (ModelState.IsValid) + { + if (!DataService.DoesUserExist(Input.UserEmail)) + { + var user = new RemotelyUser { UserName = Input.UserEmail, Email = Input.UserEmail }; + var result = await UserManager.CreateAsync(user); + if (result.Succeeded) + { + if (!DataService.SetNewUserProperties(user.UserName, currentUser.OrganizationID, Input.IsAdmin)) + { + ModelState.AddModelError("OrgID", "Failed to set organization ID."); + return Page(); + } + + user = await UserManager.FindByEmailAsync(Input.UserEmail); + + + await UserManager.ConfirmEmailAsync(user, await UserManager.GenerateEmailConfirmationTokenAsync(user)); + + StatusMessage = "User account created."; + return RedirectToPage(); + } + else + { + ModelState.AddModelError("CreateUser", "Failed to create user account."); + return Page(); + } + } + else + { + + var invite = new Invite() + { + InvitedUser = Input.UserEmail, + IsAdmin = Input.IsAdmin + }; + var newInvite = DataService.AddInvite(currentUser.OrganizationID, invite); + + var inviteURL = $"{Request.Scheme}://{Request.Host}/Invite?id={newInvite.ID}"; + await EmailSender.SendEmailAsync(invite.InvitedUser, "Invitation to Organization in Remotely", + $@" +

+ Hello! +

+ You've been invited to join an organization in Remotely. +

+ You can join the organization by clicking here."); + + StatusMessage = "Invitation sent."; + + return RedirectToPage(); + } + } + return Page(); + } } } \ No newline at end of file diff --git a/Server/Services/DataService.cs b/Server/Services/DataService.cs index 22c5198f..152d7609 100644 --- a/Server/Services/DataService.cs +++ b/Server/Services/DataService.cs @@ -82,8 +82,7 @@ namespace Remotely.Server.Services InvitedUser = invite.InvitedUser, IsAdmin = invite.IsAdmin, Organization = organization, - OrganizationID = organization.ID, - ResetUrl = invite.ResetUrl + OrganizationID = organization.ID }; organization.InviteLinks.Add(newInvite); RemotelyContext.SaveChanges(); @@ -106,6 +105,18 @@ namespace Remotely.Server.Services RemotelyContext.SaveChanges(); } + public bool SetNewUserProperties(string targetName, string organizationID, bool isAdmin) + { + var targetUser = GetUserByName(targetName); + + targetUser.OrganizationID = organizationID; + targetUser.IsAdministrator = isAdmin; + + RemotelyContext.SaveChanges(); + + return true; + } + public bool AddOrUpdateDevice(Device device, out Device updatedDevice) { device.LastOnline = DateTime.Now; diff --git a/Server/wwwroot/scripts/Pages/OrganizationManagement.js b/Server/wwwroot/scripts/Pages/OrganizationManagement.js index d06965d2..95f4394b 100644 --- a/Server/wwwroot/scripts/Pages/OrganizationManagement.js +++ b/Server/wwwroot/scripts/Pages/OrganizationManagement.js @@ -1,15 +1,14 @@ -import { ShowModal, ValidateInput, PopupMessage } from "../UI.js"; +import { ShowModal } from "../UI.js"; document.getElementById("usersHelpButton").addEventListener("click", (ev) => { ShowModal("Users", `All users for the organization are managed here.

Administrators will have access to this management screen as well as all computers.`); }); document.getElementById("invitesHelpButton").addEventListener("click", (ev) => { ShowModal("Invitations", `All pending invitations will be shown here and can be revoked by deleting them.

- If a user does not exist, sending an invite will create their account and send them a password reset email too. - The password reset must be completed before accepting the invitation. + If a user does not exist, sending an invite will create their account and add them to the current organization. + A password reset URL can be generated from the user table.

- The Admin checkbox determines if the new user will have administrator privileges in this organization - after they accept the invitation.`); + The Admin checkbox determines if the new user will have administrator privileges in this organization.`); }); document.getElementById("deviceGroupHelpButton").addEventListener("click", (ev) => { ShowModal("Device Groups", `Device groups can be used to organize and filter computers on the grid.`); @@ -148,57 +147,6 @@ document.querySelectorAll(".delete-user-button").forEach((removeButton) => { } }); }); -document.getElementById("sendInviteButton").addEventListener("click", (ev) => { - var inviteUserInput = document.querySelector("#inviteUserInput"); - if (!ValidateInput(inviteUserInput)) { - return; - } - var invitedUser = inviteUserInput.value; - inviteUserInput.value = ""; - var isAdmin = document.getElementById("inviteIsAdmin").checked; - var xhr = new XMLHttpRequest(); - xhr.onload = () => { - if (xhr.status == 200) { - var newInvite = JSON.parse(xhr.responseText); - var tbody = document.querySelector("#invitesTable tbody"); - var newRow = document.createElement("tr"); - newRow.setAttribute("invite", newInvite.ID); - var innerHtml = ` - - - - `; - newRow.innerHTML = innerHtml; - tbody.appendChild(newRow); - newRow.querySelector(".delete-invite-button").addEventListener("click", (ev) => { - deleteInvite(ev); - }); - } - else if (xhr.status == 400) { - ShowModal("Invalid Request", xhr.responseText); - } - else { - showError(xhr); - } - }; - xhr.onerror = () => { - showError(xhr); - }; - xhr.open("post", location.origin + `/api/OrganizationManagement/SendInvite/`); - xhr.setRequestHeader("Content-Type", "application/json"); - xhr.send(JSON.stringify({ InvitedUser: invitedUser, IsAdmin: isAdmin })); - PopupMessage("Sending invite..."); -}); -document.getElementById("inviteUserInput").addEventListener("keypress", (e) => { - if (e.key.toLowerCase() == "enter") { - document.getElementById("sendInviteButton").click(); - } -}); document.querySelectorAll(".delete-invite-button").forEach((deleteButton) => { deleteButton.addEventListener("click", (ev) => { deleteInvite(ev); diff --git a/Server/wwwroot/scripts/Pages/OrganizationManagement.js.map b/Server/wwwroot/scripts/Pages/OrganizationManagement.js.map index 2ffd0ade..c4c5d1b9 100644 --- a/Server/wwwroot/scripts/Pages/OrganizationManagement.js.map +++ b/Server/wwwroot/scripts/Pages/OrganizationManagement.js.map @@ -1 +1 @@ -{"version":3,"file":"OrganizationManagement.js","sourceRoot":"","sources":["OrganizationManagement.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"OrganizationManagement.js","sourceRoot":"","sources":["OrganizationManagement.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Server/wwwroot/scripts/Pages/OrganizationManagement.ts b/Server/wwwroot/scripts/Pages/OrganizationManagement.ts index 449421df..181f28a7 100644 --- a/Server/wwwroot/scripts/Pages/OrganizationManagement.ts +++ b/Server/wwwroot/scripts/Pages/OrganizationManagement.ts @@ -7,11 +7,10 @@ document.getElementById("usersHelpButton").addEventListener("click", (ev) => { }); document.getElementById("invitesHelpButton").addEventListener("click", (ev) => { ShowModal("Invitations", `All pending invitations will be shown here and can be revoked by deleting them.

- If a user does not exist, sending an invite will create their account and send them a password reset email too. - The password reset must be completed before accepting the invitation. + If a user does not exist, sending an invite will create their account and add them to the current organization. + A password reset URL can be generated from the user table.

- The Admin checkbox determines if the new user will have administrator privileges in this organization - after they accept the invitation.`); + The Admin checkbox determines if the new user will have administrator privileges in this organization.`); }); document.getElementById("deviceGroupHelpButton").addEventListener("click", (ev) => { @@ -160,59 +159,6 @@ document.querySelectorAll(".delete-user-button").forEach((removeButton: HTMLButt }) }); -document.getElementById("sendInviteButton").addEventListener("click", (ev) => { - var inviteUserInput = document.querySelector("#inviteUserInput") as HTMLInputElement; - if (!ValidateInput(inviteUserInput)) { - return; - } - var invitedUser = inviteUserInput.value; - inviteUserInput.value = ""; - var isAdmin = (document.getElementById("inviteIsAdmin") as HTMLInputElement).checked; - var xhr = new XMLHttpRequest(); - xhr.onload = () => { - if (xhr.status == 200) { - var newInvite = JSON.parse(xhr.responseText); - var tbody = document.querySelector("#invitesTable tbody"); - var newRow = document.createElement("tr"); - newRow.setAttribute("invite", newInvite.ID); - var innerHtml = ` - - - - `; - - newRow.innerHTML = innerHtml; - tbody.appendChild(newRow); - newRow.querySelector(".delete-invite-button").addEventListener("click", (ev:MouseEvent) => { - deleteInvite(ev); - }) - } - else if (xhr.status == 400) { - ShowModal("Invalid Request", xhr.responseText); - } - else { - showError(xhr); - } - } - xhr.onerror = () => { - showError(xhr); - } - xhr.open("post", location.origin + `/api/OrganizationManagement/SendInvite/`); - xhr.setRequestHeader("Content-Type", "application/json"); - xhr.send(JSON.stringify({ InvitedUser: invitedUser, IsAdmin: isAdmin })); - PopupMessage("Sending invite..."); -}); -document.getElementById("inviteUserInput").addEventListener("keypress", (e) => { - if (e.key.toLowerCase() == "enter") { - document.getElementById("sendInviteButton").click(); - } -}) - document.querySelectorAll(".delete-invite-button").forEach((deleteButton: HTMLButtonElement) => { deleteButton.addEventListener("click", (ev) => { deleteInvite(ev); diff --git a/Shared/ViewModels/Organization/Invite.cs b/Shared/ViewModels/Organization/Invite.cs index 6f22666c..cbd45f76 100644 --- a/Shared/ViewModels/Organization/Invite.cs +++ b/Shared/ViewModels/Organization/Invite.cs @@ -10,6 +10,5 @@ namespace Remotely.Shared.ViewModels.Organization public bool IsAdmin { get; set; } public DateTime DateSent { get; set; } public string InvitedUser { get; set; } - public string ResetUrl { get; set; } } }