* Run code cleanup * Start manual cleanup after dotnet format * Finish up manual pass * Fix up missed warnings * Fix after merge * Update src/Umbraco.Core/Cache/ContentTypeCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/DataTypeCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/DeepCloneAppCache.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/DomainCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/FastDictionaryAppCacheBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/MacroCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/MediaCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/MemberCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Cache/MemberGroupCacheRefresher.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Composing/OrderedCollectionBuilderBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Configuration/Models/RequestHandlerSettings.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Composing/SetCollectionBuilderBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Composing/WeightedCollectionBuilderBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/ContentApps/ContentAppFactoryCollectionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Dashboards/DashboardCollectionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/ContentTypeRefreshedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/ContentTypeSavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/ContentTypeSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DictionaryCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DataTypeCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/ContentUnpublishingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DictionaryItemDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DictionaryItemSavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DictionaryItemSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/DomainCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/LanguageCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MacroCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaEmptiedRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaEmptyingRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaMovedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaMovedToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaMovedToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaMovingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaMovingToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTreeChangeNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTreeChangeNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeChangedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeMovedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeMovingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeMovingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MediaTypeRefreshedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberGroupCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberGroupDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberGroupSavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberGroupSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeChangedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeDeletedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeMovedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeMovedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeMovingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeMovingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeRefreshedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MemberTypeSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/StringExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/UriExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MovedToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MovedToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MovingToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/MovingToRecycleBinNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PartialViewDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Extensions/UriExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/IO/PhysicalFileSystem.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/IO/PhysicalFileSystem.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/IO/ShadowWrapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Logging/DisposableTimer.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Install/InstallSteps/UpgradeStep.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Mapping/MapDefinitionCollectionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Media/EmbedProviders/EmbedProvidersCollectionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PartialViewSavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Models/ContentEditing/ContentVariationDisplay.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PartialViewSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntryDeletedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntryDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntryDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntrySavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntrySavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/PublicAccessEntrySavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/RelationTypeCacheRefresherNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/RelationTypeDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/RelationTypeSavedNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/RelationTypeSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/StatefulNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/StylesheetDeletingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Notifications/StylesheetSavingNotification.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Models/DeepCloneHelper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Models/File.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Models/PropertyGroupExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Core/Models/PropertyGroupExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Fix based on review * Fix after merge Signed-off-by: Zeegaan <nge@umbraco.dk> Co-authored-by: Nikolaj Geisle <niko737@edu.ucl.dk> Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> Co-authored-by: Zeegaan <nge@umbraco.dk>
577 lines
19 KiB
C#
577 lines
19 KiB
C#
using System.ComponentModel;
|
|
using System.Runtime.Serialization;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace Umbraco.Cms.Core.Models;
|
|
|
|
/// <summary>
|
|
/// Represents a Member object
|
|
/// </summary>
|
|
[Serializable]
|
|
[DataContract(IsReference = true)]
|
|
public class Member : ContentBase, IMember
|
|
{
|
|
private IDictionary<string, object?>? _additionalData;
|
|
private string _email;
|
|
private DateTime? _emailConfirmedDate;
|
|
private int _failedPasswordAttempts;
|
|
private bool _isApproved;
|
|
private bool _isLockedOut;
|
|
private DateTime? _lastLockoutDate;
|
|
private DateTime? _lastLoginDate;
|
|
private DateTime? _lastPasswordChangeDate;
|
|
private string? _passwordConfig;
|
|
private string? _rawPasswordValue;
|
|
private string? _securityStamp;
|
|
private string _username;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Member" /> class.
|
|
/// Constructor for creating an empty Member object
|
|
/// </summary>
|
|
/// <param name="contentType">ContentType for the current Content object</param>
|
|
public Member(IMemberType contentType)
|
|
: base(string.Empty, -1, contentType, new PropertyCollection())
|
|
{
|
|
IsApproved = true;
|
|
|
|
// this cannot be null but can be empty
|
|
_rawPasswordValue = string.Empty;
|
|
_email = string.Empty;
|
|
_username = string.Empty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Member" /> class.
|
|
/// Constructor for creating a Member object
|
|
/// </summary>
|
|
/// <param name="name">Name of the content</param>
|
|
/// <param name="contentType">ContentType for the current Content object</param>
|
|
public Member(string name, IMemberType contentType)
|
|
: base(name, -1, contentType, new PropertyCollection())
|
|
{
|
|
if (name == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(name));
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(name))
|
|
{
|
|
throw new ArgumentException(
|
|
"Value can't be empty or consist only of white-space characters.",
|
|
nameof(name));
|
|
}
|
|
|
|
IsApproved = true;
|
|
|
|
// this cannot be null but can be empty
|
|
_rawPasswordValue = string.Empty;
|
|
_email = string.Empty;
|
|
_username = string.Empty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Member" /> class.
|
|
/// Constructor for creating a Member object
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <param name="email"></param>
|
|
/// <param name="username"></param>
|
|
/// <param name="contentType"></param>
|
|
/// <param name="isApproved"></param>
|
|
public Member(string name, string email, string username, IMemberType contentType, bool isApproved = true)
|
|
: base(name, -1, contentType, new PropertyCollection())
|
|
{
|
|
if (name == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(name));
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(name))
|
|
{
|
|
throw new ArgumentException(
|
|
"Value can't be empty or consist only of white-space characters.",
|
|
nameof(name));
|
|
}
|
|
|
|
if (email == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(email));
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(email))
|
|
{
|
|
throw new ArgumentException(
|
|
"Value can't be empty or consist only of white-space characters.",
|
|
nameof(email));
|
|
}
|
|
|
|
if (username == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(username));
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(username))
|
|
{
|
|
throw new ArgumentException(
|
|
"Value can't be empty or consist only of white-space characters.",
|
|
nameof(username));
|
|
}
|
|
|
|
_email = email;
|
|
_username = username;
|
|
IsApproved = isApproved;
|
|
|
|
// this cannot be null but can be empty
|
|
_rawPasswordValue = string.Empty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Member" /> class.
|
|
/// Constructor for creating a Member object
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <param name="email"></param>
|
|
/// <param name="username"></param>
|
|
/// <param name="contentType"></param>
|
|
/// <param name="userId"></param>
|
|
/// <param name="isApproved"></param>
|
|
public Member(string name, string email, string username, IMemberType contentType, int userId, bool isApproved = true)
|
|
: base(name, -1, contentType, new PropertyCollection())
|
|
{
|
|
if (name == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(name));
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(name))
|
|
{
|
|
throw new ArgumentException(
|
|
"Value can't be empty or consist only of white-space characters.",
|
|
nameof(name));
|
|
}
|
|
|
|
if (email == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(email));
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(email))
|
|
{
|
|
throw new ArgumentException(
|
|
"Value can't be empty or consist only of white-space characters.",
|
|
nameof(email));
|
|
}
|
|
|
|
if (username == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(username));
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(username))
|
|
{
|
|
throw new ArgumentException(
|
|
"Value can't be empty or consist only of white-space characters.",
|
|
nameof(username));
|
|
}
|
|
|
|
_email = email;
|
|
_username = username;
|
|
CreatorId = userId;
|
|
IsApproved = isApproved;
|
|
|
|
// this cannot be null but can be empty
|
|
_rawPasswordValue = string.Empty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Constructor for creating a Member object
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <param name="email"></param>
|
|
/// <param name="username"></param>
|
|
/// <param name="rawPasswordValue">
|
|
/// The password value passed in to this parameter should be the encoded/encrypted/hashed format of the member's
|
|
/// password
|
|
/// </param>
|
|
/// <param name="contentType"></param>
|
|
public Member(string? name, string email, string username, string? rawPasswordValue, IMemberType? contentType)
|
|
: base(name, -1, contentType, new PropertyCollection())
|
|
{
|
|
_email = email;
|
|
_username = username;
|
|
_rawPasswordValue = rawPasswordValue;
|
|
IsApproved = true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Member" /> class.
|
|
/// Constructor for creating a Member object
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <param name="email"></param>
|
|
/// <param name="username"></param>
|
|
/// <param name="rawPasswordValue">
|
|
/// The password value passed in to this parameter should be the encoded/encrypted/hashed format of the member's
|
|
/// password
|
|
/// </param>
|
|
/// <param name="contentType"></param>
|
|
/// <param name="isApproved"></param>
|
|
public Member(string name, string email, string username, string rawPasswordValue, IMemberType contentType, bool isApproved)
|
|
: base(name, -1, contentType, new PropertyCollection())
|
|
{
|
|
_email = email;
|
|
_username = username;
|
|
_rawPasswordValue = rawPasswordValue;
|
|
IsApproved = isApproved;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Constructor for creating a Member object
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <param name="email"></param>
|
|
/// <param name="username"></param>
|
|
/// <param name="rawPasswordValue">
|
|
/// The password value passed in to this parameter should be the encoded/encrypted/hashed format of the member's
|
|
/// password
|
|
/// </param>
|
|
/// <param name="contentType"></param>
|
|
/// <param name="isApproved"></param>
|
|
/// <param name="userId"></param>
|
|
public Member(string name, string email, string username, string rawPasswordValue, IMemberType contentType, bool isApproved, int userId)
|
|
: base(name, -1, contentType, new PropertyCollection())
|
|
{
|
|
_email = email;
|
|
_username = username;
|
|
_rawPasswordValue = rawPasswordValue;
|
|
IsApproved = isApproved;
|
|
CreatorId = userId;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Groups that Member is part of
|
|
/// </summary>
|
|
[DataMember]
|
|
public IEnumerable<string>? Groups { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Username
|
|
/// </summary>
|
|
[DataMember]
|
|
public string Username
|
|
{
|
|
get => _username;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _username!, nameof(Username));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the Email
|
|
/// </summary>
|
|
[DataMember]
|
|
public string Email
|
|
{
|
|
get => _email;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _email!, nameof(Email));
|
|
}
|
|
|
|
[DataMember]
|
|
public DateTime? EmailConfirmedDate
|
|
{
|
|
get => _emailConfirmedDate;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _emailConfirmedDate, nameof(EmailConfirmedDate));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the raw password value
|
|
/// </summary>
|
|
[IgnoreDataMember]
|
|
public string? RawPasswordValue
|
|
{
|
|
get => _rawPasswordValue;
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
// special case, this is used to ensure that the password is not updated when persisting, in this case
|
|
// we don't want to track changes either
|
|
_rawPasswordValue = null;
|
|
}
|
|
else
|
|
{
|
|
SetPropertyValueAndDetectChanges(value, ref _rawPasswordValue, nameof(RawPasswordValue));
|
|
}
|
|
}
|
|
}
|
|
|
|
[IgnoreDataMember]
|
|
public string? PasswordConfiguration
|
|
{
|
|
get => _passwordConfig;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _passwordConfig, nameof(PasswordConfiguration));
|
|
}
|
|
|
|
// TODO: When get/setting all of these properties we MUST:
|
|
// * Check if we are using the umbraco membership provider, if so then we need to use the configured fields - not the explicit fields below
|
|
// * If any of the fields don't exist, what should we do? Currently it will throw an exception!
|
|
|
|
/// <summary>
|
|
/// Gets or set the comments for the member
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Alias: umbracoMemberComments
|
|
/// Part of the standard properties collection.
|
|
/// </remarks>
|
|
[DataMember]
|
|
public string? Comments
|
|
{
|
|
get
|
|
{
|
|
Attempt<string?> a = WarnIfPropertyTypeNotFoundOnGet(Constants.Conventions.Member.Comments, nameof(Comments), default(string));
|
|
if (a.Success == false)
|
|
{
|
|
return a.Result;
|
|
}
|
|
|
|
return Properties[Constants.Conventions.Member.Comments]?.GetValue() == null
|
|
? string.Empty
|
|
: Properties[Constants.Conventions.Member.Comments]?.GetValue()?.ToString();
|
|
}
|
|
|
|
set
|
|
{
|
|
if (WarnIfPropertyTypeNotFoundOnSet(
|
|
Constants.Conventions.Member.Comments,
|
|
nameof(Comments)) == false)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Properties[Constants.Conventions.Member.Comments]?.SetValue(value);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether the Member is approved
|
|
/// </summary>
|
|
[DataMember]
|
|
public bool IsApproved
|
|
{
|
|
get => _isApproved;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _isApproved, nameof(IsApproved));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets a boolean indicating whether the Member is locked out
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Alias: umbracoMemberLockedOut
|
|
/// Part of the standard properties collection.
|
|
/// </remarks>
|
|
[DataMember]
|
|
public bool IsLockedOut
|
|
{
|
|
get => _isLockedOut;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _isLockedOut, nameof(IsLockedOut));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the date for last login
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Alias: umbracoMemberLastLogin
|
|
/// Part of the standard properties collection.
|
|
/// </remarks>
|
|
[DataMember]
|
|
public DateTime? LastLoginDate
|
|
{
|
|
get => _lastLoginDate;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _lastLoginDate, nameof(LastLoginDate));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gest or sets the date for last password change
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Alias: umbracoMemberLastPasswordChangeDate
|
|
/// Part of the standard properties collection.
|
|
/// </remarks>
|
|
[DataMember]
|
|
public DateTime? LastPasswordChangeDate
|
|
{
|
|
get => _lastPasswordChangeDate;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _lastPasswordChangeDate, nameof(LastPasswordChangeDate));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the date for when Member was locked out
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Alias: umbracoMemberLastLockoutDate
|
|
/// Part of the standard properties collection.
|
|
/// </remarks>
|
|
[DataMember]
|
|
public DateTime? LastLockoutDate
|
|
{
|
|
get => _lastLockoutDate;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _lastLockoutDate, nameof(LastLockoutDate));
|
|
}
|
|
|
|
/// <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: umbracoMemberFailedPasswordAttempts
|
|
/// Part of the standard properties collection.
|
|
/// </remarks>
|
|
[DataMember]
|
|
public int FailedPasswordAttempts
|
|
{
|
|
get => _failedPasswordAttempts;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _failedPasswordAttempts, nameof(FailedPasswordAttempts));
|
|
}
|
|
|
|
/// <summary>
|
|
/// String alias of the default ContentType
|
|
/// </summary>
|
|
[DataMember]
|
|
public virtual string ContentTypeAlias => ContentType.Alias;
|
|
|
|
/// <summary>
|
|
/// The security stamp used by ASP.Net identity
|
|
/// </summary>
|
|
[IgnoreDataMember]
|
|
public string? SecurityStamp
|
|
{
|
|
get => _securityStamp;
|
|
set => SetPropertyValueAndDetectChanges(value, ref _securityStamp, nameof(SecurityStamp));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Internal/Experimental - only used for mapping queries.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Adding these to have first level properties instead of the Properties collection.
|
|
/// </remarks>
|
|
[IgnoreDataMember]
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public string? LongStringPropertyValue { get; set; }
|
|
|
|
/// <summary>
|
|
/// Internal/Experimental - only used for mapping queries.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Adding these to have first level properties instead of the Properties collection.
|
|
/// </remarks>
|
|
[IgnoreDataMember]
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public string? ShortStringPropertyValue { get; set; }
|
|
|
|
/// <summary>
|
|
/// Internal/Experimental - only used for mapping queries.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Adding these to have first level properties instead of the Properties collection.
|
|
/// </remarks>
|
|
[IgnoreDataMember]
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public int IntegerPropertyValue { get; set; }
|
|
|
|
/// <summary>
|
|
/// Internal/Experimental - only used for mapping queries.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Adding these to have first level properties instead of the Properties collection.
|
|
/// </remarks>
|
|
[IgnoreDataMember]
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public bool BoolPropertyValue { get; set; }
|
|
|
|
/// <summary>
|
|
/// Internal/Experimental - only used for mapping queries.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Adding these to have first level properties instead of the Properties collection.
|
|
/// </remarks>
|
|
[IgnoreDataMember]
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public DateTime DateTimePropertyValue { get; set; }
|
|
|
|
/// <summary>
|
|
/// Internal/Experimental - only used for mapping queries.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Adding these to have first level properties instead of the Properties collection.
|
|
/// </remarks>
|
|
[IgnoreDataMember]
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public string? PropertyTypeAlias { get; set; }
|
|
|
|
/// <inheritdoc />
|
|
[DataMember]
|
|
[DoNotClone]
|
|
public IDictionary<string, object?> AdditionalData => _additionalData ??= new Dictionary<string, object?>();
|
|
|
|
/// <inheritdoc />
|
|
[IgnoreDataMember]
|
|
public bool HasAdditionalData => _additionalData != null;
|
|
|
|
private Attempt<T> WarnIfPropertyTypeNotFoundOnGet<T>(string propertyAlias, string propertyName, T defaultVal)
|
|
{
|
|
static void DoLog(string logPropertyAlias, string logPropertyName)
|
|
{
|
|
StaticApplicationLogging.Logger.LogWarning(
|
|
"Trying to access the '{PropertyName}' property on '{MemberType}' " +
|
|
"but the {PropertyAlias} property does not exist on the member type so a default value is returned. " +
|
|
"Ensure that you have a property type with alias: {PropertyAlias} configured on your member type in order to use the '{PropertyName}' property on the model correctly.",
|
|
logPropertyName,
|
|
typeof(Member),
|
|
logPropertyAlias);
|
|
}
|
|
|
|
// if the property doesn't exist,
|
|
if (Properties.Contains(propertyAlias) == false)
|
|
{
|
|
// put a warn in the log if this entity has been persisted
|
|
// then return a failure
|
|
if (HasIdentity)
|
|
{
|
|
DoLog(propertyAlias, propertyName);
|
|
}
|
|
|
|
return Attempt<T>.Fail(defaultVal);
|
|
}
|
|
|
|
return Attempt<T>.Succeed();
|
|
}
|
|
|
|
private bool WarnIfPropertyTypeNotFoundOnSet(string propertyAlias, string propertyName)
|
|
{
|
|
static void DoLog(string logPropertyAlias, string logPropertyName)
|
|
{
|
|
StaticApplicationLogging.Logger.LogWarning(
|
|
"An attempt was made to set a value on the property '{PropertyName}' on type '{MemberType}' but the " +
|
|
"property type {PropertyAlias} does not exist on the member type, ensure that this property type exists so that setting this property works correctly.",
|
|
logPropertyName,
|
|
typeof(Member),
|
|
logPropertyAlias);
|
|
}
|
|
|
|
// if the property doesn't exist,
|
|
if (Properties.Contains(propertyAlias) == false)
|
|
{
|
|
// put a warn in the log if this entity has been persisted
|
|
// then return a failure
|
|
if (HasIdentity)
|
|
{
|
|
DoLog(propertyAlias, propertyName);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|