From 21e3cf0887474cba7eec32288f8415adfd823f69 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Fri, 4 Dec 2020 13:01:58 +0100 Subject: [PATCH] Moved files and introduced IMarkdownToHtmlConverter to avoid packages to handle markdown in core Signed-off-by: Bjarke Berg --- .../HealthCheckSettingsExtensions.cs | 4 +-- .../Diagnostics/IMarchal.cs | 4 +++ .../Diagnostics/MiniDump.cs | 6 ++-- .../Dictionary/UmbracoCultureDictionary.cs | 2 +- .../UmbracoCultureDictionaryFactory.cs | 2 +- .../Editors/UserEditorAuthorizationHelper.cs | 0 ...HealthCheckNotificationMethodCollection.cs | 0 ...heckNotificationMethodCollectionBuilder.cs | 0 .../HealthCheck/HealthCheckResults.cs | 25 ------------- .../EmailNotificationMethod.cs | 7 ++-- .../IHealthCheckNotificationMethod.cs | 0 .../IMarkdownToHtmlConverter.cs | 10 ++++++ .../NotificationMethodBase.cs | 0 .../HealthCheck/MarkdownToHtmlConverter.cs | 35 +++++++++++++++++++ .../HostedServices/HealthCheckNotifier.cs | 2 +- .../Packaging/PackageDataInstallation.cs | 2 -- .../Runtime/CoreInitialComposer.cs | 4 +-- .../HealthCheckSettingsExtensionsTests.cs | 2 +- 18 files changed, 63 insertions(+), 42 deletions(-) rename src/{Umbraco.Infrastructure => Umbraco.Core}/Configuration/Extensions/HealthCheckSettingsExtensions.cs (90%) rename src/{Umbraco.Infrastructure => Umbraco.Core}/Diagnostics/IMarchal.cs (58%) rename src/{Umbraco.Infrastructure => Umbraco.Core}/Diagnostics/MiniDump.cs (98%) rename src/{Umbraco.Infrastructure => Umbraco.Core}/Dictionary/UmbracoCultureDictionary.cs (98%) rename src/{Umbraco.Infrastructure => Umbraco.Core}/Dictionary/UmbracoCultureDictionaryFactory.cs (92%) rename src/{Umbraco.Infrastructure => Umbraco.Core}/Editors/UserEditorAuthorizationHelper.cs (100%) rename src/{Umbraco.Infrastructure => Umbraco.Core}/HealthCheck/HealthCheckNotificationMethodCollection.cs (100%) rename src/{Umbraco.Infrastructure => Umbraco.Core}/HealthCheck/HealthCheckNotificationMethodCollectionBuilder.cs (100%) rename src/{Umbraco.Infrastructure => Umbraco.Core}/HealthCheck/HealthCheckResults.cs (85%) rename src/{Umbraco.Infrastructure => Umbraco.Core}/HealthCheck/NotificationMethods/EmailNotificationMethod.cs (90%) rename src/{Umbraco.Infrastructure => Umbraco.Core}/HealthCheck/NotificationMethods/IHealthCheckNotificationMethod.cs (100%) create mode 100644 src/Umbraco.Core/HealthCheck/NotificationMethods/IMarkdownToHtmlConverter.cs rename src/{Umbraco.Infrastructure => Umbraco.Core}/HealthCheck/NotificationMethods/NotificationMethodBase.cs (100%) create mode 100644 src/Umbraco.Infrastructure/HealthCheck/MarkdownToHtmlConverter.cs diff --git a/src/Umbraco.Infrastructure/Configuration/Extensions/HealthCheckSettingsExtensions.cs b/src/Umbraco.Core/Configuration/Extensions/HealthCheckSettingsExtensions.cs similarity index 90% rename from src/Umbraco.Infrastructure/Configuration/Extensions/HealthCheckSettingsExtensions.cs rename to src/Umbraco.Core/Configuration/Extensions/HealthCheckSettingsExtensions.cs index 92c3608ac1..ae842cb040 100644 --- a/src/Umbraco.Infrastructure/Configuration/Extensions/HealthCheckSettingsExtensions.cs +++ b/src/Umbraco.Core/Configuration/Extensions/HealthCheckSettingsExtensions.cs @@ -1,9 +1,7 @@ using System; -using NCrontab; -using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.Models; -namespace Umbraco.Infrastructure.Configuration.Extensions +namespace Umbraco.Core.Configuration.Extensions { public static class HealthCheckSettingsExtensions { diff --git a/src/Umbraco.Infrastructure/Diagnostics/IMarchal.cs b/src/Umbraco.Core/Diagnostics/IMarchal.cs similarity index 58% rename from src/Umbraco.Infrastructure/Diagnostics/IMarchal.cs rename to src/Umbraco.Core/Diagnostics/IMarchal.cs index 30e6a9e619..cde4592b1b 100644 --- a/src/Umbraco.Infrastructure/Diagnostics/IMarchal.cs +++ b/src/Umbraco.Core/Diagnostics/IMarchal.cs @@ -7,6 +7,10 @@ namespace Umbraco.Core.Diagnostics /// public interface IMarchal { + /// + /// Retrieves a computer-independent description of an exception, and information about the state that existed for the thread when the exception occurred. + /// + /// A pointer to an EXCEPTION_POINTERS structure. IntPtr GetExceptionPointers(); } } diff --git a/src/Umbraco.Infrastructure/Diagnostics/MiniDump.cs b/src/Umbraco.Core/Diagnostics/MiniDump.cs similarity index 98% rename from src/Umbraco.Infrastructure/Diagnostics/MiniDump.cs rename to src/Umbraco.Core/Diagnostics/MiniDump.cs index 57e9b5204b..56635c6b46 100644 --- a/src/Umbraco.Infrastructure/Diagnostics/MiniDump.cs +++ b/src/Umbraco.Core/Diagnostics/MiniDump.cs @@ -2,9 +2,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; -using Umbraco.Core.Composing; using Umbraco.Core.Hosting; -using Umbraco.Core.IO; namespace Umbraco.Core.Diagnostics { @@ -12,7 +10,7 @@ namespace Umbraco.Core.Diagnostics // and https://blogs.msdn.microsoft.com/dondu/2010/10/31/writing-minidumps-from-exceptions-in-c/ // which itself got it from http://blog.kalmbach-software.de/2008/12/13/writing-minidumps-in-c/ - internal static class MiniDump + public static class MiniDump { private static readonly object LockO = new object(); @@ -92,7 +90,9 @@ namespace Umbraco.Core.Diagnostics exp.ExceptionPointers = IntPtr.Zero; if (withException) + { exp.ExceptionPointers = marchal.GetExceptionPointers(); + } var bRet = exp.ExceptionPointers == IntPtr.Zero ? MiniDumpWriteDump(currentProcessHandle, currentProcessId, fileHandle, (uint) options, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero) diff --git a/src/Umbraco.Infrastructure/Dictionary/UmbracoCultureDictionary.cs b/src/Umbraco.Core/Dictionary/UmbracoCultureDictionary.cs similarity index 98% rename from src/Umbraco.Infrastructure/Dictionary/UmbracoCultureDictionary.cs rename to src/Umbraco.Core/Dictionary/UmbracoCultureDictionary.cs index b0690c944b..1f23ec645c 100644 --- a/src/Umbraco.Infrastructure/Dictionary/UmbracoCultureDictionary.cs +++ b/src/Umbraco.Core/Dictionary/UmbracoCultureDictionary.cs @@ -17,7 +17,7 @@ namespace Umbraco.Core.Dictionary /// The ILocalizationService is the service used for interacting with this data from the database which isn't all that fast /// (even though there is caching involved, if there's lots of dictionary items the caching is not great) /// - public class DefaultCultureDictionary : ICultureDictionary + internal class DefaultCultureDictionary : ICultureDictionary { private readonly ILocalizationService _localizationService; private readonly IAppCache _requestCache; diff --git a/src/Umbraco.Infrastructure/Dictionary/UmbracoCultureDictionaryFactory.cs b/src/Umbraco.Core/Dictionary/UmbracoCultureDictionaryFactory.cs similarity index 92% rename from src/Umbraco.Infrastructure/Dictionary/UmbracoCultureDictionaryFactory.cs rename to src/Umbraco.Core/Dictionary/UmbracoCultureDictionaryFactory.cs index a2d1fa12d3..e2e30f3d76 100644 --- a/src/Umbraco.Infrastructure/Dictionary/UmbracoCultureDictionaryFactory.cs +++ b/src/Umbraco.Core/Dictionary/UmbracoCultureDictionaryFactory.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Dictionary /// /// In the future this will allow use to potentially store dictionary items elsewhere and allows for maximum flexibility. /// - internal class DefaultCultureDictionaryFactory : ICultureDictionaryFactory + public class DefaultCultureDictionaryFactory : ICultureDictionaryFactory { private readonly ILocalizationService _localizationService; private readonly AppCaches _appCaches; diff --git a/src/Umbraco.Infrastructure/Editors/UserEditorAuthorizationHelper.cs b/src/Umbraco.Core/Editors/UserEditorAuthorizationHelper.cs similarity index 100% rename from src/Umbraco.Infrastructure/Editors/UserEditorAuthorizationHelper.cs rename to src/Umbraco.Core/Editors/UserEditorAuthorizationHelper.cs diff --git a/src/Umbraco.Infrastructure/HealthCheck/HealthCheckNotificationMethodCollection.cs b/src/Umbraco.Core/HealthCheck/HealthCheckNotificationMethodCollection.cs similarity index 100% rename from src/Umbraco.Infrastructure/HealthCheck/HealthCheckNotificationMethodCollection.cs rename to src/Umbraco.Core/HealthCheck/HealthCheckNotificationMethodCollection.cs diff --git a/src/Umbraco.Infrastructure/HealthCheck/HealthCheckNotificationMethodCollectionBuilder.cs b/src/Umbraco.Core/HealthCheck/HealthCheckNotificationMethodCollectionBuilder.cs similarity index 100% rename from src/Umbraco.Infrastructure/HealthCheck/HealthCheckNotificationMethodCollectionBuilder.cs rename to src/Umbraco.Core/HealthCheck/HealthCheckNotificationMethodCollectionBuilder.cs diff --git a/src/Umbraco.Infrastructure/HealthCheck/HealthCheckResults.cs b/src/Umbraco.Core/HealthCheck/HealthCheckResults.cs similarity index 85% rename from src/Umbraco.Infrastructure/HealthCheck/HealthCheckResults.cs rename to src/Umbraco.Core/HealthCheck/HealthCheckResults.cs index 37159b4a49..44955bfaae 100644 --- a/src/Umbraco.Infrastructure/HealthCheck/HealthCheckResults.cs +++ b/src/Umbraco.Core/HealthCheck/HealthCheckResults.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using HeyRed.MarkdownSharp; using Microsoft.Extensions.Logging; using Umbraco.Core; using Umbraco.Core.HealthCheck; @@ -120,33 +119,9 @@ namespace Umbraco.Infrastructure.HealthCheck return sb.ToString(); } - public string ResultsAsHtml(HealthCheckNotificationVerbosity verbosity) - { - var mark = new Markdown(); - var html = mark.Transform(ResultsAsMarkDown(verbosity)); - html = ApplyHtmlHighlighting(html); - return html; - } internal Dictionary> ResultsAsDictionary => _results; - private string ApplyHtmlHighlighting(string html) - { - const string SuccessHexColor = "5cb85c"; - const string WarningHexColor = "f0ad4e"; - const string ErrorHexColor = "d9534f"; - - html = ApplyHtmlHighlightingForStatus(html, StatusResultType.Success, SuccessHexColor); - html = ApplyHtmlHighlightingForStatus(html, StatusResultType.Warning, WarningHexColor); - return ApplyHtmlHighlightingForStatus(html, StatusResultType.Error, ErrorHexColor); - } - - private string ApplyHtmlHighlightingForStatus(string html, StatusResultType status, string color) - { - return html - .Replace("Result: '" + status + "'", "Result: " + status + ""); - } - private string SimpleHtmlToMarkDown(string html) { return html.Replace("", "**") diff --git a/src/Umbraco.Infrastructure/HealthCheck/NotificationMethods/EmailNotificationMethod.cs b/src/Umbraco.Core/HealthCheck/NotificationMethods/EmailNotificationMethod.cs similarity index 90% rename from src/Umbraco.Infrastructure/HealthCheck/NotificationMethods/EmailNotificationMethod.cs rename to src/Umbraco.Core/HealthCheck/NotificationMethods/EmailNotificationMethod.cs index 4d7444447f..d29f3ccb0b 100644 --- a/src/Umbraco.Infrastructure/HealthCheck/NotificationMethods/EmailNotificationMethod.cs +++ b/src/Umbraco.Core/HealthCheck/NotificationMethods/EmailNotificationMethod.cs @@ -17,6 +17,7 @@ namespace Umbraco.Web.HealthCheck.NotificationMethods private readonly ILocalizedTextService _textService; private readonly IRequestAccessor _requestAccessor; private readonly IEmailSender _emailSender; + private readonly IMarkdownToHtmlConverter _markdownToHtmlConverter; private readonly ContentSettings _contentSettings; @@ -25,7 +26,8 @@ namespace Umbraco.Web.HealthCheck.NotificationMethods IRequestAccessor requestAccessor, IEmailSender emailSender, IOptions healthChecksSettings, - IOptions contentSettings) + IOptions contentSettings, + IMarkdownToHtmlConverter markdownToHtmlConverter) : base(healthChecksSettings) { var recipientEmail = Settings?["RecipientEmail"]; @@ -40,6 +42,7 @@ namespace Umbraco.Web.HealthCheck.NotificationMethods _textService = textService ?? throw new ArgumentNullException(nameof(textService)); _requestAccessor = requestAccessor; _emailSender = emailSender; + _markdownToHtmlConverter = markdownToHtmlConverter; _contentSettings = contentSettings.Value ?? throw new ArgumentNullException(nameof(contentSettings)); } @@ -61,7 +64,7 @@ namespace Umbraco.Web.HealthCheck.NotificationMethods { DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), - results.ResultsAsHtml(Verbosity) + _markdownToHtmlConverter.ToHtml(results, Verbosity) }); // Include the umbraco Application URL host in the message subject so that diff --git a/src/Umbraco.Infrastructure/HealthCheck/NotificationMethods/IHealthCheckNotificationMethod.cs b/src/Umbraco.Core/HealthCheck/NotificationMethods/IHealthCheckNotificationMethod.cs similarity index 100% rename from src/Umbraco.Infrastructure/HealthCheck/NotificationMethods/IHealthCheckNotificationMethod.cs rename to src/Umbraco.Core/HealthCheck/NotificationMethods/IHealthCheckNotificationMethod.cs diff --git a/src/Umbraco.Core/HealthCheck/NotificationMethods/IMarkdownToHtmlConverter.cs b/src/Umbraco.Core/HealthCheck/NotificationMethods/IMarkdownToHtmlConverter.cs new file mode 100644 index 0000000000..20d8f0f07e --- /dev/null +++ b/src/Umbraco.Core/HealthCheck/NotificationMethods/IMarkdownToHtmlConverter.cs @@ -0,0 +1,10 @@ +using Umbraco.Core.HealthCheck; +using Umbraco.Infrastructure.HealthCheck; + +namespace Umbraco.Web.HealthCheck.NotificationMethods +{ + public interface IMarkdownToHtmlConverter + { + string ToHtml(HealthCheckResults results, HealthCheckNotificationVerbosity verbosity); + } +} diff --git a/src/Umbraco.Infrastructure/HealthCheck/NotificationMethods/NotificationMethodBase.cs b/src/Umbraco.Core/HealthCheck/NotificationMethods/NotificationMethodBase.cs similarity index 100% rename from src/Umbraco.Infrastructure/HealthCheck/NotificationMethods/NotificationMethodBase.cs rename to src/Umbraco.Core/HealthCheck/NotificationMethods/NotificationMethodBase.cs diff --git a/src/Umbraco.Infrastructure/HealthCheck/MarkdownToHtmlConverter.cs b/src/Umbraco.Infrastructure/HealthCheck/MarkdownToHtmlConverter.cs new file mode 100644 index 0000000000..39c5fe0bf2 --- /dev/null +++ b/src/Umbraco.Infrastructure/HealthCheck/MarkdownToHtmlConverter.cs @@ -0,0 +1,35 @@ +using HeyRed.MarkdownSharp; +using Umbraco.Core.HealthCheck; +using Umbraco.Infrastructure.HealthCheck; +using Umbraco.Web.HealthCheck.NotificationMethods; + +namespace Umbraco.Web.HealthCheck +{ + public class MarkdownToHtmlConverter : IMarkdownToHtmlConverter + { + public string ToHtml(HealthCheckResults results, HealthCheckNotificationVerbosity verbosity) + { + var mark = new Markdown(); + var html = mark.Transform(results.ResultsAsMarkDown(verbosity)); + html = ApplyHtmlHighlighting(html); + return html; + } + + private string ApplyHtmlHighlighting(string html) + { + const string SuccessHexColor = "5cb85c"; + const string WarningHexColor = "f0ad4e"; + const string ErrorHexColor = "d9534f"; + + html = ApplyHtmlHighlightingForStatus(html, StatusResultType.Success, SuccessHexColor); + html = ApplyHtmlHighlightingForStatus(html, StatusResultType.Warning, WarningHexColor); + return ApplyHtmlHighlightingForStatus(html, StatusResultType.Error, ErrorHexColor); + } + + private string ApplyHtmlHighlightingForStatus(string html, StatusResultType status, string color) + { + return html + .Replace("Result: '" + status + "'", "Result: " + status + ""); + } + } +} diff --git a/src/Umbraco.Infrastructure/HostedServices/HealthCheckNotifier.cs b/src/Umbraco.Infrastructure/HostedServices/HealthCheckNotifier.cs index 58decb80c4..1e775abaa9 100644 --- a/src/Umbraco.Infrastructure/HostedServices/HealthCheckNotifier.cs +++ b/src/Umbraco.Infrastructure/HostedServices/HealthCheckNotifier.cs @@ -5,12 +5,12 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Core; using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.Extensions; using Umbraco.Core.Configuration.Models; using Umbraco.Core.HealthCheck; using Umbraco.Core.Logging; using Umbraco.Core.Scoping; using Umbraco.Core.Sync; -using Umbraco.Infrastructure.Configuration.Extensions; using Umbraco.Infrastructure.HealthCheck; using Umbraco.Web.HealthCheck; diff --git a/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs index 84e65732c2..5f5ee63642 100644 --- a/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs +++ b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs @@ -8,7 +8,6 @@ using System.Xml.XPath; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Core.Collections; -using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.Models; using Umbraco.Core.Models; using Umbraco.Core.Models.Entities; @@ -17,7 +16,6 @@ using Umbraco.Core.PropertyEditors; using Umbraco.Core.Scoping; using Umbraco.Core.Serialization; using Umbraco.Core.Services; -using Umbraco.Core.Services.Implement; using Umbraco.Core.Strings; namespace Umbraco.Core.Packaging diff --git a/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs index 910a9a25e2..2a988a70a4 100644 --- a/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs @@ -60,9 +60,6 @@ using IntegerValidator = Umbraco.Core.PropertyEditors.Validators.IntegerValidato using TextStringValueConverter = Umbraco.Core.PropertyEditors.ValueConverters.TextStringValueConverter; using Microsoft.Extensions.Logging; using Umbraco.Core.DependencyInjection; -using Umbraco.Core.Configuration.HealthChecks; -using Umbraco.Core.HealthCheck; -using Umbraco.Core.HealthCheck.Checks; using Umbraco.Core.Security; namespace Umbraco.Core.Runtime @@ -303,6 +300,7 @@ namespace Umbraco.Core.Runtime builder.Services.AddUnique(); // register *all* checks, except those marked [HideFromTypeFinder] of course + builder.Services.AddUnique(); builder.HealthChecks() .Add(() => builder.TypeLoader.GetTypes()); diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Configuration/Models/Extensions/HealthCheckSettingsExtensionsTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Configuration/Models/Extensions/HealthCheckSettingsExtensionsTests.cs index 833e5c865b..0eca0b7d02 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Configuration/Models/Extensions/HealthCheckSettingsExtensionsTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Configuration/Models/Extensions/HealthCheckSettingsExtensionsTests.cs @@ -1,8 +1,8 @@ using System; using NUnit.Framework; using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.Extensions; using Umbraco.Core.Configuration.Models; -using Umbraco.Infrastructure.Configuration.Extensions; namespace Umbraco.Tests.UnitTests.Umbraco.Core.Configuration.Models.Extensions {