コード例 #1
0
        /// <summary>
        /// Performs a search for pages and media and maps each result to the view model class SearchHit.
        /// </summary>
        /// <remarks>
        /// The search functionality is handled by the injected SearchService in order to keep the controller simple.
        /// Uses EPiServer Search. For more advanced search functionality such as keyword highlighting,
        /// facets and search statistics consider using EPiServer Find.
        /// </remarks>
        private IEnumerable <SearchContentModel.SearchHit> Search(string searchText, IEnumerable <ContentReference> searchRoots, HttpContextBase context, string languageBranch)
        {
            var query = new GroupQuery(LuceneOperator.AND);

            query.QueryExpressions.Add(new ContentQuery <PageData>());

            var keywordsQuery = new GroupQuery(LuceneOperator.OR);

            keywordsQuery.QueryExpressions.Add(new FieldQuery(searchText));

            keywordsQuery.QueryExpressions.Add(
                new CustomFieldQuery(searchText, "TEASERBLOCK_FIELD"));

            query.QueryExpressions.Add(keywordsQuery);

            var accessQuery = new AccessControlListQuery();

            accessQuery.AddAclForUser(PrincipalInfo.Current, HttpContext);

            query.QueryExpressions.Add(accessQuery);

            var searchHandler = ServiceLocator.Current.GetInstance <SearchHandler>();

            var results = searchHandler.GetSearchResults(query, 1, 40);

            return(results.IndexResponseItems.SelectMany(CreateHitModel));
        }
コード例 #2
0
        public static void AddAclForUser(this AccessControlListQuery query, VirtualRoleRepository <VirtualRoleProviderBase> virtualRoleRepository, PrincipalInfo principal, object context)
        {
            if (principal == null)
            {
                return;
            }
            Validator.ThrowIfNull("virtualRoleRepository", virtualRoleRepository);
            if (!string.IsNullOrEmpty(principal.Name))
            {
                query.AddUser(principal.Name);
            }
            ICollection <string> roleList = principal.RoleList;

            if (roleList != null)
            {
                foreach (string current in roleList)
                {
                    query.AddRole(current);
                }
            }
            foreach (string current2 in virtualRoleRepository.GetAllRoles())
            {
                VirtualRoleProviderBase virtualRoleProviderBase;
                if (virtualRoleRepository.TryGetRole(current2, out virtualRoleProviderBase) && virtualRoleProviderBase.IsInVirtualRole(principal.Principal, context))
                {
                    query.AddRole(current2);
                }
            }
        }
        public static IQueryExpression FilterByACL(this IQueryExpression expression)
        {
            var aclQuery = new AccessControlListQuery();
            var _virtualRoleRepository = ServiceLocator.Current.GetInstance <IVirtualRoleRepository>();
            var principal = PrincipalInfo.Current;
            var context   = HttpContext.Current;

            if (principal?.Principal == null)
            {
                return(expression);
            }

            aclQuery.AddUser(principal.Principal.Identity.Name);
            ClaimsPrincipal     claimsPrincipal = principal.Principal as ClaimsPrincipal;
            IEnumerable <Claim> claims          = claimsPrincipal != null?claimsPrincipal.Claims.Where <Claim>(c => c.Type.Equals("http://schemas.microsoft.com/ws/2008/06/identity/claims/role")) : (IEnumerable <Claim>)null;

            if (claims == null)
            {
                return(expression);
            }
            foreach (Claim claim in claims)
            {
                aclQuery.AddRole(claim.Value);
            }
            foreach (string allRole in _virtualRoleRepository.GetAllRoles())
            {
                VirtualRoleProviderBase virtualRole;
                if (_virtualRoleRepository.TryGetRole(allRole, out virtualRole) && virtualRole.IsInVirtualRole(principal.Principal, context))
                {
                    aclQuery.AddRole(allRole);
                }
            }
            return(expression.And(aclQuery));
        }
