From 067c5db740678bdabfb9fcc4fe49ecf3fd57a9a5 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 31 Aug 2010 14:14:14 -0700 Subject: [PATCH] EventHandler for User creation - Could allow a module to provide some logic to prevent specific users from registering --HG-- branch : dev --- .../Orchard.Users/Events/IUserEventHandler.cs | 16 ++++++++ .../Orchard.Users/Events/UserContext.cs | 8 ++++ .../Orchard.Users/Orchard.Users.csproj | 2 + .../Services/MembershipService.cs | 40 ++++++++++++++----- 4 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Users/Events/IUserEventHandler.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Users/Events/UserContext.cs diff --git a/src/Orchard.Web/Modules/Orchard.Users/Events/IUserEventHandler.cs b/src/Orchard.Web/Modules/Orchard.Users/Events/IUserEventHandler.cs new file mode 100644 index 000000000..79b0962ed --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Users/Events/IUserEventHandler.cs @@ -0,0 +1,16 @@ +using Orchard.Events; + +namespace Orchard.Users.Events { + public interface IUserEventHandler : IEventHandler { + /// + /// Called before a User is created + /// + void Creating(UserContext context); + + /// + /// Called once a user has been created + /// + void Created(UserContext context); + } +} + diff --git a/src/Orchard.Web/Modules/Orchard.Users/Events/UserContext.cs b/src/Orchard.Web/Modules/Orchard.Users/Events/UserContext.cs new file mode 100644 index 000000000..9ae60fae2 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Users/Events/UserContext.cs @@ -0,0 +1,8 @@ +using Orchard.Users.Models; + +namespace Orchard.Users.Events { + public class UserContext { + public UserPart User { get; set; } + public bool Cancel { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj b/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj index 1a605f92f..465342676 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj +++ b/src/Orchard.Web/Modules/Orchard.Users/Orchard.Users.csproj @@ -69,8 +69,10 @@ + + diff --git a/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs b/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs index 4b03289c5..6431db7f4 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Services/MembershipService.cs @@ -9,21 +9,26 @@ using Orchard.Logging; using Orchard.ContentManagement; using Orchard.Security; using Orchard.Users.Drivers; +using Orchard.Users.Events; using Orchard.Users.Models; using Orchard.Settings; using Orchard.Messaging.Services; +using System.Collections; +using System.Collections.Generic; namespace Orchard.Users.Services { [UsedImplicitly] public class MembershipService : IMembershipService { private readonly IContentManager _contentManager; private readonly IMessageManager _messageManager; + private readonly IEnumerable _userEventHandlers; private readonly IRepository _userRepository; - public MembershipService(IContentManager contentManager, IRepository userRepository, IMessageManager messageManager ) { + public MembershipService(IContentManager contentManager, IRepository userRepository, IMessageManager messageManager, IEnumerable userEventHandlers) { _contentManager = contentManager; _userRepository = userRepository; _messageManager = messageManager; + _userEventHandlers = userEventHandlers; Logger = NullLogger.Instance; } @@ -41,17 +46,30 @@ namespace Orchard.Users.Services { var registrationSettings = CurrentSite.As(); - var user = _contentManager.Create(UserPartDriver.ContentType.Name, init => - { - init.Record.UserName = createUserParams.Username; - init.Record.Email = createUserParams.Email; - init.Record.NormalizedUserName = createUserParams.Username.ToLower(); - init.Record.HashAlgorithm = "SHA1"; - SetPassword(init.Record, createUserParams.Password); - init.Record.RegistrationStatus = registrationSettings.UsersAreModerated ? UserStatus.Pending : UserStatus.Approved; - init.Record.EmailStatus = registrationSettings.UsersMustValidateEmail ? UserStatus.Pending : UserStatus.Approved; + var user = _contentManager.New(UserPartDriver.ContentType.Name); - }); + user.Record.UserName = createUserParams.Username; + user.Record.Email = createUserParams.Email; + user.Record.NormalizedUserName = createUserParams.Username.ToLower(); + user.Record.HashAlgorithm = "SHA1"; + SetPassword(user.Record, createUserParams.Password); + user.Record.RegistrationStatus = registrationSettings.UsersAreModerated ? UserStatus.Pending : UserStatus.Approved; + user.Record.EmailStatus = registrationSettings.UsersMustValidateEmail ? UserStatus.Pending : UserStatus.Approved; + + var userContext = new UserContext {User = user, Cancel = false}; + foreach(var userEventHandler in _userEventHandlers) { + userEventHandler.Creating(userContext); + } + + if(userContext.Cancel) { + return null; + } + + _contentManager.Create(user); + + foreach ( var userEventHandler in _userEventHandlers ) { + userEventHandler.Created(userContext); + } if ( registrationSettings.UsersMustValidateEmail ) { SendEmailValidationMessage(user);