diff --git a/PlexRequests.Store/SqlTables.sql b/PlexRequests.Store/SqlTables.sql index a6e696fba..23d49a87c 100644 --- a/PlexRequests.Store/SqlTables.sql +++ b/PlexRequests.Store/SqlTables.sql @@ -36,24 +36,3 @@ CREATE TABLE IF NOT EXISTS Log CallSite varchar(100) NOT NULL, Exception varchar(100) NOT NULL ); - -CREATE TABLE IF NOT EXISTS Requested -( - Id INTEGER PRIMARY KEY AUTOINCREMENT, - Type INTEGER NOT NULL, - ProviderId INTEGER NOT NULL, - ImdbId varchar(50), - Overview varchar(50), - Title varchar(50) NOT NULL, - PosterPath varchar(50) NOT NULL, - ReleaseDate varchar(50) NOT NULL, - Status varchar(50) NOT NULL, - AdminNote varchar(50), - Approved INTEGER NOT NULL, - LatestTv INTEGER NOT NULL, - RequestedBy varchar(50), - RequestedDate varchar(50) NOT NULL, - Available INTEGER(50), - Issues INTEGER, - OtherMessage varchar(50) -); \ No newline at end of file diff --git a/PlexRequests.UI.Tests/UserLoginModuleTests.cs b/PlexRequests.UI.Tests/UserLoginModuleTests.cs index 6b4e0b4d3..338949b00 100644 --- a/PlexRequests.UI.Tests/UserLoginModuleTests.cs +++ b/PlexRequests.UI.Tests/UserLoginModuleTests.cs @@ -36,7 +36,6 @@ using Newtonsoft.Json; using NUnit.Framework; using PlexRequests.Api.Interfaces; -using PlexRequests.Api.Models; using PlexRequests.Api.Models.Plex; using PlexRequests.Core; using PlexRequests.Core.SettingModels; @@ -81,7 +80,7 @@ namespace PlexRequests.UI.Tests with.Header("Accept", "application/json"); with.FormValue("Username", "abc"); }); - + Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); Assert.That(result.Context.Request.Session[SessionKeys.UsernameKey], Is.EqualTo("abc")); @@ -142,6 +141,7 @@ namespace PlexRequests.UI.Tests AuthMock.Setup(x => x.GetSettings()).Returns(expectedSettings); PlexMock.Setup(x => x.GetUsers(It.IsAny())).Returns(plexFriends); + PlexMock.Setup(x => x.GetAccount(It.IsAny())).Returns(new PlexAccount()); var bootstrapper = new ConfigurableBootstrapper(with => { @@ -188,6 +188,7 @@ namespace PlexRequests.UI.Tests AuthMock.Setup(x => x.GetSettings()).Returns(expectedSettings); PlexMock.Setup(x => x.GetUsers(It.IsAny())).Returns(plexFriends); + PlexMock.Setup(x => x.GetAccount(It.IsAny())).Returns(new PlexAccount()); var bootstrapper = new ConfigurableBootstrapper(with => { @@ -245,6 +246,7 @@ namespace PlexRequests.UI.Tests AuthMock.Setup(x => x.GetSettings()).Returns(expectedSettings); PlexMock.Setup(x => x.GetUsers(It.IsAny())).Returns(plexFriends); PlexMock.Setup(x => x.SignIn(It.IsAny(), It.IsAny())).Returns(plexAuth); + PlexMock.Setup(x => x.GetAccount(It.IsAny())).Returns(new PlexAccount()); var bootstrapper = new ConfigurableBootstrapper(with => { @@ -376,7 +378,7 @@ namespace PlexRequests.UI.Tests with.RootPathProvider(); }); - bootstrapper.WithSession(new Dictionary { {SessionKeys.UsernameKey, "abc"} }); + bootstrapper.WithSession(new Dictionary { { SessionKeys.UsernameKey, "abc" } }); var browser = new Browser(bootstrapper); var result = browser.Get("/userlogin/logout", with => @@ -388,5 +390,108 @@ namespace PlexRequests.UI.Tests Assert.That(HttpStatusCode.SeeOther, Is.EqualTo(result.StatusCode)); Assert.That(result.Context.Request.Session[SessionKeys.UsernameKey], Is.Null); } + + [Test] + public void LoginWithOwnerUsernameSuccessfully() + { + var expectedSettings = new AuthenticationSettings { UserAuthentication = true, PlexAuthToken = "abc" }; + var plexFriends = new PlexFriends + { + User = new[] + { + new UserFriends() + } + }; + + var account = new PlexAccount { Username = "Jamie" }; + AuthMock.Setup(x => x.GetSettings()).Returns(expectedSettings); + PlexMock.Setup(x => x.GetUsers(It.IsAny())).Returns(plexFriends); + PlexMock.Setup(x => x.GetAccount(It.IsAny())).Returns(account); + PlexMock.Setup(x => x.SignIn(It.IsAny(), It.IsAny())).Returns(new PlexAuthentication { user = new User { username = "Jamie" } }); + + var bootstrapper = new ConfigurableBootstrapper(with => + { + with.Module(); + with.Dependency(AuthMock.Object); + with.Dependency(PlexMock.Object); + with.RootPathProvider(); + }); + + bootstrapper.WithSession(new Dictionary()); + + var browser = new Browser(bootstrapper); + var result = browser.Post("/userlogin", with => + { + with.HttpRequest(); + with.Header("Accept", "application/json"); + with.FormValue("Username", "Jamie"); + }); + + Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); + Assert.That(result.Context.Request.Session[SessionKeys.UsernameKey], Is.EqualTo("Jamie")); + + var body = JsonConvert.DeserializeObject(result.Body.AsString()); + Assert.That(body.Result, Is.EqualTo(true)); + AuthMock.Verify(x => x.GetSettings(), Times.Once); + PlexMock.Verify(x => x.SignIn(It.IsAny(), It.IsAny()), Times.Never); + PlexMock.Verify(x => x.GetUsers(It.IsAny()), Times.Once); + } + + [Test] + public void LoginWithOwnerUsernameAndPasswordSuccessfully() + { + var expectedSettings = new AuthenticationSettings { UserAuthentication = true, UsePassword = true, PlexAuthToken = "abc" }; + var plexFriends = new PlexFriends + { + User = new[] + { + new UserFriends() + } + }; + var plexAuth = new PlexAuthentication + { + user = new User + { + authentication_token = "abc", + username = "Jamie" + } + }; + + var account = new PlexAccount { Username = "Jamie" }; + + AuthMock.Setup(x => x.GetSettings()).Returns(expectedSettings); + PlexMock.Setup(x => x.GetUsers(It.IsAny())).Returns(plexFriends); + PlexMock.Setup(x => x.SignIn(It.IsAny(), It.IsAny())).Returns(plexAuth); + PlexMock.Setup(x => x.GetAccount(It.IsAny())).Returns(account); + + var bootstrapper = new ConfigurableBootstrapper(with => + { + with.Module(); + with.Dependency(AuthMock.Object); + with.Dependency(PlexMock.Object); + with.RootPathProvider(); + }); + + bootstrapper.WithSession(new Dictionary()); + + var browser = new Browser(bootstrapper); + var result = browser.Post("/userlogin", with => + { + with.HttpRequest(); + with.Header("Accept", "application/json"); + with.FormValue("Username", "jamie"); + with.FormValue("Password", "abc"); + }); + + + Assert.That(HttpStatusCode.OK, Is.EqualTo(result.StatusCode)); + Assert.That(result.Context.Request.Session[SessionKeys.UsernameKey], Is.EqualTo("jamie")); + + var body = JsonConvert.DeserializeObject(result.Body.AsString()); + Assert.That(body.Result, Is.EqualTo(true)); + AuthMock.Verify(x => x.GetSettings(), Times.Once); + PlexMock.Verify(x => x.SignIn(It.IsAny(), It.IsAny()), Times.Once); + PlexMock.Verify(x => x.GetUsers(It.IsAny()), Times.Never); + } } } \ No newline at end of file diff --git a/PlexRequests.UI/Modules/UserLoginModule.cs b/PlexRequests.UI/Modules/UserLoginModule.cs index 224f86d5e..cfadd2b8f 100644 --- a/PlexRequests.UI/Modules/UserLoginModule.cs +++ b/PlexRequests.UI/Modules/UserLoginModule.cs @@ -25,6 +25,7 @@ // ************************************************************************/ #endregion +using System; using System.Collections.Generic; using System.Linq; @@ -101,7 +102,7 @@ namespace PlexRequests.UI.Modules if (signedIn.user?.authentication_token != null) { Log.Debug("Correct credentials, checking if the user is account owner or in the friends list"); - if (CheckIfUserIsOwner(settings.PlexAuthToken, username)) + if (CheckIfUserIsOwner(settings.PlexAuthToken, signedIn.user?.username)) { Log.Debug("User is the account owner"); authenticated = true; @@ -117,6 +118,11 @@ namespace PlexRequests.UI.Modules { Log.Debug("Need to auth"); authenticated = CheckIfUserIsInPlexFriends(username, settings.PlexAuthToken); + if (CheckIfUserIsOwner(settings.PlexAuthToken, username)) + { + Log.Debug("User is the account owner"); + authenticated = true; + } Log.Debug("Friends list result = {0}", authenticated); } else if(!settings.UserAuthentication) // No auth, let them pass! @@ -152,7 +158,11 @@ namespace PlexRequests.UI.Modules private bool CheckIfUserIsOwner(string authToken, string userName) { var userAccount = Api.GetAccount(authToken); - return userAccount.Username == userName; + if (userAccount == null) + { + return false; + } + return userAccount.Username != null && userAccount.Username.Equals(userName, StringComparison.CurrentCultureIgnoreCase); } private bool CheckIfUserIsInPlexFriends(string username, string authToken) @@ -160,7 +170,8 @@ namespace PlexRequests.UI.Modules var users = Api.GetUsers(authToken); Log.Debug("Plex Users: "); Log.Debug(users.DumpJson()); - return users.User.Any(x => x.Username == username); + var allUsers = users.User?.Where(x => !string.IsNullOrEmpty(x.Username)); + return allUsers != null && allUsers.Any(x => x.Username.Equals(username, StringComparison.CurrentCultureIgnoreCase)); } private bool IsUserInDeniedList(string username, AuthenticationSettings settings)