diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Module.txt b/src/Orchard.Web/Modules/Orchard.AuditTrail/Module.txt index f5f8bd196..2817a7e3b 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Module.txt +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Module.txt @@ -9,4 +9,5 @@ Features: Orchard.AuditTrail: Name: AuditTrail Description: Provides the core audit trail framework. - Category: Security \ No newline at end of file + Category: Security + Dependencies: Orchard.Users, Orchard.Roles \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj index 6cb1d6cc4..a936c5b63 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Orchard.AuditTrail.csproj @@ -87,6 +87,10 @@ + + + + @@ -105,6 +109,9 @@ + + + diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/AuditTrailEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/AuditTrailEventHandler.cs index a0e334448..7fa9130a2 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/AuditTrailEventHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Content/AuditTrailEventHandler.cs @@ -5,7 +5,7 @@ using Orchard.ContentManagement; namespace Orchard.AuditTrail.Providers.Content { public class AuditTrailEventHandler : IAuditTrailEventHandler { public void Create(AuditTrailCreateContext context) { - var content = (IContent)context.Properties["Content"]; + var content = context.Properties.ContainsKey("Content") ? (IContent)context.Properties["Content"] : default(IContent); var auditTrailPart = content != null ? content.As() : default(AuditTrailPart); if (auditTrailPart == null) diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Role/IRoleEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Role/IRoleEventHandler.cs new file mode 100644 index 000000000..40450a452 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Role/IRoleEventHandler.cs @@ -0,0 +1,13 @@ +using Orchard.Events; + +namespace Orchard.AuditTrail.Providers.Role { + 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/Role/RoleAuditTrailEventProvider.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Role/RoleAuditTrailEventProvider.cs new file mode 100644 index 000000000..78ffafb58 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Role/RoleAuditTrailEventProvider.cs @@ -0,0 +1,25 @@ +using Orchard.AuditTrail.Models; +using Orchard.AuditTrail.Services; + +namespace Orchard.AuditTrail.Providers.Role { + public class RoleAuditTrailEventProvider : AuditTrailEventProviderBase { + public const string RoleCreated = "RoleCreated"; + public const string RoleRemoved = "RoleRemoved"; + public const string RoleRenamed = "RoleRenamed"; + public const string PermissionAdded = "PermissionAdded"; + public const string PermissionRemoved = "PermissionRemoved"; + public const string UserAdded = "UserAdded"; + public const string UserRemoved = "UserRemoved"; + + public override void Describe(DescribeContext context) { + context.For("Role", T("Role")) + .Event(this, RoleCreated, T("Role created"), T("A role was created."), enableByDefault: true) + .Event(this, RoleRemoved, T("Role removed"), T("A role was removed."), enableByDefault: true) + .Event(this, RoleRenamed, T("Role renamed"), T("A role was renamed."), enableByDefault: true) + .Event(this, PermissionAdded, T("Permission added"), T("Permission was added to a role."), enableByDefault: true) + .Event(this, PermissionRemoved, T("Permission removed"), T("Permission was removed from a role."), enableByDefault: true) + .Event(this, UserAdded, T("User added"), T("A user was added to a role."), enableByDefault: true) + .Event(this, UserRemoved, T("User removed"), T("A user was removed from a role."), enableByDefault: true); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Role/RoleEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Role/RoleEventHandler.cs new file mode 100644 index 000000000..6d91bad1a --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Providers/Role/RoleEventHandler.cs @@ -0,0 +1,85 @@ +using System.Collections.Generic; +using Orchard.AuditTrail.Services; +using Orchard.Security; + +namespace Orchard.AuditTrail.Providers.Role { + public class RoleEventHandler : IRoleEventHandler { + private readonly IAuditTrailManager _auditTrailManager; + private readonly IWorkContextAccessor _wca; + + public RoleEventHandler(IAuditTrailManager auditTrailManager, IWorkContextAccessor wca) { + _auditTrailManager = auditTrailManager; + _wca = wca; + } + + public void Created(dynamic context) { + RecordAuditTrail(RoleAuditTrailEventProvider.RoleCreated, context.Role.Name); + } + + public void Removed(dynamic context) { + RecordAuditTrail(RoleAuditTrailEventProvider.RoleRemoved, context.Role.Name); + } + + public void Renamed(dynamic context) { + var eventData = new Dictionary { + {"RoleName", (string)context.Role.Name}, + {"PreviousRoleName", (string)context.PreviousRoleName}, + {"NewRoleName", (string)context.NewRoleName}, + }; + + RecordAuditTrail(RoleAuditTrailEventProvider.RoleRenamed, context.Role.Name, properties: null, eventData:eventData); + } + + public void PermissionAdded(dynamic context) { + RecordAuditTrail(RoleAuditTrailEventProvider.PermissionAdded, context.Role.Name, context.Permission.Name); + } + + public void PermissionRemoved(dynamic context) { + RecordAuditTrail(RoleAuditTrailEventProvider.PermissionRemoved, context.Role.Name, context.Permission.Name); + } + + public void UserAdded(dynamic context) { + RecordAuditTrail(RoleAuditTrailEventProvider.UserAdded, context.Role.Name, context.User); + } + + public void UserRemoved(dynamic context) { + RecordAuditTrail(RoleAuditTrailEventProvider.UserRemoved, context.Role.Name, context.User); + } + + private void RecordAuditTrail(string eventName, string roleName) { + var eventData = new Dictionary { + {"RoleName", roleName} + }; + + RecordAuditTrail(eventName, roleName, properties: null, eventData: eventData); + } + + private void RecordAuditTrail(string eventName, string roleName, string permissionName) { + var eventData = new Dictionary { + {"RoleName", roleName}, + {"PermissionName", permissionName} + }; + + RecordAuditTrail(eventName, roleName, properties: null, eventData: eventData); + } + + + private void RecordAuditTrail(string eventName, string roleName, IUser user) { + + var properties = new Dictionary { + {"User", user} + }; + + var eventData = new Dictionary { + {"RoleName", roleName}, + {"UserName", user.UserName} + }; + + RecordAuditTrail(eventName, roleName, properties, eventData); + } + + private void RecordAuditTrail(string eventName, string roleName, IDictionary properties, IDictionary eventData) { + _auditTrailManager.Record(eventName, _wca.GetContext().CurrentUser, properties, eventData, eventFilterKey: "role", eventFilterData: roleName); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailEventDisplayBuilder.cs b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailEventDisplayBuilder.cs index dd08d9142..fa06f7752 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailEventDisplayBuilder.cs +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Services/AuditTrailEventDisplayBuilder.cs @@ -25,9 +25,14 @@ namespace Orchard.AuditTrail.Services { metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}", displayType)); metaData.Alternates.Add(String.Format("AuditTrailEvent__{0}", record.Category)); metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}", displayType, record.Category)); - metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}", record.Category, record.Event)); - metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}__{2}", displayType, record.Category, record.Event)); + metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}", record.Category, GetShortName(record.Event))); + metaData.Alternates.Add(String.Format("AuditTrailEvent_{0}__{1}__{2}", displayType, record.Category, GetShortName(record.Event))); return auditTrailEventShape; } + + private string GetShortName(string fullyQualifiedEventName) { + var index = fullyQualifiedEventName.LastIndexOf('.') + 1; + return fullyQualifiedEventName.Substring(index); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-PermissionAdded.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-PermissionAdded.SummaryAdmin.cshtml new file mode 100644 index 000000000..764446ae2 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-PermissionAdded.SummaryAdmin.cshtml @@ -0,0 +1,10 @@ +@using Orchard.AuditTrail.Helpers +@{ + var eventData = (IDictionary) Model.EventData; + var roleName = eventData.Get("RoleName"); + var permissionName = eventData.Get("PermissionName"); +} + +
+ @T("Added the {0} permission to the {1} role.", permissionName, roleName) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-PermissionRemoved.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-PermissionRemoved.SummaryAdmin.cshtml new file mode 100644 index 000000000..870bf00f5 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-PermissionRemoved.SummaryAdmin.cshtml @@ -0,0 +1,10 @@ +@using Orchard.AuditTrail.Helpers +@{ + var eventData = (IDictionary) Model.EventData; + var roleName = eventData.Get("RoleName"); + var permissionName = eventData.Get("PermissionName"); +} + +
+ @T("Removed the {0} permission from the {1} role.", permissionName, roleName) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-RoleCreated.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-RoleCreated.SummaryAdmin.cshtml new file mode 100644 index 000000000..91d579147 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-RoleCreated.SummaryAdmin.cshtml @@ -0,0 +1,9 @@ +@using Orchard.AuditTrail.Helpers +@{ + var eventData = (IDictionary) Model.EventData; + var roleName = eventData.Get("RoleName"); +} + +
+ @T("Created {0} role.", roleName) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-RoleRenamed.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-RoleRenamed.SummaryAdmin.cshtml new file mode 100644 index 000000000..8611bd024 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent-Role-RoleRenamed.SummaryAdmin.cshtml @@ -0,0 +1,10 @@ +@using Orchard.AuditTrail.Helpers +@{ + var eventData = (IDictionary) Model.EventData; + var previousRoleName = eventData.Get("PreviousRoleName"); + var newRoleName = eventData.Get("NewRoleName"); +} + +
+ @T("Renamed {0} to {1}.", previousRoleName, newRoleName) +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent.SummaryAdmin.cshtml index 5f282702b..ff029a741 100644 --- a/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.AuditTrail/Views/AuditTrailEvent.SummaryAdmin.cshtml @@ -1 +1,3 @@ - \ No newline at end of file +@{ + var model = Model; +} \ No newline at end of file