diff --git a/src/Umbraco.Core/Constants-Security.cs b/src/Umbraco.Core/Constants-Security.cs
index 0ada375163..9aa7a907dd 100644
--- a/src/Umbraco.Core/Constants-Security.cs
+++ b/src/Umbraco.Core/Constants-Security.cs
@@ -9,6 +9,7 @@ namespace Umbraco.Core
{
public const string AdminGroupAlias = "admin";
+ public const string SensitiveDataGroupAlias = "sensitiveData";
public const string TranslatorGroupAlias = "translator";
public const string BackOfficeAuthenticationType = "UmbracoBackOffice";
@@ -36,4 +37,4 @@ namespace Umbraco.Core
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Umbraco.Core/Models/UserExtensions.cs b/src/Umbraco.Core/Models/UserExtensions.cs
index a65b307f24..5db36d16ed 100644
--- a/src/Umbraco.Core/Models/UserExtensions.cs
+++ b/src/Umbraco.Core/Models/UserExtensions.cs
@@ -261,6 +261,16 @@ namespace Umbraco.Core.Models
return user.Groups != null && user.Groups.Any(x => x.Alias == Constants.Security.AdminGroupAlias);
}
+ ///
+ /// Determines whether this user has access to view sensitive data
+ ///
+ ///
+ public static bool HasAccessToSensitiveData(this IUser user)
+ {
+ if (user == null) throw new ArgumentNullException("user");
+ return user.Groups != null && user.Groups.Any(x => x.Alias == Constants.Security.SensitiveDataGroupAlias);
+ }
+
// calc. start nodes, combining groups' and user's, and excluding what's in the bin
public static int[] CalculateContentStartNodeIds(this IUser user, IEntityService entityService)
{
@@ -413,4 +423,4 @@ namespace Umbraco.Core.Models
return lsn.ToArray();
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs
index 45107d3f21..be78638a9e 100644
--- a/src/Umbraco.Web/Editors/ContentController.cs
+++ b/src/Umbraco.Web/Editors/ContentController.cs
@@ -219,7 +219,7 @@ namespace Umbraco.Web.Editors
Path = "-1," + Constants.System.RecycleBinContent
};
- TabsAndPropertiesResolver.AddListView(display, "content", Services.DataTypeService, Services.TextService);
+ TabsAndPropertiesResolver.AddListView(display, "content", Services.DataTypeService, Services.TextService);
return display;
}
diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs
index 0b2044dbe5..e22c83cbeb 100644
--- a/src/Umbraco.Web/Editors/MediaController.cs
+++ b/src/Umbraco.Web/Editors/MediaController.cs
@@ -115,7 +115,7 @@ namespace Umbraco.Web.Editors
Path = "-1," + Constants.System.RecycleBinMedia
};
- TabsAndPropertiesResolver.AddListView(display, "media", Services.DataTypeService, Services.TextService);
+ TabsAndPropertiesResolver.AddListView(display, "media", Services.DataTypeService, Services.TextService);
return display;
}
diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs
index 841b2df3d5..2440ad0691 100644
--- a/src/Umbraco.Web/Editors/MemberController.cs
+++ b/src/Umbraco.Web/Editors/MemberController.cs
@@ -154,7 +154,7 @@ namespace Umbraco.Web.Editors
ParentId = -1
};
- TabsAndPropertiesResolver.AddListView(display, "member", Services.DataTypeService, Services.TextService);
+ TabsAndPropertiesResolver.AddListView(display, "member", Services.DataTypeService, Services.TextService);
return display;
}
diff --git a/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs
index 9d5975b564..6df9c40f6a 100644
--- a/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs
@@ -56,7 +56,7 @@ namespace Umbraco.Web.Models.Mapping
expression.MapFrom(content => content.ContentType.AllowedTemplates
.Where(t => t.Alias.IsNullOrWhiteSpace() == false && t.Name.IsNullOrWhiteSpace() == false)
.ToDictionary(t => t.Alias, t => t.Name)))
- .ForMember(display => display.Tabs, expression => expression.ResolveUsing(new TabsAndPropertiesResolver(applicationContext.Services.TextService)))
+ .ForMember(display => display.Tabs, expression => expression.ResolveUsing(new TabsAndPropertiesResolver(applicationContext.Services.TextService)))
.ForMember(display => display.AllowedActions, expression => expression.ResolveUsing(
new ActionButtonsResolver(new Lazy(() => applicationContext.Services.UserService), new Lazy(() => applicationContext.Services.ContentService))))
.AfterMap((content, display) => AfterMap(content, display, applicationContext.Services.DataTypeService, applicationContext.Services.TextService,
@@ -100,6 +100,8 @@ namespace Umbraco.Web.Models.Mapping
private static void AfterMap(IContent content, ContentItemDisplay display, IDataTypeService dataTypeService,
ILocalizedTextService localizedText, IContentTypeService contentTypeService)
{
+ //TODO: All of this logic should be moved to the TabsAndPropertiesResolver and not in AfterMap
+
// map the IsChildOfListView (this is actually if it is a descendant of a list view!)
//TODO: STOP using these extension methods, they are not testable and require singletons to be setup
var parent = content.Parent();
@@ -113,7 +115,7 @@ namespace Umbraco.Web.Models.Mapping
if (content.ContentType.IsContainer)
{
- TabsAndPropertiesResolver.AddListView(display, "content", dataTypeService, localizedText);
+ TabsAndPropertiesResolver.AddListView(display, "content", dataTypeService, localizedText);
}
}
diff --git a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs
index 9a0480f771..7069bea2e2 100644
--- a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs
@@ -41,7 +41,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(display => display.Alias, expression => expression.Ignore())
.ForMember(display => display.IsContainer, expression => expression.Ignore())
.ForMember(display => display.HasPublishedVersion, expression => expression.Ignore())
- .ForMember(display => display.Tabs, expression => expression.ResolveUsing(new TabsAndPropertiesResolver(applicationContext.Services.TextService)))
+ .ForMember(display => display.Tabs, expression => expression.ResolveUsing(new TabsAndPropertiesResolver(applicationContext.Services.TextService)))
.ForMember(display => display.ContentType, expression => expression.ResolveUsing())
.ForMember(display => display.MediaLink, expression => expression.ResolveUsing(
content => string.Join(",", content.GetUrls(UmbracoConfig.For.UmbracoSettings().Content, applicationContext.ProfilingLogger.Logger))))
@@ -70,6 +70,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(dto => dto.HasPublishedVersion, expression => expression.Ignore());
}
+ //TODO: All of this logic should be moved to the TabsAndPropertiesResolver and not in AfterMap
private static void AfterMap(IMedia media, MediaItemDisplay display, IDataTypeService dataTypeService, ILocalizedTextService localizedText, IContentTypeService contentTypeService, ILogger logger)
{
// Adapted from ContentModelMapper
@@ -80,7 +81,7 @@ namespace Umbraco.Web.Models.Mapping
if (media.ContentType.IsContainer)
{
- TabsAndPropertiesResolver.AddListView(display, "media", dataTypeService, localizedText);
+ TabsAndPropertiesResolver.AddListView(display, "media", dataTypeService, localizedText);
}
}
diff --git a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
index 7f5bc731b1..147c074747 100644
--- a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
@@ -217,7 +217,7 @@ namespace Umbraco.Web.Models.Mapping
///
/// This also ensures that the IsSensitive property display value is set based on the configured IMemberType property type
///
- internal class MemberTabsAndPropertiesResolver : TabsAndPropertiesResolver, IValueResolver
+ internal class MemberTabsAndPropertiesResolver : TabsAndPropertiesResolver
{
private readonly ILocalizedTextService _localizedTextService;
private readonly IMemberService _memberService;
@@ -238,45 +238,23 @@ namespace Umbraco.Web.Models.Mapping
_memberService = memberService;
_userService = userService;
}
-
+
///
- /// Explicitly implement to override behavior
- ///
- ///
- ///
- ///
- /// This is required to get access to the object which allows us access to the mapping options
- ///
- ResolutionResult IValueResolver.Resolve(ResolutionResult source)
- {
- //call the base class logic
- var result = base.Resolve(source);
-
- var member = (IMember)source.Value;
- //now we can customize the result and use the ResolutionResult options to get the UmbracoContext
- var tabs = (List>) result.Value;
-
- //now we can customize the result with the current context, we can get the UmbracoContext from the options
- CustomizeProperties(source.Context.GetUmbracoContext(), member, tabs);
-
- return result;
- }
-
- ///
- /// Overridden to deal with custom member properties
+ /// Overridden to deal with custom member properties and permissions
///
+ ///
///
///
- protected override List> ResolveCore(IContentBase content)
+ protected override List> ResolveCore(UmbracoContext umbracoContext, IMember content)
{
var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider();
-
+
IgnoreProperties = content.PropertyTypes
.Where(x => x.HasIdentity == false)
.Select(x => x.Alias)
.ToArray();
- var result = base.ResolveCore(content);
+ var result = base.ResolveCore(umbracoContext, content);
if (provider.IsUmbracoMembershipProvider() == false)
{
@@ -303,6 +281,39 @@ namespace Umbraco.Web.Models.Mapping
}
}
+ if (umbracoContext != null && umbracoContext.Security.CurrentUser != null
+ && umbracoContext.Security.CurrentUser.AllowedSections.Any(x => x.Equals(Constants.Applications.Settings)))
+ {
+ var memberTypeLink = string.Format("#/member/memberTypes/edit/{0}", content.ContentTypeId);
+
+ //Replace the doctype property
+ var docTypeProperty = result.SelectMany(x => x.Properties)
+ .First(x => x.Alias == string.Format("{0}doctype", Constants.PropertyEditors.InternalGenericPropertiesPrefix));
+ docTypeProperty.Value = new List