Add server admins.

This commit is contained in:
Jared Goodwin 2020-03-06 14:21:53 -08:00
parent 57eb9b3a7e
commit fe6147029a
11 changed files with 155 additions and 74 deletions

View File

@ -69,14 +69,20 @@ namespace Remotely.ScreenCast.Win.Services
{
try
{
if (clipboardText is null)
{
return;
}
var thread = new Thread(() =>
{
Clipboard.SetText(clipboardText);
try
{
if (string.IsNullOrWhiteSpace(clipboardText))
{
Clipboard.Clear();
}
else
{
Clipboard.SetText(clipboardText);
}
}
catch { }
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

View File

@ -111,15 +111,8 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage
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.";

View File

@ -12,7 +12,7 @@
<partial name="_StatusMessage" for="StatusMessage" />
<div class="row">
<div class="col-md-6">
<form method="post" autocomplete="off">
<form id="serverConfigForm" method="post" autocomplete="off">
<div asp-validation-summary="All" class="text-danger"></div>
<h4>Application Settings</h4>
@ -56,7 +56,10 @@
<div class="form-group">
<label asp-for="AppSettingsInput.KnownProxies" class="control-label"></label>
<br />
<select id="knownProxiesSelect" asp-for="AppSettingsInput.KnownProxies" class="form-control"></select>
<select id="knownProxiesSelect"
asp-for="AppSettingsInput.KnownProxies"
asp-items="Model.AppSettingsInput.KnownProxies?.Select(x=>new SelectListItem(x,x))"
class="form-control"></select>
<div class="text-right mb-2 mt-1">
<button id="knownProxiesRemoveButton" type="button" class="btn btn-secondary">Remove</button>
</div>
@ -167,7 +170,10 @@
<div class="form-group">
<label asp-for="AppSettingsInput.TrustedCorsOrigins" class="control-label"></label>
<br />
<select id="trustedCorsSelect" asp-for="AppSettingsInput.TrustedCorsOrigins" class="form-control"></select>
<select id="trustedCorsSelect"
asp-for="AppSettingsInput.TrustedCorsOrigins"
asp-items="Model.AppSettingsInput.TrustedCorsOrigins?.Select(x=>new SelectListItem(x,x))"
class="form-control"></select>
<div class="text-right mb-2 mt-1">
<button id="trustedCorsRemoveButton" type="button" class="btn btn-secondary">Remove</button>
@ -227,7 +233,10 @@
<div class="form-group">
<label asp-for="ServerAdmins" class="control-label"></label>
<br />
<select id="serverAdminsSelect" asp-for="ServerAdmins" class="form-control"></select>
<select id="serverAdminsSelect"
asp-for="ServerAdmins"
asp-items="Model.ServerAdmins?.Select(x=>new SelectListItem(x,x))"
class="form-control"></select>
<div class="text-right mb-2 mt-1">
<button id="serverAdminsRemoveButton" type="button" class="btn btn-secondary">Remove</button>
</div>
@ -240,13 +249,20 @@
<div class="form-group mt-3">
<button type="submit" class="btn btn-primary">Save</button>
<button id="serverConfigSaveButton" type="button" class="btn btn-primary">Save</button>
</div>
</form>
</div>
</div>
<script type="module" src="~/scripts/Pages/ServerConfig.js"></script>
<style>
input[type='checkbox'] {
width: 25px;
height: 25px;
}
</style>
}
else

View File

@ -1,11 +1,3 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Dynamic;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
@ -14,38 +6,54 @@ using Microsoft.Extensions.Configuration;
using Remotely.Server.Services;
using Remotely.Shared.Enums;
using Remotely.Shared.Models;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace Remotely.Server.Areas.Identity.Pages.Account.Manage
{
public class ServerConfigModel : PageModel
{
public ServerConfigModel(IConfiguration configuration, IWebHostEnvironment hostEnv, UserManager<RemotelyUser> userManager)
public ServerConfigModel(IConfiguration configuration,
IWebHostEnvironment hostEnv,
UserManager<RemotelyUser> userManager,
DataService dataService)
{
Configuration = configuration;
HostEnv = hostEnv;
UserManager = userManager;
DataService = dataService;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment HostEnv { get; }
public enum DBProviders
{
PostgreSQL,
SQLite,
SQLServer
}
[BindProperty]
public AppSettingsModel AppSettingsInput { get; set; } = new AppSettingsModel();
[BindProperty]
[Display(Name = "Server Admins")]
public List<string> ServerAdmins { get; set; } = new List<string>();
[BindProperty]
public ConnectionStringsModel ConnectionStrings { get; set; } = new ConnectionStringsModel();
public bool IsServerAdmin { get; set; }
[BindProperty]
[Display(Name = "Server Admins")]
public List<string> ServerAdmins { get; set; } = new List<string>();
[TempData]
public string StatusMessage { get; set; }
public UserManager<RemotelyUser> UserManager { get; }
private IConfiguration Configuration { get; }
private DataService DataService { get; }
private IWebHostEnvironment HostEnv { get; }
private UserManager<RemotelyUser> UserManager { get; }
public async Task<IActionResult> OnGet()
{
IsServerAdmin = (await UserManager.GetUserAsync(User)).IsServerAdmin;
@ -56,9 +64,11 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage
Configuration.Bind("ApplicationOptions", AppSettingsInput);
Configuration.Bind("ConnectionStrings", ConnectionStrings);
ServerAdmins = DataService.GetServerAdmins();
return Page();
}
public async Task<IActionResult> OnPost()
{
IsServerAdmin = (await UserManager.GetUserAsync(User)).IsServerAdmin;
@ -72,10 +82,20 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage
return Page();
}
var configReloaded = false;
Configuration.GetReloadToken().RegisterChangeCallback((e) =>
{
configReloaded = true;
}, null);
await SaveAppSettings();
return RedirectToPage();
while (!configReloaded)
{
await Task.Delay(10);
}
return RedirectToPage();
}
private async Task SaveAppSettings()
@ -103,10 +123,9 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage
await System.IO.File.WriteAllTextAsync(savePath, JsonSerializer.Serialize(settingsJson, new JsonSerializerOptions() { WriteIndented = true }));
// TODO: Save server admins.
await DataService.UpdateServerAdmins(ServerAdmins, User.Identity.Name);
}
public class AppSettingsModel
{
[Display(Name = "Allow API Login")]
@ -130,6 +149,7 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage
[Display(Name = "Max Organizations")]
public int MaxOrganizationCount { get; set; }
[Display(Name = "Record Remote Control Sessions")]
public bool RecordRemoteControlSessions { get; set; }
@ -189,17 +209,8 @@ namespace Remotely.Server.Areas.Identity.Pages.Account.Manage
[Display(Name = "SQLite")]
public string SQLite { get; set; }
[Display(Name = "SQL Server")]
public string SQLServer { get; set; }
}
public enum DBProviders
{
PostgreSQL,
SQLite,
SQLServer
}
}
}
}

View File

@ -88,13 +88,7 @@ namespace Remotely.Server.Areas.Identity.Pages.Account
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if (ModelState.IsValid)
{
var user = new RemotelyUser
{
UserName = Input.Email,
Email = Input.Email ,
IsServerAdmin = organizationCount == 0
};
var result = await _userManager.CreateAsync(user, Input.Password);
var (result, user) = await _dataService.CreateUser(Input.Email, Input.Password, true);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");

View File

@ -64,6 +64,14 @@ namespace Remotely.Server.Services
return true;
}
public List<string> GetServerAdmins()
{
return RemotelyContext.Users
.Where(x => x.IsServerAdmin)
.Select(x => x.UserName)
.ToList();
}
public InviteLink AddInvite(string orgID, Invite invite)
{
invite.InvitedUser = invite.InvitedUser.ToLower();
@ -101,6 +109,7 @@ namespace Remotely.Server.Services
RemotelyContext.SaveChanges();
}
public bool AddOrUpdateDevice(Device device, out Device updatedDevice)
{
var existingDevice = RemotelyContext.Devices.Find(device.ID);
@ -152,6 +161,31 @@ namespace Remotely.Server.Services
return true;
}
public async Task UpdateServerAdmins(List<string> serverAdmins, string callerUserName)
{
var currentAdmins = RemotelyContext.Users.Where(x => x.IsServerAdmin).ToList();
var removeAdmins = currentAdmins.Where(currentAdmin =>
!serverAdmins.Contains(currentAdmin.UserName.Trim().ToLower()) &&
currentAdmin.UserName.Trim().ToLower() != callerUserName.Trim().ToLower());
foreach (var removeAdmin in removeAdmins)
{
removeAdmin.IsServerAdmin = false;
}
var newAdmins = RemotelyContext.Users.Where(user =>
serverAdmins.Contains(user.UserName.Trim().ToLower()) &&
!user.IsServerAdmin);
foreach (var newAdmin in newAdmins)
{
newAdmin.IsServerAdmin = true;
}
await RemotelyContext.SaveChangesAsync();
}
public string AddSharedFile(IFormFile file, string organizationID)
{
var expirationDate = DateTimeOffset.Now.AddDays(-AppConfig.DataRetentionInDays);
@ -233,6 +267,21 @@ namespace Remotely.Server.Services
return newToken;
}
public async Task<(IdentityResult, RemotelyUser)> CreateUser(string email, string password, bool isOrgAdmin)
{
var user = new RemotelyUser
{
UserName = email,
Email = email,
IsServerAdmin = RemotelyContext.Organizations.Count() == 0,
IsAdministrator = isOrgAdmin
};
var result = await UserManager.CreateAsync(user, password);
return (result, user);
}
public async Task DeleteApiToken(string userName, string tokenId)
{
var user = RemotelyContext.Users.FirstOrDefault(x => x.UserName == userName);
@ -720,17 +769,6 @@ namespace Remotely.Server.Services
}
}
public bool SetNewUserProperties(string targetName, string organizationID, bool isAdmin)
{
var targetUser = GetUserByName(targetName);
targetUser.OrganizationID = organizationID;
targetUser.IsAdministrator = isAdmin;
RemotelyContext.SaveChanges();
return true;
}
public void SetServerVerificationToken(string deviceID, string verificationToken)
{
var device = RemotelyContext.Devices.Find(deviceID);

View File

@ -19,12 +19,6 @@ h6 {
font-size: 1rem !important;
}
input[type='checkbox'] {
width: 25px;
height: 25px;
}
.container {
max-width: 95vw !important;
}

View File

@ -1,3 +1,5 @@
var serverConfigForm = document.getElementById("serverConfigForm");
var serverConfigSaveButton = document.getElementById("serverConfigSaveButton");
var trustedCorsAddButton = document.getElementById("trustedCorsAddButton");
var trustedCorsRemoveButton = document.getElementById("trustedCorsRemoveButton");
var trustedCorsInput = document.getElementById("trustedCorsInput");
@ -10,6 +12,18 @@ var serverAdminsAddButton = document.getElementById("serverAdminsAddButton");
var serverAdminsRemoveButton = document.getElementById("serverAdminsRemoveButton");
var serverAdminsInput = document.getElementById("serverAdminsInput");
var serverAdminsSelect = document.getElementById("serverAdminsSelect");
serverConfigSaveButton.addEventListener("click", e => {
for (var i = 0; i < trustedCorsSelect.options.length; i++) {
trustedCorsSelect.options[i].selected = true;
}
for (var i = 0; i < knownProxiesSelect.options.length; i++) {
knownProxiesSelect.options[i].selected = true;
}
for (var i = 0; i < serverAdminsSelect.options.length; i++) {
serverAdminsSelect.options[i].selected = true;
}
serverConfigForm.submit();
});
trustedCorsAddButton.addEventListener("click", ev => {
if (trustedCorsInput.value.length > 0) {
var option = document.createElement("option");

View File

@ -1 +1 @@
{"version":3,"file":"ServerConfig.js","sourceRoot":"","sources":["ServerConfig.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"ServerConfig.js","sourceRoot":"","sources":["ServerConfig.ts"],"names":[],"mappings":"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"}

View File

@ -1,4 +1,7 @@
var trustedCorsAddButton = document.getElementById("trustedCorsAddButton") as HTMLButtonElement;
var serverConfigForm = document.getElementById("serverConfigForm") as HTMLFormElement;
var serverConfigSaveButton = document.getElementById("serverConfigSaveButton") as HTMLButtonElement;
var trustedCorsAddButton = document.getElementById("trustedCorsAddButton") as HTMLButtonElement;
var trustedCorsRemoveButton = document.getElementById("trustedCorsRemoveButton") as HTMLButtonElement;
var trustedCorsInput = document.getElementById("trustedCorsInput") as HTMLInputElement;
var trustedCorsSelect = document.getElementById("trustedCorsSelect") as HTMLSelectElement;
@ -13,7 +16,19 @@ var serverAdminsRemoveButton = document.getElementById("serverAdminsRemoveButton
var serverAdminsInput = document.getElementById("serverAdminsInput") as HTMLInputElement;
var serverAdminsSelect = document.getElementById("serverAdminsSelect") as HTMLSelectElement;
serverConfigSaveButton.addEventListener("click", e => {
for (var i = 0; i < trustedCorsSelect.options.length; i++) {
trustedCorsSelect.options[i].selected = true;
}
for (var i = 0; i < knownProxiesSelect.options.length; i++) {
knownProxiesSelect.options[i].selected = true;
}
for (var i = 0; i < serverAdminsSelect.options.length; i++) {
serverAdminsSelect.options[i].selected = true;
}
serverConfigForm.submit();
});
trustedCorsAddButton.addEventListener("click", ev => {
if (trustedCorsInput.value.length > 0) {