using System.Collections.Generic; using System.Linq; using Umbraco.Web.Models; using System.IO; using Umbraco.Core; using Ganss.XSS; using Microsoft.Extensions.Options; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.Models; using Umbraco.Core.Hosting; using Umbraco.Web.BackOffice.Controllers; using Umbraco.Web.Common.Attributes; using Umbraco.Web.Common.Filters; namespace Umbraco.Web.Editors { [PluginController("UmbracoApi")] public class IconController : UmbracoAuthorizedApiController { private readonly IHostingEnvironment _hostingEnvironment; private readonly IOptions _globalSettings; public IconController( IHostingEnvironment hostingEnvironment, IOptions globalSettings) { _hostingEnvironment = hostingEnvironment; _globalSettings = globalSettings; } /// /// Gets an IconModel containing the icon name and SvgString according to an icon name found at the global icons path /// /// /// [DetermineAmbiguousActionByPassingParameters] public IconModel GetIcon(string iconName) { return string.IsNullOrWhiteSpace(iconName) ? null : CreateIconModel(iconName.StripFileExtension(), _hostingEnvironment.MapPathWebRoot($"{_globalSettings.Value.IconsPath}/{iconName}.svg")); } /// /// Gets an IconModel using values from a FileInfo model /// /// /// [DetermineAmbiguousActionByPassingParameters] public IconModel GetIcon(FileInfo fileInfo) { return fileInfo == null || string.IsNullOrWhiteSpace(fileInfo.Name) ? null : CreateIconModel(fileInfo.Name.StripFileExtension(), fileInfo.FullName); } /// /// Gets a list of all svg icons found at at the global icons path. /// /// public List GetAllIcons() { var icons = new List(); var directory = new DirectoryInfo(_hostingEnvironment.MapPathWebRoot($"{_globalSettings.Value.IconsPath}/")); var iconNames = directory.GetFiles("*.svg"); iconNames.OrderBy(f => f.Name).ToList().ForEach(iconInfo => { var icon = GetIcon(iconInfo); if (icon != null) { icons.Add(icon); } }); return icons; } /// /// Gets an IconModel containing the icon name and SvgString /// /// /// /// private IconModel CreateIconModel(string iconName, string iconPath) { var sanitizer = new HtmlSanitizer(); sanitizer.AllowedAttributes.UnionWith(Core.Constants.SvgSanitizer.Attributes); sanitizer.AllowedCssProperties.UnionWith(Core.Constants.SvgSanitizer.Attributes); sanitizer.AllowedTags.UnionWith(Core.Constants.SvgSanitizer.Tags); try { var svgContent = System.IO.File.ReadAllText(iconPath); var sanitizedString = sanitizer.Sanitize(svgContent); var svg = new IconModel { Name = iconName, SvgString = sanitizedString }; return svg; } catch { return null; } } } }