Esempio n. 1
0
        public override Task GetContentItemAspectAsync(ContentItemAspectContext context, HtmlBodyPart part)
        {
            return(context.ForAsync <BodyAspect>(async bodyAspect =>
            {
                if (_bodyAspect != null)
                {
                    bodyAspect.Body = _bodyAspect;
                    return;
                }

                try
                {
                    var model = new HtmlBodyPartViewModel()
                    {
                        Html = part.Html,
                        HtmlBodyPart = part,
                        ContentItem = part.ContentItem
                    };

                    var result = await _liquidTemplateManager.RenderAsync(part.Html, _htmlEncoder, model,
                                                                          scope => scope.SetValue("ContentItem", model.ContentItem));

                    bodyAspect.Body = _bodyAspect = new HtmlString(result);
                }
                catch
                {
                    bodyAspect.Body = HtmlString.Empty;
                }
            }));
        }
        private static async Task <object> RenderHtml(ResolveFieldContext <HtmlBodyPart> ctx)
        {
            var serviceProvider          = ctx.ResolveServiceProvider();
            var shortcodeService         = serviceProvider.GetRequiredService <IShortcodeService>();
            var contentDefinitionManager = serviceProvider.GetRequiredService <IContentDefinitionManager>();

            var contentTypeDefinition     = contentDefinitionManager.GetTypeDefinition(ctx.Source.ContentItem.ContentType);
            var contentTypePartDefinition = contentTypeDefinition.Parts.FirstOrDefault(x => string.Equals(x.PartDefinition.Name, "HtmlBodyPart"));
            var settings = contentTypePartDefinition.GetSettings <HtmlBodyPartSettings>();

            var html = ctx.Source.Html;

            if (!settings.SanitizeHtml)
            {
                var model = new HtmlBodyPartViewModel()
                {
                    Html         = ctx.Source.Html,
                    HtmlBodyPart = ctx.Source,
                    ContentItem  = ctx.Source.ContentItem
                };
                var liquidTemplateManager = serviceProvider.GetRequiredService <ILiquidTemplateManager>();
                var htmlEncoder           = serviceProvider.GetService <HtmlEncoder>();

                html = await liquidTemplateManager.RenderAsync(html, htmlEncoder, model,
                                                               scope => scope.SetValue("ContentItem", model.ContentItem));
            }

            return(await shortcodeService.ProcessAsync(html,
                                                       new Context
            {
                ["ContentItem"] = ctx.Source.ContentItem,
                ["TypePartDefinition"] = contentTypePartDefinition
            }));
        }
        public override Task GetContentItemAspectAsync(ContentItemAspectContext context, HtmlBodyPart part)
        {
            return context.ForAsync<BodyAspect>(async bodyAspect =>
            {
                if (_bodyAspect != null)
                {
                    bodyAspect.Body = _bodyAspect;
                    return;
                }

                try
                {
                    var model = new HtmlBodyPartViewModel()
                    {
                        Html = part.Html,
                        HtmlBodyPart = part,
                        ContentItem = part.ContentItem
                    };

                    var templateContext = new TemplateContext();
                    templateContext.SetValue("ContentItem", part.ContentItem);
                    templateContext.MemberAccessStrategy.Register<HtmlBodyPartViewModel>();
                    templateContext.SetValue("Model", model);

                    var result = await _liquidTemplateManager.RenderAsync(part.Html, _htmlEncoder, templateContext);
                    bodyAspect.Body = _bodyAspect = new HtmlString(result);
                }
                catch
                {
                    bodyAspect.Body = HtmlString.Empty;
                }
            });
        }
Esempio n. 4
0
        private async ValueTask BuildViewModelAsync(HtmlBodyPartViewModel model, HtmlBodyPart htmlBodyPart)
        {
            model.Html         = htmlBodyPart.Html;
            model.HtmlBodyPart = htmlBodyPart;
            model.ContentItem  = htmlBodyPart.ContentItem;

            model.Html = await _liquidTemplateManager.RenderAsync(htmlBodyPart.Html, _htmlEncoder, model,
                                                                  scope => scope.SetValue("ContentItem", model.ContentItem));
        }
        public override async Task <IDisplayResult> UpdateAsync(HtmlBodyPart model, IUpdateModel updater, UpdatePartEditorContext context)
        {
            var viewModel = new HtmlBodyPartViewModel();

            await updater.TryUpdateModelAsync(viewModel, Prefix, t => t.Source);

            model.Html = viewModel.Source;

            return(Edit(model, context));
        }
        private async ValueTask BuildViewModelAsync(HtmlBodyPartViewModel model, HtmlBodyPart htmlBodyPart, HtmlBodyPartSettings settings)
        {
            model.Html         = htmlBodyPart.Html;
            model.HtmlBodyPart = htmlBodyPart;
            model.ContentItem  = htmlBodyPart.ContentItem;

            if (!settings.SanitizeHtml)
            {
                model.Html = await _liquidTemplateManager.RenderAsync(htmlBodyPart.Html, _htmlEncoder, model,
                                                                      scope => scope.SetValue("ContentItem", model.ContentItem));
            }

            model.Html = await _shortCodeService.ProcessAsync(model.Html);
        }
        private async ValueTask BuildViewModelAsync(HtmlBodyPartViewModel model, HtmlBodyPart htmlBodyPart)
        {
            var templateContext = new TemplateContext();

            templateContext.SetValue("ContentItem", htmlBodyPart.ContentItem);
            templateContext.MemberAccessStrategy.Register <HtmlBodyPartViewModel>();

            model.Html         = htmlBodyPart.Html;
            model.HtmlBodyPart = htmlBodyPart;
            model.ContentItem  = htmlBodyPart.ContentItem;
            templateContext.SetValue("Model", model);

            model.Html = await _liquidTemplatemanager.RenderAsync(htmlBodyPart.Html, _htmlEncoder, templateContext);
        }
