diff --git a/src/Umbraco.Core/Configuration/GlobalSettings.cs b/src/Umbraco.Core/Configuration/GlobalSettings.cs
index 028d745a0e..8911f6c130 100644
--- a/src/Umbraco.Core/Configuration/GlobalSettings.cs
+++ b/src/Umbraco.Core/Configuration/GlobalSettings.cs
@@ -5,11 +5,13 @@ using System.Linq;
using System.Web;
using System.Web.Configuration;
using System.Web.Routing;
+using System.Web.Security;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
+using Umbraco.Core.Security;
namespace Umbraco.Core.Configuration
{
@@ -265,7 +267,7 @@ namespace Umbraco.Core.Configuration
{
get
{
- return ConfiguredMembershipProvidersLegacyEncoding(Constants.Conventions.Member.UmbracoMemberProviderName);
+ return IsConfiguredMembershipProviderUsingLegacyEncoding(Constants.Conventions.Member.UmbracoMemberProviderName);
}
set
{
@@ -281,7 +283,7 @@ namespace Umbraco.Core.Configuration
{
get
{
- return ConfiguredMembershipProvidersLegacyEncoding(Constants.Conventions.User.UmbracoUsersProviderName);
+ return IsConfiguredMembershipProviderUsingLegacyEncoding(Constants.Conventions.Member.UmbracoMemberProviderName);
}
set
{
@@ -366,22 +368,17 @@ namespace Umbraco.Core.Configuration
webConfigXml.Save(webConfigFilename, SaveOptions.DisableFormatting);
}
-
- private static bool ConfiguredMembershipProvidersLegacyEncoding(string providerName)
+
+ private static bool IsConfiguredMembershipProviderUsingLegacyEncoding(string providerName)
{
- var webConfigFilename = GetFullWebConfigFileName();
- var webConfigXml = XDocument.Load(webConfigFilename, LoadOptions.PreserveWhitespace);
+ //check if this can even be configured.
+ var membershipProvider = Membership.Providers[providerName] as MembershipProviderBase;
+ if (membershipProvider == null)
+ {
+ return false;
+ }
- var membershipConfigs = webConfigXml.XPathSelectElements("configuration/system.web/membership/providers/add").ToList();
-
- var provider = membershipConfigs.SingleOrDefault(c => c.Attribute("name") != null && c.Attribute("name").Value == providerName);
-
- var useLegacyEncodingAttribute = provider.Attribute("useLegacyEncoding");
-
- bool useLegacyEncoding;
- bool.TryParse(useLegacyEncodingAttribute.Value, out useLegacyEncoding);
-
- return useLegacyEncoding;
+ return membershipProvider.UseLegacyEncoding;
}
///
diff --git a/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs
index 1dc88b4b51..4ad0836a12 100644
--- a/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs
+++ b/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs
@@ -40,6 +40,8 @@ namespace Umbraco.Web.Security.Providers
}
private string _defaultMemberTypeAlias = "Member";
+ private volatile bool _hasDefaultMember = false;
+ private static readonly object Locker = new object();
public override string ProviderName
{
@@ -77,20 +79,35 @@ namespace Umbraco.Web.Security.Providers
if (config["defaultMemberTypeAlias"] != null)
{
_defaultMemberTypeAlias = config["defaultMemberTypeAlias"];
- }
- else
- {
- _defaultMemberTypeAlias = MemberService.GetDefaultMemberType();
if (_defaultMemberTypeAlias.IsNullOrWhiteSpace())
{
- throw new ProviderException("No default MemberType alias is specified in the web.config string. Please add a 'defaultMemberTypeAlias' to the add element in the provider declaration in web.config");
+ throw new ProviderException("No default user type alias is specified in the web.config string. Please add a 'defaultUserTypeAlias' to the add element in the provider declaration in web.config");
}
+ _hasDefaultMember = true;
}
}
public override string DefaultMemberTypeAlias
{
- get { return _defaultMemberTypeAlias; }
+ get
+ {
+ if (_hasDefaultMember == false)
+ {
+ lock (Locker)
+ {
+ if (_hasDefaultMember == false)
+ {
+ _defaultMemberTypeAlias = MemberService.GetDefaultMemberType();
+ if (_defaultMemberTypeAlias.IsNullOrWhiteSpace())
+ {
+ throw new ProviderException("No default user type alias is specified in the web.config string. Please add a 'defaultUserTypeAlias' to the add element in the provider declaration in web.config");
+ }
+ _hasDefaultMember = true;
+ }
+ }
+ }
+ return _defaultMemberTypeAlias;
+ }
}
}
}
diff --git a/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs
index ba2c127877..d1ec03c97d 100644
--- a/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs
+++ b/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs
@@ -15,20 +15,22 @@ namespace Umbraco.Web.Security.Providers
///
public class UsersMembershipProvider : UmbracoMembershipProvider, IUsersMembershipProvider
{
-
+
public UsersMembershipProvider()
: this(ApplicationContext.Current.Services.UserService)
- {
+ {
}
public UsersMembershipProvider(IMembershipMemberService memberService)
: base(memberService)
- {
+ {
}
private string _defaultMemberTypeAlias = "writer";
+ private volatile bool _hasDefaultMember = false;
+ private static readonly object Locker = new object();
- public override string ProviderName
+ public override string ProviderName
{
get { return Constants.Conventions.User.UmbracoUsersProviderName; }
}
@@ -44,7 +46,7 @@ namespace Umbraco.Web.Security.Providers
protected override MembershipUser ConvertToMembershipUser(IUser entity)
{
//the provider user key is always the int id
- return entity.AsConcreteMembershipUser(Name);
+ return entity.AsConcreteMembershipUser(Name);
}
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
@@ -55,20 +57,35 @@ namespace Umbraco.Web.Security.Providers
if (config["defaultUserTypeAlias"] != null)
{
_defaultMemberTypeAlias = config["defaultUserTypeAlias"];
- }
- else
- {
- var defaultFromService = MemberService.GetDefaultMemberType();
- if (defaultFromService.IsNullOrWhiteSpace())
+ if (_defaultMemberTypeAlias.IsNullOrWhiteSpace())
{
throw new ProviderException("No default user type alias is specified in the web.config string. Please add a 'defaultUserTypeAlias' to the add element in the provider declaration in web.config");
}
- }
- }
+ _hasDefaultMember = true;
+ }
+ }
public override string DefaultMemberTypeAlias
{
- get { return _defaultMemberTypeAlias; }
+ get
+ {
+ if (_hasDefaultMember == false)
+ {
+ lock (Locker)
+ {
+ if (_hasDefaultMember == false)
+ {
+ _defaultMemberTypeAlias = MemberService.GetDefaultMemberType();
+ if (_defaultMemberTypeAlias.IsNullOrWhiteSpace())
+ {
+ throw new ProviderException("No default user type alias is specified in the web.config string. Please add a 'defaultUserTypeAlias' to the add element in the provider declaration in web.config");
+ }
+ _hasDefaultMember = true;
+ }
+ }
+ }
+ return _defaultMemberTypeAlias;
+ }
}
}
}
\ No newline at end of file
diff --git a/src/umbraco.providers/members/UmbracoMembershipProvider.cs b/src/umbraco.providers/members/UmbracoMembershipProvider.cs
index dc094fd15b..cd6a80d340 100644
--- a/src/umbraco.providers/members/UmbracoMembershipProvider.cs
+++ b/src/umbraco.providers/members/UmbracoMembershipProvider.cs
@@ -48,7 +48,9 @@ namespace umbraco.providers.members
#region Fields
private string _defaultMemberTypeAlias = "Member";
- private string _providerName = Member.UmbracoMemberProviderName;
+ private string _providerName = Member.UmbracoMemberProviderName;
+ private volatile bool _hasDefaultMember = false;
+ private static readonly object Locker = new object();
#endregion
@@ -118,11 +120,14 @@ namespace umbraco.providers.members
// test for membertype (if not specified, choose the first member type available)
if (config["defaultMemberTypeAlias"] != null)
+ {
_defaultMemberTypeAlias = config["defaultMemberTypeAlias"];
- else if (MemberType.GetAll.Length == 1)
- _defaultMemberTypeAlias = MemberType.GetAll[0].Alias;
- else
- throw new ProviderException("No default MemberType alias is specified in the web.config string. Please add a 'defaultMemberTypeAlias' to the add element in the provider declaration in web.config");
+ if (_defaultMemberTypeAlias.IsNullOrWhiteSpace())
+ {
+ throw new ProviderException("No default user type alias is specified in the web.config string. Please add a 'defaultUserTypeAlias' to the add element in the provider declaration in web.config");
+ }
+ _hasDefaultMember = true;
+ }
// test for approve status
if (config["umbracoApprovePropertyTypeAlias"] != null)
@@ -233,7 +238,26 @@ namespace umbraco.providers.members
public override string DefaultMemberTypeAlias
{
- get { return _defaultMemberTypeAlias; }
+ get
+ {
+ if (_hasDefaultMember == false)
+ {
+ lock (Locker)
+ {
+ if (_hasDefaultMember == false)
+ {
+ var types = MemberType.GetAll;
+ if (types.Length == 1)
+ _defaultMemberTypeAlias = types[0].Alias;
+ else
+ throw new ProviderException("No default MemberType alias is specified in the web.config string. Please add a 'defaultMemberTypeAlias' to the add element in the provider declaration in web.config");
+
+ _hasDefaultMember = true;
+ }
+ }
+ }
+ return _defaultMemberTypeAlias;
+ }
}
///
diff --git a/src/umbraco.providers/members/UmbracoRoleProvider.cs b/src/umbraco.providers/members/UmbracoRoleProvider.cs
index bfb8863ed0..f87f960a79 100644
--- a/src/umbraco.providers/members/UmbracoRoleProvider.cs
+++ b/src/umbraco.providers/members/UmbracoRoleProvider.cs
@@ -14,13 +14,13 @@ using umbraco.cms.businesslogic.member;
using System.Collections;
#endregion
-namespace umbraco.providers.members
+namespace umbraco.providers.members
{
///
/// A role provider for members
///
[Obsolete("This has been superceded by Umbraco.Web.Security.Providers.MembersRoleProvider")]
- public class UmbracoRoleProvider : RoleProvider
+ public class UmbracoRoleProvider : RoleProvider
{
#region
@@ -33,11 +33,14 @@ namespace umbraco.providers.members
///
///
/// The name of the application to store and retrieve role information for.
- public override string ApplicationName {
- get {
+ public override string ApplicationName
+ {
+ get
+ {
return _applicationName;
}
- set {
+ set
+ {
if (string.IsNullOrEmpty(value))
throw new ProviderException("ApplicationName cannot be empty.");
@@ -60,13 +63,15 @@ namespace umbraco.providers.members
/// on a provider
/// after the provider has already been initialized.
/// The name of the provider has a length of zero.
- public override void Initialize(string name, NameValueCollection config) {
+ public override void Initialize(string name, NameValueCollection config)
+ {
// Initialize values from web.config
if (config == null) throw new ArgumentNullException("config");
if (name == null || name.Length == 0) name = "UmbracoMemberRoleProvider";
- if (String.IsNullOrEmpty(config["description"])) {
+ if (String.IsNullOrEmpty(config["description"]))
+ {
config.Remove("description");
config.Add("description", "Umbraco Member Role provider");
}
@@ -86,15 +91,20 @@ namespace umbraco.providers.members
///
/// A string array of user names to be added to the specified roles.
/// A string array of the role names to add the specified user names to.
- public override void AddUsersToRoles(string[] usernames, string[] roleNames) {
+ public override void AddUsersToRoles(string[] usernames, string[] roleNames)
+ {
ArrayList roles = new ArrayList();
foreach (string role in roleNames)
- try {
+ try
+ {
roles.Add(MemberGroup.GetByName(role).Id);
- } catch {
+ }
+ catch
+ {
throw new ProviderException(String.Format("No role with name '{0}' exists", role));
}
- foreach (string username in usernames) {
+ foreach (string username in usernames)
+ {
Member m = Member.GetMemberFromLoginName(username);
foreach (int roleId in roles)
m.AddGroup(roleId);
@@ -105,7 +115,8 @@ namespace umbraco.providers.members
/// Adds a new role to the data source for the configured applicationName.
///
/// The name of the role to create.
- public override void CreateRole(string roleName) {
+ public override void CreateRole(string roleName)
+ {
MemberGroup.MakeNew(roleName, User.GetUser(0));
}
@@ -117,13 +128,15 @@ namespace umbraco.providers.members
///
/// true if the role was successfully deleted; otherwise, false.
///
- public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) {
+ public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
+ {
MemberGroup group = MemberGroup.GetByName(roleName);
if (group == null)
throw new ProviderException(String.Format("No role with name '{0}' exists", roleName));
else if (throwOnPopulatedRole && group.GetMembersAsIds().Length > 0)
throw new ProviderException(String.Format("Can't delete role '{0}', there are members assigned to the role", roleName));
- else {
+ else
+ {
foreach (Member m in group.GetMembers())
m.RemoveGroup(group.Id);
group.delete();
@@ -139,12 +152,14 @@ namespace umbraco.providers.members
///
/// A string array containing the names of all the users where the user name matches usernameToMatch and the user is a member of the specified role.
///
- public override string[] FindUsersInRole(string roleName, string usernameToMatch) {
+ public override string[] FindUsersInRole(string roleName, string usernameToMatch)
+ {
ArrayList members = new ArrayList();
MemberGroup group = MemberGroup.GetByName(roleName);
if (group == null)
throw new ProviderException(String.Format("No role with name '{0}' exists", roleName));
- else {
+ else
+ {
foreach (Member m in group.GetMembers(usernameToMatch))
members.Add(m.LoginName);
return (string[])members.ToArray(typeof(string));
@@ -157,7 +172,8 @@ namespace umbraco.providers.members
///
/// A string array containing the names of all the roles stored in the data source for the configured applicationName.
///
- public override string[] GetAllRoles() {
+ public override string[] GetAllRoles()
+ {
ArrayList roles = new ArrayList();
foreach (MemberGroup mg in MemberGroup.GetAll)
roles.Add(mg.Text);
@@ -171,15 +187,18 @@ namespace umbraco.providers.members
///
/// A string array containing the names of all the roles that the specified user is in for the configured applicationName.
///
- public override string[] GetRolesForUser(string username) {
+ public override string[] GetRolesForUser(string username)
+ {
ArrayList roles = new ArrayList();
Member m = Member.GetMemberFromLoginName(username);
- if (m != null) {
+ if (m != null)
+ {
IDictionaryEnumerator ide = m.Groups.GetEnumerator();
while (ide.MoveNext())
roles.Add(((MemberGroup)ide.Value).Text);
return (string[])roles.ToArray(typeof(string));
- } else
+ }
+ else
throw new ProviderException(String.Format("No member with username '{0}' exists", username));
}
@@ -190,12 +209,14 @@ namespace umbraco.providers.members
///
/// A string array containing the names of all the users who are members of the specified role for the configured applicationName.
///
- public override string[] GetUsersInRole(string roleName) {
+ public override string[] GetUsersInRole(string roleName)
+ {
ArrayList members = new ArrayList();
MemberGroup group = MemberGroup.GetByName(roleName);
if (group == null)
throw new ProviderException(String.Format("No role with name '{0}' exists", roleName));
- else {
+ else
+ {
foreach (Member m in group.GetMembers())
members.Add(m.LoginName);
return (string[])members.ToArray(typeof(string));
@@ -210,11 +231,13 @@ namespace umbraco.providers.members
///
/// true if the specified user is in the specified role for the configured applicationName; otherwise, false.
///
- public override bool IsUserInRole(string username, string roleName) {
+ public override bool IsUserInRole(string username, string roleName)
+ {
Member m = Member.GetMemberFromLoginName(username);
if (m == null)
throw new ProviderException(String.Format("No user with name '{0}' exists", username));
- else {
+ else
+ {
MemberGroup mg = MemberGroup.GetByName(roleName);
if (mg == null)
throw new ProviderException(String.Format("No Membergroup with name '{0}' exists", roleName));
@@ -228,15 +251,20 @@ namespace umbraco.providers.members
///
/// A string array of user names to be removed from the specified roles.
/// A string array of role names to remove the specified user names from.
- public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) {
+ public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
+ {
ArrayList roles = new ArrayList();
foreach (string role in roleNames)
- try {
+ try
+ {
roles.Add(MemberGroup.GetByName(role).Id);
- } catch {
+ }
+ catch
+ {
throw new ProviderException(String.Format("No role with name '{0}' exists", role));
}
- foreach (string username in usernames) {
+ foreach (string username in usernames)
+ {
Member m = Member.GetMemberFromLoginName(username);
foreach (int roleId in roles)
m.RemoveGroup(roleId);
@@ -250,9 +278,10 @@ namespace umbraco.providers.members
///
/// true if the role name already exists in the data source for the configured applicationName; otherwise, false.
///
- public override bool RoleExists(string roleName) {
- MemberGroup mg = MemberGroup.GetByName(roleName);
- return mg != null;
+ public override bool RoleExists(string roleName)
+ {
+ MemberGroup mg = MemberGroup.GetByName(roleName);
+ return mg != null;
}
#endregion