Beispiel #1
0
        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());
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        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);
        }
Beispiel #6
0
        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());
        }
Beispiel #10
0
        /// <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);
        }