From edf70388487a4dec7985148c5163986a73cf314e Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 20 Mar 2018 15:00:09 +0100 Subject: [PATCH 1/4] U4-11020 Deleting a member group that is part of a Public Access feature, from the system, does not also remove the corresponding rows from the umbracoAccessRule table. --- .../umbraco/create/MemberGroupTasks.cs | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs index 42f8419723..85f6906e36 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs @@ -1,5 +1,6 @@ using System; using System.Data; +using System.Linq; using System.Web.Security; using Umbraco.Web.UI; using umbraco.BusinessLogic; @@ -7,6 +8,8 @@ using umbraco.DataLayer; using umbraco.BasePages; using Umbraco.Core.IO; using umbraco.cms.businesslogic.member; +using Umbraco.Core; +using Umbraco.Web; namespace umbraco { @@ -21,13 +24,32 @@ namespace umbraco public override bool PerformDelete() { + var roleDeleted = false; + // only built-in roles can be deleted if (Member.IsUsingUmbracoRoles()) { MemberGroup.GetByName(Alias).delete(); - return true; + roleDeleted = true; } - return false; + + // Need to delete the member group from any content item that has it assigned in public access settings + var publicAccessService = UmbracoContext.Current.Application.Services.PublicAccessService; + var allPublicAccessRules = publicAccessService.GetAll(); + + // Find only rules which have the current role name (alias) assigned to them + var rulesWithDeletedRoles = allPublicAccessRules.Where(x => x.Rules.Any(r => r.RuleValue == Alias)); + + var contentService = UmbracoContext.Current.Application.Services.ContentService; + foreach (var publicAccessEntry in rulesWithDeletedRoles) + { + var contentItem = contentService.GetById(publicAccessEntry.ProtectedNodeId); + var rulesToDelete = publicAccessEntry.Rules.ToList(); + foreach (var rule in rulesToDelete) + publicAccessService.RemoveRule(contentItem, rule.RuleType, rule.RuleValue); + } + + return roleDeleted; } private string _returnUrl = ""; From 0d2df4de811fbbd5760e0ef70adf0abcf8da326c Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 21 Mar 2018 10:22:08 +0100 Subject: [PATCH 2/4] Some cleanup --- .../umbraco/create/MemberGroupTasks.cs | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs index 85f6906e36..14fd55ee98 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs @@ -1,24 +1,17 @@ -using System; -using System.Data; using System.Linq; using System.Web.Security; -using Umbraco.Web.UI; using umbraco.BusinessLogic; -using umbraco.DataLayer; -using umbraco.BasePages; -using Umbraco.Core.IO; using umbraco.cms.businesslogic.member; -using Umbraco.Core; -using Umbraco.Web; +using Umbraco.Web.UI; -namespace umbraco +namespace Umbraco.Web.umbraco.presentation.umbraco.create { public class MemberGroupTasks : LegacyDialogTask { public override bool PerformSave() { Roles.CreateRole(Alias); - _returnUrl = string.Format("members/EditMemberGroup.aspx?id={0}", System.Web.HttpContext.Current.Server.UrlEncode(Alias)); + _returnUrl = $"members/EditMemberGroup.aspx?id={System.Web.HttpContext.Current.Server.UrlEncode(Alias)}"; return true; } @@ -29,7 +22,7 @@ namespace umbraco // only built-in roles can be deleted if (Member.IsUsingUmbracoRoles()) { - MemberGroup.GetByName(Alias).delete(); + Roles.DeleteRole(Alias); roleDeleted = true; } @@ -54,14 +47,8 @@ namespace umbraco private string _returnUrl = ""; - public override string ReturnUrl - { - get { return _returnUrl; } - } + public override string ReturnUrl => _returnUrl; - public override string AssignedApp - { - get { return DefaultApps.member.ToString(); } - } + public override string AssignedApp => DefaultApps.member.ToString(); } } From 97d7e3db8424a650386486dce08764da2fe45cba Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 21 Mar 2018 10:46:42 +0100 Subject: [PATCH 3/4] Forgot add the new namespace --- src/Umbraco.Tests/UI/LegacyDialogTests.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Umbraco.Tests/UI/LegacyDialogTests.cs b/src/Umbraco.Tests/UI/LegacyDialogTests.cs index e7749cf80b..304f8256b8 100644 --- a/src/Umbraco.Tests/UI/LegacyDialogTests.cs +++ b/src/Umbraco.Tests/UI/LegacyDialogTests.cs @@ -1,13 +1,11 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using NUnit.Framework; using Umbraco.Core; using Umbraco.Web.UI; using umbraco; using umbraco.BusinessLogic; using umbraco.interfaces; +using Umbraco.Web.umbraco.presentation.umbraco.create; namespace Umbraco.Tests.UI { From 3c4f052a278442eb18a7e75000b6bd4976725fb9 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 21 Mar 2018 13:45:44 +0100 Subject: [PATCH 4/4] Moved some code around based on feedback --- .../umbraco.presentation/umbraco/create/MemberGroupTasks.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs index 14fd55ee98..905aa42ca3 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/create/MemberGroupTasks.cs @@ -22,8 +22,7 @@ namespace Umbraco.Web.umbraco.presentation.umbraco.create // only built-in roles can be deleted if (Member.IsUsingUmbracoRoles()) { - Roles.DeleteRole(Alias); - roleDeleted = true; + roleDeleted = Roles.DeleteRole(Alias); } // Need to delete the member group from any content item that has it assigned in public access settings