From 310f0e2811cd56003b67d964a41447e92e61a75f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 18 Apr 2017 15:22:17 -0400 Subject: [PATCH] fixes #2008 - Collections doesn't respect UserPolicy --- MediaBrowser.Controller/Entities/Folder.cs | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index be41d896dd..e89dd58c8f 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -13,6 +13,7 @@ using System.Threading.Tasks; using MediaBrowser.Common.IO; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.IO; using MediaBrowser.Model.Channels; @@ -735,9 +736,61 @@ namespace MediaBrowser.Controller.Entities query.ParentId = query.ParentId ?? Id; } + if (RequiresPostFiltering2(query)) + { + return QueryWithPostFiltering2(query); + } + return LibraryManager.GetItemsResult(query); } + private QueryResult QueryWithPostFiltering2(InternalItemsQuery query) + { + var startIndex = query.StartIndex; + var limit = query.Limit; + + query.StartIndex = null; + query.Limit = null; + + var itemsList = LibraryManager.GetItemList(query); + var user = query.User; + + if (user != null) + { + // needed for boxsets + itemsList = itemsList.Where(i => i.IsVisibleStandalone(query.User)); + } + + var itemsArray = itemsList.ToArray(); + var totalCount = itemsArray.Length; + + if (limit.HasValue) + { + itemsArray = itemsArray.Skip(startIndex ?? 0).Take(limit.Value).ToArray(); + } + else if (startIndex.HasValue) + { + itemsArray = itemsArray.Skip(startIndex.Value).ToArray(); + } + + return new QueryResult + { + TotalRecordCount = totalCount, + Items = itemsArray + }; + } + + private bool RequiresPostFiltering2(InternalItemsQuery query) + { + if (query.IncludeItemTypes.Length == 1 && string.Equals(query.IncludeItemTypes[0], typeof(BoxSet).Name, StringComparison.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to BoxSet query"); + return true; + } + + return false; + } + private bool RequiresPostFiltering(InternalItemsQuery query) { if (LinkedChildren.Count > 0)