Simplifies and streamlines the models used between IMember and IUser along with the services used for both of these entities.

Updates the model used to store and retreive permissions, instead of a single string it is an Enumerable<string> which gives us some flexibility in the future and since this was not public (yet) it's the perfect time to do this.
Removes the base Profile classes from User since these are not required, since we cannot share base classes between Member and User, these weren't necessary.
This commit is contained in:
Shannon
2014-01-06 11:04:26 +11:00
parent ba5f2bc69d
commit 85c85cd1eb
28 changed files with 780 additions and 622 deletions

View File

@@ -1,106 +1,10 @@
using System;
using Umbraco.Core.Models.Membership;
namespace Umbraco.Core.Models
{
public interface IMember : IContentBase
public interface IMember : IContentBase, IMembershipUser
{
/// <summary>
/// Gets or sets the Username
/// </summary>
string Username { get; set; }
/// <summary>
/// Gets or sets the Email
/// </summary>
string Email { get; set; }
/// <summary>
/// Gets or sets the Password
/// </summary>
string Password { get; set; }
/// <summary>
/// Gets or sets the Password Question
/// </summary>
/// <remarks>
/// Alias: umbracoPasswordRetrievalQuestionPropertyTypeAlias
/// Part of the standard properties collection.
/// </remarks>
string PasswordQuestion { get; set; }
/// <summary>
/// Gets or sets the Password Answer
/// </summary>
/// <remarks>
/// Alias: umbracoPasswordRetrievalAnswerPropertyTypeAlias
/// Part of the standard properties collection.
/// </remarks>
string PasswordAnswer { get; set; }
/// <summary>
/// Gets or set the comments for the member
/// </summary>
/// <remarks>
/// Alias: umbracoCommentPropertyTypeAlias
/// Part of the standard properties collection.
/// </remarks>
string Comments { get; set; }
/// <summary>
/// Gets or sets a boolean indicating whether the Member is approved
/// </summary>
/// <remarks>
/// Alias: umbracoApprovePropertyTypeAlias
/// Part of the standard properties collection.
/// </remarks>
bool IsApproved { get; set; }
/// <summary>
/// Gets or sets a boolean indicating whether the Member is locked out
/// </summary>
/// <remarks>
/// Alias: umbracoLockPropertyTypeAlias
/// Part of the standard properties collection.
/// </remarks>
bool IsLockedOut { get; set; }
/// <summary>
/// Gets or sets the date for last login
/// </summary>
/// <remarks>
/// Alias: umbracoLastLoginPropertyTypeAlias
/// Part of the standard properties collection.
/// </remarks>
DateTime LastLoginDate { get; set; }
/// <summary>
/// Gest or sets the date for last password change
/// </summary>
/// <remarks>
/// Alias: umbracoMemberLastPasswordChange
/// Part of the standard properties collection.
/// </remarks>
DateTime LastPasswordChangeDate { get; set; }
/// <summary>
/// Gets or sets the date for when Member was locked out
/// </summary>
/// <remarks>
/// Alias: umbracoMemberLastLockout
/// Part of the standard properties collection.
/// </remarks>
DateTime LastLockoutDate { get; set; }
/// <summary>
/// Gets or sets the number of failed password attempts.
/// This is the number of times the password was entered incorrectly upon login.
/// </summary>
/// <remarks>
/// Alias: umbracoFailedPasswordAttemptsPropertyTypeAlias
/// Part of the standard properties collection.
/// </remarks>
int FailedPasswordAttempts { get; set; }
/// <summary>
/// String alias of the default ContentType
/// </summary>

View File

@@ -378,7 +378,7 @@ namespace Umbraco.Core.Models
/// membership provider.
/// </remarks>
[DataMember]
internal virtual object ProviderUserKey
public virtual object ProviderUserKey
{
get
{

View File

@@ -4,9 +4,9 @@ using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Models.Membership
{
internal interface IMembershipUser : IMembershipUserId, IAggregateRoot
{
/*new object Id { get; set; }*/
public interface IMembershipUser : IAggregateRoot
{
object ProviderUserKey { get; set; }
string Username { get; set; }
string Email { get; set; }
string Password { get; set; }
@@ -14,13 +14,23 @@ namespace Umbraco.Core.Models.Membership
string PasswordAnswer { get; set; }
string Comments { get; set; }
bool IsApproved { get; set; }
bool IsOnline { get; set; }
//bool IsOnline { get; set; }
bool IsLockedOut { get; set; }
DateTime LastLoginDate { get; set; }
DateTime LastPasswordChangeDate { get; set; }
DateTime LastLockoutDate { get; set; }
object ProfileId { get; set; }
IEnumerable<object> Groups { get; set; }
/// <summary>
/// Gets or sets the number of failed password attempts.
/// This is the number of times the password was entered incorrectly upon login.
/// </summary>
/// <remarks>
/// Alias: umbracoFailedPasswordAttemptsPropertyTypeAlias
/// Part of the standard properties collection.
/// </remarks>
int FailedPasswordAttempts { get; set; }
//object ProfileId { get; set; }
//IEnumerable<object> Groups { get; set; }
}
}

View File

@@ -1,7 +0,0 @@
namespace Umbraco.Core.Models.Membership
{
internal interface IMembershipUserId
{
object ProviderUserKey { get; set; }
}
}

View File

@@ -7,23 +7,28 @@ namespace Umbraco.Core.Models.Membership
/// Defines the interface for a <see cref="User"/>
/// </summary>
/// <remarks>Will be left internal until a proper Membership implementation is part of the roadmap</remarks>
internal interface IUser : IMembershipUser, IUserProfile
internal interface IUser : IMembershipUser, IProfile
{
new object Id { get; set; }
//string Name { get; set; }
int SessionTimeout { get; set; }
int StartContentId { get; set; }
int StartMediaId { get; set; }
string Language { get; set; }
bool DefaultToLiveEditing { get; set; }
//NOTE: I have removed this because it is obsolete in v7 and we are basically removing live editing for now
//bool DefaultToLiveEditing { get; set; }
bool NoConsole { get; set; }
IUserType UserType { get; }
string DefaultPermissions { get; set; }
}
internal interface IUserProfile : IProfile
{
/// <summary>
/// The default permission set for the user
/// </summary>
/// <remarks>
/// Currently in umbraco each permission is a single char but with an Enumerable{string} collection this allows for flexible changes to this in the future
/// </remarks>
IEnumerable<string> DefaultPermissions { get; set; }
IEnumerable<string> AllowedSections { get; }
void RemoveAllowedSection(string sectionAlias);
void AddAllowedSection(string sectionAlias);

View File

@@ -1,3 +1,4 @@
using System.Collections.Generic;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Persistence.Mappers;
@@ -6,8 +7,22 @@ namespace Umbraco.Core.Models.Membership
internal interface IUserType : IAggregateRoot
{
/// <summary>
/// The user type alias
/// </summary>
string Alias { get; set; }
/// <summary>
/// The user type name
/// </summary>
string Name { get; set; }
string Permissions { get; set; }
/// <summary>
/// The set of default permissions for the user type
/// </summary>
/// <remarks>
/// By default each permission is simply a single char but we've made this an enumerable{string} to support a more flexible permissions structure in the future.
/// </remarks>
IEnumerable<string> Permissions { get; set; }
}
}

View File

@@ -1,123 +0,0 @@
using System;
using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Models.Membership
{
/// <summary>
/// Represents a Profile which is shared between Members and Users
/// </summary>
[Serializable]
[DataContract(IsReference = true)]
internal class Profile : TracksChangesEntityBase, IProfile, IRememberBeingDirty
{
/// <summary>
/// Initializes a new instance of the <see cref="Profile"/> class.
/// </summary>
protected Profile()
{
ProviderUserKeyType = typeof(int);
}
public Profile(object id, string name)
{
ProviderUserKeyType = typeof(int);
Id = id;
Name = name;
}
private object _id;
private string _name;
private object _providerUserKey;
private Type _userTypeKey;
private static readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo<Profile, object>(x => x.Id);
private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo<Profile, string>(x => x.Name);
private static readonly PropertyInfo ProviderUserKeySelector = ExpressionHelper.GetPropertyInfo<Profile, object>(x => x.ProviderUserKey);
private static readonly PropertyInfo UserTypeKeySelector = ExpressionHelper.GetPropertyInfo<Profile, Type>(x => x.ProviderUserKeyType);
[DataMember]
public virtual object Id
{
get
{
return _id;
}
set
{
SetPropertyValueAndDetectChanges(o =>
{
_id = value;
return _id;
}, _id, IdSelector);
}
}
[DataMember]
public virtual string Name
{
get
{
return _name;
}
set
{
SetPropertyValueAndDetectChanges(o =>
{
_name = value;
return _name;
}, _name, NameSelector);
}
}
[IgnoreDataMember]
public virtual object ProviderUserKey
{
get
{
return _providerUserKey;
}
set
{
SetPropertyValueAndDetectChanges(o =>
{
_providerUserKey = value;
return _id;
}, _providerUserKey, ProviderUserKeySelector);
}
}
/// <summary>
/// Gets or sets the type of the provider user key.
/// </summary>
/// <value>
/// The type of the provider user key.
/// </value>
[IgnoreDataMember]
internal Type ProviderUserKeyType
{
get
{
return _userTypeKey;
}
private set
{
SetPropertyValueAndDetectChanges(o =>
{
_userTypeKey = value;
return _userTypeKey;
}, _userTypeKey, UserTypeKeySelector);
}
}
/// <summary>
/// Sets the type of the provider user key.
/// </summary>
/// <param name="type">The type.</param>
internal void SetProviderUserKeyType(Type type)
{
ProviderUserKeyType = type;
}
}
}

View File

@@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Persistence.Mappers;
@@ -16,15 +19,59 @@ namespace Umbraco.Core.Models.Membership
/// </remarks>
[Serializable]
[DataContract(IsReference = true)]
internal class User : UserProfile, IUser
internal class User : TracksChangesEntityBase, IUser
{
private bool _hasIdentity;
public User(IUserType userType)
{
Groups = new List<object> { userType };
_userType = userType;
//Groups = new List<object> { userType };
SessionTimeout = 60;
_sectionCollection = new ObservableCollection<string>();
_addedSections = new List<string>();
_removedSections = new List<string>();
_sectionCollection.CollectionChanged += SectionCollectionChanged;
}
private readonly IUserType _userType;
private bool _hasIdentity;
private object _id;
private string _name;
private Type _userTypeKey;
private readonly List<string> _addedSections;
private readonly List<string> _removedSections;
private readonly ObservableCollection<string> _sectionCollection;
private int _sessionTimeout;
private int _startContentId;
private int _startMediaId;
private string _username;
private string _email;
private string _password;
private object _providerUserKey;
private bool _isApproved;
private bool _isLockedOut;
private string _language;
private IEnumerable<string> _defaultPermissions;
private bool _defaultToLiveEditing;
private static readonly PropertyInfo SessionTimeoutSelector = ExpressionHelper.GetPropertyInfo<User, int>(x => x.SessionTimeout);
private static readonly PropertyInfo StartContentIdSelector = ExpressionHelper.GetPropertyInfo<User, int>(x => x.StartContentId);
private static readonly PropertyInfo StartMediaIdSelector = ExpressionHelper.GetPropertyInfo<User, int>(x => x.StartMediaId);
private static readonly PropertyInfo AllowedSectionsSelector = ExpressionHelper.GetPropertyInfo<User, IEnumerable<string>>(x => x.AllowedSections);
private static readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo<User, object>(x => x.Id);
private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo<User, string>(x => x.Name);
private static readonly PropertyInfo ProviderUserKeySelector = ExpressionHelper.GetPropertyInfo<User, object>(x => x.ProviderUserKey);
private static readonly PropertyInfo UserTypeKeySelector = ExpressionHelper.GetPropertyInfo<User, Type>(x => x.ProviderUserKeyType);
private static readonly PropertyInfo UsernameSelector = ExpressionHelper.GetPropertyInfo<User, string>(x => x.Username);
private static readonly PropertyInfo EmailSelector = ExpressionHelper.GetPropertyInfo<User, string>(x => x.Email);
private static readonly PropertyInfo PasswordSelector = ExpressionHelper.GetPropertyInfo<User, string>(x => x.Password);
private static readonly PropertyInfo IsLockedOutSelector = ExpressionHelper.GetPropertyInfo<User, bool>(x => x.IsLockedOut);
private static readonly PropertyInfo IsApprovedSelector = ExpressionHelper.GetPropertyInfo<User, bool>(x => x.IsApproved);
private static readonly PropertyInfo LanguageSelector = ExpressionHelper.GetPropertyInfo<User, string>(x => x.Language);
private static readonly PropertyInfo DefaultPermissionsSelector = ExpressionHelper.GetPropertyInfo<User, IEnumerable<string>>(x => x.DefaultPermissions);
private static readonly PropertyInfo DefaultToLiveEditingSelector = ExpressionHelper.GetPropertyInfo<User, bool>(x => x.DefaultToLiveEditing);
#region Implementation of IEntity
[IgnoreDataMember]
@@ -35,11 +82,11 @@ namespace Umbraco.Core.Models.Membership
{
get
{
return int.Parse(base.Id.ToString());
return int.Parse(Id.ToString());
}
set
{
base.Id = value;
Id = value;
_hasIdentity = true;
}
}
@@ -50,64 +97,399 @@ namespace Umbraco.Core.Models.Membership
#region Implementation of IMembershipUser
[DataMember]
public string Username { get; set; }
[DataMember]
public string Email { get; set; }
[DataMember]
public string Password { get; set; }
[DataMember]
public string PasswordQuestion { get; set; }
[DataMember]
public string PasswordAnswer { get; set; }
[DataMember]
public string Comments { get; set; }
[DataMember]
public bool IsApproved { get; set; }
[DataMember]
public bool IsOnline { get; set; }
[DataMember]
public bool IsLockedOut { get; set; }
[DataMember]
public DateTime CreateDate { get; set; }
[DataMember]
public DateTime UpdateDate { get; set; }
[DataMember]
public DateTime LastLoginDate { get; set; }
[DataMember]
public DateTime LastPasswordChangeDate { get; set; }
[DataMember]
public DateTime LastLockoutDate { get; set; }
[IgnoreDataMember]
public object ProviderUserKey
{
get
{
return _providerUserKey;
}
set
{
SetPropertyValueAndDetectChanges(o =>
{
_providerUserKey = value;
return _id;
}, _providerUserKey, ProviderUserKeySelector);
}
}
/// <summary>
/// Gets or sets the type of the provider user key.
/// </summary>
/// <value>
/// The type of the provider user key.
/// </value>
[IgnoreDataMember]
internal Type ProviderUserKeyType
{
get
{
return _userTypeKey;
}
private set
{
SetPropertyValueAndDetectChanges(o =>
{
_userTypeKey = value;
return _userTypeKey;
}, _userTypeKey, UserTypeKeySelector);
}
}
/// <summary>
/// Sets the type of the provider user key.
/// </summary>
/// <param name="type">The type.</param>
internal void SetProviderUserKeyType(Type type)
{
ProviderUserKeyType = type;
}
[DataMember]
public object ProfileId { get; set; }
public string Username
{
get { return _username; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_username = value;
return _username;
}, _username, UsernameSelector);
}
}
[DataMember]
public IEnumerable<object> Groups { get; set; }
public string Email
{
get { return _email; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_email = value;
return _email;
}, _email, EmailSelector);
}
}
[DataMember]
public string Password
{
get { return _password; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_password = value;
return _password;
}, _password, PasswordSelector);
}
}
[DataMember]
public string PasswordQuestion
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
[DataMember]
public string PasswordAnswer
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
[DataMember]
public string Comments
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
[DataMember]
public bool IsApproved
{
get { return _isApproved; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_isApproved = value;
return _isApproved;
}, _isApproved, IsApprovedSelector);
}
}
[DataMember]
public bool IsLockedOut
{
get { return _isLockedOut; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_isLockedOut = value;
return _isLockedOut;
}, _isLockedOut, IsLockedOutSelector);
}
}
[DataMember]
public DateTime CreateDate
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
[DataMember]
public DateTime UpdateDate
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
[DataMember]
public DateTime LastLoginDate
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
[DataMember]
public DateTime LastPasswordChangeDate
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
[DataMember]
public DateTime LastLockoutDate
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
[DataMember]
public int FailedPasswordAttempts
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
#endregion
#region Implementation of IProfile
[DataMember]
public string Name
{
get { return _name; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_name = value;
return _name;
}, _name, NameSelector);
}
}
#endregion
#region Implementation of IUser
public IEnumerable<string> AllowedSections
{
get { return _sectionCollection; }
}
public void RemoveAllowedSection(string sectionAlias)
{
_sectionCollection.Remove(sectionAlias);
}
public void AddAllowedSection(string sectionAlias)
{
if (_sectionCollection.Contains(sectionAlias) == false)
{
_sectionCollection.Add(sectionAlias);
}
}
/// <summary>
/// Used internally to check if we need to add a section in the repository to the db
/// </summary>
internal IEnumerable<string> AddedSections
{
get { return _addedSections; }
}
/// <summary>
/// Used internally to check if we need to remove a section in the repository to the db
/// </summary>
internal IEnumerable<string> RemovedSections
{
get { return _removedSections; }
}
/// <summary>
/// Gets or sets the session timeout.
/// </summary>
/// <value>
/// The session timeout.
/// </value>
[DataMember]
public string Language { get; set; }
public int SessionTimeout
{
get { return _sessionTimeout; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_sessionTimeout = value;
return _sessionTimeout;
}, _sessionTimeout, SessionTimeoutSelector);
}
}
/// <summary>
/// Gets or sets the start content id.
/// </summary>
/// <value>
/// The start content id.
/// </value>
[DataMember]
public string DefaultPermissions { get; set; }
public int StartContentId
{
get { return _startContentId; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_startContentId = value;
return _startContentId;
}, _startContentId, StartContentIdSelector);
}
}
/// <summary>
/// Gets or sets the start media id.
/// </summary>
/// <value>
/// The start media id.
/// </value>
[DataMember]
public int StartMediaId
{
get { return _startMediaId; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_startMediaId = value;
return _startMediaId;
}, _startMediaId, StartMediaIdSelector);
}
}
[DataMember]
public bool DefaultToLiveEditing { get; set; }
public object Id
{
get { return _id; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_id = value;
return _id;
}, _id, IdSelector);
}
}
[DataMember]
public bool NoConsole { get; set; }
public string Language
{
get { return _language; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_language = value;
return _language;
}, _language, LanguageSelector);
}
}
[DataMember]
public IEnumerable<string> DefaultPermissions
{
get { return _defaultPermissions; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_defaultPermissions = value;
return _defaultPermissions;
}, _defaultPermissions, DefaultPermissionsSelector);
}
}
[IgnoreDataMember]
internal bool DefaultToLiveEditing
{
get { return _defaultToLiveEditing; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_defaultToLiveEditing = value;
return _defaultToLiveEditing;
}, _defaultToLiveEditing, DefaultToLiveEditingSelector);
}
}
[IgnoreDataMember]
public IUserType UserType
{
get
{
var type = Groups.FirstOrDefault();
return type as IUserType;
}
get { return _userType; }
}
#endregion
/// <summary>
/// Whenever resetting occurs, clear the remembered add/removed collections, even if
/// rememberPreviouslyChangedProperties is true, the AllowedSections property will still
/// be flagged as dirty.
/// </summary>
/// <param name="rememberPreviouslyChangedProperties"></param>
internal override void ResetDirtyProperties(bool rememberPreviouslyChangedProperties)
{
_addedSections.Clear();
_removedSections.Clear();
base.ResetDirtyProperties(rememberPreviouslyChangedProperties);
}
/// <summary>
/// Handles the collection changed event in order for us to flag the AllowedSections property as changed
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void SectionCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
OnPropertyChanged(AllowedSectionsSelector);
if (e.Action == NotifyCollectionChangedAction.Add)
{
//remove from the removed/added sections (since people could add/remove all they want in one request)
_removedSections.RemoveAll(s => s == e.NewItems.Cast<string>().First());
_addedSections.RemoveAll(s => s == e.NewItems.Cast<string>().First());
//add to the added sections
_addedSections.Add(e.NewItems.Cast<string>().First());
}
else if (e.Action == NotifyCollectionChangedAction.Remove)
{
//remove from the removed/added sections (since people could add/remove all they want in one request)
_removedSections.RemoveAll(s => s == e.OldItems.Cast<string>().First());
_addedSections.RemoveAll(s => s == e.OldItems.Cast<string>().First());
//add to the added sections
_removedSections.Add(e.OldItems.Cast<string>().First());
}
}
}
}

