U4-10795 - granular logging - roles

This commit is contained in:
Stephan
2018-02-07 16:50:49 +01:00
parent 7c34255abe
commit 0a44ad3ab6
4 changed files with 76 additions and 22 deletions

View File

@@ -60,6 +60,38 @@ namespace Umbraco.Core.Auditing
MemberService.Saved += OnSavedMember;
MemberService.Deleted += OnDeletedMember;
MemberService.AssignedRoles += OnAssignedRoles;
MemberService.RemovedRoles += OnRemovedRoles;
}
private void OnRemovedRoles(IMemberService sender, MemberService.RolesEventArgs args)
{
var performingUser = PerformingUser;
var roles = string.Join(", ", args.Roles);
var members = ApplicationContext.Current.Services.MemberService.GetAllMembers(args.MemberIds).ToDictionary(x => x.Id, x => x);
foreach (var id in args.MemberIds)
{
members.TryGetValue(id, out var member);
AuditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" <{performingUser.Email}>", PerformingIp,
DateTime.Now,
0, null,
"umbraco/member", $"modified roles for member id:{id} \"{member?.Name ?? "(unknown)"}\" <{member?.Email ?? ""}>, removed {roles}");
}
}
private void OnAssignedRoles(IMemberService sender, MemberService.RolesEventArgs args)
{
var performingUser = PerformingUser;
var roles = string.Join(", ", args.Roles);
var members = ApplicationContext.Current.Services.MemberService.GetAllMembers(args.MemberIds).ToDictionary(x => x.Id, x => x);
foreach (var id in args.MemberIds)
{
members.TryGetValue(id, out var member);
AuditService.Write(performingUser.Id, $"User \"{performingUser.Name}\" <{performingUser.Email}>", PerformingIp,
DateTime.Now,
0, null,
"umbraco/member", $"modified roles for member id:{id} \"{member?.Name ?? "(unknown)"}\" <{member?.Email ?? ""}>, assigned {roles}");
}
}
private void OnSavedUserGroup(IUserService sender, SaveEventArgs<IUserGroup> saveEventArgs)

View File

@@ -39,5 +39,7 @@ namespace Umbraco.Core.Persistence.Repositories
void AssignRoles(int[] memberIds, string[] roleNames);
void DissociateRoles(int[] memberIds, string[] roleNames);
int[] GetMemberIds(string[] names);
}
}
}

View File

@@ -183,7 +183,7 @@ namespace Umbraco.Core.Persistence.Repositories
}
public IEnumerable<IMemberGroup> GetMemberGroupsForMember(string username)
{
{
var sql = new Sql()
.Select("un.*")
.From("umbracoNode AS un")
@@ -192,16 +192,15 @@ namespace Umbraco.Core.Persistence.Repositories
.InnerJoin("cmsMember")
.On("cmsMember.nodeId = cmsMember2MemberGroup.Member")
.Where("un.nodeObjectType=@objectType", new { objectType = NodeObjectTypeId })
.Where("cmsMember.LoginName=@loginName", new { loginName = username });
.Where("cmsMember.LoginName=@loginName", new { loginName = username });
return Database.Fetch<NodeDto>(sql)
.DistinctBy(dto => dto.NodeId)
.Select(x => _modelFactory.BuildEntity(x));
}
public void AssignRoles(string[] usernames, string[] roleNames)
public int[] GetMemberIds(string[] names)
{
//first get the member ids based on the usernames
var memberSql = new Sql();
var memberObjectType = new Guid(Constants.ObjectTypes.Member);
memberSql.Select("umbracoNode.id")
@@ -209,25 +208,19 @@ namespace Umbraco.Core.Persistence.Repositories
.InnerJoin<MemberDto>()
.On<NodeDto, MemberDto>(dto => dto.NodeId, dto => dto.NodeId)
.Where<NodeDto>(x => x.NodeObjectType == memberObjectType)
.Where("cmsMember.LoginName in (@usernames)", new { usernames = usernames });
var memberIds = Database.Fetch<int>(memberSql).ToArray();
.Where("cmsMember.LoginName in (@names)", new { names });
return Database.Fetch<int>(memberSql).ToArray();
}
public void AssignRoles(string[] usernames, string[] roleNames)
{
var memberIds = GetMemberIds(usernames);
AssignRolesInternal(memberIds, roleNames);
}
public void DissociateRoles(string[] usernames, string[] roleNames)
{
//first get the member ids based on the usernames
var memberSql = new Sql();
var memberObjectType = new Guid(Constants.ObjectTypes.Member);
memberSql.Select("umbracoNode.id")
.From<NodeDto>()
.InnerJoin<MemberDto>()
.On<NodeDto, MemberDto>(dto => dto.NodeId, dto => dto.NodeId)
.Where<NodeDto>(x => x.NodeObjectType == memberObjectType)
.Where("cmsMember.LoginName in (@usernames)", new { usernames = usernames });
var memberIds = Database.Fetch<int>(memberSql).ToArray();
var memberIds = GetMemberIds(usernames);
DissociateRolesInternal(memberIds, roleNames);
}
@@ -337,4 +330,4 @@ namespace Umbraco.Core.Persistence.Repositories
/// </summary>
internal static event TypedEventHandler<IMemberGroupRepository, SaveEventArgs<IMemberGroup>> SavedMemberGroup;
}
}
}

