public override void Render(Context context, TextWriter result) { IPortalLiquidContext portalLiquidContext; if (!context.TryGetPortalLiquidContext(out portalLiquidContext)) { return; } using (TextWriter xml = new StringWriter()) { base.Render(context, xml); var fetch = Fetch.Parse(xml.ToString()); var right = GetRight(context); CrmEntityPermissionProvider.EntityPermissionRightResult permissionResult = new CrmEntityPermissionProvider() .TryApplyRecordLevelFiltersToFetch(portalLiquidContext.PortalViewContext.CreateServiceContext(), right, fetch); // Apply Content Access Level filtering var contentAccessLevelProvider = new ContentAccessLevelProvider(); contentAccessLevelProvider.TryApplyRecordLevelFiltersToFetch(right, fetch); // Apply Product filtering var productAccessProvider = new ProductAccessProvider(); productAccessProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, fetch); context.Scopes.Last()[_variableName] = new FetchXmlQueryDrop(portalLiquidContext, fetch, permissionResult); } }
private IQueryable <Entity> GetLookupRecords(string fetchXml, OrganizationServiceContext context) { var fetch = Fetch.Parse(fetchXml); var crmEntityPermissionProvider = new CrmEntityPermissionProvider(); crmEntityPermissionProvider.TryApplyRecordLevelFiltersToFetch(context, CrmEntityPermissionRight.Read, fetch); crmEntityPermissionProvider.TryApplyRecordLevelFiltersToFetch(context, CrmEntityPermissionRight.Append, fetch); // Apply Content Access Level filtering var contentAccessLevelProvider = new ContentAccessLevelProvider(); contentAccessLevelProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, fetch); // Apply Product filtering var productAccessProvider = new ProductAccessProvider(); productAccessProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, fetch); var response = (RetrieveMultipleResponse)context.Execute(fetch.ToRetrieveMultipleRequest()); var data = response.EntityCollection; if (data == null || data.Entities == null) { return(null); } return(data.Entities.AsQueryable()); }
/// <summary> /// Adds Content Access Level and Product Filtering to fetch /// </summary> /// <param name="annotation">Annotation</param> /// <param name="context">Context</param> /// <param name="contentAccessLevelProvider">content Access Level Provider</param> /// <param name="productAccessProvider">product Access Provider</param> private bool AssertKnowledgeArticleCalAndProductFiltering(Entity annotation, OrganizationServiceContext context, ContentAccessLevelProvider contentAccessLevelProvider, ProductAccessProvider productAccessProvider) { if (!contentAccessLevelProvider.IsEnabled() & !productAccessProvider.IsEnabled()) { // If CAL and Product Filtering is not enabled then we must not restrict access to the article. This will also eliminate an unnecessary knowledge article query. return(true); } var entityReference = annotation.GetAttributeValue <EntityReference>("objectid"); var fetch = new Fetch(); var knowledgeArticleFetch = new FetchEntity("knowledgearticle") { Filters = new List <Filter> { new Filter { Type = LogicalOperator.And, Conditions = new List <Condition> { new Condition("knowledgearticleid", ConditionOperator.Equal, entityReference.Id) } } }, Links = new List <Link>() }; fetch.Entity = knowledgeArticleFetch; // Apply Content Access Level filtering. If it is not enabled the fetch will not be modified contentAccessLevelProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, fetch); // Apply Product filtering. If it is not enabled the fetch will not be modified. productAccessProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, fetch); var kaResponse = (RetrieveMultipleResponse)context.Execute(fetch.ToRetrieveMultipleRequest()); var isValid = kaResponse.EntityCollection.Entities.Any(); if (isValid) { if (FeatureCheckHelper.IsFeatureEnabled(FeatureNames.TelemetryFeatureUsage)) { PortalFeatureTrace.TraceInstance.LogFeatureUsage(FeatureTraceCategory.Note, HttpContext.Current, "TryCreateHandler CAL/PF passed", 1, annotation.ToEntityReference(), "read"); } return(true); } if (FeatureCheckHelper.IsFeatureEnabled(FeatureNames.TelemetryFeatureUsage)) { PortalFeatureTrace.TraceInstance.LogFeatureUsage(FeatureTraceCategory.Note, HttpContext.Current, "TryCreateHandler CAL/PF failed", 1, annotation.ToEntityReference(), "read"); } return(false); }
private Fetch GetBaseArticleFetch(int pageSize = 5, string languageLocaleCode = null) { const int published = 3; // if language locale code is not provided, fallback to the site setting if (string.IsNullOrWhiteSpace(languageLocaleCode)) { var portalContext = PortalCrmConfigurationManager.CreatePortalContext(); languageLocaleCode = portalContext.ServiceContext.GetSiteSettingValueByName(portalContext.Website, "KnowledgeManagement/Article/Language"); } var optionalLanguageCondition = string.IsNullOrWhiteSpace(languageLocaleCode) ? string.Empty : string.Format("<condition entityname='language_locale' attribute='code' operator='eq' value = '{0}' />", languageLocaleCode); var articlesFetchXmlFormat = @" <fetch mapping='logical' count='{0}' returntotalrecordcount='true'> <entity name='knowledgearticle'> <all-attributes /> <link-entity name='languagelocale' from='languagelocaleid' to='languagelocaleid' visible='false' link-type='outer' alias='language_locale'> <attribute name='localeid' /> <attribute name='code' /> <attribute name='region' /> <attribute name='name' /> <attribute name='language' /> </link-entity> <filter type='and'> <condition attribute='isrootarticle' operator='eq' value='0' /> <condition attribute='statecode' operator='eq' value='{1}' /> <condition attribute='isinternal' operator='eq' value='0' /> {2} </filter> </entity> </fetch>" ; var articlesFetchXml = string.Format(articlesFetchXmlFormat, pageSize, published, optionalLanguageCondition); var articleFetch = Fetch.Parse(articlesFetchXml); // Apply Content Access Level filtering var contentAccessProvider = new ContentAccessLevelProvider(); contentAccessProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, articleFetch); // Apply Product filtering var productAccessProvider = new ProductAccessProvider(); productAccessProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, articleFetch); return(articleFetch); }
private static Entity GetArticle(OrganizationServiceContext serviceContext, string number, CrmWebsite website, string lang, out string languageLocaleCode) { const int published = 3; var portalContext = PortalCrmConfigurationManager.CreatePortalContext(); languageLocaleCode = lang; // If language locale code is NOT provided and multi-language is enabled, then use the context website language. var contextLanguageInfo = System.Web.HttpContext.Current.GetContextLanguageInfo(); if (contextLanguageInfo.IsCrmMultiLanguageEnabled && string.IsNullOrWhiteSpace(languageLocaleCode)) { languageLocaleCode = contextLanguageInfo.ContextLanguage.Code; } // If language locale code is NOT provided and we're not using multi-language, fall back to site setting. else if (string.IsNullOrWhiteSpace(languageLocaleCode)) { languageLocaleCode = portalContext.ServiceContext.GetSiteSettingValueByName(portalContext.Website, "KnowledgeManagement/Article/Language"); } var optionalLanguageCondition = string.IsNullOrWhiteSpace(languageLocaleCode) ? string.Empty : string.Format("<condition entityname='language_locale' attribute='code' operator='eq' value = '{0}' />", languageLocaleCode); var articlesFetchXml = string.Format(ArticlesFetchXmlFormat, published, number, optionalLanguageCondition); var fetchArticles = Fetch.Parse(articlesFetchXml); var settings = website.Settings; var productFilteringOn = settings.Get <bool>(ProductFilteringSiteSettingName); var calFilteringOn = settings.Get <bool>(CalEnabledSiteSettingName); if (calFilteringOn) { // Apply CAL filtering var contentAccessLevelProvider = new ContentAccessLevelProvider(); contentAccessLevelProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, fetchArticles); } if (productFilteringOn) { // Apply Product filtering var productAccessProvider = new ProductAccessProvider(); productAccessProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, fetchArticles); } var article = serviceContext.RetrieveSingle(fetchArticles, false, false, RequestFlag.AllowStaleData); return(article); }
private static bool AddPermissionFilterToFetch(Fetch fetch, OrganizationServiceContext serviceContext, CrmEntityPermissionRight right) { var crmEntityPermissionProvider = new CrmEntityPermissionProvider(); var result = crmEntityPermissionProvider.TryApplyRecordLevelFiltersToFetch(serviceContext, right, fetch); // Apply Content Access Level filtering var contentAccessLevelProvider = new ContentAccessLevelProvider(); contentAccessLevelProvider.TryApplyRecordLevelFiltersToFetch(right, fetch); // Apply Product filtering var productAccessProvider = new ProductAccessProvider(); productAccessProvider.TryApplyRecordLevelFiltersToFetch(right, fetch); return(result.GlobalPermissionGranted && result.PermissionGranted); }
private Fetch CreateFetch(OrganizationServiceContext context, string entityName, string latitudeFieldName, string longitudeFieldName) { var fetchIn = new Fetch { Entity = new FetchEntity { Name = entityName, Filters = new List <AdxFilter> { new AdxFilter { Type = LogicalOperator.And, Conditions = new[] { new Condition(latitudeFieldName, ConditionOperator.NotNull), new Condition(longitudeFieldName, ConditionOperator.NotNull) } } } } }; var permissionChecker = new CrmEntityPermissionProvider(); var permissionCheckResult = permissionChecker.TryApplyRecordLevelFiltersToFetch(context, CrmEntityPermissionRight.Read, fetchIn); if (!permissionCheckResult.GlobalPermissionGranted && !permissionCheckResult.PermissionGranted) { return(null); } var contentAccessLevelProvider = new ContentAccessLevelProvider(); contentAccessLevelProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, fetchIn); var productAccessProvider = new ProductAccessProvider(); productAccessProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, fetchIn); return(fetchIn); }
protected void AddPermissionFilterToFetch(Fetch fetch, EntityListSettings settings, OrganizationServiceContext serviceContext, CrmEntityPermissionRight right) { if (!settings.EntityPermissionsEnabled) { return; } var crmEntityPermissionProvider = new CrmEntityPermissionProvider(); var result = crmEntityPermissionProvider.TryApplyRecordLevelFiltersToFetch(serviceContext, right, fetch); // Apply Content Access Level filtering var contentAccessLevelProvider = new ContentAccessLevelProvider(); contentAccessLevelProvider.TryApplyRecordLevelFiltersToFetch(right, fetch); // Apply Product filtering var productAccessProvider = new ProductAccessProvider(); productAccessProvider.TryApplyRecordLevelFiltersToFetch(right, fetch); EntityPermissionDenied = !result.GlobalPermissionGranted && !result.PermissionGranted; }
/// <summary> /// Validates the content access level and product filtering. /// </summary> /// <param name="serviceContext">The service context.</param> /// <param name="result">The result.</param> /// <returns>Boolean</returns> private bool ValidateContentAccessLevelAndProducts(OrganizationServiceContext serviceContext, CrmEntitySearchResult result, ContentAccessLevelProvider contentAccessLevelProvider, ProductAccessProvider productAccessProvider) { if (result == null || result.EntityID == null) { return(false); } // Content access levels/products will only filter knowledge articles if (result.EntityLogicalName != "knowledgearticle") { return(true); } var baseFetch = string.Format(@" <fetch mapping='logical'> <entity name='knowledgearticle'> <filter type='and'> <condition attribute='knowledgearticleid' operator='eq' value='{0}' /> </filter> </entity> </fetch>" , result.EntityID); if (!contentAccessLevelProvider.IsEnabled() && !productAccessProvider.IsEnabled()) { return(true); } Fetch filterCheckFetch = Fetch.Parse(baseFetch); contentAccessLevelProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, filterCheckFetch); productAccessProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, filterCheckFetch); // If there are no results, user didn't have access to products or CALs associated to article var response = (RetrieveMultipleResponse)serviceContext.Execute(filterCheckFetch.ToRetrieveMultipleRequest()); return(response.EntityCollection != null && response.EntityCollection.Entities.Any()); }
/// <summary> /// Gets Related Articles of a Category /// </summary> /// <returns>IEnumerable of Related Article</returns> public IEnumerable <RelatedArticle> SelectRelatedArticles() { var category = this.Select(); var relatedArticlesFetch = new Fetch { Distinct = true, Entity = new FetchEntity { Name = "knowledgearticle", Attributes = new List <FetchAttribute>() { new FetchAttribute("articlepublicnumber"), new FetchAttribute("knowledgearticleid"), new FetchAttribute("title"), new FetchAttribute("keywords"), new FetchAttribute("createdon"), new FetchAttribute("statecode"), new FetchAttribute("statuscode"), new FetchAttribute("isrootarticle"), new FetchAttribute("islatestversion"), new FetchAttribute("isprimary"), new FetchAttribute("knowledgearticleviews") }, Filters = new List <Filter>() { new Filter { Type = LogicalOperator.And, Conditions = new List <Condition>() { new Condition("isrootarticle", ConditionOperator.Equal, 0), new Condition("statecode", ConditionOperator.Equal, 3), new Condition("isinternal", ConditionOperator.Equal, 0) } }, }, Links = new List <Link>() { new Link { Name = "knowledgearticlescategories", FromAttribute = "knowledgearticleid", ToAttribute = "knowledgearticleid", Intersect = true, Visible = false, Filters = new List <Filter>() { new Filter { Type = LogicalOperator.And, Conditions = new List <Condition>() { new Condition("categoryid", ConditionOperator.Equal, category.Id) } } } } } } }; var relatedArticles = Enumerable.Empty <RelatedArticle>(); var serviceContext = this.Dependencies.GetServiceContext(); var securityProvider = this.Dependencies.GetSecurityProvider(); var urlProvider = this.Dependencies.GetUrlProvider(); // Apply Content Access Level filtering var contentAccessProvider = new ContentAccessLevelProvider(); contentAccessProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, relatedArticlesFetch); // Apply Product filtering var productAccessProvider = new ProductAccessProvider(); productAccessProvider.TryApplyRecordLevelFiltersToFetch(CrmEntityPermissionRight.Read, relatedArticlesFetch); var relatedArticlesEntityCollection = relatedArticlesFetch.Execute(serviceContext as IOrganizationService); if (relatedArticlesEntityCollection != null && relatedArticlesEntityCollection.Entities != null && relatedArticlesEntityCollection.Entities.Any()) { relatedArticles = relatedArticlesEntityCollection.Entities.Where(e => securityProvider.TryAssert(serviceContext, e, CrmEntityRight.Read)) .Select(e => new { Title = e.GetAttributeValue <string>("title"), Url = urlProvider.GetUrl(serviceContext, e) }) .Where(e => !(string.IsNullOrEmpty(e.Title) || string.IsNullOrEmpty(e.Url))) .Select(e => new RelatedArticle(e.Title, e.Url)) .OrderBy(e => e.Title); } return(relatedArticles); }