View File

@@ -1,188 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
namespace Umbraco.Core.Models.Membership
{
/// <summary>
/// Represents the Profile implementation for a backoffice User
/// </summary>
/// <remarks>
/// Should be internal until a proper user/membership implementation
/// is part of the roadmap.
/// </remarks>
[Serializable]
[DataContract(IsReference = true)]
internal class UserProfile : Profile, IUserProfile
{
public UserProfile()
{
SessionTimeout = 60;
_sectionCollection = new ObservableCollection<string>();
_addedSections = new List<string>();
_removedSections = new List<string>();
_sectionCollection.CollectionChanged += SectionCollectionChanged;
}
private readonly List<string> _addedSections;
private readonly List<string> _removedSections;
private readonly ObservableCollection<string> _sectionCollection;
private int _sessionTimeout;
private int _startContentId;
private int _startMediaId;
private static readonly PropertyInfo SessionTimeoutSelector = ExpressionHelper.GetPropertyInfo<UserProfile, int>(x => x.SessionTimeout);
private static readonly PropertyInfo StartContentIdSelector = ExpressionHelper.GetPropertyInfo<UserProfile, int>(x => x.StartContentId);
private static readonly PropertyInfo StartMediaIdSelector = ExpressionHelper.GetPropertyInfo<UserProfile, int>(x => x.StartMediaId);
private static readonly PropertyInfo AllowedSectionsSelector = ExpressionHelper.GetPropertyInfo<UserProfile, IEnumerable<string>>(x => x.AllowedSections);
/// <summary>
/// Gets or sets the session timeout.
/// </summary>
/// <value>
/// The session timeout.
/// </value>
[DataMember]
public int SessionTimeout
{
get
{
return _sessionTimeout;
}
set
{
SetPropertyValueAndDetectChanges(o =>
{
_sessionTimeout = value;
return _sessionTimeout;
}, _sessionTimeout, SessionTimeoutSelector);
}
}
/// <summary>
/// Gets or sets the start content id.
/// </summary>
/// <value>
/// The start content id.
/// </value>
[DataMember]
public int StartContentId
{
get
{
return _startContentId;
}
set
{
SetPropertyValueAndDetectChanges(o =>
{
_startContentId = value;
return _startContentId;
}, _startContentId, StartContentIdSelector);
}
}
/// <summary>
/// Gets or sets the start media id.
/// </summary>
/// <value>
/// The start media id.
/// </value>
[DataMember]
public int StartMediaId
{
get
{
return _startMediaId;
}
set
{
SetPropertyValueAndDetectChanges(o =>
{
_startMediaId = value;
return _startMediaId;
}, _startMediaId, StartMediaIdSelector);
}
}
public IEnumerable<string> AllowedSections
{
get { return _sectionCollection; }
}
public void RemoveAllowedSection(string sectionAlias)
{
_sectionCollection.Remove(sectionAlias);
}
public void AddAllowedSection(string sectionAlias)
{
if (!_sectionCollection.Contains(sectionAlias))
{
_sectionCollection.Add(sectionAlias);
}
}
/// <summary>
/// Whenever resetting occurs, clear the remembered add/removed collections, even if
/// rememberPreviouslyChangedProperties is true, the AllowedSections property will still
/// be flagged as dirty.
/// </summary>
/// <param name="rememberPreviouslyChangedProperties"></param>
internal override void ResetDirtyProperties(bool rememberPreviouslyChangedProperties)
{
_addedSections.Clear();
_removedSections.Clear();
base.ResetDirtyProperties(rememberPreviouslyChangedProperties);
}
/// <summary>
/// Used internally to check if we need to add a section in the repository to the db
/// </summary>
internal IEnumerable<string> AddedSections
{
get { return _addedSections; }
}
/// <summary>
/// Used internally to check if we need to remove a section in the repository to the db
/// </summary>
internal IEnumerable<string> RemovedSections
{
get { return _removedSections; }
}
/// <summary>
/// Handles the collection changed event in order for us to flag the AllowedSections property as changed
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void SectionCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
OnPropertyChanged(AllowedSectionsSelector);
if (e.Action == NotifyCollectionChangedAction.Add)
{
//remove from the removed/added sections (since people could add/remove all they want in one request)
_removedSections.RemoveAll(s => s == e.NewItems.Cast<string>().First());
_addedSections.RemoveAll(s => s == e.NewItems.Cast<string>().First());
//add to the added sections
_addedSections.Add(e.NewItems.Cast<string>().First());
}
else if (e.Action == NotifyCollectionChangedAction.Remove)
{
//remove from the removed/added sections (since people could add/remove all they want in one request)
_removedSections.RemoveAll(s => s == e.OldItems.Cast<string>().First());
_addedSections.RemoveAll(s => s == e.OldItems.Cast<string>().First());
//add to the added sections
_removedSections.Add(e.OldItems.Cast<string>().First());
}
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Persistence.Mappers;
@@ -22,7 +23,13 @@ namespace Umbraco.Core.Models.Membership
[DataMember]
public string Name { get; set; }
/// <summary>
/// The set of default permissions for the user type
/// </summary>
/// <remarks>
/// By default each permission is simply a single char but we've made this an enumerable{string} to support a more flexible permissions structure in the future.
/// </remarks>
[DataMember]
public string Permissions { get; set; }
public IEnumerable<string> Permissions { get; set; }
}
}