Esempio n. 8
0
        public override Task GetContentItemAspectAsync(ContentItemAspectContext context, HtmlBodyPart part)
        {
            return(context.ForAsync <BodyAspect>(async bodyAspect =>
            {
                if (bodyAspect != null && part.ContentItem.Id == _contentItemId)
                {
                    bodyAspect.Body = _bodyAspect;

                    return;
                }

                try
                {
                    var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(part.ContentItem.ContentType);
                    var contentTypePartDefinition = contentTypeDefinition.Parts.FirstOrDefault(x => string.Equals(x.PartDefinition.Name, "HtmlBodyPart"));
                    var settings = contentTypePartDefinition.GetSettings <HtmlBodyPartSettings>();

                    var html = part.Html;

                    if (!settings.SanitizeHtml)
                    {
                        var model = new HtmlBodyPartViewModel()
                        {
                            Html = part.Html,
                            HtmlBodyPart = part,
                            ContentItem = part.ContentItem
                        };

                        html = await _liquidTemplateManager.RenderAsync(html, _htmlEncoder, model,
                                                                        scope => scope.SetValue("ContentItem", model.ContentItem));
                    }

                    html = await _shortcodeService.ProcessAsync(html,
                                                                new Context
                    {
                        ["ContentItem"] = part.ContentItem,
                        ["TypePartDefinition"] = contentTypePartDefinition
                    });

                    bodyAspect.Body = _bodyAspect = new HtmlString(html);
                    _contentItemId = part.ContentItem.Id;
                }
                catch
                {
                    bodyAspect.Body = HtmlString.Empty;
                    _contentItemId = default;
                }
            }));
        }
Esempio n. 9
0
        private static async Task <object> RenderHtml(ResolveFieldContext <HtmlBodyPart> ctx)
        {
            var serviceProvider       = ctx.ResolveServiceProvider();
            var liquidTemplateManager = serviceProvider.GetService <ILiquidTemplateManager>();
            var htmlEncoder           = serviceProvider.GetService <HtmlEncoder>();

            var model = new HtmlBodyPartViewModel()
            {
                Html         = ctx.Source.Html,
                HtmlBodyPart = ctx.Source,
                ContentItem  = ctx.Source.ContentItem
            };

            return(await liquidTemplateManager.RenderAsync(ctx.Source.Html, htmlEncoder, model,
                                                           scope => scope.SetValue("ContentItem", model.ContentItem)));
        }
        private async Task BuildViewModelAsync(HtmlBodyPartViewModel model, HtmlBodyPart HtmlBodyPart, ContentTypePartDefinition definition)
        {
            var contentTypeDefinition     = _contentDefinitionManager.GetTypeDefinition(HtmlBodyPart.ContentItem.ContentType);
            var contentTypePartDefinition = contentTypeDefinition.Parts.FirstOrDefault(p => p.Name == nameof(HtmlBodyPart));
            var settings = contentTypePartDefinition.GetSettings <HtmlBodyPartSettings>();

            var templateContext = new TemplateContext();

            templateContext.SetValue("ContentItem", HtmlBodyPart.ContentItem);
            templateContext.MemberAccessStrategy.Register <HtmlBodyPartViewModel>();

            model.Html = await _liquidTemplatemanager.RenderAsync(HtmlBodyPart.Html, HtmlEncoder.Default, templateContext);

            model.ContentItem        = HtmlBodyPart.ContentItem;
            model.Source             = HtmlBodyPart.Html;
            model.HtmlBodyPart       = HtmlBodyPart;
            model.TypePartDefinition = definition;
        }
Esempio n. 11
0
        public override async Task <IDisplayResult> UpdateAsync(HtmlBodyPart model, IUpdateModel updater, UpdatePartEditorContext context)
        {
            var viewModel = new HtmlBodyPartViewModel();

            if (await updater.TryUpdateModelAsync(viewModel, Prefix, t => t.Html))
            {
                if (!string.IsNullOrEmpty(viewModel.Html) && !_liquidTemplateManager.Validate(viewModel.Html, out var errors))
                {
                    var partName = context.TypePartDefinition.DisplayName();
                    context.Updater.ModelState.AddModelError(nameof(model.Html), S["{0} doesn't contain a valid Liquid expression. Details: {1}", partName, string.Join(" ", errors)]);
                }
                else
                {
                    model.Html = viewModel.Html;
                }
            }

            return(Edit(model, context));
        }