コード例 #4
0
        public void Search(string q)
        {
            var culture = ContentLanguage.PreferredCulture.Name;

            SearchResult = new List <IndexResponseItem>();

            var query = new GroupQuery(LuceneOperator.AND);

            // Only search for pages
            query.QueryExpressions.Add(new ContentQuery <PageData>());

            // Search for keywords in any of the fields specified below (OR condition)
            var keywordsQuery = new GroupQuery(LuceneOperator.OR);

            // Search in default field
            keywordsQuery.QueryExpressions.Add(new FieldQuery(q));

            query.QueryExpressions.Add(keywordsQuery);

            // The access control list query will remove any pages the user doesn't have read access to
            var accessQuery = new AccessControlListQuery();

            accessQuery.AddAclForUser(PrincipalInfo.Current, HttpContext.Current);
            query.QueryExpressions.Add(accessQuery);

            var fieldQueryResult = SearchHandler.Instance.GetSearchResults(query, 1, 40)
                                   .IndexResponseItems
                                   .Where(x =>
                                          (x.Culture.Equals(culture) || string.IsNullOrEmpty(x.Culture)))
                                   .ToList();

            SearchResult.AddRange(fieldQueryResult);
        }
コード例 #5
0
        AccessControlListQuery GetSecurityFilter()
        {
            var aclQuery = new AccessControlListQuery();

            aclQuery.AddAclForUser(PrincipalInfo.Current, HttpContext.Current);

            return(aclQuery);
        }
コード例 #6
0
        public ActionResult Index(SearchPage currentPage, string q)
        {
            var viewModel = new SearchPageViewModel(currentPage)
            {
                StartPage = Loader.Get <StartPage>(ContentReference.StartPage),
                MenuPages = FilterForVisitor
                            .Filter(Loader.GetChildren <SitePageData>(ContentReference.StartPage))
                            .Cast <SitePageData>()
                            .Where(p => p.VisibleInMenu),
                Section = currentPage.ContentLink.GetSection()
            };

            if (string.IsNullOrWhiteSpace(q))
            {
                return(View(viewModel));
            }

            // 1. only pages
            var onlyPages = new ContentQuery <SitePageData>();

            // 2. free-text query
            var freeText = new FieldQuery(q);

            // 3. only what current user can read
            var readAccess = new AccessControlListQuery();

            readAccess.AddAclForUser(PrincipalInfo.Current, HttpContext);

            // 4. only under start page (ignore trash bin)
            var underStart = new VirtualPathQuery();

            underStart.AddContentNodes(ContentReference.StartPage);

            // build query
            var query = new GroupQuery(LuceneOperator.AND);

            query.QueryExpressions.Add(onlyPages);
            query.QueryExpressions.Add(freeText);
            query.QueryExpressions.Add(readAccess);
            query.QueryExpressions.Add(underStart);

            // get result
            SearchResults results = _searchHandler.GetSearchResults(query, 1, 10);

            viewModel.SearchText    = q;
            viewModel.SearchResults = results.IndexResponseItems
                                      .Select(item => new Result
            {
                Title       = item.Title,
                Description = item.DisplayText?.TruncateAtWord(20),
                Url         = ConvertToUri(item).ToString()
            }).ToList();

            return(View(viewModel));
        }
コード例 #7
0
        public ActionResult Index(SearchPage currentPage, string q)
        {
            var viewmodel = new SearchPageViewModel(currentPage);

            if (!string.IsNullOrWhiteSpace(q))
            {
                // 1. only pages
                var onlyPages = new ContentQuery <PageData>();

                // 2. free-text query
                var freeText = new FieldQuery(q);

                // 3. only what the current user can read
                var readAccess = new AccessControlListQuery();
                readAccess.AddAclForUser(PrincipalInfo.Current, HttpContext);

                // 4. only under the Start page (to exclude Wastebasket, for example)
                var underStart = new VirtualPathQuery();
                underStart.AddContentNodes(ContentReference.StartPage);

                // build the query from the expressions
                var query = new GroupQuery(LuceneOperator.AND);
                query.QueryExpressions.Add(freeText);
                query.QueryExpressions.Add(onlyPages);
                query.QueryExpressions.Add(readAccess);
                query.QueryExpressions.Add(underStart);

                // get the first page of ten results
                SearchResults results = searchHandler.GetSearchResults(query, 1, 10);

                viewmodel.SearchText = q;

                viewmodel.SearchResults = results.IndexResponseItems
                                          .Select(x => new Result
                {
                    Title       = x.Title,
                    Description = x.DisplayText.TruncateAtWord(20),
                    Url         = GetExternalUrl(x).ToString()
                }).ToList();
            }

            //Not using the base controller CreateViewModel so we need to set the menu
            viewmodel.MenuPages = FilterForVisitor.Filter(
                loader.GetChildren <PageData>(ContentReference.StartPage))
                                  .Cast <PageData>().Where(page => page.VisibleInMenu);

            return(View(viewmodel));
        }
