From 434ffdf9fba20aec96841dfe3a16b0c8a9f78a0f Mon Sep 17 00:00:00 2001 From: Jared Goodwin Date: Wed, 3 Jul 2019 15:59:20 -0700 Subject: [PATCH] Password reset link is now displayed in Organization Management when a user account is created as a result of an invite. --- README.md | 3 +- Server/API/FileSharing.cs | 4 +- .../API/OrganizationManagementController.cs | 28 +- .../Pages/Account/Manage/Organization.cshtml | 13 +- .../Account/Manage/Organization.cshtml.cs | 3 +- Server/Data/DataService.cs | 8 +- .../20190703215422_ResetUrl.Designer.cs | 527 ++++++++++++++++++ Server/Migrations/20190703215422_ResetUrl.cs | 22 + .../ApplicationDbContextModelSnapshot.cs | 64 +-- .../Pages/Shared/_CookieConsentPartial.cshtml | 2 +- .../scripts/Pages/OrganizationManagement.js | 11 +- .../Pages/OrganizationManagement.js.map | 2 +- .../scripts/Pages/OrganizationManagement.ts | 12 +- Shared/Models/InviteLink.cs | 1 + Shared/ViewModels/OrganizationViewModels.cs | 1 + 15 files changed, 643 insertions(+), 58 deletions(-) create mode 100644 Server/Migrations/20190703215422_ResetUrl.Designer.cs create mode 100644 Server/Migrations/20190703215422_ResetUrl.cs diff --git a/README.md b/README.md index 481a855e..4fca21d7 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,7 @@ The following steps will configure your Windows 10 machine for building the Remo * Example: powershell -f [path]\Publish.ps1 -outdir C:\inetpub\remotely -rid win10-x86 * The output folder will now contain the server, with the clients in the Downloads folder. * By default, the screen-sharing desktop app prompts for a host URL and can be changed thereafter. - * To hard-code a URL, set the Host value in /Desktop.Win/Services/Config.cs to the server's URL (same for the Desktop.Unix project). - * To hide the server name in the app, set ShowHostName to false. + * To hard-code an initial URL, set the Host value in /Desktop.Win/Services/Config.cs to the server's URL (same for the Desktop.Unix project). ## Hosting a Server (Windows) * Create a site in IIS that will run Remotely. diff --git a/Server/API/FileSharing.cs b/Server/API/FileSharing.cs index 62774d62..70661992 100644 --- a/Server/API/FileSharing.cs +++ b/Server/API/FileSharing.cs @@ -23,14 +23,14 @@ namespace Remotely.Server.API public DataService DataService { get; set; } // GET api//5 [HttpGet("{id}")] - public FileResult Get(string id) + public ActionResult Get(string id) { var sharedFile = DataService.GetSharedFiled(id); if (sharedFile != null) { return File(sharedFile.FileContents, sharedFile.ContentType, sharedFile.FileName); } - return null; + return NotFound(); } [HttpPost] diff --git a/Server/API/OrganizationManagementController.cs b/Server/API/OrganizationManagementController.cs index 82bcf8cf..918db3d9 100644 --- a/Server/API/OrganizationManagementController.cs +++ b/Server/API/OrganizationManagementController.cs @@ -120,18 +120,6 @@ namespace Remotely.Server.API } return Ok(result.Item2); } - [HttpDelete("RemoveUserFromOrganization/{userID}")] - public IActionResult RemoveUserFromOrganization(string userID) - { - if (!DataService.GetUserByName(User.Identity.Name).IsAdministrator) - { - return Unauthorized(); - } - - DataService.RemoveUserFromOrganization(User.Identity.Name, userID); - return Ok("ok"); - } - [HttpDelete("RemovePermissionFromUser/{userID}/{permissionID}")] public IActionResult RemovePermissionFromUser(string userID, string permissionID) { @@ -143,6 +131,18 @@ namespace Remotely.Server.API DataService.RemovePermissionFromUser(User.Identity.Name, userID, permissionID.Trim()); return Ok("ok"); } + + [HttpDelete("RemoveUserFromOrganization/{userID}")] + public IActionResult RemoveUserFromOrganization(string userID) + { + if (!DataService.GetUserByName(User.Identity.Name).IsAdministrator) + { + return Unauthorized(); + } + + DataService.RemoveUserFromOrganization(User.Identity.Name, userID); + return Ok("ok"); + } [HttpPost("SendInvite")] public async Task SendInvite([FromBody]Invite invite) { @@ -166,16 +166,18 @@ namespace Remotely.Server.API await UserManager.ConfirmEmailAsync(user, await UserManager.GenerateEmailConfirmationTokenAsync(user)); var resetCode = UrlEncoder.Default.Encode(await UserManager.GeneratePasswordResetTokenAsync(user)); var resetUrl = $"{Request.Scheme}://{Request.Host}/Identity/Account/ResetPassword?code={resetCode}"; + invite.ResetUrl = resetUrl; 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}."; + is {invite.InvitedUser}."; } else { return BadRequest("There was an issue creating the new account."); } } + var newInvite = DataService.AddInvite(User.Identity.Name, invite, Request.Scheme + "://" + Request.Host); var inviteURL = $"{Request.Scheme}://{Request.Host}/Invite?id={newInvite.ID}"; diff --git a/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml b/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml index ca435b3c..d029a329 100644 --- a/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml +++ b/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml @@ -103,7 +103,7 @@ Invited User Administrator - URL + Link(s) Delete @@ -113,7 +113,16 @@ @Html.CheckBoxFor(x => x.Invites[i].IsAdmin, new { disabled = "disabled" }) - + + + } diff --git a/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs b/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs index b7180fc3..805d2c2e 100644 --- a/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs +++ b/Server/Areas/Identity/Pages/Account/Manage/Organization.cshtml.cs @@ -75,7 +75,8 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage ID = x.ID, InvitedUser = x.InvitedUser, IsAdmin = x.IsAdmin, - DateSent = x.DateSent + DateSent = x.DateSent, + ResetUrl = x.ResetUrl }).ToList(); } } diff --git a/Server/Data/DataService.cs b/Server/Data/DataService.cs index 13f5d999..6f6b7062 100644 --- a/Server/Data/DataService.cs +++ b/Server/Data/DataService.cs @@ -314,7 +314,8 @@ namespace Remotely.Server.Data DateSent = DateTime.Now, InvitedUser = invite.InvitedUser, IsAdmin = invite.IsAdmin, - Organization = requester.Organization + Organization = requester.Organization, + ResetUrl = invite.ResetUrl }; requester.Organization.InviteLinks.Add(newInvite); RemotelyContext.SaveChanges(); @@ -468,6 +469,11 @@ namespace Remotely.Server.Data .ThenInclude(x => x.InviteLinks) .FirstOrDefault(x => x.UserName == requesterUserName); var invite = requester.Organization.InviteLinks.FirstOrDefault(x => x.ID == inviteID); + var user = RemotelyContext.Users.FirstOrDefault(x => x.UserName == invite.InvitedUser); + if (string.IsNullOrWhiteSpace(user.PasswordHash)) + { + RemotelyContext.Remove(user); + } RemotelyContext.Remove(invite); RemotelyContext.SaveChanges(); } diff --git a/Server/Migrations/20190703215422_ResetUrl.Designer.cs b/Server/Migrations/20190703215422_ResetUrl.Designer.cs new file mode 100644 index 00000000..87364a72 --- /dev/null +++ b/Server/Migrations/20190703215422_ResetUrl.Designer.cs @@ -0,0 +1,527 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Remotely.Server.Data; + +namespace Remotely.Server.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20190703215422_ResetUrl")] + partial class ResetUrl + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.2.4-servicing-10062"); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Discriminator") + .IsRequired(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("SecurityStamp"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex"); + + b.ToTable("RemotelyUsers"); + + b.HasDiscriminator("Discriminator").HasValue("IdentityUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasMaxLength(128); + + b.Property("ProviderDisplayName"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider") + .HasMaxLength(128); + + b.Property("Name") + .HasMaxLength(128); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.CommandContext", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("CommandMode"); + + b.Property("CommandResults"); + + b.Property("CommandText"); + + b.Property("OrganizationID"); + + b.Property("PSCoreResults"); + + b.Property("SenderConnectionID"); + + b.Property("SenderUserID"); + + b.Property("TargetDeviceIDs"); + + b.Property("TimeStamp"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("CommandContexts"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("CurrentUser"); + + b.Property("DeviceName"); + + b.Property("Drives"); + + b.Property("FreeMemory"); + + b.Property("FreeStorage"); + + b.Property("Is64Bit"); + + b.Property("IsOnline"); + + b.Property("LastOnline"); + + b.Property("OSArchitecture"); + + b.Property("OSDescription"); + + b.Property("OrganizationID"); + + b.Property("Platform"); + + b.Property("ProcessorCount"); + + b.Property("ServerVerificationToken"); + + b.Property("Tags") + .HasMaxLength(200); + + b.Property("TotalMemory"); + + b.Property("TotalStorage"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("Devices"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DevicePermissionLink", b => + { + b.Property("PermissionGroupID"); + + b.Property("DeviceID"); + + b.HasKey("PermissionGroupID", "DeviceID"); + + b.HasIndex("DeviceID"); + + b.ToTable("DevicePermissionLinks"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.EventLog", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("EventType"); + + b.Property("Message"); + + b.Property("OrganizationID"); + + b.Property("Source"); + + b.Property("StackTrace"); + + b.Property("TimeStamp"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("EventLogs"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("DateSent"); + + b.Property("InvitedUser"); + + b.Property("IsAdmin"); + + b.Property("OrganizationID"); + + b.Property("ResetUrl"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("InviteLinks"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Organization", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("OrganizationName") + .HasMaxLength(25); + + b.HasKey("ID"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.PermissionGroup", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("Name") + .HasMaxLength(100); + + b.Property("OrganizationID"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("PermissionGroups"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("ContentType"); + + b.Property("FileContents"); + + b.Property("FileName"); + + b.Property("OrganizationID"); + + b.Property("Timestamp"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("SharedFiles"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.UserPermissionLink", b => + { + b.Property("PermissionGroupID"); + + b.Property("RemotelyUserID"); + + b.HasKey("PermissionGroupID", "RemotelyUserID"); + + b.HasIndex("RemotelyUserID"); + + b.ToTable("UserPermissionLinks"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsAdministrator"); + + b.Property("OrganizationID"); + + b.Property("UserOptions"); + + b.HasIndex("OrganizationID"); + + b.ToTable("RemotelyUsers"); + + b.HasDiscriminator().HasValue("RemotelyUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Remotely.Shared.Models.CommandContext", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("CommandContexts") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("Devices") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DevicePermissionLink", b => + { + b.HasOne("Remotely.Shared.Models.Device", "Device") + .WithMany("DevicePermissionLinks") + .HasForeignKey("DeviceID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Remotely.Shared.Models.PermissionGroup", "PermissionGroup") + .WithMany("DevicePermissionLinks") + .HasForeignKey("PermissionGroupID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Remotely.Shared.Models.EventLog", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("EventLogs") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("InviteLinks") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.PermissionGroup", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("PermissionGroups") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("SharedFiles") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.UserPermissionLink", b => + { + b.HasOne("Remotely.Shared.Models.PermissionGroup", "PermissionGroup") + .WithMany("UserPermissionLinks") + .HasForeignKey("PermissionGroupID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Remotely.Shared.Models.RemotelyUser", "RemotelyUser") + .WithMany("UserPermissionLinks") + .HasForeignKey("RemotelyUserID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("RemotelyUsers") + .HasForeignKey("OrganizationID"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Server/Migrations/20190703215422_ResetUrl.cs b/Server/Migrations/20190703215422_ResetUrl.cs new file mode 100644 index 00000000..57fdd9d7 --- /dev/null +++ b/Server/Migrations/20190703215422_ResetUrl.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Remotely.Server.Migrations +{ + public partial class ResetUrl : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ResetUrl", + table: "InviteLinks", + nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ResetUrl", + table: "InviteLinks"); + } + } +} diff --git a/Server/Migrations/ApplicationDbContextModelSnapshot.cs b/Server/Migrations/ApplicationDbContextModelSnapshot.cs index a342c1f2..bde9bce4 100644 --- a/Server/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Server/Migrations/ApplicationDbContextModelSnapshot.cs @@ -14,7 +14,7 @@ namespace Remotely.Server.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.2.3-servicing-35854"); + .HasAnnotation("ProductVersion", "2.2.4-servicing-10062"); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => { @@ -182,7 +182,7 @@ namespace Remotely.Server.Migrations b.ToTable("AspNetUserTokens"); }); - modelBuilder.Entity("Remotely_Shared.Models.CommandContext", b => + modelBuilder.Entity("Remotely.Shared.Models.CommandContext", b => { b.Property("ID") .ValueGeneratedOnAdd(); @@ -212,7 +212,7 @@ namespace Remotely.Server.Migrations b.ToTable("CommandContexts"); }); - modelBuilder.Entity("Remotely_Shared.Models.Device", b => + modelBuilder.Entity("Remotely.Shared.Models.Device", b => { b.Property("ID") .ValueGeneratedOnAdd(); @@ -259,7 +259,7 @@ namespace Remotely.Server.Migrations b.ToTable("Devices"); }); - modelBuilder.Entity("Remotely_Shared.Models.DevicePermissionLink", b => + modelBuilder.Entity("Remotely.Shared.Models.DevicePermissionLink", b => { b.Property("PermissionGroupID"); @@ -272,7 +272,7 @@ namespace Remotely.Server.Migrations b.ToTable("DevicePermissionLinks"); }); - modelBuilder.Entity("Remotely_Shared.Models.EventLog", b => + modelBuilder.Entity("Remotely.Shared.Models.EventLog", b => { b.Property("ID") .ValueGeneratedOnAdd(); @@ -296,7 +296,7 @@ namespace Remotely.Server.Migrations b.ToTable("EventLogs"); }); - modelBuilder.Entity("Remotely_Shared.Models.InviteLink", b => + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => { b.Property("ID") .ValueGeneratedOnAdd(); @@ -309,6 +309,8 @@ namespace Remotely.Server.Migrations b.Property("OrganizationID"); + b.Property("ResetUrl"); + b.HasKey("ID"); b.HasIndex("OrganizationID"); @@ -316,7 +318,7 @@ namespace Remotely.Server.Migrations b.ToTable("InviteLinks"); }); - modelBuilder.Entity("Remotely_Shared.Models.Organization", b => + modelBuilder.Entity("Remotely.Shared.Models.Organization", b => { b.Property("ID") .ValueGeneratedOnAdd(); @@ -329,7 +331,7 @@ namespace Remotely.Server.Migrations b.ToTable("Organizations"); }); - modelBuilder.Entity("Remotely_Shared.Models.PermissionGroup", b => + modelBuilder.Entity("Remotely.Shared.Models.PermissionGroup", b => { b.Property("ID") .ValueGeneratedOnAdd(); @@ -346,7 +348,7 @@ namespace Remotely.Server.Migrations b.ToTable("PermissionGroups"); }); - modelBuilder.Entity("Remotely_Shared.Models.SharedFile", b => + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => { b.Property("ID") .ValueGeneratedOnAdd(); @@ -368,7 +370,7 @@ namespace Remotely.Server.Migrations b.ToTable("SharedFiles"); }); - modelBuilder.Entity("Remotely_Shared.Models.UserPermissionLink", b => + modelBuilder.Entity("Remotely.Shared.Models.UserPermissionLink", b => { b.Property("PermissionGroupID"); @@ -381,7 +383,7 @@ namespace Remotely.Server.Migrations b.ToTable("UserPermissionLinks"); }); - modelBuilder.Entity("Remotely_Shared.Models.RemotelyUser", b => + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => { b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); @@ -443,77 +445,77 @@ namespace Remotely.Server.Migrations .OnDelete(DeleteBehavior.Cascade); }); - modelBuilder.Entity("Remotely_Shared.Models.CommandContext", b => + modelBuilder.Entity("Remotely.Shared.Models.CommandContext", b => { - b.HasOne("Remotely_Shared.Models.Organization", "Organization") + b.HasOne("Remotely.Shared.Models.Organization", "Organization") .WithMany("CommandContexts") .HasForeignKey("OrganizationID"); }); - modelBuilder.Entity("Remotely_Shared.Models.Device", b => + modelBuilder.Entity("Remotely.Shared.Models.Device", b => { - b.HasOne("Remotely_Shared.Models.Organization", "Organization") + b.HasOne("Remotely.Shared.Models.Organization", "Organization") .WithMany("Devices") .HasForeignKey("OrganizationID"); }); - modelBuilder.Entity("Remotely_Shared.Models.DevicePermissionLink", b => + modelBuilder.Entity("Remotely.Shared.Models.DevicePermissionLink", b => { - b.HasOne("Remotely_Shared.Models.Device", "Device") + b.HasOne("Remotely.Shared.Models.Device", "Device") .WithMany("DevicePermissionLinks") .HasForeignKey("DeviceID") .OnDelete(DeleteBehavior.Cascade); - b.HasOne("Remotely_Shared.Models.PermissionGroup", "PermissionGroup") + b.HasOne("Remotely.Shared.Models.PermissionGroup", "PermissionGroup") .WithMany("DevicePermissionLinks") .HasForeignKey("PermissionGroupID") .OnDelete(DeleteBehavior.Cascade); }); - modelBuilder.Entity("Remotely_Shared.Models.EventLog", b => + modelBuilder.Entity("Remotely.Shared.Models.EventLog", b => { - b.HasOne("Remotely_Shared.Models.Organization", "Organization") + b.HasOne("Remotely.Shared.Models.Organization", "Organization") .WithMany("EventLogs") .HasForeignKey("OrganizationID"); }); - modelBuilder.Entity("Remotely_Shared.Models.InviteLink", b => + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => { - b.HasOne("Remotely_Shared.Models.Organization", "Organization") + b.HasOne("Remotely.Shared.Models.Organization", "Organization") .WithMany("InviteLinks") .HasForeignKey("OrganizationID"); }); - modelBuilder.Entity("Remotely_Shared.Models.PermissionGroup", b => + modelBuilder.Entity("Remotely.Shared.Models.PermissionGroup", b => { - b.HasOne("Remotely_Shared.Models.Organization", "Organization") + b.HasOne("Remotely.Shared.Models.Organization", "Organization") .WithMany("PermissionGroups") .HasForeignKey("OrganizationID"); }); - modelBuilder.Entity("Remotely_Shared.Models.SharedFile", b => + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => { - b.HasOne("Remotely_Shared.Models.Organization", "Organization") + b.HasOne("Remotely.Shared.Models.Organization", "Organization") .WithMany("SharedFiles") .HasForeignKey("OrganizationID"); }); - modelBuilder.Entity("Remotely_Shared.Models.UserPermissionLink", b => + modelBuilder.Entity("Remotely.Shared.Models.UserPermissionLink", b => { - b.HasOne("Remotely_Shared.Models.PermissionGroup", "PermissionGroup") + b.HasOne("Remotely.Shared.Models.PermissionGroup", "PermissionGroup") .WithMany("UserPermissionLinks") .HasForeignKey("PermissionGroupID") .OnDelete(DeleteBehavior.Cascade); - b.HasOne("Remotely_Shared.Models.RemotelyUser", "RemotelyUser") + b.HasOne("Remotely.Shared.Models.RemotelyUser", "RemotelyUser") .WithMany("UserPermissionLinks") .HasForeignKey("RemotelyUserID") .OnDelete(DeleteBehavior.Cascade); }); - modelBuilder.Entity("Remotely_Shared.Models.RemotelyUser", b => + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => { - b.HasOne("Remotely_Shared.Models.Organization", "Organization") + b.HasOne("Remotely.Shared.Models.Organization", "Organization") .WithMany("RemotelyUsers") .HasForeignKey("OrganizationID"); }); diff --git a/Server/Pages/Shared/_CookieConsentPartial.cshtml b/Server/Pages/Shared/_CookieConsentPartial.cshtml index 6bbae189..934ac7bf 100644 --- a/Server/Pages/Shared/_CookieConsentPartial.cshtml +++ b/Server/Pages/Shared/_CookieConsentPartial.cshtml @@ -9,7 +9,7 @@ @if (showBanner) {