Esempio n. 12
0
        private async ValueTask BuildViewModelAsync(HtmlBodyPartViewModel model, HtmlBodyPart htmlBodyPart, BuildPartDisplayContext context)
        {
            model.Html         = htmlBodyPart.Html;
            model.HtmlBodyPart = htmlBodyPart;
            model.ContentItem  = htmlBodyPart.ContentItem;
            var settings = context.TypePartDefinition.GetSettings <HtmlBodyPartSettings>();

            if (!settings.SanitizeHtml)
            {
                model.Html = await _liquidTemplateManager.RenderAsync(htmlBodyPart.Html, _htmlEncoder, model,
                                                                      scope => scope.SetValue("ContentItem", model.ContentItem));
            }

            model.Html = await _shortcodeService.ProcessAsync(model.Html,
                                                              new Context
            {
                ["ContentItem"]        = htmlBodyPart.ContentItem,
                ["TypePartDefinition"] = context.TypePartDefinition
            });
        }
Esempio n. 13
0
        private static async Task <object> RenderHtml(ResolveFieldContext <HtmlBodyPart> ctx)
        {
            var serviceProvider       = ctx.ResolveServiceProvider();
            var liquidTemplateManager = serviceProvider.GetService <ILiquidTemplateManager>();
            var htmlEncoder           = serviceProvider.GetService <HtmlEncoder>();

            var model = new HtmlBodyPartViewModel()
            {
                HtmlBodyPart = ctx.Source,
                ContentItem  = ctx.Source.ContentItem
            };

            var templateContext = new TemplateContext();

            templateContext.SetValue("ContentItem", ctx.Source.ContentItem);
            templateContext.MemberAccessStrategy.Register <HtmlBodyPartViewModel>();
            templateContext.SetValue("Model", model);

            return(await liquidTemplateManager.RenderAsync(ctx.Source.Html, htmlEncoder, templateContext));
        }
Esempio n. 14
0
        public override async Task <IDisplayResult> UpdateAsync(ContentItem model, UpdateEditorContext context)
        {
            var htmlBodyPart = model.As <HtmlBodyPart>();

            if (htmlBodyPart == null)
            {
                return(null);
            }


            var typePartDefintion = GetContentTypePartDefinition(htmlBodyPart);

            // If it's a FroalaEditor editor the files are automatically handled by _attachedMediaFieldFileService
            if (String.Equals(typePartDefintion?.Editor, "FroalaEditor", StringComparison.OrdinalIgnoreCase))
            {
                var viewModel = new HtmlBodyPartViewModel();

                if (await context.Updater.TryUpdateModelAsync(viewModel, Prefix, t => t.Html))
                {
                    //var settings = context.TypePartDefinition.GetSettings<HtmlBodyPartSettings>();
                    var settings = GetPartSettings(htmlBodyPart);

                    // Deserializing an empty string doesn't return an array
                    var items = string.IsNullOrWhiteSpace(viewModel.Paths)
                        ? new List <EditMediaFieldItemInfo>()
                        : JsonConvert.DeserializeObject <EditMediaFieldItemInfo[]>(viewModel.Paths).ToList();
                    if (items.Any())
                    {
                        try
                        {
                            await _attachedMediaToContentItemService.HandleFilesOnContentPartUpdateAsync(items,
                                                                                                         model.ContentItem);

                            //replace body temp file paths with new folder paths
                            //because froala encodes url paths to avoid xss must decode first before finding and replacing paths
                            var decodedHtml = HttpUtility.UrlDecode(viewModel.Html);
                            foreach (var mediaFieldItemInfo in items)
                            {
                                if (!String.IsNullOrEmpty(mediaFieldItemInfo.NewPath))
                                {
                                    // vm.Body=  vm.Body.Replace(mediaFieldItemInfo.Path, mediaFieldItemInfo.NewPath);
                                    decodedHtml = decodedHtml?.Replace(mediaFieldItemInfo.Path,
                                                                       mediaFieldItemInfo.NewPath);
                                }
                            }

                            //set back html to viewmodel
                            viewModel.Html = decodedHtml;
                        }
                        catch (Exception)
                        {
                            context.Updater.ModelState.AddModelError(Prefix,
                                                                     S["{0}: There was an error handling the files.",
                                                                       typePartDefintion?.DisplayName]);
                        }

                        htmlBodyPart.Html = settings.SanitizeHtml
                            ? _htmlSanitizerService.Sanitize(viewModel.Html)
                            : viewModel.Html;
                    }
                }
            }


            return(await EditAsync(model, context));
        }