/// <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)); }
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)); }
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); }
AccessControlListQuery GetSecurityFilter() { var aclQuery = new AccessControlListQuery(); aclQuery.AddAclForUser(PrincipalInfo.Current, HttpContext.Current); return(aclQuery); }
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)); }
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)); }
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>(); } }
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); }
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; }
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)); }
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); }
public static void AddAclForUser(this AccessControlListQuery query, PrincipalInfo principal, object context) { query.AddAclForUser(VirtualRoleRepository <VirtualRoleProviderBase> .GetDefault(), principal, context); }