diff --git a/Agent/Agent.csproj b/Agent/Agent.csproj index 1a42b20b..e7920aa4 100644 --- a/Agent/Agent.csproj +++ b/Agent/Agent.csproj @@ -7,7 +7,6 @@ false Copyright © 2020 Translucency Software Background service that maintains a connection to the Remotely server. The service is used for remote support and maintenance by this computer's administrators. - https://doxm.app/EULA Jared Goodwin Remotely Agent Translucency Software diff --git a/Agent/Services/DeviceSocket.cs b/Agent/Services/DeviceSocket.cs index d63c1771..6c06dc3b 100644 --- a/Agent/Services/DeviceSocket.cs +++ b/Agent/Services/DeviceSocket.cs @@ -60,7 +60,7 @@ namespace Remotely.Agent.Services await HubConnection.StartAsync(); - var device = Device.Create(ConnectionInfo); + var device = await Device.Create(ConnectionInfo); await HubConnection.InvokeAsync("DeviceCameOnline", device); @@ -87,15 +87,15 @@ namespace Remotely.Agent.Services HeartbeatTimer.Start(); } - public void SendHeartbeat() + public async Task SendHeartbeat() { - var currentInfo = Device.Create(ConnectionInfo); - HubConnection.InvokeAsync("DeviceHeartbeat", currentInfo); + var currentInfo = await Device.Create(ConnectionInfo); + await HubConnection.InvokeAsync("DeviceHeartbeat", currentInfo); } - private void HeartbeatTimer_Elapsed(object sender, ElapsedEventArgs e) + private async void HeartbeatTimer_Elapsed(object sender, ElapsedEventArgs e) { - SendHeartbeat(); + await SendHeartbeat(); } private void RegisterMessageHandlers() diff --git a/Server/Migrations/20191211163438_Initial.Designer.cs b/Server/Migrations/20191211163438_Initial.Designer.cs deleted file mode 100644 index dc038a98..00000000 --- a/Server/Migrations/20191211163438_Initial.Designer.cs +++ /dev/null @@ -1,575 +0,0 @@ -// -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("20191211163438_Initial")] - partial class Initial - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "3.1.0"); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("TEXT"); - - b.Property("Name") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("NormalizedName") - .HasColumnType("TEXT") - .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() - .HasColumnType("INTEGER"); - - b.Property("ClaimType") - .HasColumnType("TEXT"); - - b.Property("ClaimValue") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("AccessFailedCount") - .HasColumnType("INTEGER"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("TEXT"); - - b.Property("Discriminator") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Email") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("EmailConfirmed") - .HasColumnType("INTEGER"); - - b.Property("LockoutEnabled") - .HasColumnType("INTEGER"); - - b.Property("LockoutEnd") - .HasColumnType("TEXT"); - - b.Property("NormalizedEmail") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("PasswordHash") - .HasColumnType("TEXT"); - - b.Property("PhoneNumber") - .HasColumnType("TEXT"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("INTEGER"); - - b.Property("SecurityStamp") - .HasColumnType("TEXT"); - - b.Property("TwoFactorEnabled") - .HasColumnType("INTEGER"); - - b.Property("UserName") - .HasColumnType("TEXT") - .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() - .HasColumnType("INTEGER"); - - b.Property("ClaimType") - .HasColumnType("TEXT"); - - b.Property("ClaimValue") - .HasColumnType("TEXT"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("ProviderDisplayName") - .HasColumnType("TEXT"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("LoginProvider") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("Name") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("Value") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.CommandContext", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("CommandMode") - .HasColumnType("TEXT"); - - b.Property("CommandResults") - .HasColumnType("TEXT"); - - b.Property("CommandText") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("PSCoreResults") - .HasColumnType("TEXT"); - - b.Property("SenderConnectionID") - .HasColumnType("TEXT"); - - b.Property("SenderUserID") - .HasColumnType("TEXT"); - - b.Property("TargetDeviceIDs") - .HasColumnType("TEXT"); - - b.Property("TimeStamp") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("CommandContexts"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.Device", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("AgentVersion") - .HasColumnType("TEXT"); - - b.Property("CurrentUser") - .HasColumnType("TEXT"); - - b.Property("DeviceGroupID") - .HasColumnType("TEXT"); - - b.Property("DeviceName") - .HasColumnType("TEXT"); - - b.Property("Drives") - .HasColumnType("TEXT"); - - b.Property("FreeMemory") - .HasColumnType("REAL"); - - b.Property("FreeStorage") - .HasColumnType("REAL"); - - b.Property("Is64Bit") - .HasColumnType("INTEGER"); - - b.Property("IsOnline") - .HasColumnType("INTEGER"); - - b.Property("LastOnline") - .HasColumnType("TEXT"); - - b.Property("OSArchitecture") - .HasColumnType("INTEGER"); - - b.Property("OSDescription") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("Platform") - .HasColumnType("TEXT"); - - b.Property("ProcessorCount") - .HasColumnType("INTEGER"); - - b.Property("ServerVerificationToken") - .HasColumnType("TEXT"); - - b.Property("Tags") - .HasColumnType("TEXT") - .HasMaxLength(200); - - b.Property("TotalMemory") - .HasColumnType("REAL"); - - b.Property("TotalStorage") - .HasColumnType("REAL"); - - b.HasKey("ID"); - - b.HasIndex("DeviceGroupID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("Devices"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("Name") - .HasColumnType("TEXT") - .HasMaxLength(200); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("DeviceGroups"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.EventLog", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("EventType") - .HasColumnType("INTEGER"); - - b.Property("Message") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("Source") - .HasColumnType("TEXT"); - - b.Property("StackTrace") - .HasColumnType("TEXT"); - - b.Property("TimeStamp") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("EventLogs"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("DateSent") - .HasColumnType("TEXT"); - - b.Property("InvitedUser") - .HasColumnType("TEXT"); - - b.Property("IsAdmin") - .HasColumnType("INTEGER"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("ResetUrl") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("InviteLinks"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.Organization", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("OrganizationName") - .HasColumnType("TEXT") - .HasMaxLength(25); - - b.HasKey("ID"); - - b.ToTable("Organizations"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("ContentType") - .HasColumnType("TEXT"); - - b.Property("FileContents") - .HasColumnType("BLOB"); - - b.Property("FileName") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("Timestamp") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("SharedFiles"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => - { - b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); - - b.Property("IsAdministrator") - .HasColumnType("INTEGER"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("UserOptions") - .HasColumnType("TEXT"); - - b.HasIndex("OrganizationID"); - - b.HasDiscriminator().HasValue("RemotelyUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - 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.DeviceGroup", "DeviceGroup") - .WithMany("Devices") - .HasForeignKey("DeviceGroupID"); - - b.HasOne("Remotely.Shared.Models.Organization", "Organization") - .WithMany("Devices") - .HasForeignKey("OrganizationID"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => - { - b.HasOne("Remotely.Shared.Models.Organization", "Organization") - .WithMany("DeviceGroups") - .HasForeignKey("OrganizationID"); - }); - - 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.SharedFile", b => - { - b.HasOne("Remotely.Shared.Models.Organization", "Organization") - .WithMany("SharedFiles") - .HasForeignKey("OrganizationID"); - }); - - 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/20191212152649_Device alias.Designer.cs b/Server/Migrations/20191212152649_Device alias.Designer.cs deleted file mode 100644 index f1630eca..00000000 --- a/Server/Migrations/20191212152649_Device alias.Designer.cs +++ /dev/null @@ -1,579 +0,0 @@ -// -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("20191212152649_Device alias")] - partial class Devicealias - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "3.1.0"); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("TEXT"); - - b.Property("Name") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("NormalizedName") - .HasColumnType("TEXT") - .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() - .HasColumnType("INTEGER"); - - b.Property("ClaimType") - .HasColumnType("TEXT"); - - b.Property("ClaimValue") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("AccessFailedCount") - .HasColumnType("INTEGER"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("TEXT"); - - b.Property("Discriminator") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Email") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("EmailConfirmed") - .HasColumnType("INTEGER"); - - b.Property("LockoutEnabled") - .HasColumnType("INTEGER"); - - b.Property("LockoutEnd") - .HasColumnType("TEXT"); - - b.Property("NormalizedEmail") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("PasswordHash") - .HasColumnType("TEXT"); - - b.Property("PhoneNumber") - .HasColumnType("TEXT"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("INTEGER"); - - b.Property("SecurityStamp") - .HasColumnType("TEXT"); - - b.Property("TwoFactorEnabled") - .HasColumnType("INTEGER"); - - b.Property("UserName") - .HasColumnType("TEXT") - .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() - .HasColumnType("INTEGER"); - - b.Property("ClaimType") - .HasColumnType("TEXT"); - - b.Property("ClaimValue") - .HasColumnType("TEXT"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("ProviderDisplayName") - .HasColumnType("TEXT"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("LoginProvider") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("Name") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("Value") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.CommandContext", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("CommandMode") - .HasColumnType("TEXT"); - - b.Property("CommandResults") - .HasColumnType("TEXT"); - - b.Property("CommandText") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("PSCoreResults") - .HasColumnType("TEXT"); - - b.Property("SenderConnectionID") - .HasColumnType("TEXT"); - - b.Property("SenderUserID") - .HasColumnType("TEXT"); - - b.Property("TargetDeviceIDs") - .HasColumnType("TEXT"); - - b.Property("TimeStamp") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("CommandContexts"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.Device", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("AgentVersion") - .HasColumnType("TEXT"); - - b.Property("Alias") - .HasColumnType("TEXT") - .HasMaxLength(100); - - b.Property("CurrentUser") - .HasColumnType("TEXT"); - - b.Property("DeviceGroupID") - .HasColumnType("TEXT"); - - b.Property("DeviceName") - .HasColumnType("TEXT"); - - b.Property("Drives") - .HasColumnType("TEXT"); - - b.Property("FreeMemory") - .HasColumnType("REAL"); - - b.Property("FreeStorage") - .HasColumnType("REAL"); - - b.Property("Is64Bit") - .HasColumnType("INTEGER"); - - b.Property("IsOnline") - .HasColumnType("INTEGER"); - - b.Property("LastOnline") - .HasColumnType("TEXT"); - - b.Property("OSArchitecture") - .HasColumnType("INTEGER"); - - b.Property("OSDescription") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("Platform") - .HasColumnType("TEXT"); - - b.Property("ProcessorCount") - .HasColumnType("INTEGER"); - - b.Property("ServerVerificationToken") - .HasColumnType("TEXT"); - - b.Property("Tags") - .HasColumnType("TEXT") - .HasMaxLength(200); - - b.Property("TotalMemory") - .HasColumnType("REAL"); - - b.Property("TotalStorage") - .HasColumnType("REAL"); - - b.HasKey("ID"); - - b.HasIndex("DeviceGroupID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("Devices"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("Name") - .HasColumnType("TEXT") - .HasMaxLength(200); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("DeviceGroups"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.EventLog", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("EventType") - .HasColumnType("INTEGER"); - - b.Property("Message") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("Source") - .HasColumnType("TEXT"); - - b.Property("StackTrace") - .HasColumnType("TEXT"); - - b.Property("TimeStamp") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("EventLogs"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("DateSent") - .HasColumnType("TEXT"); - - b.Property("InvitedUser") - .HasColumnType("TEXT"); - - b.Property("IsAdmin") - .HasColumnType("INTEGER"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("ResetUrl") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("InviteLinks"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.Organization", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("OrganizationName") - .HasColumnType("TEXT") - .HasMaxLength(25); - - b.HasKey("ID"); - - b.ToTable("Organizations"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("ContentType") - .HasColumnType("TEXT"); - - b.Property("FileContents") - .HasColumnType("BLOB"); - - b.Property("FileName") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("Timestamp") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("SharedFiles"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => - { - b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); - - b.Property("IsAdministrator") - .HasColumnType("INTEGER"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("UserOptions") - .HasColumnType("TEXT"); - - b.HasIndex("OrganizationID"); - - b.HasDiscriminator().HasValue("RemotelyUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - 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.DeviceGroup", "DeviceGroup") - .WithMany("Devices") - .HasForeignKey("DeviceGroupID"); - - b.HasOne("Remotely.Shared.Models.Organization", "Organization") - .WithMany("Devices") - .HasForeignKey("OrganizationID"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => - { - b.HasOne("Remotely.Shared.Models.Organization", "Organization") - .WithMany("DeviceGroups") - .HasForeignKey("OrganizationID"); - }); - - 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.SharedFile", b => - { - b.HasOne("Remotely.Shared.Models.Organization", "Organization") - .WithMany("SharedFiles") - .HasForeignKey("OrganizationID"); - }); - - 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/20191212152649_Device alias.cs b/Server/Migrations/20191212152649_Device alias.cs deleted file mode 100644 index 2108ff2b..00000000 --- a/Server/Migrations/20191212152649_Device alias.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace Remotely.Server.Migrations -{ - public partial class Devicealias : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "Alias", - table: "Devices", - maxLength: 100, - nullable: true); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "Alias", - table: "Devices"); - } - } -} diff --git a/Server/Migrations/20200215193028_API Tokens.Designer.cs b/Server/Migrations/20200215193028_API Tokens.Designer.cs deleted file mode 100644 index eded09a2..00000000 --- a/Server/Migrations/20200215193028_API Tokens.Designer.cs +++ /dev/null @@ -1,616 +0,0 @@ -// -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("20200215193028_API Tokens")] - partial class APITokens - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "3.1.1"); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("TEXT"); - - b.Property("Name") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("NormalizedName") - .HasColumnType("TEXT") - .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() - .HasColumnType("INTEGER"); - - b.Property("ClaimType") - .HasColumnType("TEXT"); - - b.Property("ClaimValue") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("AccessFailedCount") - .HasColumnType("INTEGER"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("TEXT"); - - b.Property("Discriminator") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Email") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("EmailConfirmed") - .HasColumnType("INTEGER"); - - b.Property("LockoutEnabled") - .HasColumnType("INTEGER"); - - b.Property("LockoutEnd") - .HasColumnType("TEXT"); - - b.Property("NormalizedEmail") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .HasColumnType("TEXT") - .HasMaxLength(256); - - b.Property("PasswordHash") - .HasColumnType("TEXT"); - - b.Property("PhoneNumber") - .HasColumnType("TEXT"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("INTEGER"); - - b.Property("SecurityStamp") - .HasColumnType("TEXT"); - - b.Property("TwoFactorEnabled") - .HasColumnType("INTEGER"); - - b.Property("UserName") - .HasColumnType("TEXT") - .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() - .HasColumnType("INTEGER"); - - b.Property("ClaimType") - .HasColumnType("TEXT"); - - b.Property("ClaimValue") - .HasColumnType("TEXT"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("ProviderDisplayName") - .HasColumnType("TEXT"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("LoginProvider") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("Name") - .HasColumnType("TEXT") - .HasMaxLength(128); - - b.Property("Value") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.ApiToken", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("LastUsed") - .HasColumnType("TEXT"); - - b.Property("Name") - .HasColumnType("TEXT") - .HasMaxLength(200); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("Secret") - .HasColumnType("TEXT"); - - b.Property("Token") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("ApiTokens"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.CommandContext", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("CommandMode") - .HasColumnType("TEXT"); - - b.Property("CommandResults") - .HasColumnType("TEXT"); - - b.Property("CommandText") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("PSCoreResults") - .HasColumnType("TEXT"); - - b.Property("SenderConnectionID") - .HasColumnType("TEXT"); - - b.Property("SenderUserID") - .HasColumnType("TEXT"); - - b.Property("TargetDeviceIDs") - .HasColumnType("TEXT"); - - b.Property("TimeStamp") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("CommandContexts"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.Device", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("AgentVersion") - .HasColumnType("TEXT"); - - b.Property("Alias") - .HasColumnType("TEXT") - .HasMaxLength(100); - - b.Property("CurrentUser") - .HasColumnType("TEXT"); - - b.Property("DeviceGroupID") - .HasColumnType("TEXT"); - - b.Property("DeviceName") - .HasColumnType("TEXT"); - - b.Property("Drives") - .HasColumnType("TEXT"); - - b.Property("FreeMemory") - .HasColumnType("REAL"); - - b.Property("FreeStorage") - .HasColumnType("REAL"); - - b.Property("Is64Bit") - .HasColumnType("INTEGER"); - - b.Property("IsOnline") - .HasColumnType("INTEGER"); - - b.Property("LastOnline") - .HasColumnType("TEXT"); - - b.Property("OSArchitecture") - .HasColumnType("INTEGER"); - - b.Property("OSDescription") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("Platform") - .HasColumnType("TEXT"); - - b.Property("ProcessorCount") - .HasColumnType("INTEGER"); - - b.Property("ServerVerificationToken") - .HasColumnType("TEXT"); - - b.Property("Tags") - .HasColumnType("TEXT") - .HasMaxLength(200); - - b.Property("TotalMemory") - .HasColumnType("REAL"); - - b.Property("TotalStorage") - .HasColumnType("REAL"); - - b.HasKey("ID"); - - b.HasIndex("DeviceGroupID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("Devices"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("Name") - .HasColumnType("TEXT") - .HasMaxLength(200); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("DeviceGroups"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.EventLog", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("EventType") - .HasColumnType("INTEGER"); - - b.Property("Message") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("Source") - .HasColumnType("TEXT"); - - b.Property("StackTrace") - .HasColumnType("TEXT"); - - b.Property("TimeStamp") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("EventLogs"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("DateSent") - .HasColumnType("TEXT"); - - b.Property("InvitedUser") - .HasColumnType("TEXT"); - - b.Property("IsAdmin") - .HasColumnType("INTEGER"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("ResetUrl") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("InviteLinks"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.Organization", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("OrganizationName") - .HasColumnType("TEXT") - .HasMaxLength(25); - - b.HasKey("ID"); - - b.ToTable("Organizations"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => - { - b.Property("ID") - .HasColumnType("TEXT"); - - b.Property("ContentType") - .HasColumnType("TEXT"); - - b.Property("FileContents") - .HasColumnType("BLOB"); - - b.Property("FileName") - .HasColumnType("TEXT"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("Timestamp") - .HasColumnType("TEXT"); - - b.HasKey("ID"); - - b.HasIndex("OrganizationID"); - - b.ToTable("SharedFiles"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => - { - b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); - - b.Property("IsAdministrator") - .HasColumnType("INTEGER"); - - b.Property("OrganizationID") - .HasColumnType("TEXT"); - - b.Property("UserOptions") - .HasColumnType("TEXT"); - - b.HasIndex("OrganizationID"); - - b.HasIndex("UserName"); - - b.HasDiscriminator().HasValue("RemotelyUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Remotely.Shared.Models.ApiToken", b => - { - b.HasOne("Remotely.Shared.Models.Organization", "Organization") - .WithMany("ApiTokens") - .HasForeignKey("OrganizationID"); - }); - - 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.DeviceGroup", "DeviceGroup") - .WithMany("Devices") - .HasForeignKey("DeviceGroupID"); - - b.HasOne("Remotely.Shared.Models.Organization", "Organization") - .WithMany("Devices") - .HasForeignKey("OrganizationID"); - }); - - modelBuilder.Entity("Remotely.Shared.Models.DeviceGroup", b => - { - b.HasOne("Remotely.Shared.Models.Organization", "Organization") - .WithMany("DeviceGroups") - .HasForeignKey("OrganizationID"); - }); - - 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.SharedFile", b => - { - b.HasOne("Remotely.Shared.Models.Organization", "Organization") - .WithMany("SharedFiles") - .HasForeignKey("OrganizationID"); - }); - - 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/20200215193028_API Tokens.cs b/Server/Migrations/20200215193028_API Tokens.cs deleted file mode 100644 index a1524591..00000000 --- a/Server/Migrations/20200215193028_API Tokens.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace Remotely.Server.Migrations -{ - public partial class APITokens : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "ApiTokens", - columns: table => new - { - ID = table.Column(nullable: false), - LastUsed = table.Column(nullable: true), - Name = table.Column(maxLength: 200, nullable: true), - OrganizationID = table.Column(nullable: true), - Secret = table.Column(nullable: true), - Token = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_ApiTokens", x => x.ID); - table.ForeignKey( - name: "FK_ApiTokens_Organizations_OrganizationID", - column: x => x.OrganizationID, - principalTable: "Organizations", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateIndex( - name: "IX_RemotelyUsers_UserName", - table: "RemotelyUsers", - column: "UserName"); - - migrationBuilder.CreateIndex( - name: "IX_ApiTokens_OrganizationID", - table: "ApiTokens", - column: "OrganizationID"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "ApiTokens"); - - migrationBuilder.DropIndex( - name: "IX_RemotelyUsers_UserName", - table: "RemotelyUsers"); - } - } -} diff --git a/Server/Migrations/20200216015743_ApiToken and Device indexes.cs b/Server/Migrations/20200216015743_ApiToken and Device indexes.cs deleted file mode 100644 index a56233aa..00000000 --- a/Server/Migrations/20200216015743_ApiToken and Device indexes.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace Remotely.Server.Migrations -{ - public partial class ApiTokenandDeviceindexes : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "LastUsed", - table: "ApiTokens", - nullable: true, - oldClrType: typeof(DateTime), - oldType: "TEXT"); - - migrationBuilder.CreateIndex( - name: "IX_Devices_DeviceName", - table: "Devices", - column: "DeviceName"); - - migrationBuilder.CreateIndex( - name: "IX_ApiTokens_Token", - table: "ApiTokens", - column: "Token"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "IX_Devices_DeviceName", - table: "Devices"); - - migrationBuilder.DropIndex( - name: "IX_ApiTokens_Token", - table: "ApiTokens"); - - migrationBuilder.AlterColumn( - name: "LastUsed", - table: "ApiTokens", - type: "TEXT", - nullable: false, - oldClrType: typeof(DateTime), - oldNullable: true); - } - } -} diff --git a/Server/Migrations/20200216015743_ApiToken and Device indexes.Designer.cs b/Server/Migrations/20200216234855_Initial.Designer.cs similarity index 99% rename from Server/Migrations/20200216015743_ApiToken and Device indexes.Designer.cs rename to Server/Migrations/20200216234855_Initial.Designer.cs index 8c3b16f8..87f473b5 100644 --- a/Server/Migrations/20200216015743_ApiToken and Device indexes.Designer.cs +++ b/Server/Migrations/20200216234855_Initial.Designer.cs @@ -9,8 +9,8 @@ using Remotely.Server.Data; namespace Remotely.Server.Migrations { [DbContext(typeof(ApplicationDbContext))] - [Migration("20200216015743_ApiToken and Device indexes")] - partial class ApiTokenandDeviceindexes + [Migration("20200216234855_Initial")] + partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -301,6 +301,9 @@ namespace Remotely.Server.Migrations .HasColumnType("TEXT") .HasMaxLength(100); + b.Property("CpuUtilization") + .HasColumnType("REAL"); + b.Property("CurrentUser") .HasColumnType("TEXT"); diff --git a/Server/Migrations/20191211163438_Initial.cs b/Server/Migrations/20200216234855_Initial.cs similarity index 91% rename from Server/Migrations/20191211163438_Initial.cs rename to Server/Migrations/20200216234855_Initial.cs index fe6acbdc..4fa3028c 100644 --- a/Server/Migrations/20191211163438_Initial.cs +++ b/Server/Migrations/20200216234855_Initial.cs @@ -54,6 +54,28 @@ namespace Remotely.Server.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "ApiTokens", + columns: table => new + { + ID = table.Column(nullable: false), + LastUsed = table.Column(nullable: true), + Name = table.Column(maxLength: 200, nullable: true), + OrganizationID = table.Column(nullable: true), + Secret = table.Column(nullable: true), + Token = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ApiTokens", x => x.ID); + table.ForeignKey( + name: "FK_ApiTokens_Organizations_OrganizationID", + column: x => x.OrganizationID, + principalTable: "Organizations", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + }); + migrationBuilder.CreateTable( name: "CommandContexts", columns: table => new @@ -207,9 +229,11 @@ namespace Remotely.Server.Migrations { ID = table.Column(nullable: false), AgentVersion = table.Column(nullable: true), + Alias = table.Column(maxLength: 100, nullable: true), + CpuUtilization = table.Column(nullable: false), CurrentUser = table.Column(nullable: true), - DeviceName = table.Column(nullable: true), DeviceGroupID = table.Column(nullable: true), + DeviceName = table.Column(nullable: true), Drives = table.Column(nullable: true), FreeMemory = table.Column(nullable: false), FreeStorage = table.Column(nullable: false), @@ -328,6 +352,16 @@ namespace Remotely.Server.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateIndex( + name: "IX_ApiTokens_OrganizationID", + table: "ApiTokens", + column: "OrganizationID"); + + migrationBuilder.CreateIndex( + name: "IX_ApiTokens_Token", + table: "ApiTokens", + column: "Token"); + migrationBuilder.CreateIndex( name: "IX_AspNetRoleClaims_RoleId", table: "AspNetRoleClaims", @@ -369,6 +403,11 @@ namespace Remotely.Server.Migrations table: "Devices", column: "DeviceGroupID"); + migrationBuilder.CreateIndex( + name: "IX_Devices_DeviceName", + table: "Devices", + column: "DeviceName"); + migrationBuilder.CreateIndex( name: "IX_Devices_OrganizationID", table: "Devices", @@ -400,6 +439,11 @@ namespace Remotely.Server.Migrations table: "RemotelyUsers", column: "OrganizationID"); + migrationBuilder.CreateIndex( + name: "IX_RemotelyUsers_UserName", + table: "RemotelyUsers", + column: "UserName"); + migrationBuilder.CreateIndex( name: "IX_SharedFiles_OrganizationID", table: "SharedFiles", @@ -408,6 +452,9 @@ namespace Remotely.Server.Migrations protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "ApiTokens"); + migrationBuilder.DropTable( name: "AspNetRoleClaims"); diff --git a/Server/Migrations/ApplicationDbContextModelSnapshot.cs b/Server/Migrations/ApplicationDbContextModelSnapshot.cs index 4332ddf8..18cc39e5 100644 --- a/Server/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Server/Migrations/ApplicationDbContextModelSnapshot.cs @@ -299,6 +299,9 @@ namespace Remotely.Server.Migrations .HasColumnType("TEXT") .HasMaxLength(100); + b.Property("CpuUtilization") + .HasColumnType("REAL"); + b.Property("CurrentUser") .HasColumnType("TEXT"); diff --git a/Server/Pages/_DataGrid.cshtml b/Server/Pages/_DataGrid.cshtml index c4883537..b5efe597 100644 --- a/Server/Pages/_DataGrid.cshtml +++ b/Server/Pages/_DataGrid.cshtml @@ -30,6 +30,7 @@ Last Online Platform OS Description + CPU Free Storage Total Storage (GB) Free Memory diff --git a/Server/Services/DataService.cs b/Server/Services/DataService.cs index 8b376afc..743abff1 100644 --- a/Server/Services/DataService.cs +++ b/Server/Services/DataService.cs @@ -106,6 +106,7 @@ namespace Remotely.Server.Services existingDevice.CurrentUser = device.CurrentUser; existingDevice.DeviceName = device.DeviceName; existingDevice.Drives = device.Drives; + existingDevice.CpuUtilization = device.CpuUtilization; existingDevice.FreeMemory = device.FreeMemory; existingDevice.FreeStorage = device.FreeStorage; existingDevice.Is64Bit = device.Is64Bit; diff --git a/Server/wwwroot/scripts/DataGrid.js b/Server/wwwroot/scripts/DataGrid.js index ca7e5f40..51069d5e 100644 --- a/Server/wwwroot/scripts/DataGrid.js +++ b/Server/wwwroot/scripts/DataGrid.js @@ -58,6 +58,7 @@ export function AddOrUpdateDevice(device) { ${new Date(device.LastOnline).toLocaleString()} ${device.Platform} ${device.OSDescription} + ${Math.round(device.CpuUtilization * 100)}% ${Math.round(device.FreeStorage * 100)}% ${device.TotalStorage.toLocaleString()} ${Math.round(device.FreeMemory * 100)}% diff --git a/Server/wwwroot/scripts/DataGrid.js.map b/Server/wwwroot/scripts/DataGrid.js.map index 000b4faf..549b55d7 100644 --- a/Server/wwwroot/scripts/DataGrid.js.map +++ b/Server/wwwroot/scripts/DataGrid.js.map @@ -1 +1 @@ -{"version":3,"file":"DataGrid.js","sourceRoot":"","sources":["DataGrid.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"DataGrid.js","sourceRoot":"","sources":["DataGrid.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Server/wwwroot/scripts/DataGrid.ts b/Server/wwwroot/scripts/DataGrid.ts index ce328416..051f479c 100644 --- a/Server/wwwroot/scripts/DataGrid.ts +++ b/Server/wwwroot/scripts/DataGrid.ts @@ -66,6 +66,7 @@ export function AddOrUpdateDevice(device: Device) { ${new Date(device.LastOnline).toLocaleString()} ${device.Platform} ${device.OSDescription} + ${Math.round(device.CpuUtilization * 100)}% ${Math.round(device.FreeStorage * 100)}% ${device.TotalStorage.toLocaleString()} ${Math.round(device.FreeMemory * 100)}% diff --git a/Server/wwwroot/scripts/Models/Device.ts b/Server/wwwroot/scripts/Models/Device.ts index b28a4c5f..ec8c2419 100644 --- a/Server/wwwroot/scripts/Models/Device.ts +++ b/Server/wwwroot/scripts/Models/Device.ts @@ -3,6 +3,7 @@ export interface Device { Alias: string; AgentVersion: string; + CpuUtilization: number; CurrentUser: string; DeviceName: string; DeviceGroupID: string; diff --git a/Shared/Models/Device.cs b/Shared/Models/Device.cs index 5919dc1b..cd9d2781 100644 --- a/Shared/Models/Device.cs +++ b/Shared/Models/Device.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text.Json.Serialization; +using System.Threading.Tasks; namespace Remotely.Shared.Models { @@ -16,6 +17,7 @@ namespace Remotely.Shared.Models public string AgentVersion { get; set; } [StringLength(100)] public string Alias { get; set; } + public double CpuUtilization { get; set; } public string CurrentUser { get; set; } public virtual DeviceGroup DeviceGroup { get; set; } public string DeviceGroupID { get; set; } @@ -49,7 +51,7 @@ namespace Remotely.Shared.Models public double TotalMemory { get; set; } public double TotalStorage { get; set; } - public static Device Create(ConnectionInfo connectionInfo) + public static async Task Create(ConnectionInfo connectionInfo) { OSPlatform platform = OSUtils.GetPlatform(); DriveInfo systemDrive; @@ -100,26 +102,21 @@ namespace Remotely.Shared.Models device.FreeStorage = freeStorage / device.TotalStorage; } - Tuple totalMemory = new Tuple(0, 0); + + var (freeMemory, totalMemory) = DeviceInformation.GetMemoryInGB(); - if (OSUtils.IsWindows) + if (totalMemory > 0) { - totalMemory = DeviceInformation.GetWinMemoryInGB(); - } - else if (OSUtils.IsLinux) - { - totalMemory = DeviceInformation.GetLinxMemoryInGB(); - } - - if (totalMemory.Item2 > 0) - { - device.FreeMemory = totalMemory.Item1 / totalMemory.Item2; + device.FreeMemory = freeMemory / totalMemory; } else { device.FreeMemory = 0; } - device.TotalMemory = totalMemory.Item2; + + device.TotalMemory = totalMemory; + + device.CpuUtilization = await DeviceInformation.GetCpuUtilization(); if (File.Exists("Remotely_Agent.dll")) { diff --git a/Shared/Services/DeviceInformation.cs b/Shared/Services/DeviceInformation.cs index 7473df27..deecb38a 100644 --- a/Shared/Services/DeviceInformation.cs +++ b/Shared/Services/DeviceInformation.cs @@ -2,13 +2,60 @@ using Remotely.Shared.Services; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace Remotely.Shared.Services { public class DeviceInformation { + public static async Task GetCpuUtilization() + { + double totalUtilization = 0; + var utilizations = new Dictionary>(); + var processes = Process.GetProcesses(); + + foreach (var proc in processes) + { + try + { + var startTime = DateTime.UtcNow; + var startCpuUsage = proc.TotalProcessorTime; + utilizations.Add(proc.Id, new Tuple(startTime, startCpuUsage)); + } + catch + { + continue; + } + } + + await Task.Delay(500); + + foreach (var kvp in utilizations) + { + var endTime = DateTime.UtcNow; + try + { + var proc = Process.GetProcessById(kvp.Key); + var startTime = kvp.Value.Item1; + var startCpuUsage = kvp.Value.Item2; + var endCpuUsage = proc.TotalProcessorTime; + var cpuUsedMs = (endCpuUsage - startCpuUsage).TotalMilliseconds; + var totalMsPassed = (endTime - startTime).TotalMilliseconds; + var cpuUsageTotal = cpuUsedMs / (Environment.ProcessorCount * totalMsPassed); + totalUtilization += cpuUsageTotal; + } + catch + { + continue; + } + } + + return totalUtilization; + } + public static string GetCurrentUser() { try @@ -34,7 +81,23 @@ namespace Remotely.Shared.Services } } - public static Tuple GetLinxMemoryInGB() + public static (double, double) GetMemoryInGB() + { + if (OSUtils.IsWindows) + { + return GetWinMemoryInGB(); + } + else if (OSUtils.IsLinux) + { + return GetLinxMemoryInGB(); + } + else + { + return (0, 0); + } + } + + private static (double, double) GetLinxMemoryInGB() { try { @@ -61,15 +124,15 @@ namespace Remotely.Shared.Services var freeGB = Math.Round((double.Parse(freeKB) / 1024 / 1024), 2); var totalGB = Math.Round((double.Parse(totalKB) / 1024 / 1024), 2); - return new Tuple(freeGB, totalGB); + return (freeGB, totalGB); } catch { - return new Tuple(0, 0); + return (0, 0); } } - public static Tuple GetWinMemoryInGB() + private static (double, double) GetWinMemoryInGB() { try { @@ -80,11 +143,11 @@ namespace Remotely.Shared.Services var total = (ulong)(cimOS.FirstOrDefault()?.CimInstanceProperties["TotalVisibleMemorySize"]?.Value ?? 0); var totalGB = Math.Round(((double)total / 1024 / 1024), 2); - return new Tuple(freeGB, totalGB); + return (freeGB, totalGB); } catch { - return new Tuple(0, 0); + return (0, 0); } } }