コード例 #8
0
        private void MakeSearch(string q, ProductListPageViewModel viewmodel)
        {
            // 1. only productpages
            var onlyPages = new ContentQuery <ProductPage>();

            // 2. free-text query
            var freeText = new FieldQuery(q);

            // 3. only what the current user can read
            var readAccess = new AccessControlListQuery();

            readAccess.AddAclForUser(PrincipalInfo.Current, HttpContext);

            // 4. only productpages
            var inProductPages = new VirtualPathQuery();

            foreach (var page in viewmodel.MenuPages.Where(p => p.Name == "Shop"))
            {
                inProductPages.AddContentNodes(page.Page.ContentLink);
            }

            // build the query from the expressions
            var query = new GroupQuery(LuceneOperator.AND);

            query.QueryExpressions.Add(freeText);
            query.QueryExpressions.Add(onlyPages);
            query.QueryExpressions.Add(readAccess);
            query.QueryExpressions.Add(inProductPages);

            // get the first page of ten results
            SearchResults results = searchHandler.GetSearchResults(query, 1, 10);

            viewmodel.SearchText = q;

            if (results.TotalHits > 0)
            {
                viewmodel.ProductsToDisplay =
                    results.IndexResponseItems
                    .Where(p => p.Id.ToUpper().Contains(Thread.CurrentThread.CurrentUICulture.Name.ToUpper()))
                    .Select(p => loader.Get <ProductPage>(Guid.Parse(p.Id.Split('|').First())))
                    .ToList();
            }
            else
            {
                viewmodel.ProductsToDisplay = new List <ProductPage>();
            }
        }
コード例 #9
0
        private IQueryExpression CreateQuery(string searchText, IEnumerable <ContentReference> searchRoots, HttpContextBase context, string languageBranch)
        {
            //Main query which groups other queries. Each query added
            //must match in order for a page or file to be returned.
            var query = new GroupQuery(LuceneOperator.AND);

            //Add free text query to the main query
            query.QueryExpressions.Add(new FieldQuery(searchText));

            //Search for pages using the provided language
            var pageTypeQuery = new GroupQuery(LuceneOperator.AND);

            pageTypeQuery.QueryExpressions.Add(new ContentQuery <PageData>());
            pageTypeQuery.QueryExpressions.Add(new FieldQuery(languageBranch, Field.Culture));

            //Search for media without languages
            var contentTypeQuery = new GroupQuery(LuceneOperator.OR);

            contentTypeQuery.QueryExpressions.Add(new ContentQuery <MediaData>());
            contentTypeQuery.QueryExpressions.Add(pageTypeQuery);

            query.QueryExpressions.Add(contentTypeQuery);

            //Create and add query which groups type conditions using OR
            var typeQueries = new GroupQuery(LuceneOperator.OR);

            query.QueryExpressions.Add(typeQueries);

            foreach (var root in searchRoots)
            {
                var contentRootQuery = new VirtualPathQuery();
                contentRootQuery.AddContentNodes(root);
                typeQueries.QueryExpressions.Add(contentRootQuery);
            }

            var accessRightsQuery = new AccessControlListQuery();

            accessRightsQuery.AddAclForUser(PrincipalInfo.Current, context);
            query.QueryExpressions.Add(accessRightsQuery);

            return(query);
        }
