using Umbraco.Cms.Core; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Hosting; namespace Umbraco.Extensions; public static class GlobalSettingsExtensions { private static string? _mvcArea; private static string? _backOfficePath; /// /// Returns the absolute path for the Umbraco back office /// /// /// /// public static string GetBackOfficePath(this GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment) { if (_backOfficePath != null) { return _backOfficePath; } _backOfficePath = hostingEnvironment.ToAbsolute(globalSettings.UmbracoPath); return _backOfficePath; } /// /// This returns the string of the MVC Area route. /// /// /// This will return the MVC area that we will route all custom routes through like surface controllers, etc... /// We will use the 'Path' (default ~/umbraco) to create it but since it cannot contain '/' and people may specify a /// path of ~/asdf/asdf/admin /// we will convert the '/' to '-' and use that as the path. its a bit lame but will work. /// We also make sure that the virtual directory (SystemDirectories.Root) is stripped off first, otherwise we'd end up /// with something /// like "MyVirtualDirectory-Umbraco" instead of just "Umbraco". /// public static string GetUmbracoMvcArea(this GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment) { if (_mvcArea != null) { return _mvcArea; } _mvcArea = globalSettings.GetUmbracoMvcAreaNoCache(hostingEnvironment); return _mvcArea; } internal static string GetUmbracoMvcAreaNoCache( this GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment) { var path = string.IsNullOrEmpty(globalSettings.UmbracoPath) ? string.Empty : hostingEnvironment.ToAbsolute(globalSettings.UmbracoPath); if (path.IsNullOrWhiteSpace()) { throw new InvalidOperationException("Cannot create an MVC Area path without the umbracoPath specified"); } // beware of TrimStart, see U4-2518 if (path.StartsWith(hostingEnvironment.ApplicationVirtualPath)) { path = path[hostingEnvironment.ApplicationVirtualPath.Length..]; } return path.TrimStart(Constants.CharArrays.Tilde).TrimStart(Constants.CharArrays.ForwardSlash).Replace('/', '-') .Trim().ToLower(); } }