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