From e123a13e3853087a87a845c7738a74c22ea9064f Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Thu, 30 Jul 2026 09:53:44 +0200 Subject: Apply the by-name access exemption in the search candidate query --- .../Library/Search/SearchQueryAccessFilter.cs | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Emby.Server.Implementations/Library/Search/SearchQueryAccessFilter.cs (limited to 'Emby.Server.Implementations/Library/Search/SearchQueryAccessFilter.cs') diff --git a/Emby.Server.Implementations/Library/Search/SearchQueryAccessFilter.cs b/Emby.Server.Implementations/Library/Search/SearchQueryAccessFilter.cs new file mode 100644 index 0000000000..6e3f01de13 --- /dev/null +++ b/Emby.Server.Implementations/Library/Search/SearchQueryAccessFilter.cs @@ -0,0 +1,38 @@ +using Jellyfin.Database.Implementations.Entities; +using Jellyfin.Extensions; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; + +namespace Emby.Server.Implementations.Library.Search; + +/// +/// Builds the access filter that decides which items a search may return for a user. +/// +internal static class SearchQueryAccessFilter +{ + /// + /// Builds an access filter carrying the search's library access and type filters. + /// + /// The user the search runs for. + /// The search query. + /// The library manager. + /// The access filter. + public static InternalItemsQuery Build(User user, SearchProviderQuery query, ILibraryManager libraryManager) + { + // The type filters have to travel with the access filter: a by-name item belongs to no + // library, so it carries no TopParentId to match, and the library filter only knows to + // exempt it when the query says those types are wanted. A search scoped to a parent gets + // no exemption because a by-name item has no parent to descend from either. + var accessFilter = new InternalItemsQuery(user) + { + IncludeItemTypes = query.IncludeItemTypes, + ExcludeItemTypes = query.ExcludeItemTypes, + IncludeItemsByName = !query.ParentId.HasValue || query.ParentId.Value.IsEmpty() + }; + + // ConfigureUserAccess populates TopParentIds for the libraries the user may open. + libraryManager.ConfigureUserAccess(accessFilter, user); + + return accessFilter; + } +} -- cgit v1.2.3