View File

@@ -1173,12 +1173,16 @@ namespace Umbraco.Core.Services
public void AssignRoles(string[] usernames, string[] roleNames)
{
int[] memberIds;
using (var uow = UowProvider.GetUnitOfWork())
{
var repository = RepositoryFactory.CreateMemberGroupRepository(uow);
repository.AssignRoles(usernames, roleNames);
memberIds = repository.GetMemberIds(usernames);
repository.AssignRoles(memberIds, roleNames);
uow.Commit();
}
AssignedRoles?.Invoke(this, new RolesEventArgs(memberIds, roleNames));
}
public void DissociateRole(string username, string roleName)
@@ -1188,12 +1192,16 @@ namespace Umbraco.Core.Services
public void DissociateRoles(string[] usernames, string[] roleNames)
{
int[] memberIds;
using (var uow = UowProvider.GetUnitOfWork())
{
var repository = RepositoryFactory.CreateMemberGroupRepository(uow);
repository.DissociateRoles(usernames, roleNames);
memberIds = repository.GetMemberIds(usernames);
repository.DissociateRoles(memberIds, roleNames);
uow.Commit();
}
RemovedRoles?.Invoke(this, new RolesEventArgs(memberIds, roleNames));
}
public void AssignRole(int memberId, string roleName)
@@ -1209,6 +1217,8 @@ namespace Umbraco.Core.Services
repository.AssignRoles(memberIds, roleNames);
uow.Commit();
}
AssignedRoles?.Invoke(this, new RolesEventArgs(memberIds, roleNames));
}
public void DissociateRole(int memberId, string roleName)
@@ -1224,6 +1234,8 @@ namespace Umbraco.Core.Services
repository.DissociateRoles(memberIds, roleNames);
uow.Commit();
}
RemovedRoles?.Invoke(this, new RolesEventArgs(memberIds, roleNames));
}
@@ -1289,6 +1301,21 @@ namespace Umbraco.Core.Services
/// </summary>
public static event TypedEventHandler<IMemberService, SaveEventArgs<IMember>> Saved;
public static event TypedEventHandler<IMemberService, RolesEventArgs> AssignedRoles;
public static event TypedEventHandler<IMemberService, RolesEventArgs> RemovedRoles;
public class RolesEventArgs : EventArgs
{
public RolesEventArgs(int[] memberIds, string[] roles)
{
MemberIds = memberIds;
Roles = roles;
}
public int[] MemberIds { get; set; }
public string[] Roles { get; set; }
}
#endregion
/// <summary>