diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_7_14_0/UpdateMemberGroupPickerData.cs b/src/Umbraco.Core/Migrations/Upgrade/V_7_14_0/UpdateMemberGroupPickerData.cs
new file mode 100644
index 0000000000..8ef293f4bf
--- /dev/null
+++ b/src/Umbraco.Core/Migrations/Upgrade/V_7_14_0/UpdateMemberGroupPickerData.cs
@@ -0,0 +1,27 @@
+namespace Umbraco.Core.Migrations.Upgrade.V_7_14_0
+{
+ public class UpdateMemberGroupPickerData : MigrationBase
+ {
+ ///
+ /// Migrates member group picker properties from NVarchar to NText. See https://github.com/umbraco/Umbraco-CMS/issues/3268.
+ ///
+ public UpdateMemberGroupPickerData(IMigrationContext context)
+ : base(context)
+ {
+ }
+
+ public override void Migrate()
+ {
+ Database.Execute($@"UPDATE cmsPropertyData SET dataNtext = dataNvarchar, dataNvarchar = NULL
+ WHERE dataNtext IS NULL AND id IN (
+ SELECT id FROM cmsPropertyData WHERE propertyTypeId in (
+ SELECT id from cmsPropertyType where dataTypeID IN (
+ SELECT nodeId FROM cmsDataType WHERE propertyEditorAlias = '{Constants.PropertyEditors.Aliases.MemberGroupPicker}'
+ )
+ )
+ )");
+
+ Database.Execute($"UPDATE cmsDataType SET dbType = 'Ntext' WHERE propertyEditorAlias = '{Constants.PropertyEditors.Aliases.MemberGroupPicker}'");
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourteenZero/UpdateMemberGroupPickerData.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourteenZero/UpdateMemberGroupPickerData.cs
new file mode 100644
index 0000000000..2dbc69e58a
--- /dev/null
+++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenFourteenZero/UpdateMemberGroupPickerData.cs
@@ -0,0 +1,36 @@
+using Umbraco.Core.Logging;
+using Umbraco.Core.Persistence.SqlSyntax;
+
+namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenFourteenZero
+{
+ ///
+ /// Migrates member group picker properties from NVarchar to NText. See https://github.com/umbraco/Umbraco-CMS/issues/3268.
+ ///
+ [Migration("7.14.0", 1, Constants.System.UmbracoMigrationName)]
+ public class UpdateMemberGroupPickerData : MigrationBase
+ {
+ public UpdateMemberGroupPickerData(ISqlSyntaxProvider sqlSyntax, ILogger logger) : base(sqlSyntax, logger)
+ {
+ }
+
+ public override void Up()
+ {
+ // move the data for all member group properties from the NVarchar to the NText column and clear the NVarchar column
+ Execute.Sql(@"UPDATE cmsPropertyData SET dataNtext = dataNvarchar, dataNvarchar = NULL
+ WHERE dataNtext IS NULL AND id IN (
+ SELECT id FROM cmsPropertyData WHERE propertyTypeId in (
+ SELECT id from cmsPropertyType where dataTypeID IN (
+ SELECT nodeId FROM cmsDataType WHERE propertyEditorAlias = 'Umbraco.MemberGroupPicker'
+ )
+ )
+ )");
+
+ // ensure that all exising member group properties are defined as NText
+ Execute.Sql("UPDATE cmsDataType SET dbType = 'Ntext' WHERE propertyEditorAlias = 'Umbraco.MemberGroupPicker'");
+ }
+
+ public override void Down()
+ {
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index 609befd233..43649709b3 100755
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -368,6 +368,7 @@
+
diff --git a/src/Umbraco.Web/PropertyEditors/MemberGroupPickerPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/MemberGroupPickerPropertyEditor.cs
index 58e71250eb..b917145dbd 100644
--- a/src/Umbraco.Web/PropertyEditors/MemberGroupPickerPropertyEditor.cs
+++ b/src/Umbraco.Web/PropertyEditors/MemberGroupPickerPropertyEditor.cs
@@ -4,7 +4,7 @@ using Umbraco.Core.PropertyEditors;
namespace Umbraco.Web.PropertyEditors
{
- [DataEditor(Constants.PropertyEditors.Aliases.MemberGroupPicker, "Member Group Picker", "membergrouppicker", Group="People", Icon="icon-users")]
+ [DataEditor(Constants.PropertyEditors.Aliases.MemberGroupPicker, "Member Group Picker", "membergrouppicker", ValueType = ValueTypes.Text, Group = "People", Icon = "icon-users")]
public class MemberGroupPickerPropertyEditor : DataEditor
{
public MemberGroupPickerPropertyEditor(ILogger logger)
diff --git a/src/Umbraco.Web/Routing/PublishedRouter.cs b/src/Umbraco.Web/Routing/PublishedRouter.cs
index 3d3b623838..b6c89b29ad 100644
--- a/src/Umbraco.Web/Routing/PublishedRouter.cs
+++ b/src/Umbraco.Web/Routing/PublishedRouter.cs
@@ -646,7 +646,30 @@ namespace Umbraco.Web.Routing
}
else
{
- _logger.Debug("EnsurePublishedContentAccess: Current member has access");
+ // grab the current member
+ var member = membershipHelper.GetCurrentMember();
+ // if the member has the "approved" and/or "locked out" properties, make sure they're correctly set before allowing access
+ var memberIsActive = true;
+ if (member != null)
+ {
+ if (member.HasProperty(Constants.Conventions.Member.IsApproved) == false)
+ memberIsActive = member.Value(Constants.Conventions.Member.IsApproved);
+
+ if (member.HasProperty(Constants.Conventions.Member.IsLockedOut) == false)
+ memberIsActive = member.Value(Constants.Conventions.Member.IsLockedOut) == false;
+ }
+
+ if (memberIsActive == false)
+ {
+ _logger.Debug("Current member is either unapproved or locked out, redirect to error page");
+ var errorPageId = publicAccessAttempt.Result.NoAccessNodeId;
+ if (errorPageId != request.PublishedContent.Id)
+ request.PublishedContent = request.UmbracoContext.PublishedSnapshot.Content.GetById(errorPageId);
+ }
+ else
+ {
+ _logger.Debug("Current member has access");
+ }
}
}
else
diff --git a/src/Umbraco.Web/Trees/ContentTreeController.cs b/src/Umbraco.Web/Trees/ContentTreeController.cs
index 3da8540fe3..d8d464834d 100644
--- a/src/Umbraco.Web/Trees/ContentTreeController.cs
+++ b/src/Umbraco.Web/Trees/ContentTreeController.cs
@@ -237,14 +237,16 @@ namespace Umbraco.Web.Trees
AddActionNode(item, menu, opensDialog: true);
//fixme - conver this editor to angular
AddActionNode(item, menu, true, convert: true, opensDialog: true);
-
- menu.Items.Add(new MenuItem("notify", Services.TextService)
+ if (EmailSender.CanSendRequiredEmail)
{
- Icon = "megaphone",
- SeperatorBefore = true,
- OpensDialog = true
- });
-
+ menu.Items.Add(new MenuItem("notify", Services.TextService)
+ {
+ Icon = "megaphone",
+ SeperatorBefore = true,
+ OpensDialog = true
+ });
+ }
+
menu.Items.Add(new RefreshNode(Services.TextService, true));
return menu;