From f7bf2a2fe7c031577c0d55e51cc6381d5f12cb83 Mon Sep 17 00:00:00 2001 From: "Jamie.Rees" Date: Mon, 21 Nov 2016 13:25:39 +0000 Subject: [PATCH] #218 --- .../Migrations/Version1100.cs | 32 ++++--- PlexRequests.Core/PlexRequests.Core.csproj | 1 + .../SettingModels/UserManagementSettings.cs | 11 ++- .../Users/UserManagementHelper.cs | 62 ++++++++++++++ PlexRequests.Services/Jobs/PlexUserChecker.cs | 46 ++-------- PlexRequests.UI/Helpers/CustomHtmlHelper.cs | 15 +++- .../Modules/Admin/FaultQueueModule.cs | 6 +- .../Admin/UserManagementSettingsModule.cs | 85 +++++++++++++++++++ PlexRequests.UI/Modules/UserLoginModule.cs | 26 +++++- PlexRequests.UI/PlexRequests.UI.csproj | 4 + .../Views/Admin/UserManagementSettings.cshtml | 70 +++++++++++++++ 11 files changed, 296 insertions(+), 62 deletions(-) create mode 100644 PlexRequests.Core/Users/UserManagementHelper.cs create mode 100644 PlexRequests.UI/Modules/Admin/UserManagementSettingsModule.cs create mode 100644 PlexRequests.UI/Views/Admin/UserManagementSettings.cshtml diff --git a/PlexRequests.Core.Migration/Migrations/Version1100.cs b/PlexRequests.Core.Migration/Migrations/Version1100.cs index 7797212be..319b570ab 100644 --- a/PlexRequests.Core.Migration/Migrations/Version1100.cs +++ b/PlexRequests.Core.Migration/Migrations/Version1100.cs @@ -76,10 +76,11 @@ namespace PlexRequests.Core.Migration.Migrations UpdateDb(con); // Update the current admin permissions set + + PopulateDefaultUserManagementSettings(); UpdateAdmin(); ResetLogLevel(); UpdatePlexUsers(); - PopulateDefaultUserManagementSettings(); UpdateScheduledJobs(); MigrateUserNotifications(); @@ -104,7 +105,7 @@ namespace PlexRequests.Core.Migration.Migrations users.FirstOrDefault(x => x.UserName.Equals(u.Username, StringComparison.CurrentCultureIgnoreCase)); if (selectedLocalUser != null) { - selectedLocalUser.Features += (int) Features.RequestAddedNotification; + selectedLocalUser.Features += (int)Features.RequestAddedNotification; UserRepo.Update(selectedLocalUser); } @@ -128,9 +129,9 @@ namespace PlexRequests.Core.Migration.Migrations UserManagementSettings.SaveSettings(new UserManagementSettings { AutoApproveMovies = !plexRequestSettings.RequireMovieApproval, - SearchForTvShows = plexRequestSettings.SearchForTvShows, - SearchForMusic = plexRequestSettings.SearchForMusic, - SearchForMovies = plexRequestSettings.SearchForMovies, + RequestTvShows = plexRequestSettings.SearchForTvShows, + RequestMusic = plexRequestSettings.SearchForMusic, + RequestMovies = plexRequestSettings.SearchForMovies, AutoApproveMusic = !plexRequestSettings.RequireMusicApproval, AutoApproveTvShows = !plexRequestSettings.RequireTvShowApproval }); @@ -145,7 +146,7 @@ namespace PlexRequests.Core.Migration.Migrations } var plexUsers = PlexApi.GetUsers(settings.PlexAuthToken); var prSettings = PlexRequestSettings.GetSettings(); - + var dbUsers = PlexUsers.GetAll().ToList(); foreach (var user in plexUsers.User) { @@ -153,19 +154,19 @@ namespace PlexRequests.Core.Migration.Migrations { continue; } - + int permissions = 0; if (prSettings.SearchForMovies) { - permissions = (int) Permissions.RequestMovie; + permissions = (int)Permissions.RequestMovie; } if (prSettings.SearchForTvShows) { - permissions += (int) Permissions.RequestTvShow; + permissions += (int)Permissions.RequestTvShow; } if (prSettings.SearchForMusic) { - permissions += (int) Permissions.RequestMusic; + permissions += (int)Permissions.RequestMusic; } if (!prSettings.RequireMovieApproval) { @@ -179,11 +180,11 @@ namespace PlexRequests.Core.Migration.Migrations { permissions += (int)Permissions.AutoApproveAlbum; } - + // Add report Issues - + permissions += (int)Permissions.ReportIssue; - + var m = new PlexUsers { PlexUserId = user.Id, @@ -249,7 +250,10 @@ namespace PlexRequests.Core.Migration.Migrations | Permissions.ReportIssue | Permissions.RequestMusic | Permissions.RequestTvShow - | Permissions.RequestMovie); + | Permissions.RequestMovie + | Permissions.AutoApproveAlbum + | Permissions.AutoApproveMovie + | Permissions.AutoApproveTv); } UserRepo.UpdateAll(users); diff --git a/PlexRequests.Core/PlexRequests.Core.csproj b/PlexRequests.Core/PlexRequests.Core.csproj index 3753a4109..f2f79067b 100644 --- a/PlexRequests.Core/PlexRequests.Core.csproj +++ b/PlexRequests.Core/PlexRequests.Core.csproj @@ -153,6 +153,7 @@ + diff --git a/PlexRequests.Core/SettingModels/UserManagementSettings.cs b/PlexRequests.Core/SettingModels/UserManagementSettings.cs index 975eebcc3..308f2e4a5 100644 --- a/PlexRequests.Core/SettingModels/UserManagementSettings.cs +++ b/PlexRequests.Core/SettingModels/UserManagementSettings.cs @@ -28,11 +28,16 @@ namespace PlexRequests.Core.SettingModels { public class UserManagementSettings : Settings { - public bool SearchForMovies { get; set; } - public bool SearchForTvShows { get; set; } - public bool SearchForMusic { get; set; } + public bool RequestMovies { get; set; } + public bool RequestTvShows { get; set; } + public bool RequestMusic { get; set; } public bool AutoApproveMovies { get; set; } public bool AutoApproveTvShows { get; set; } public bool AutoApproveMusic { get; set; } + public bool ReportIssues { get; set; } + + // Features + public bool RecentlyAddedNotification { get; set; } + public bool RecentlyAddedNewsletter { get; set; } } } \ No newline at end of file diff --git a/PlexRequests.Core/Users/UserManagementHelper.cs b/PlexRequests.Core/Users/UserManagementHelper.cs new file mode 100644 index 000000000..dc4c7b367 --- /dev/null +++ b/PlexRequests.Core/Users/UserManagementHelper.cs @@ -0,0 +1,62 @@ +using PlexRequests.Core.SettingModels; +using PlexRequests.Helpers.Permissions; + +namespace PlexRequests.Core.Users +{ + public static class UserManagementHelper + { + + public static int GetPermissions(UserManagementSettings settings) + { + var permission = 0; + + if (settings.AutoApproveMovies) + { + permission += (int)Permissions.AutoApproveMovie; + } + if (settings.AutoApproveMusic) + { + permission += (int)Permissions.AutoApproveAlbum; + } + if (settings.AutoApproveTvShows) + { + permission += (int)Permissions.AutoApproveTv; + } + if (settings.RequestMovies) + { + permission += (int)Permissions.RequestMovie; + } + if (settings.RequestMusic) + { + permission += (int)Permissions.RequestMusic; + } + if (settings.RequestTvShows) + { + permission += (int)Permissions.RequestTvShow; + } + if (settings.ReportIssues) + { + permission += (int)Permissions.ReportIssue; + } + + + return permission; + } + + public static int GetFeatures(UserManagementSettings settings) + { + var features = 0; + + if (settings.RecentlyAddedNewsletter) + { + features += (int)Features.Newsletter; + } + if (settings.RecentlyAddedNotification) + { + features += (int)Features.Newsletter; + } + + return features; + } + } +} \ No newline at end of file diff --git a/PlexRequests.Services/Jobs/PlexUserChecker.cs b/PlexRequests.Services/Jobs/PlexUserChecker.cs index fb851a3f4..e44067186 100644 --- a/PlexRequests.Services/Jobs/PlexUserChecker.cs +++ b/PlexRequests.Services/Jobs/PlexUserChecker.cs @@ -33,12 +33,10 @@ using NLog; using PlexRequests.Api.Interfaces; using PlexRequests.Core; using PlexRequests.Core.SettingModels; -using PlexRequests.Helpers; -using PlexRequests.Helpers.Permissions; +using PlexRequests.Core.Users; using PlexRequests.Services.Interfaces; using PlexRequests.Store.Models; using PlexRequests.Store.Repository; - using Quartz; namespace PlexRequests.Services.Jobs @@ -47,13 +45,14 @@ namespace PlexRequests.Services.Jobs { private static readonly Logger Log = LogManager.GetCurrentClassLogger(); - public PlexUserChecker(IPlexUserRepository plexUsers, IPlexApi plexAPi, IJobRecord rec, ISettingsService plexSettings, ISettingsService prSettings) + public PlexUserChecker(IPlexUserRepository plexUsers, IPlexApi plexAPi, IJobRecord rec, ISettingsService plexSettings, ISettingsService prSettings, ISettingsService umSettings) { Repo = plexUsers; JobRecord = rec; PlexApi = plexAPi; PlexSettings = plexSettings; PlexRequestSettings = prSettings; + UserManagementSettings = umSettings; } private IJobRecord JobRecord { get; } @@ -61,6 +60,7 @@ namespace PlexRequests.Services.Jobs private IPlexUserRepository Repo { get; } private ISettingsService PlexSettings { get; } private ISettingsService PlexRequestSettings { get; } + private ISettingsService UserManagementSettings { get; } public void Execute(IJobExecutionContext context) @@ -75,7 +75,7 @@ namespace PlexRequests.Services.Jobs return; } var plexUsers = PlexApi.GetUsers(settings.PlexAuthToken); - var prSettings = PlexRequestSettings.GetSettings(); + var userManagementSettings = UserManagementSettings.GetSettings(); var dbUsers = Repo.GetAll().ToList(); foreach (var user in plexUsers.User) @@ -105,41 +105,11 @@ namespace PlexRequests.Services.Jobs continue; } - int permissions = 0; - if (prSettings.SearchForMovies) - { - permissions = (int)Permissions.RequestMovie; - } - if (prSettings.SearchForTvShows) - { - permissions += (int)Permissions.RequestTvShow; - } - if (prSettings.SearchForMusic) - { - permissions += (int)Permissions.RequestMusic; - } - if (!prSettings.RequireMovieApproval) - { - permissions += (int)Permissions.AutoApproveMovie; - } - if (!prSettings.RequireTvShowApproval) - { - permissions += (int)Permissions.AutoApproveTv; - } - if (!prSettings.RequireMusicApproval) - { - permissions += (int)Permissions.AutoApproveAlbum; - } - - // Add report Issues - - permissions += (int)Permissions.ReportIssue; - - var m = new PlexUsers + var m = new PlexUsers { PlexUserId = user.Id, - Permissions = permissions, - Features = 0, + Permissions = UserManagementHelper.GetPermissions(userManagementSettings), + Features = UserManagementHelper.GetFeatures(userManagementSettings), UserAlias = string.Empty, EmailAddress = user.Email, Username = user.Username, diff --git a/PlexRequests.UI/Helpers/CustomHtmlHelper.cs b/PlexRequests.UI/Helpers/CustomHtmlHelper.cs index a8fcf66c0..103421c60 100644 --- a/PlexRequests.UI/Helpers/CustomHtmlHelper.cs +++ b/PlexRequests.UI/Helpers/CustomHtmlHelper.cs @@ -24,10 +24,9 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // ************************************************************************/ #endregion -using System.Reflection; +using System.Text; using Nancy.ViewEngines.Razor; - using PlexRequests.Helpers; namespace PlexRequests.UI.Helpers @@ -41,5 +40,17 @@ namespace PlexRequests.UI.Helpers return helper.Raw(htmlString); } + + public static IHtmlString Checkbox(this HtmlHelpers helper, bool check, string name, string display) + { + var sb = new StringBuilder(); + + sb.AppendLine("
"); + sb.AppendLine("
"); + sb.AppendFormat("", name, display, check ? "checked=\"checked\"" : string.Empty); + sb.AppendLine("
"); + sb.AppendLine("
"); + return helper.Raw(sb.ToString()); + } } } \ No newline at end of file diff --git a/PlexRequests.UI/Modules/Admin/FaultQueueModule.cs b/PlexRequests.UI/Modules/Admin/FaultQueueModule.cs index 996dbdcc6..22b916bc1 100644 --- a/PlexRequests.UI/Modules/Admin/FaultQueueModule.cs +++ b/PlexRequests.UI/Modules/Admin/FaultQueueModule.cs @@ -43,17 +43,15 @@ namespace PlexRequests.UI.Modules.Admin { public class FaultQueueModule : BaseModule { - public FaultQueueModule(ISettingsService settingsService, ICacheProvider cache, IRepository requestQueue, ISecurityExtensions security) : base("admin", settingsService, security) + public FaultQueueModule(ISettingsService settingsService, IRepository requestQueue, ISecurityExtensions security) : base("admin", settingsService, security) { - Cache = cache; RequestQueue = requestQueue; Before += (ctx) => Security.AdminLoginRedirect(Permissions.Administrator, ctx); Get["Index", "/faultqueue"] = x => Index(); } - - private ICacheProvider Cache { get; } + private IRepository RequestQueue { get; } private Negotiator Index() diff --git a/PlexRequests.UI/Modules/Admin/UserManagementSettingsModule.cs b/PlexRequests.UI/Modules/Admin/UserManagementSettingsModule.cs new file mode 100644 index 000000000..84bede852 --- /dev/null +++ b/PlexRequests.UI/Modules/Admin/UserManagementSettingsModule.cs @@ -0,0 +1,85 @@ +#region Copyright +// /************************************************************************ +// Copyright (c) 2016 Jamie Rees +// File: SystemStatusModule.cs +// Created By: Jamie Rees +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ************************************************************************/ +#endregion + +using System.Threading.Tasks; +using Nancy; +using Nancy.ModelBinding; +using Nancy.Responses.Negotiation; +using Nancy.Validation; +using NLog; +using NLog.Fluent; +using PlexRequests.Core; +using PlexRequests.Core.SettingModels; +using PlexRequests.Helpers; +using PlexRequests.Helpers.Permissions; +using PlexRequests.UI.Helpers; +using PlexRequests.UI.Models; +using ISecurityExtensions = PlexRequests.Core.ISecurityExtensions; + +namespace PlexRequests.UI.Modules.Admin +{ + public class UserManagementSettingsModule : BaseModule + { + public UserManagementSettingsModule(ISettingsService settingsService, ISettingsService umSettings, ISecurityExtensions security) : base("admin", settingsService, security) + { + UserManagementSettings = umSettings; + + Before += (ctx) => Security.AdminLoginRedirect(Permissions.Administrator, ctx); + + Get["UserManagementSettings","/usermanagementsettings", true] = async(x,ct) => await Index(); + Post["/usermanagementsettings", true] = async(x,ct) => await Update(); + } + + private ISettingsService UserManagementSettings { get; } + private static readonly Logger Log = LogManager.GetCurrentClassLogger(); + + private async Task Index() + { + var model = await UserManagementSettings.GetSettingsAsync(); + + return View["UserManagementSettings", model]; + } + + + private async Task Update() + { + var settings = this.Bind(); + var valid = this.Validate(settings); + if (!valid.IsValid) + { + var error = valid.SendJsonError(); + Log.Info("Error validating User Management settings, message: {0}", error.Message); + return Response.AsJson(error); + } + + var result = await UserManagementSettings.SaveSettingsAsync(settings); + return Response.AsJson(result + ? new JsonResponseModel { Result = true, Message = "Successfully Updated the Settings for User Management!" } + : new JsonResponseModel { Result = false, Message = "Could not update the settings, take a look at the logs." }); + } + } +} \ No newline at end of file diff --git a/PlexRequests.UI/Modules/UserLoginModule.cs b/PlexRequests.UI/Modules/UserLoginModule.cs index 547b902f7..46a76de47 100644 --- a/PlexRequests.UI/Modules/UserLoginModule.cs +++ b/PlexRequests.UI/Modules/UserLoginModule.cs @@ -38,11 +38,15 @@ using PlexRequests.Api.Interfaces; using PlexRequests.Api.Models.Plex; using PlexRequests.Core; using PlexRequests.Core.SettingModels; +using PlexRequests.Core.Users; using PlexRequests.Helpers; using PlexRequests.Helpers.Analytics; +using PlexRequests.Helpers.Permissions; using PlexRequests.Store; +using PlexRequests.Store.Models; using PlexRequests.Store.Repository; using PlexRequests.UI.Authentication; +using PlexRequests.UI.Helpers; using ISecurityExtensions = PlexRequests.Core.ISecurityExtensions; @@ -51,7 +55,8 @@ namespace PlexRequests.UI.Modules public class UserLoginModule : BaseModule { public UserLoginModule(ISettingsService auth, IPlexApi api, ISettingsService plexSettings, ISettingsService pr, - ISettingsService lp, IAnalytics a, IResourceLinker linker, IRepository userLogins, IPlexUserRepository plexUsers, ICustomUserMapper custom, ISecurityExtensions security) + ISettingsService lp, IAnalytics a, IResourceLinker linker, IRepository userLogins, IPlexUserRepository plexUsers, ICustomUserMapper custom, + ISecurityExtensions security, ISettingsService userManagementSettings) : base("userlogin", pr, security) { AuthService = auth; @@ -63,6 +68,7 @@ namespace PlexRequests.UI.Modules UserLogins = userLogins; PlexUserRepository = plexUsers; CustomUserMapper = custom; + UserManagementSettings = userManagementSettings; Get["UserLoginIndex", "/", true] = async (x, ct) => { @@ -88,6 +94,7 @@ namespace PlexRequests.UI.Modules private IRepository UserLogins { get; } private IPlexUserRepository PlexUserRepository { get; } private ICustomUserMapper CustomUserMapper { get; } + private ISettingsService UserManagementSettings {get;} private static Logger Log = LogManager.GetCurrentClassLogger(); @@ -190,6 +197,23 @@ namespace PlexRequests.UI.Modules { loginGuid = Guid.Parse(dbUser.UserGuid); } + + if(loginGuid == Guid.Empty && settings.UserAuthentication) + { + var defaultSettings = UserManagementSettings.GetSettings(); + loginGuid = Guid.NewGuid(); + // Looks like we still don't have an entry, so this user does not exist + await PlexUserRepository.InsertAsync(new PlexUsers + { + PlexUserId = GetUserIdIsInPlexFriends(username, plexSettings.PlexAuthToken) ?? string.Empty, + UserAlias = string.Empty, + Permissions = UserManagementHelper.GetPermissions(defaultSettings), + Features = UserManagementHelper.GetPermissions(defaultSettings), + Username = username, + EmailAddress = string.Empty, // We don't have it, we will get it on the next scheduled job run + LoginId = loginGuid.ToString() + }); + } } if (!authenticated) diff --git a/PlexRequests.UI/PlexRequests.UI.csproj b/PlexRequests.UI/PlexRequests.UI.csproj index 9e02ae2f6..de957640d 100644 --- a/PlexRequests.UI/PlexRequests.UI.csproj +++ b/PlexRequests.UI/PlexRequests.UI.csproj @@ -244,6 +244,7 @@ + @@ -729,6 +730,9 @@ Always + + Always + web.config diff --git a/PlexRequests.UI/Views/Admin/UserManagementSettings.cshtml b/PlexRequests.UI/Views/Admin/UserManagementSettings.cshtml new file mode 100644 index 000000000..4138e1f98 --- /dev/null +++ b/PlexRequests.UI/Views/Admin/UserManagementSettings.cshtml @@ -0,0 +1,70 @@ +@using PlexRequests.UI.Helpers +@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase +@Html.Partial("_Sidebar") + +
+
+
+ User Management Settings + + Here you can manage the default permissions and features that your users get + + +

Permissions

+ @Html.Checkbox(Model.RequestMovies, "RequestMovies", "Request Movies"); + @Html.Checkbox(Model.RequestTvShows, "RequestTvShows", "Request TV Shows"); + @Html.Checkbox(Model.RequestMusic, "RequestMusic", "Request Music"); + @Html.Checkbox(Model.AutoApproveMovies, "AutoApproveMovies", "Auto Approve Movie Requests"); + @Html.Checkbox(Model.AutoApproveTvShows, "AutoApproveTvShows", "Auto Approve TV Show Requests"); + @Html.Checkbox(Model.AutoApproveMusic, "AutoApproveMusic", "Auto Approve Music Requests"); + @Html.Checkbox(Model.ReportIssues, "ReportIssues", "Report Issues"); + + + +

Features

+ @Html.Checkbox(Model.RecentlyAddedNewsletter, "RecentlyAddedNewsletter", "Recently Added Newsletter"); + @Html.Checkbox(Model.RecentlyAddedNotification, "RecentlyAddedNotification", "Recently Added Notifications"); + + + + +
+
+
+
+ +
+
+
+
+
+ + \ No newline at end of file