View File

@@ -1,4 +1,6 @@
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Models.Rdbms;
@@ -18,22 +20,23 @@ namespace Umbraco.Core.Persistence.Factories
public IUser BuildEntity(UserDto dto)
{
var user = new User(_userType)
{
Id = dto.Id,
ProfileId = dto.Id,
StartContentId = dto.ContentStartId,
StartMediaId = dto.MediaStartId.HasValue ? dto.MediaStartId.Value : -1,
Password = dto.Password,
Username = dto.Login,
Name = dto.UserName,
IsLockedOut = dto.Disabled,
IsApproved = dto.Disabled == false,
Email = dto.Email,
Language = dto.UserLanguage,
DefaultToLiveEditing = dto.DefaultToLiveEditing,
NoConsole = dto.NoConsole,
DefaultPermissions = dto.DefaultPermissions
};
{
Id = dto.Id,
//ProfileId = dto.Id,
StartContentId = dto.ContentStartId,
StartMediaId = dto.MediaStartId.HasValue ? dto.MediaStartId.Value : -1,
Password = dto.Password,
Username = dto.Login,
Name = dto.UserName,
IsLockedOut = dto.NoConsole,
IsApproved = dto.Disabled == false,
Email = dto.Email,
Language = dto.UserLanguage,
DefaultToLiveEditing = dto.DefaultToLiveEditing,
DefaultPermissions = dto.DefaultPermissions.IsNullOrWhiteSpace()
? Enumerable.Empty<string>()
: dto.DefaultPermissions.ToCharArray().Select(x => x.ToString(CultureInfo.InvariantCulture))
};
foreach (var app in dto.User2AppDtos)
{
@@ -53,16 +56,16 @@ namespace Umbraco.Core.Persistence.Factories
{
ContentStartId = entity.StartContentId,
MediaStartId = entity.StartMediaId,
DefaultToLiveEditing = entity.DefaultToLiveEditing,
DefaultToLiveEditing = ((User)entity).DefaultToLiveEditing,
Disabled = entity.IsApproved == false,
Email = entity.Email,
Login = entity.Username,
NoConsole = entity.NoConsole,
NoConsole = entity.IsLockedOut,
Password = entity.Password,
UserLanguage = entity.Language,
UserName = entity.Name,
Type = short.Parse(entity.UserType.Id.ToString()),
DefaultPermissions = entity.DefaultPermissions,
Type = short.Parse(entity.UserType.Id.ToString(CultureInfo.InvariantCulture)),
DefaultPermissions = entity.DefaultPermissions == null ? "" : string.Join("", entity.DefaultPermissions),
User2AppDtos = new List<User2AppDto>()
};

View File

@@ -1,4 +1,6 @@
using Umbraco.Core.Models.Membership;
using System.Globalization;
using System.Linq;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Models.Rdbms;
namespace Umbraco.Core.Persistence.Factories
@@ -10,12 +12,14 @@ namespace Umbraco.Core.Persistence.Factories
public IUserType BuildEntity(UserTypeDto dto)
{
var userType = new UserType
{
Alias = dto.Alias,
Id = dto.Id,
Name = dto.Name,
Permissions = dto.DefaultPermissions
};
{
Alias = dto.Alias,
Id = dto.Id,
Name = dto.Name,
Permissions = dto.DefaultPermissions.IsNullOrWhiteSpace()
? Enumerable.Empty<string>()
: dto.DefaultPermissions.ToCharArray().Select(x => x.ToString(CultureInfo.InvariantCulture))
};
//on initial construction we don't want to have dirty properties tracked
// http://issues.umbraco.org/issue/U4-1946
userType.ResetDirtyProperties(false);
@@ -27,7 +31,7 @@ namespace Umbraco.Core.Persistence.Factories
var userType = new UserTypeDto
{
Alias = entity.Alias,
DefaultPermissions = entity.Permissions,
DefaultPermissions = entity.Permissions == null ? "" : string.Join("", entity.Permissions),
Name = entity.Name
};

View File

@@ -38,7 +38,7 @@ namespace Umbraco.Core.Persistence.Mappers
CacheMap<User, UserDto>(src => src.StartContentId, dto => dto.ContentStartId);
CacheMap<User, UserDto>(src => src.DefaultToLiveEditing, dto => dto.DefaultToLiveEditing);
CacheMap<User, UserDto>(src => src.IsApproved, dto => dto.Disabled);
CacheMap<User, UserDto>(src => src.NoConsole, dto => dto.NoConsole);
CacheMap<User, UserDto>(src => src.IsLockedOut, dto => dto.NoConsole);
CacheMap<User, UserDto>(src => src.UserType, dto => dto.Type);
CacheMap<User, UserDto>(src => src.Language, dto => dto.UserLanguage);
}

View File

@@ -269,9 +269,9 @@ namespace Umbraco.Core.Persistence.Repositories
if (parentPermissions.Any())
{
var userPermissions = parentPermissions.Select(
permissionDto => new KeyValuePair<object, string>(
permissionDto => new KeyValuePair<object, IEnumerable<string>>(
permissionDto.UserId,
permissionDto.Permission));
permissionDto.Permission.ToCharArray().Select(x => x.ToString(CultureInfo.InvariantCulture))));
AssignEntityPermissions(entity, userPermissions);
//flag the entity's permissions changed flag so we can track those changes.
//Currently only used for the cache refreshers to detect if we should refresh all user permissions cache.

View File

@@ -44,14 +44,16 @@ namespace Umbraco.Core.Persistence.Repositories
/// Assigns permissions to an entity for multiple users
/// </summary>
/// <param name="entity"></param>
/// <param name="permissions"></param>
/// <param name="permissions">
/// A list of permissions to assign - currently in Umbraco each permission is a single char but this list of strings allows for flexibility in the future
/// </param>
/// <param name="userIds"></param>
protected internal void AssignEntityPermissions(TEntity entity, string permissions, IEnumerable<object> userIds)
protected internal void AssignEntityPermissions(TEntity entity, IEnumerable<string> permissions, IEnumerable<object> userIds)
{
var actions = userIds.Select(id => new User2NodePermissionDto
{
NodeId = entity.Id,
Permission = permissions,
Permission = string.Join("",permissions),
UserId = (int)id
});
@@ -63,14 +65,14 @@ namespace Umbraco.Core.Persistence.Repositories
/// </summary>
/// <param name="entity"></param>
/// <param name="userPermissions">
/// A key/value pair list containing a userId and a permission to assign
/// A key/value pair list containing a userId and a permission to assign, currently in Umbraco each permission is a single char but this list of strings allows for flexibility in the future
/// </param>
protected internal void AssignEntityPermissions(TEntity entity, IEnumerable<KeyValuePair<object, string>> userPermissions)
protected internal void AssignEntityPermissions(TEntity entity, IEnumerable<KeyValuePair<object, IEnumerable<string>>> userPermissions)
{
var actions = userPermissions.Select(p => new User2NodePermissionDto
{
NodeId = entity.Id,
Permission = p.Value,
Permission = string.Join("", p.Value),
UserId = (int)p.Key
});
@@ -81,9 +83,11 @@ namespace Umbraco.Core.Persistence.Repositories
/// Replace permissions for an entity for multiple users
/// </summary>
/// <param name="entity"></param>
/// <param name="permissions"></param>
/// <param name="permissions">
/// A list of permissions to assign - currently in Umbraco each permission is a single char but this list of strings allows for flexibility in the future
/// </param>
/// <param name="userIds"></param>
protected internal void ReplaceEntityPermissions(TEntity entity, string permissions, IEnumerable<object> userIds)
protected internal void ReplaceEntityPermissions(TEntity entity, IEnumerable<string> permissions, IEnumerable<object> userIds)
{
Database.Update<User2NodePermissionDto>(
GenerateReplaceEntityPermissionsSql(entity.Id, permissions, userIds.ToArray()));
@@ -93,12 +97,14 @@ namespace Umbraco.Core.Persistence.Repositories
/// An overload to replace entity permissions and all replace all descendant permissions
/// </summary>
/// <param name="entity"></param>
/// <param name="permissions"></param>
/// <param name="permissions">
/// A list of permissions to assign - currently in Umbraco each permission is a single char but this list of strings allows for flexibility in the future
/// </param>
/// <param name="getDescendantIds">
/// A callback to get the descendant Ids of the current entity
/// </param>
/// <param name="userIds"></param>
protected internal void ReplaceEntityPermissions(TEntity entity, string permissions, Func<IEntity, IEnumerable<int>> getDescendantIds, IEnumerable<object> userIds)
protected internal void ReplaceEntityPermissions(TEntity entity, IEnumerable<string> permissions, Func<IEntity, IEnumerable<int>> getDescendantIds, IEnumerable<object> userIds)
{
Database.Update<User2NodePermissionDto>(
GenerateReplaceEntityPermissionsSql(
@@ -107,17 +113,35 @@ namespace Umbraco.Core.Persistence.Repositories
userIds.ToArray()));
}
internal static string GenerateReplaceEntityPermissionsSql(int entityId, string permissions, object[] userIds)
/// <summary>
///
/// </summary>
/// <param name="entityId"></param>
/// <param name="permissions">
/// A list of permissions to assign - currently in Umbraco each permission is a single char but this list of strings allows for flexibility in the future
/// </param>
/// <param name="userIds"></param>
/// <returns></returns>
internal static string GenerateReplaceEntityPermissionsSql(int entityId, IEnumerable<string> permissions, object[] userIds)
{
return GenerateReplaceEntityPermissionsSql(new[] {entityId}, permissions, userIds);
}
internal static string GenerateReplaceEntityPermissionsSql(int[] entityIds, string permissions, object[] userIds)
/// <summary>
///
/// </summary>
/// <param name="entityIds"></param>
/// <param name="permissions">
/// A list of permissions to assign - currently in Umbraco each permission is a single char but this list of strings allows for flexibility in the future
/// </param>
/// <param name="userIds"></param>
/// <returns></returns>
internal static string GenerateReplaceEntityPermissionsSql(int[] entityIds, IEnumerable<string> permissions, object[] userIds)
{
//create the "SET" clause of the update statement
var sqlSet = string.Format("SET {0}={1}",
SqlSyntaxContext.SqlSyntaxProvider.GetQuotedColumnName("permission"),
SqlSyntaxContext.SqlSyntaxProvider.GetQuotedValue(permissions));
SqlSyntaxContext.SqlSyntaxProvider.GetQuotedValue(string.Join("", permissions)));
//build the nodeIds part of the where clause
var sqlNodeWhere = BuildOrClause(entityIds, "nodeId");

View File

@@ -1,16 +1,30 @@
using System.Collections.Generic;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Persistence.Querying;
namespace Umbraco.Core.Services
{
/// <summary>
/// Defines part of the MemberService, which is specific to methods used by the membership provider.
/// </summary>
/// <remarks>
/// Idea is to have this is an isolated interface so that it can be easily 'replaced' in the membership provider impl.
/// </remarks>
public interface IMembershipMemberService : IService
public interface IMembershipMemberService : IMembershipMemberService<IMember>
{
IMember CreateMember(string email, string username, string password, IMemberType memberType);
}
/// <summary>
/// Defines part of the UserService/MemberService, which is specific to methods used by the membership provider.
/// </summary>
/// <remarks>
/// Idea is to have this is an isolated interface so that it can be easily 'replaced' in the membership provider impl.
/// </remarks>
public interface IMembershipMemberService<T> : IService
where T: IEntity
{
/// <summary>
/// Checks if a member with the username exists
@@ -27,28 +41,28 @@ namespace Umbraco.Core.Services
/// <param name="password"></param>
/// <param name="memberTypeAlias"></param>
/// <returns></returns>
IMember CreateMember(string username, string email, string password, string memberTypeAlias);
T CreateMember(string username, string email, string password, string memberTypeAlias);
IMember GetById(object id);
T GetById(object id);
/// <summary>
/// Get a member by email
/// </summary>
/// <param name="email"></param>
/// <returns></returns>
IMember GetByEmail(string email);
T GetByEmail(string email);
IMember GetByUsername(string login);
T GetByUsername(string login);
void Delete(IMember membershipUser);
void Delete(T membershipUser);
void Save(IMember membershipUser, bool raiseEvents = true);
void Save(T membershipUser, bool raiseEvents = true);
void Save(IEnumerable<IMember> members, bool raiseEvents = true);
void Save(IEnumerable<T> members, bool raiseEvents = true);
IEnumerable<IMember> FindMembersByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
IEnumerable<T> FindMembersByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
IEnumerable<IMember> FindMembersByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
IEnumerable<T> FindMembersByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
/// <summary>
/// Gets the total number of members based on the count type
@@ -63,6 +77,6 @@ namespace Umbraco.Core.Services
/// <param name="pageSize"></param>
/// <param name="totalRecords"></param>
/// <returns></returns>
IEnumerable<IMember> GetAllMembers(int pageIndex, int pageSize, out int totalRecords);
IEnumerable<T> GetAllMembers(int pageIndex, int pageSize, out int totalRecords);
}
}

View File

@@ -8,8 +8,10 @@ namespace Umbraco.Core.Services
/// <remarks>
/// Idea is to have this is an isolated interface so that it can be easily 'replaced' in the membership provider impl.
/// </remarks>
internal interface IMembershipUserService : IService
internal interface IMembershipUserService : IMembershipMemberService<IUser>
{
IMembershipUser CreateMembershipUser(string name, string login, string password, IUserType userType, string email = "");
IUser CreateMember(string username, string email, string password, IUserType userType);
}
}

View File

@@ -14,9 +14,10 @@ namespace Umbraco.Core.Services
/// <param name="id">Id of the User to retrieve</param>
/// <returns><see cref="IProfile"/></returns>
IProfile GetProfileById(int id);
IProfile GetProfileByUserName(string username);
IUser GetUserByUserName(string username);
//IUser GetUserByUserName(string username);
IUser GetUserById(int id);
/// <summary>

View File

@@ -511,6 +511,22 @@ namespace Umbraco.Core.Services
throw new NotImplementedException();
}
public IMember CreateMember(string email, string username, string password, IMemberType memberType)
{
if (memberType == null) throw new ArgumentNullException("memberType");
var member = new Member(email, email, username, password, -1, memberType);
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
repository.AddOrUpdate(member);
uow.Commit();
}
return member;
}
/// <summary>
/// Creates and persists a new Member
/// </summary>
@@ -531,17 +547,11 @@ namespace Umbraco.Core.Services
}
if (memberType == null)
throw new Exception(string.Format("No MemberType matching the passed in Alias: '{0}' was found", memberTypeAlias));
var member = new Member(email, email, username, password, -1, memberType);
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
repository.AddOrUpdate(member);
uow.Commit();
throw new ArgumentException(string.Format("No MemberType matching the passed in Alias: '{0}' was found", memberTypeAlias));
}
return member;
return CreateMember(email, username, password, memberTypeAlias);
}
/// <summary>

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Umbraco.Core.Events;
@@ -33,6 +34,113 @@ namespace Umbraco.Core.Services
_uowProvider = provider;
}
#region Implementation of IMembershipUserService
public bool Exists(string username)
{
throw new NotImplementedException();
}
public IUser CreateMember(string username, string email, string password, IUserType userType)
{
if (userType == null) throw new ArgumentNullException("userType");
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateUserRepository(uow))
{
var loginExists = uow.Database.ExecuteScalar<int>("SELECT COUNT(id) FROM umbracoUser WHERE userLogin = @Login", new { Login = username }) != 0;
if (loginExists)
throw new ArgumentException("Login already exists");
var user = new User(userType)
{
DefaultToLiveEditing = false,
Email = email,
Language = Configuration.GlobalSettings.DefaultUILanguage,
Name = username,
Password = password,
DefaultPermissions = userType.Permissions,
Username = username,
StartContentId = -1,
StartMediaId = -1,
IsLockedOut = false,
IsApproved = true
};
repository.AddOrUpdate(user);
uow.Commit();
return user;
}
}
public IUser CreateMember(string username, string email, string password, string memberTypeAlias)
{
var userType = GetUserTypeByAlias(memberTypeAlias);
if (userType == null)
{
throw new ArgumentException("The user type " + memberTypeAlias + " could not be resolved");
}
return CreateMember(username, email, password, userType);
}
public IUser GetById(object id)
{
throw new NotImplementedException();
}
public IUser GetByEmail(string email)
{
throw new NotImplementedException();
}
public IUser GetByUsername(string login)
{
using (var repository = _repositoryFactory.CreateUserRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query<IUser>.Builder.Where(x => x.Username == login);
return repository.GetByQuery(query).FirstOrDefault();
}
}
public void Delete(IUser membershipUser)
{
throw new NotImplementedException();
}
public void Save(IUser membershipUser, bool raiseEvents = true)
{
throw new NotImplementedException();
}
public void Save(IEnumerable<IUser> members, bool raiseEvents = true)
{
throw new NotImplementedException();
}
public IEnumerable<IUser> FindMembersByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
{
throw new NotImplementedException();
}
public IEnumerable<IUser> FindMembersByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
{
throw new NotImplementedException();
}
public int GetMemberCount(MemberCountType countType)
{
throw new NotImplementedException();
}
public IEnumerable<IUser> GetAllMembers(int pageIndex, int pageSize, out int totalRecords)
{
throw new NotImplementedException();
}
#endregion
#region Implementation of IUserService
/// <summary>
@@ -43,22 +151,13 @@ namespace Umbraco.Core.Services
public IProfile GetProfileById(int id)
{
var user = GetUserById(id);
return new Profile(user.Id, user.Name);
return user;
}
public IProfile GetProfileByUserName(string username)
public IProfile GetProfileByUserName(string login)
{
var user = GetUserByUserName(username);
return new Profile(user.Id, user.Name);
}
public IUser GetUserByUserName(string username)
{
using (var repository = _repositoryFactory.CreateUserRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query<IUser>.Builder.Where(x => x.Username == username);
return repository.GetByQuery(query).FirstOrDefault();
}
var user = GetByUsername(login);
return user;
}
public IUser GetUserById(int id)
@@ -69,7 +168,6 @@ namespace Umbraco.Core.Services
}
}
/// <summary>
/// Gets an IUserType by its Alias
/// </summary>
@@ -139,45 +237,45 @@ namespace Umbraco.Core.Services
}
}
/// <summary>
/// Creates a new user for logging into the umbraco backoffice
/// </summary>
/// <param name="name"></param>
/// <param name="login"></param>
/// <param name="password"></param>
/// <param name="userType"></param>
/// <param name="email"></param>
/// <returns></returns>
public IMembershipUser CreateMembershipUser(string name, string login, string password, IUserType userType, string email = "")
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateUserRepository(uow))
{
var loginExists = uow.Database.ExecuteScalar<int>("SELECT COUNT(id) FROM umbracoUser WHERE userLogin = @Login", new { Login = login }) != 0;
if (loginExists)
throw new ArgumentException("Login already exists");
///// <summary>
///// Creates a new user for logging into the umbraco backoffice
///// </summary>
///// <param name="name"></param>
///// <param name="login"></param>
///// <param name="password"></param>
///// <param name="userType"></param>
///// <param name="email"></param>
///// <returns></returns>
//public IMembershipUser CreateMembershipUser(string name, string login, string password, IUserType userType, string email = "")
//{
// var uow = _uowProvider.GetUnitOfWork();
// using (var repository = _repositoryFactory.CreateUserRepository(uow))
// {
// var loginExists = uow.Database.ExecuteScalar<int>("SELECT COUNT(id) FROM umbracoUser WHERE userLogin = @Login", new { Login = login }) != 0;
// if (loginExists)
// throw new ArgumentException("Login already exists");
var user = new User(userType)
{
DefaultToLiveEditing = false,
Email = email,
Language = Umbraco.Core.Configuration.GlobalSettings.DefaultUILanguage,
Name = name,
Password = password,
DefaultPermissions = userType.Permissions,
Username = login,
StartContentId = -1,
StartMediaId = -1,
NoConsole = false,
IsApproved = true
};
// var user = new User(userType)
// {
// DefaultToLiveEditing = false,
// Email = email,
// Language = Umbraco.Core.Configuration.GlobalSettings.DefaultUILanguage,
// Name = name,
// Password = password,
// DefaultPermissions = userType.Permissions,
// Username = login,
// StartContentId = -1,
// StartMediaId = -1,
// NoConsole = false,
// IsApproved = true
// };
repository.AddOrUpdate(user);
uow.Commit();
// repository.AddOrUpdate(user);
// uow.Commit();
return user;
}
}
// return user;
// }
//}
#endregion

