using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Logging; using Umbraco.Core.Hosting; using Umbraco.Core.IO; using Umbraco.Core.Services; namespace Umbraco.Web.HealthCheck.Checks.Config { [HealthCheck("046A066C-4FB2-4937-B931-069964E16C66", "Try Skip IIS Custom Errors", Description = "Starting with IIS 7.5, this must be set to true for Umbraco 404 pages to show. Otherwise, IIS will takeover and render its built-in error page.", Group = "Configuration")] public class TrySkipIisCustomErrorsCheck : AbstractConfigCheck { private readonly Version _iisVersion; public TrySkipIisCustomErrorsCheck(ILocalizedTextService textService, ILoggerFactory loggerFactory, IHostingEnvironment hostingEnvironment) : base(textService, hostingEnvironment, loggerFactory) { _iisVersion = hostingEnvironment.IISVersion; } public override string FilePath => "~/Config/umbracoSettings.config"; public override string XPath => "/settings/web.routing/@trySkipIisCustomErrors"; public override ValueComparisonType ValueComparisonType => ValueComparisonType.ShouldEqual; public override IEnumerable Values { get { // beware! 7.5 and 7.5.0 are not the same thing! var recommendedValue = _iisVersion >= new Version("7.5") ? bool.TrueString.ToLower() : bool.FalseString.ToLower(); return new List { new AcceptableConfiguration { IsRecommended = true, Value = recommendedValue } }; } } public override string CheckSuccessMessage { get { return TextService.Localize("healthcheck/trySkipIisCustomErrorsCheckSuccessMessage", new[] { Values.First(v => v.IsRecommended).Value, _iisVersion.ToString() }); } } public override string CheckErrorMessage { get { return TextService.Localize("healthcheck/trySkipIisCustomErrorsCheckErrorMessage", new[] { CurrentValue, Values.First(v => v.IsRecommended).Value, _iisVersion.ToString() }); } } public override string RectifySuccessMessage { get { return TextService.Localize("healthcheck/trySkipIisCustomErrorsCheckRectifySuccessMessage", new[] { Values.First(v => v.IsRecommended).Value, _iisVersion.ToString() }); } } } }