From ac6b3b2f66665214354f9e751aa1f19eec13d1f7 Mon Sep 17 00:00:00 2001 From: Daniel Stolt Date: Sun, 6 Jul 2014 17:42:06 +0200 Subject: [PATCH] Completed extraction of roles and users audit trail providers into separate features by removing duplicated interfaces. Renamed some helper classes as extensions. Some minor reformating and naming changes. Fixed bugs in the role audit trail provider. --- .../Drivers/AuditTrailSettingsPartDriver.cs | 35 +++++++++++-------- ...ateTimeHelper.cs => DateTimeExtensions.cs} | 2 +- ...ntDataHelper.cs => EventDataExtensions.cs} | 2 +- ...ntNameHelper.cs => EventNameExtensions.cs} | 2 +- ...{FiltersHelper.cs => FiltersExtensions.cs} | 2 +- ...onversionHelper.cs => StringExtensions.cs} | 2 +- .../Orchard.AuditTrail.csproj | 20 +++++++---- .../Providers/Content/DiffGramAnalyzer.cs | 6 ++-- .../Providers/Content/IDiffGramAnalyzer.cs | 4 +-- .../Providers/Roles/IRoleEventHandler.cs | 13 ------- .../Providers/Roles/RoleEventHandler.cs | 29 +++++++-------- .../Providers/Users/IUserEventHandler.cs | 27 -------------- .../Providers/Users/UserEventHandler.cs | 22 ++++++++++++ .../Services/AuditTrailManager.cs | 2 +- .../Services/Models/DescribeFor.cs | 2 +- .../AuditTrailCategorySettingsViewModel.cs | 2 +- 16 files changed, 82 insertions(+), 90 deletions(-) rename src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/{DateTimeHelper.cs => DateTimeExtensions.cs} (92%) rename src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/{EventDataHelper.cs => EventDataExtensions.cs} (89%) rename src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/{EventNameHelper.cs => EventNameExtensions.cs} (90%) rename src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/{FiltersHelper.cs => FiltersExtensions.cs} (86%) rename src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/{StringConversionHelper.cs => StringExtensions.cs} (86%) delete mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Roles/IRoleEventHandler.cs delete mode 100644 src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Users/IUserEventHandler.cs diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Drivers/AuditTrailSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Drivers/AuditTrailSettingsPartDriver.cs index da3fa20c1..97e21bc3e 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Drivers/AuditTrailSettingsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Drivers/AuditTrailSettingsPartDriver.cs @@ -27,22 +27,26 @@ namespace Orchard.AuditTrail.Drivers { return ContentShape("Parts_AuditTrailSettings_Edit", () => { var descriptors = _auditTrailManager.DescribeCategories(); var eventSettings = part.EventSettings.ToList(); + var categoriesQuery = + from categoryDescriptor in descriptors + let eventsQuery = + from eventDescriptor in categoryDescriptor.Events + let eventSetting = eventSettings.FirstOrDefault(x => x.EventName == eventDescriptor.Event) + select new AuditTrailEventSettingsViewModel { + Event = eventDescriptor.Event, + Name = eventDescriptor.Name, + Description = eventDescriptor.Description, + IsEnabled = eventDescriptor.IsMandatory || (eventSetting != null ? eventSetting.IsEnabled : eventDescriptor.IsEnabledByDefault), + IsMandatory = eventDescriptor.IsMandatory + } + select new AuditTrailCategorySettingsViewModel { + Category = categoryDescriptor.Category, + Name = categoryDescriptor.Name, + Events = eventsQuery.ToArray() + }; + var viewModel = new AuditTrailSettingsViewModel { - Categories = (from categoryDescriptor in descriptors - select new AuditTrailCategorySettingsViewModel { - Category = categoryDescriptor.Category, - Name = categoryDescriptor.Name, - Events = - (from eventDescriptor in categoryDescriptor.Events - let eventSetting = eventSettings.FirstOrDefault(x => x.EventName == eventDescriptor.Event) - select new AuditTrailEventSettingsViewModel { - Event = eventDescriptor.Event, - Name = eventDescriptor.Name, - Description = eventDescriptor.Description, - IsEnabled = eventDescriptor.IsMandatory || (eventSetting != null ? eventSetting.IsEnabled : eventDescriptor.IsEnabledByDefault), - IsMandatory = eventDescriptor.IsMandatory - }).ToList() - }).ToList() + Categories = categoriesQuery.ToArray() }; if (updater != null) { @@ -55,6 +59,7 @@ namespace Orchard.AuditTrail.Drivers { eventSettings.Add(eventSetting); } + // TODO: Security hole! IsMandatory could be spoofed in the request! eventSetting.IsEnabled = eventSettingViewModel.IsEnabled || eventSettingViewModel.IsMandatory; } part.EventSettings = eventSettings; diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/DateTimeHelper.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/DateTimeExtensions.cs similarity index 92% rename from src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/DateTimeHelper.cs rename to src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/DateTimeExtensions.cs index 0b9e0a349..0289ca343 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/DateTimeHelper.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/DateTimeExtensions.cs @@ -1,7 +1,7 @@ using System; namespace Orchard.AuditTrail.Helpers { - public static class DateTimeHelper { + public static class DateTimeExtensions { public static DateTime? Earliest(this DateTime? value) { if (value == null) return null; diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataHelper.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataExtensions.cs similarity index 89% rename from src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataHelper.cs rename to src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataExtensions.cs index 664af226a..27c66302b 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataHelper.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventDataExtensions.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; namespace Orchard.AuditTrail.Helpers { - public static class EventDataHelper { + public static class EventDataExtensions { public static T Get(this IDictionary eventData, string key) { if (eventData == null || !eventData.ContainsKey(key)) return default(T); diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventNameHelper.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventNameExtensions.cs similarity index 90% rename from src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventNameHelper.cs rename to src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventNameExtensions.cs index 64702e7ad..5302a8fa3 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventNameHelper.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/EventNameExtensions.cs @@ -2,7 +2,7 @@ using Orchard.AuditTrail.Services; namespace Orchard.AuditTrail.Helpers { - internal static class EventNameHelper { + internal static class EventNameExtensions { public static string GetFullyQualifiedEventName(string eventName) where T : IAuditTrailEventProvider { return GetFullyQualifiedEventName(typeof(T), eventName); } diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/FiltersHelper.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/FiltersExtensions.cs similarity index 86% rename from src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/FiltersHelper.cs rename to src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/FiltersExtensions.cs index 04c7912dc..6dd2e1067 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/FiltersHelper.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/FiltersExtensions.cs @@ -1,7 +1,7 @@ using Orchard.AuditTrail.Services.Models; namespace Orchard.AuditTrail.Helpers { - public static class FiltersHelper { + public static class FiltersExtensions { public static string Get(this Filters filters, string key) { if (!filters.ContainsKey(key)) return null; diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/StringConversionHelper.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/StringExtensions.cs similarity index 86% rename from src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/StringConversionHelper.cs rename to src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/StringExtensions.cs index f3f2b40db..224c17986 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/StringConversionHelper.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Helpers/StringExtensions.cs @@ -1,7 +1,7 @@ using System; namespace Orchard.AuditTrail.Helpers { - public static class StringConversionHelper { + public static class StringExtensions { public static int? ToInt32(this string value) { if (String.IsNullOrWhiteSpace(value)) return null; diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj index baee17a45..3ec3e3a6b 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj @@ -161,6 +161,14 @@ {fe5c5947-d2d5-42c5-992a-13d672946135} Orchard.ImportExport + + {d10ad48f-407d-4db5-a328-173ec7cb010f} + Orchard.Roles + + + {79aed36e-abd0-4747-93d3-8722b042454b} + Orchard.Users + @@ -169,9 +177,9 @@ - - - + + + @@ -206,19 +214,17 @@ - + - - - + diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffGramAnalyzer.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffGramAnalyzer.cs index 5e5989b91..5eb08b657 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffGramAnalyzer.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/DiffGramAnalyzer.cs @@ -8,13 +8,11 @@ using Microsoft.XmlDiffPatch; namespace Orchard.AuditTrail.Providers.Content { public class DiffGramAnalyzer : IDiffGramAnalyzer { public XElement GenerateDiffGram(XElement element1, XElement element2) { - using(var node1Reader = element1.CreateReader()) + using (var node1Reader = element1.CreateReader()) using (var node2Reader = element2.CreateReader()) { var result = new XDocument(); using (var writer = result.CreateWriter()) { - var diff = - new XmlDiff(XmlDiffOptions.IgnoreChildOrder | XmlDiffOptions.IgnoreWhitespace | - XmlDiffOptions.IgnoreComments | XmlDiffOptions.IgnoreXmlDecl); + var diff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder | XmlDiffOptions.IgnoreWhitespace | XmlDiffOptions.IgnoreComments | XmlDiffOptions.IgnoreXmlDecl); diff.Compare(node1Reader, node2Reader, writer); writer.Flush(); writer.Close(); diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/IDiffGramAnalyzer.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/IDiffGramAnalyzer.cs index 7482dd681..82631d36c 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/IDiffGramAnalyzer.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/IDiffGramAnalyzer.cs @@ -9,8 +9,8 @@ namespace Orchard.AuditTrail.Providers.Content { XElement GenerateDiffGram(XElement element1, XElement element2); /// - /// Analyzes the specified DiffGram against the specified original XML element and returns a list of diff nodes, - /// where each node describes the difference between the original and updated document. + /// Analyzes the specified DiffGram element against the specified original XML element and returns a list of diff nodes, + /// where each node describes a difference between the original and updated document. /// IEnumerable Analyze(XElement original, XElement diffGram); } diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Roles/IRoleEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Roles/IRoleEventHandler.cs deleted file mode 100644 index ddef5f9c0..000000000 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Roles/IRoleEventHandler.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Orchard.Events; - -namespace Orchard.AuditTrail.Providers.Roles { - public interface IRoleEventHandler : IEventHandler { - void Created(dynamic context); - void Removed(dynamic context); - void Renamed(dynamic context); - void PermissionAdded(dynamic context); - void PermissionRemoved(dynamic context); - void UserAdded(dynamic context); - void UserRemoved(dynamic context); - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Roles/RoleEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Roles/RoleEventHandler.cs index b63179143..49d040998 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Roles/RoleEventHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Roles/RoleEventHandler.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using Orchard.AuditTrail.Services; using Orchard.Environment.Extensions; +using Orchard.Roles.Events; using Orchard.Security; namespace Orchard.AuditTrail.Providers.Roles { @@ -14,38 +15,38 @@ namespace Orchard.AuditTrail.Providers.Roles { _wca = wca; } - public void Created(dynamic context) { + public void Created(RoleCreatedContext context) { RecordAuditTrailEvent(RoleAuditTrailEventProvider.Created, context.Role.Name); } - public void Removed(dynamic context) { + public void Removed(RoleRemovedContext context) { RecordAuditTrailEvent(RoleAuditTrailEventProvider.Removed, context.Role.Name); } - public void Renamed(dynamic context) { + public void Renamed(RoleRenamedContext context) { var eventData = new Dictionary { - {"RoleName", (string)context.Role.Name}, - {"PreviousRoleName", (string)context.PreviousRoleName}, - {"NewRoleName", (string)context.NewRoleName}, + {"RoleName", context.Role.Name}, + {"PreviousRoleName", context.PreviousRoleName}, + {"NewRoleName", context.NewRoleName}, }; RecordAuditTrailEvent(RoleAuditTrailEventProvider.Renamed, context.Role.Name, properties: null, eventData:eventData); } - public void PermissionAdded(dynamic context) { - RecordAuditTrailEvent(RoleAuditTrailEventProvider.PermissionAdded, (string) context.Role.Name, (IUser) context.Permission.Name); + public void PermissionAdded(PermissionAddedContext context) { + RecordAuditTrailEvent(RoleAuditTrailEventProvider.PermissionAdded, context.Role.Name); } - public void PermissionRemoved(dynamic context) { - RecordAuditTrailEvent(RoleAuditTrailEventProvider.PermissionRemoved, (string) context.Role.Name, (IUser) context.Permission.Name); + public void PermissionRemoved(PermissionRemovedContext context) { + RecordAuditTrailEvent(RoleAuditTrailEventProvider.PermissionRemoved, context.Role.Name); } - public void UserAdded(dynamic context) { - RecordAuditTrailEvent(RoleAuditTrailEventProvider.UserAdded, (string) context.Role.Name, (IUser) context.User); + public void UserAdded(UserAddedContext context) { + RecordAuditTrailEvent(RoleAuditTrailEventProvider.UserAdded, context.Role.Name, context.User); } - public void UserRemoved(dynamic context) { - RecordAuditTrailEvent(RoleAuditTrailEventProvider.UserRemoved, (string) context.Role.Name, (IUser) context.User); + public void UserRemoved(UserRemovedContext context) { + RecordAuditTrailEvent(RoleAuditTrailEventProvider.UserRemoved, context.Role.Name, context.User); } private void RecordAuditTrailEvent(string eventName, string roleName) { diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Users/IUserEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Users/IUserEventHandler.cs deleted file mode 100644 index 2b3342eb5..000000000 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Users/IUserEventHandler.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Orchard.Events; -using Orchard.Security; - -namespace Orchard.AuditTrail.Providers.Users { - public interface IUserEventHandler : IEventHandler { - - /// - /// Called after a user has logged in. - /// - void LoggedIn(IUser user); - - /// - /// Called when a user explicitly logs out (as opposed to one whose session cookie simply expires). - /// - void LoggedOut(IUser user); - - /// - /// Called when a login attempt failed. - /// - void LogInFailed(string userNameOrEmail, string password); - - /// - /// Called after a user has changed password. - /// - void ChangedPassword(IUser user); - } -} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Users/UserEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Users/UserEventHandler.cs index 449cd626c..61e6d1b95 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Users/UserEventHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Users/UserEventHandler.cs @@ -2,6 +2,7 @@ using Orchard.AuditTrail.Services; using Orchard.Environment.Extensions; using Orchard.Security; +using Orchard.Users.Events; namespace Orchard.AuditTrail.Providers.Users { [OrchardFeature("Orchard.AuditTrail.Users")] @@ -47,5 +48,26 @@ namespace Orchard.AuditTrail.Providers.Users { _auditTrailManager.CreateRecord(eventName, _wca.GetContext().CurrentUser, properties, eventData, eventFilterKey: "user", eventFilterData: user.UserName); } + + public void Creating(UserContext context) { + } + + public void Created(UserContext context) { + } + + public void LoggingIn(string userNameOrEmail, string password) { + } + + public void AccessDenied(IUser user) { + } + + public void SentChallengeEmail(IUser user) { + } + + public void ConfirmedEmail(IUser user) { + } + + public void Approved(IUser user) { + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailManager.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailManager.cs index d22a33f66..d05bd1a8f 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailManager.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailManager.cs @@ -179,7 +179,7 @@ namespace Orchard.AuditTrail.Services { } public AuditTrailEventDescriptor DescribeEvent(string eventName) where T:IAuditTrailEventProvider { - var fullyQualifiedEventName = EventNameHelper.GetFullyQualifiedEventName(eventName); + var fullyQualifiedEventName = EventNameExtensions.GetFullyQualifiedEventName(eventName); return DescribeEvent(fullyQualifiedEventName); } diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/DescribeFor.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/DescribeFor.cs index 7d360a0a9..fed7d2aa4 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/DescribeFor.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/Models/DescribeFor.cs @@ -32,7 +32,7 @@ namespace Orchard.AuditTrail.Services.Models { Name = Name, Events = Events }, - Event = EventNameHelper.GetFullyQualifiedEventName(provider.GetType(), eventName), + Event = EventNameExtensions.GetFullyQualifiedEventName(provider.GetType(), eventName), Name = name, Description = description, IsEnabledByDefault = enableByDefault, diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/ViewModels/AuditTrailCategorySettingsViewModel.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/ViewModels/AuditTrailCategorySettingsViewModel.cs index 04d619a08..81267c677 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/ViewModels/AuditTrailCategorySettingsViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/ViewModels/AuditTrailCategorySettingsViewModel.cs @@ -5,6 +5,6 @@ namespace Orchard.AuditTrail.ViewModels { public class AuditTrailCategorySettingsViewModel { public string Category { get; set; } public LocalizedString Name { get; set; } - public IList Events { get; set; } + public IEnumerable Events { get; set; } } } \ No newline at end of file