View File

@@ -266,14 +266,11 @@
<Compile Include="Models\Media.cs" />
<Compile Include="Models\MediaType.cs" />
<Compile Include="Models\Membership\IMembershipUser.cs" />
<Compile Include="Models\Membership\IMembershipUserId.cs" />
<Compile Include="Models\Membership\IProfile.cs" />
<Compile Include="Models\Membership\IUser.cs" />
<Compile Include="Models\Membership\IUserType.cs" />
<Compile Include="Models\Membership\Profile.cs" />
<Compile Include="Models\Membership\User.cs" />
<Compile Include="Models\Membership\UserGroup.cs" />
<Compile Include="Models\Membership\UserProfile.cs" />
<Compile Include="Models\Membership\UserType.cs" />
<Compile Include="Models\PropertyExtensions.cs" />
<Compile Include="Models\PropertyTypeExtensions.cs" />

View File

@@ -16,7 +16,7 @@ namespace Umbraco.Tests.Persistence.Querying
public void Generate_Replace_Entity_Permissions_Test()
{
// Act
var sql = PermissionRepository<int, IContent>.GenerateReplaceEntityPermissionsSql(123, "A", new object[] {10, 11, 12});
var sql = PermissionRepository<int, IContent>.GenerateReplaceEntityPermissionsSql(123, new[]{"A"}, new object[] {10, 11, 12});
// Assert
Assert.AreEqual(@"SET [permission]='A' WHERE (([nodeId]=123) AND ([userId]=10 OR [userId]=11 OR [userId]=12))", sql);
@@ -26,7 +26,7 @@ namespace Umbraco.Tests.Persistence.Querying
public void Generate_Replace_Entity_Permissions_With_Descendants_Test()
{
// Act
var sql = PermissionRepository<int, IContent>.GenerateReplaceEntityPermissionsSql(new[] {123, 456}, "A", new object[] {10, 11, 12});
var sql = PermissionRepository<int, IContent>.GenerateReplaceEntityPermissionsSql(new[] { 123, 456 }, new[] { "A" }, new object[] { 10, 11, 12 });
// Assert
Assert.AreEqual(@"SET [permission]='A' WHERE (([nodeId]=123 OR [nodeId]=456) AND ([userId]=10 OR [userId]=11 OR [userId]=12))", sql);

View File

@@ -69,7 +69,7 @@ namespace Umbraco.Tests.Persistence.Repositories
unitOfWork.Commit();
// Act
repository.AssignEntityPermissions(parentPage, "A", new object[] { 0 });
repository.AssignEntityPermissions(parentPage, new[] { "A" }, new object[] { 0 });
var childPage = MockedContent.CreateSimpleContent(contentType, "child", parentPage);
repository.AddOrUpdate(childPage);
unitOfWork.Commit();

View File

@@ -131,14 +131,14 @@ namespace Umbraco.Tests.Persistence.Repositories
unitOfWork.Commit();
// Act
var resolved = repository.Get((int)user.Id);
var resolved = (User)repository.Get((int)user.Id);
resolved.Name = "New Name";
resolved.DefaultPermissions = "ZYX";
resolved.DefaultPermissions = new[]{"Z", "Y", "X"};
resolved.Language = "fr";
resolved.IsApproved = false;
resolved.Password = "new";
resolved.NoConsole = true;
resolved.IsLockedOut = true;
resolved.StartContentId = 10;
resolved.StartMediaId = 11;
resolved.DefaultToLiveEditing = true;
@@ -148,7 +148,7 @@ namespace Umbraco.Tests.Persistence.Repositories
repository.AddOrUpdate(resolved);
unitOfWork.Commit();
var updatedItem = repository.Get((int)user.Id);
var updatedItem = (User)repository.Get((int)user.Id);
// Assert
Assert.That(updatedItem.Id, Is.EqualTo(resolved.Id));
@@ -157,7 +157,7 @@ namespace Umbraco.Tests.Persistence.Repositories
Assert.That(updatedItem.Language, Is.EqualTo(resolved.Language));
Assert.That(updatedItem.IsApproved, Is.EqualTo(resolved.IsApproved));
Assert.That(updatedItem.Password, Is.EqualTo(resolved.Password));
Assert.That(updatedItem.NoConsole, Is.EqualTo(resolved.NoConsole));
Assert.That(updatedItem.IsLockedOut, Is.EqualTo(resolved.IsLockedOut));
Assert.That(updatedItem.StartContentId, Is.EqualTo(resolved.StartContentId));
Assert.That(updatedItem.StartMediaId, Is.EqualTo(resolved.StartMediaId));
Assert.That(updatedItem.DefaultToLiveEditing, Is.EqualTo(resolved.DefaultToLiveEditing));
@@ -492,10 +492,10 @@ namespace Umbraco.Tests.Persistence.Repositories
Assert.That(updatedItem.Language, Is.EqualTo(originalUser.Language));
Assert.That(updatedItem.IsApproved, Is.EqualTo(originalUser.IsApproved));
Assert.That(updatedItem.Password, Is.EqualTo(originalUser.Password));
Assert.That(updatedItem.NoConsole, Is.EqualTo(originalUser.NoConsole));
Assert.That(updatedItem.IsLockedOut, Is.EqualTo(originalUser.IsLockedOut));
Assert.That(updatedItem.StartContentId, Is.EqualTo(originalUser.StartContentId));
Assert.That(updatedItem.StartMediaId, Is.EqualTo(originalUser.StartMediaId));
Assert.That(updatedItem.DefaultToLiveEditing, Is.EqualTo(originalUser.DefaultToLiveEditing));
Assert.That(((User)updatedItem).DefaultToLiveEditing, Is.EqualTo(((User)originalUser).DefaultToLiveEditing));
Assert.That(updatedItem.Email, Is.EqualTo(originalUser.Email));
Assert.That(updatedItem.Username, Is.EqualTo(originalUser.Username));
Assert.That(updatedItem.AllowedSections.Count(), Is.EqualTo(2));

View File

@@ -125,7 +125,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Act
var resolved = repository.Get(userType.Id);
resolved.Name = "New Name";
resolved.Permissions = "ZYX";
resolved.Permissions = new[]{"Z", "Y", "X"};
repository.AddOrUpdate(resolved);
unitOfWork.Commit();
var updatedItem = repository.Get(userType.Id);

View File

@@ -33,7 +33,7 @@ namespace Umbraco.Tests.Services
var userType = userService.GetUserTypeByAlias("admin");
// Act
var membershipUser = userService.CreateMembershipUser("John Doe", "john@umbraco.io", "12345", userType, "john@umbraco.io");
var membershipUser = userService.CreateMember("JohnDoe", "john@umbraco.io", "12345", userType);
// Assert
Assert.That(membershipUser.HasIdentity, Is.True);
@@ -55,7 +55,7 @@ namespace Umbraco.Tests.Services
var hash = new HMACSHA1();
hash.Key = Encoding.Unicode.GetBytes(password);
var encodedPassword = Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(password)));
var membershipUser = userService.CreateMembershipUser("John Doe", "john@umbraco.io", encodedPassword, userType, "john@umbraco.io");
var membershipUser = userService.CreateMember("JohnDoe", "john@umbraco.io", encodedPassword, userType);
// Assert
Assert.That(membershipUser.HasIdentity, Is.True);
@@ -70,9 +70,9 @@ namespace Umbraco.Tests.Services
public void Can_Remove_Section_From_All_Assigned_Users()
{
var userType = ServiceContext.UserService.GetUserTypeByAlias("admin");
//we know this actually is an IUser so we'll just cast
var user1 = (IUser)ServiceContext.UserService.CreateMembershipUser("test1", "test1", "test1", userType, "test1@test.com");
var user2 = (IUser)ServiceContext.UserService.CreateMembershipUser("test2", "test2", "test2", userType, "test2@test.com");
var user1 = ServiceContext.UserService.CreateMember("test1", "test1@test.com", "test1", userType);
var user2 = ServiceContext.UserService.CreateMember("test2", "test2@test.com", "test2", userType);
//adds some allowed sections
user1.AddAllowedSection("test");
@@ -96,7 +96,7 @@ namespace Umbraco.Tests.Services
{
// Arrange
var userType = ServiceContext.UserService.GetUserTypeByAlias("admin");
var user = (IUser)ServiceContext.UserService.CreateMembershipUser("test1", "test1", "test1", userType, "test1@test.com");
var user = ServiceContext.UserService.CreateMember("test1", "test1@test.com", "test1", userType);
// Act
@@ -113,7 +113,7 @@ namespace Umbraco.Tests.Services
{
// Arrange
var userType = ServiceContext.UserService.GetUserTypeByAlias("admin");
var user = (IUser)ServiceContext.UserService.CreateMembershipUser("test1", "test1", "test1", userType, "test1@test.com");
var user = (IUser)ServiceContext.UserService.CreateMember("test1", "test1@test.com", "test1", userType);
// Act
@@ -130,11 +130,11 @@ namespace Umbraco.Tests.Services
{
// Arrange
var userType = ServiceContext.UserService.GetUserTypeByAlias("admin");
var originalUser = (IUser)ServiceContext.UserService.CreateMembershipUser("test1", "test1", "test1", userType, "test1@test.com");
var originalUser = (User)ServiceContext.UserService.CreateMember("test1", "test1@test.com", "test1", userType);
// Act
var updatedItem = ServiceContext.UserService.GetUserByUserName(originalUser.Username);
var updatedItem = (User)ServiceContext.UserService.GetByUsername(originalUser.Username);
// Assert
Assert.IsNotNull(updatedItem);
@@ -144,7 +144,7 @@ namespace Umbraco.Tests.Services
Assert.That(updatedItem.Language, Is.EqualTo(originalUser.Language));
Assert.That(updatedItem.IsApproved, Is.EqualTo(originalUser.IsApproved));
Assert.That(updatedItem.Password, Is.EqualTo(originalUser.Password));
Assert.That(updatedItem.NoConsole, Is.EqualTo(originalUser.NoConsole));
Assert.That(updatedItem.IsLockedOut, Is.EqualTo(originalUser.IsLockedOut));
Assert.That(updatedItem.StartContentId, Is.EqualTo(originalUser.StartContentId));
Assert.That(updatedItem.StartMediaId, Is.EqualTo(originalUser.StartMediaId));
Assert.That(updatedItem.DefaultToLiveEditing, Is.EqualTo(originalUser.DefaultToLiveEditing));

View File

@@ -18,8 +18,8 @@ namespace Umbraco.Tests.TestHelpers.Entities
IsApproved = true,
Name = "TestUser" + suffix,
Password = "testing",
NoConsole = false,
DefaultPermissions = "ABC",
IsLockedOut = false,
DefaultPermissions = new[]{"A", "B", "C"},
StartContentId = -1,
StartMediaId = -1,
DefaultToLiveEditing = false,

View File

@@ -10,7 +10,7 @@ namespace Umbraco.Tests.TestHelpers.Entities
{
Alias = "testUserType" + suffix,
Name = "TestUserType" + suffix,
Permissions = "ABC"
Permissions = new[]{"A", "B", "C"}
};
}
}