コード例 #10
0
        private IQueryExpression CreateQuery(string searchText, IEnumerable<ContentReference> searchRoots, HttpContextBase context, string languageBranch)
        {
            //Main query which groups other queries. Each query added
            //must match in order for a page or file to be returned.
            var query = new GroupQuery(LuceneOperator.AND);

            //Add free text query to the main query
            query.QueryExpressions.Add(new FieldQuery(searchText));

            //Search for pages using the provided language
            var pageTypeQuery = new GroupQuery(LuceneOperator.AND);
            pageTypeQuery.QueryExpressions.Add(new ContentQuery<PageData>());
            pageTypeQuery.QueryExpressions.Add(new FieldQuery(languageBranch, Field.Culture));

            //Search for media without languages
            var contentTypeQuery = new GroupQuery(LuceneOperator.OR);
            contentTypeQuery.QueryExpressions.Add(new ContentQuery<MediaData>());
            contentTypeQuery.QueryExpressions.Add(pageTypeQuery);

            query.QueryExpressions.Add(contentTypeQuery);

            //Create and add query which groups type conditions using OR
            var typeQueries = new GroupQuery(LuceneOperator.OR);
            query.QueryExpressions.Add(typeQueries);

            foreach (var root in searchRoots)
            {
                var contentRootQuery = new VirtualPathQuery();
                contentRootQuery.AddContentNodes(root, _contentLoader);
                typeQueries.QueryExpressions.Add(contentRootQuery);
            }

            var accessRightsQuery = new AccessControlListQuery();
            accessRightsQuery.AddAclForUser(PrincipalInfo.Current, context);
            query.QueryExpressions.Add(accessRightsQuery);

            return query;
        }
コード例 #11
0
        public virtual SearchResults GetSearchResults <T>(string searchQuery, ContentReference root, int page, int pageSize, Collection <SortField> sortFields, bool filterOnAccess) where T : IContent
        {
            if (!this.ServiceActive)
            {
                return(null);
            }
            var groupQuery = new GroupQuery(LuceneOperator.AND);

            groupQuery.QueryExpressions.Add(new ContentQuery <T>());
            groupQuery.QueryExpressions.Add(new FieldQuery(ContentLanguage.PreferredCulture.Name, Field.Culture));
            groupQuery.QueryExpressions.Add(new FieldQuery(searchQuery));
            if (!ContentReference.IsNullOrEmpty(root))
            {
                var virtualPathQuery = new VirtualPathQuery();
                virtualPathQuery.AddContentNodes(root, this.contentRepository);
                groupQuery.QueryExpressions.Add(virtualPathQuery);
            }
            if (filterOnAccess)
            {
                var accessControlListQuery = new AccessControlListQuery();
                accessControlListQuery.AddAclForUser(PrincipalInfo.Current, HttpContext.Current);
                groupQuery.QueryExpressions.Add(accessControlListQuery);
            }

            #region Customized
            Collection <string> sortFieldCollection = null;
            if (sortFields != null && sortFields.Count > 0)
            {
                sortFieldCollection = new Collection <string>();
                foreach (var sortField in sortFields)
                {
                    sortFieldCollection.Add(string.Format("{0},{1},{2}", sortField.Field, sortField.Type, sortField.Reverse));
                }
            }
            #endregion
            return(this.searchHandler.GetSearchResults(groupQuery, this.NamedIndexingService, this.namedIndexes, page, pageSize, sortFieldCollection));
        }
コード例 #12
0
        private IQueryExpression CreateQuery(string searchText, IEnumerable <ContentReference> searchRoots, HttpContextBase context, string languageBranch)
        {
            var query = new GroupQuery(LuceneOperator.AND);

            query.QueryExpressions.Add(new FieldQuery(searchText));

            var pageTypeQuery = new GroupQuery(LuceneOperator.AND);

            pageTypeQuery.QueryExpressions.Add(new ContentQuery <PageData>());
            pageTypeQuery.QueryExpressions.Add(new FieldQuery(languageBranch, Field.Culture));

            var contentTypeQuery = new GroupQuery(LuceneOperator.OR);

            contentTypeQuery.QueryExpressions.Add(new ContentQuery <MediaData>());
            contentTypeQuery.QueryExpressions.Add(pageTypeQuery);

            query.QueryExpressions.Add(contentTypeQuery);

            var typeQueries = new GroupQuery(LuceneOperator.OR);

            query.QueryExpressions.Add(typeQueries);

            foreach (var root in searchRoots)
            {
                var contentRootQuery = new VirtualPathQuery();
                contentRootQuery.AddContentNodes(root);
                typeQueries.QueryExpressions.Add(contentRootQuery);
            }

            var accessRightsQuery = new AccessControlListQuery();

            accessRightsQuery.AddAclForUser(PrincipalInfo.Current, context);
            query.QueryExpressions.Add(accessRightsQuery);

            return(query);
        }
コード例 #13
0
 public static void AddAclForUser(this AccessControlListQuery query, PrincipalInfo principal, object context)
 {
     query.AddAclForUser(VirtualRoleRepository <VirtualRoleProviderBase> .GetDefault(), principal, context);
 }