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