From c0070868abb106f442568d485c9ee89217c689ad Mon Sep 17 00:00:00 2001 From: "Jamie.Rees" Date: Fri, 9 Dec 2016 15:34:35 +0000 Subject: [PATCH] Fixes around the server admin #754 --- PlexRequests.UI/Modules/UserLoginModule.cs | 23 +++- .../Modules/UserManagementModule.cs | 111 ++++++++++++------ 2 files changed, 96 insertions(+), 38 deletions(-) diff --git a/PlexRequests.UI/Modules/UserLoginModule.cs b/PlexRequests.UI/Modules/UserLoginModule.cs index 38635a1f1..a3c8f65e7 100644 --- a/PlexRequests.UI/Modules/UserLoginModule.cs +++ b/PlexRequests.UI/Modules/UserLoginModule.cs @@ -41,6 +41,7 @@ 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; @@ -139,6 +140,7 @@ namespace PlexRequests.UI.Modules } var authenticated = false; + var isOwner = false; var settings = await AuthService.GetSettingsAsync(); var plexSettings = await PlexSettings.GetSettingsAsync(); @@ -173,6 +175,7 @@ namespace PlexRequests.UI.Modules { Log.Debug("User is the account owner"); authenticated = true; + isOwner = true; } else { @@ -194,6 +197,7 @@ namespace PlexRequests.UI.Modules { Log.Debug("User is the account owner"); authenticated = true; + isOwner = true; userId = GetOwnerId(plexSettings.PlexAuthToken, username); } Log.Debug("Friends list result = {0}", authenticated); @@ -228,15 +232,26 @@ namespace PlexRequests.UI.Modules { var defaultSettings = UserManagementSettings.GetSettings(); loginGuid = Guid.NewGuid(); + + var defaultPermissions = (Permissions)UserManagementHelper.GetPermissions(defaultSettings); + if (isOwner) + { + // If we are the owner, add the admin permission. + if (!defaultPermissions.HasFlag(Permissions.Administrator)) + { + defaultPermissions += (int)Permissions.Administrator; + } + } + // 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, + PlexUserId = userId, UserAlias = string.Empty, - Permissions = UserManagementHelper.GetPermissions(defaultSettings), + Permissions = (int)defaultPermissions, Features = UserManagementHelper.GetPermissions(defaultSettings), - Username = username, - EmailAddress = string.Empty, // We don't have it, we will get it on the next scheduled job run + Username = username, + EmailAddress = string.Empty, // We don't have it, we will get it on the next scheduled job run (in 30 mins) LoginId = loginGuid.ToString() }); } diff --git a/PlexRequests.UI/Modules/UserManagementModule.cs b/PlexRequests.UI/Modules/UserManagementModule.cs index cf7669a57..3066b2c52 100644 --- a/PlexRequests.UI/Modules/UserManagementModule.cs +++ b/PlexRequests.UI/Modules/UserManagementModule.cs @@ -44,7 +44,7 @@ namespace PlexRequests.UI.Modules Get["/"] = x => Load(); Get["/users", true] = async (x, ct) => await LoadUsers(); - Post["/createuser", true] = async (x,ct) => await CreateUser(); + Post["/createuser", true] = async (x, ct) => await CreateUser(); Get["/local/{id}"] = x => LocalDetails((Guid)x.id); Get["/plex/{id}", true] = async (x, ct) => await PlexDetails(x.id); Get["/permissions"] = x => GetEnum(); @@ -91,6 +91,7 @@ namespace PlexRequests.UI.Modules { var dbUser = plexDbUsers.FirstOrDefault(x => x.PlexUserId == u.Id); var userDb = userLogins.FirstOrDefault(x => x.UserId == u.Id); + // We don't have the user in the database yet if (dbUser == null) { @@ -102,6 +103,15 @@ namespace PlexRequests.UI.Modules model.Add(MapPlexUser(u, dbUser, userDb?.LastLoggedIn ?? DateTime.MinValue)); } } + + // Also get the server admin + var account = PlexApi.GetAccount(plexSettings.PlexAuthToken); + if (account != null) + { + var dbUser = plexDbUsers.FirstOrDefault(x => x.PlexUserId == account.Id); + var userDb = userLogins.FirstOrDefault(x => x.UserId == account.Id); + model.Add(MapPlexAdmin(account, dbUser, userDb?.LastLoggedIn ?? DateTime.MinValue)); + } } return Response.AsJson(model); } @@ -192,7 +202,7 @@ namespace PlexRequests.UI.Modules { localUser.Permissions = permissionsValue; localUser.Features = featuresValue; - + var currentProps = ByteConverterHelper.ReturnObject(localUser.UserProperties); // Let's check if the alias has changed, if so we need to change all the requests associated with this @@ -231,6 +241,24 @@ namespace PlexRequests.UI.Modules return Response.AsJson(retUser); } + // So it could actually be the admin + var account = PlexApi.GetAccount(plexSettings.PlexAuthToken); + if (plexDbUser != null && account != null) + { + // We have a user in the DB for this Plex Account + plexDbUser.Permissions = permissionsValue; + plexDbUser.Features = featuresValue; + + await UpdateRequests(plexDbUser.Username, plexDbUser.UserAlias, model.Alias); + + plexDbUser.UserAlias = model.Alias; + + await PlexUsersRepository.UpdateAsync(plexDbUser); + + var retUser = MapPlexAdmin(account, plexDbUser, userLogin?.LastLoggedIn ?? DateTime.MinValue); + return Response.AsJson(retUser); + } + // We have a Plex Account but he's not in the DB if (plexUser != null) { @@ -369,35 +397,9 @@ namespace PlexRequests.UI.Modules LastLoggedIn = lastLoggedIn, }; - // Add permissions - foreach (var p in Enum.GetValues(typeof(Permissions))) - { - var perm = (Permissions)p; - var displayValue = EnumHelper.GetDisplayValue(perm); - var pm = new CheckBox - { - Name = displayValue, - Selected = permissions.HasFlag(perm), - Value = (int)perm - }; - m.Permissions.Add(pm); - } - - // Add features - foreach (var p in Enum.GetValues(typeof(Features))) - { - var perm = (Features)p; - var displayValue = EnumHelper.GetDisplayValue(perm); - var pm = new CheckBox - { - Name = displayValue, - Selected = features.HasFlag(perm), - Value = (int)perm - }; - - m.Features.Add(pm); - } + m.Permissions.AddRange(GetPermissions(permissions)); + m.Features.AddRange(GetFeatures(features)); return m; } @@ -427,6 +429,42 @@ namespace PlexRequests.UI.Modules }, }; + m.Permissions.AddRange(GetPermissions(permissions)); + m.Features.AddRange(GetFeatures(features)); + + return m; + } + + private UserManagementUsersViewModel MapPlexAdmin(PlexAccount plexInfo, PlexUsers dbUser, DateTime lastLoggedIn) + { + if (dbUser == null) + { + dbUser = new PlexUsers(); + } + var features = (Features)dbUser?.Features; + var permissions = (Permissions)dbUser?.Permissions; + + var m = new UserManagementUsersViewModel + { + Id = plexInfo.Id, + PermissionsFormattedString = permissions == 0 ? "None" : permissions.ToString(), + FeaturesFormattedString = features.ToString(), + Username = plexInfo.Username, + Type = UserType.PlexUser, + EmailAddress = plexInfo.Email, + Alias = dbUser?.UserAlias ?? string.Empty, + LastLoggedIn = lastLoggedIn, + }; + + m.Permissions.AddRange(GetPermissions(permissions)); + m.Features.AddRange(GetFeatures(features)); + + return m; + } + + private List GetPermissions(Permissions permissions) + { + var retVal = new List(); // Add permissions foreach (var p in Enum.GetValues(typeof(Permissions))) { @@ -439,9 +477,15 @@ namespace PlexRequests.UI.Modules Value = (int)perm }; - m.Permissions.Add(pm); + retVal.Add(pm); } + return retVal; + } + + private List GetFeatures(Features features) + { + var retVal = new List(); // Add features foreach (var p in Enum.GetValues(typeof(Features))) { @@ -454,10 +498,9 @@ namespace PlexRequests.UI.Modules Value = (int)perm }; - m.Features.Add(pm); + retVal.Add(pm); } - - return m; + return retVal; } } }