diff --git a/WebCms/App_Data/Models/all.generated.cs b/WebCms/App_Data/Models/all.generated.cs index 3f98e66..a968de0 100644 --- a/WebCms/App_Data/Models/all.generated.cs +++ b/WebCms/App_Data/Models/all.generated.cs @@ -8,7 +8,7 @@ using Umbraco.Web; using Umbraco.ModelsBuilder; using Umbraco.ModelsBuilder.Umbraco; [assembly: PureLiveAssembly] -[assembly:ModelsBuilderAssembly(PureLive = true, SourceHash = "79624ab1619e0f80")] +[assembly:ModelsBuilderAssembly(PureLive = true, SourceHash = "94dd4dfa3bd286e0")] [assembly:System.Reflection.AssemblyVersion("0.0.0.1")] @@ -586,6 +586,15 @@ namespace Umbraco.Web.PublishedContentModels { get { return this.GetPropertyValue("umbracoMemberPasswordRetrievalQuestion"); } } + + /// + /// Verification Token + /// + [ImplementPropertyType("VerificationToken")] + public string VerificationToken + { + get { return this.GetPropertyValue("VerificationToken"); } + } } } diff --git a/WebCms/App_Data/Models/models.generated.cs b/WebCms/App_Data/Models/models.generated.cs index 881f16d..c484d78 100644 --- a/WebCms/App_Data/Models/models.generated.cs +++ b/WebCms/App_Data/Models/models.generated.cs @@ -19,7 +19,7 @@ using Umbraco.ModelsBuilder; using Umbraco.ModelsBuilder.Umbraco; [assembly: PureLiveAssembly] -[assembly:ModelsBuilderAssembly(PureLive = true, SourceHash = "79624ab1619e0f80")] +[assembly:ModelsBuilderAssembly(PureLive = true, SourceHash = "94dd4dfa3bd286e0")] [assembly:System.Reflection.AssemblyVersion("0.0.0.2")] namespace Umbraco.Web.PublishedContentModels @@ -570,6 +570,15 @@ namespace Umbraco.Web.PublishedContentModels { get { return this.GetPropertyValue("umbracoMemberPasswordRetrievalQuestion"); } } + + /// + /// Verification Token + /// + [ImplementPropertyType("VerificationToken")] + public string VerificationToken + { + get { return this.GetPropertyValue("VerificationToken"); } + } } } diff --git a/WebCms/App_Data/Models/models.hash b/WebCms/App_Data/Models/models.hash index e9c0a40..2272a44 100644 --- a/WebCms/App_Data/Models/models.hash +++ b/WebCms/App_Data/Models/models.hash @@ -1 +1 @@ -79624ab1619e0f80 \ No newline at end of file +94dd4dfa3bd286e0 \ No newline at end of file diff --git a/WebCms/EventHandlers/MemberEvents.cs b/WebCms/EventHandlers/MemberEvents.cs new file mode 100644 index 0000000..a5cb6de --- /dev/null +++ b/WebCms/EventHandlers/MemberEvents.cs @@ -0,0 +1,52 @@ +using Hangfire; +using LeafWeb.WebCms.Services; +using MlkPwgen; +using Umbraco.Core; +using Umbraco.Core.Events; +using Umbraco.Core.Models; +using Umbraco.Core.Services; + +namespace LeafWeb.WebCms.EventHandlers +{ + // https://our.umbraco.com/forum/umbraco-7/using-umbraco-7/64185-Assign-new-members-to-member-group-upon-registration#comment-254768 + public class MemberEvents : ApplicationEventHandler + { + protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) + { + base.ApplicationStarted(umbracoApplication, applicationContext); + MemberService.Created += MemberService_Created; + MemberService.Saving += MemberService_OnSaving; + } + + private void MemberService_OnSaving(IMemberService sender, SaveEventArgs e) + { + foreach (var member in e.SavedEntities) + { + // Member is not approved, don't send an email at all + if (!member.HasIdentity || !member.IsApproved) + continue; + + // Pull the old approval state from the member service (this is the value before the save has updated the cache) + var alreadyApproved = ApplicationContext.Current.Services.MemberService.GetById(member.Id).IsApproved; + + //Member wasn't approved before save but is now + if (!alreadyApproved) + { + //Code to send email goes here + } + } + } + + private void MemberService_Created(IMemberService sender, NewEventArgs e) + { + e.Entity.IsApproved = false; + var token = PasswordGenerator.Generate(12, allowed: "0123456789"); + e.Entity.SetValue("VerificationToken", token); + sender.Save(e.Entity); + + // Send Email + BackgroundJob.Enqueue( + email => email.SendVerifyMemberEmail(e.Entity.Email)); + } + } +} \ No newline at end of file diff --git a/WebCms/EventHandlers/MemberRegistrationEventHandler.cs b/WebCms/EventHandlers/MemberRegistrationEventHandler.cs deleted file mode 100644 index 8ffddfe..0000000 --- a/WebCms/EventHandlers/MemberRegistrationEventHandler.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Hangfire; -using LeafWeb.WebCms.Services; -using Umbraco.Core; -using Umbraco.Core.Events; -using Umbraco.Core.Models; -using Umbraco.Core.Services; - -namespace LeafWeb.WebCms.EventHandlers -{ - // https://our.umbraco.com/forum/umbraco-7/using-umbraco-7/64185-Assign-new-members-to-member-group-upon-registration#comment-254768 - public class MemberRegistrationEventHandler : ApplicationEventHandler - { - protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) - { - base.ApplicationStarted(umbracoApplication, applicationContext); - MemberService.Created += MemberService_Created; - } - - private void MemberService_Created(IMemberService sender, NewEventArgs e) - { - sender.AssignRole(e.Entity.Username, "Unverified"); - sender.Save(e.Entity); - - // Send Email - BackgroundJob.Enqueue( - email => email.SendVerifyMemberEmail(e.Entity)); - } - } -} \ No newline at end of file diff --git a/WebCms/Services/DownloadUrlService.cs b/WebCms/Services/DownloadUrlService.cs deleted file mode 100644 index 37a9c2f..0000000 --- a/WebCms/Services/DownloadUrlService.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Configuration; -using LeafWeb.Core.Entities; - -namespace LeafWeb.WebCms.Services -{ - public class DownloadUrlService - { - private readonly string _downloadUrl; - - public DownloadUrlService() - { - _downloadUrl = - ConfigurationManager.AppSettings["LeafWebUrl"] - + ConfigurationManager.AppSettings["ResultsDownloadPath"]; - } - - public string GetDownloadUrl(LeafInput leafInput) - { - return string.Format(_downloadUrl, leafInput.UniqueToken); - } - } -} \ No newline at end of file diff --git a/WebCms/Services/EmailNotificationService.cs b/WebCms/Services/EmailNotificationService.cs index a91b571..3775e3f 100644 --- a/WebCms/Services/EmailNotificationService.cs +++ b/WebCms/Services/EmailNotificationService.cs @@ -7,7 +7,11 @@ using LeafWeb.Core.DAL; using LeafWeb.Core.Entities; using LeafWeb.Core.Utility; using LeafWeb.WebCms.Models; +using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Web; +using Umbraco.Web.PublishedCache; +using Umbraco.Web.Security; namespace LeafWeb.WebCms.Services { @@ -32,7 +36,7 @@ namespace LeafWeb.WebCms.Services private readonly DataService _dataService; - private readonly DownloadUrlService _downloadUrlService; + private readonly UrlService _urlService; private string FormatSubject(string subject, LeafInput leafInput) { @@ -43,7 +47,7 @@ namespace LeafWeb.WebCms.Services { _dataService = dataService; - _downloadUrlService = new DownloadUrlService(); + _urlService = new UrlService(); _smtpClient = new SmtpClient( ConfigurationManager.AppSettings["SmtpHost"], @@ -114,7 +118,7 @@ namespace LeafWeb.WebCms.Services if (downloadLink) { - var downloadUrl = _downloadUrlService.GetDownloadUrl(leafInput); + var downloadUrl = _urlService.GetDownloadUrl(leafInput); body += "Download results with the following link:" @@ -197,12 +201,18 @@ namespace LeafWeb.WebCms.Services SendMessage(message); } - public void SendVerifyMemberEmail(IMember member) + public void SendVerifyMemberEmail(string memberEmail) { - // TODO: write verify email to user + var servicesMemberService = ApplicationContext.Current.Services.MemberService; + var member = servicesMemberService.GetByEmail(memberEmail); + var verifyEmailURl = _urlService.GetVerifyEmailURl(member); + var body = "Please verify your email address with this link " + verifyEmailURl; + + var message = new MailMessage(_emailFromAddress, member.Email, "Verify your email for LeafWeb", body); + SendMessage(message); } - private string FormatWarningMessage(LeafInput leafInput) + private string FormatWarningMessage(LeafInput leafInput) { if (leafInput.OutputWarningMessage != null) return Environment.NewLine + Environment.NewLine @@ -230,5 +240,6 @@ namespace LeafWeb.WebCms.Services { _dataService.Dispose(); } - } + + } } \ No newline at end of file diff --git a/WebCms/Services/UrlService.cs b/WebCms/Services/UrlService.cs new file mode 100644 index 0000000..10ca698 --- /dev/null +++ b/WebCms/Services/UrlService.cs @@ -0,0 +1,33 @@ +using System.Configuration; +using LeafWeb.Core.Entities; +using Umbraco.Core.Models; +using Umbraco.Web.PublishedCache; + +namespace LeafWeb.WebCms.Services +{ + public class UrlService + { + private readonly string _downloadUrl; + private readonly string _verifyEmailUrl; + + public UrlService() + { + _downloadUrl = + ConfigurationManager.AppSettings["LeafWebUrl"] + + ConfigurationManager.AppSettings["ResultsDownloadPath"]; + } + + public string GetDownloadUrl(LeafInput leafInput) + { + return string.Format(_downloadUrl, leafInput.UniqueToken); + } + + public string GetVerifyEmailURl(IMember member) + { + var memberEmail = member.Email; + var token = member.GetValue("VerificationToken") as string; + var verifyEmailToken = _downloadUrl + "/verify?email={0}&token={1}"; + return string.Format(verifyEmailToken, memberEmail, token); + } + } +} \ No newline at end of file diff --git a/WebCms/WebCms.csproj b/WebCms/WebCms.csproj index ef5bb59..f85f846 100644 --- a/WebCms/WebCms.csproj +++ b/WebCms/WebCms.csproj @@ -187,6 +187,9 @@ ..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll True + + ..\packages\MlkPwgen.0.3.0\lib\net45\MlkPwgen.dll + ..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll True @@ -1097,7 +1100,7 @@ - + @@ -1106,7 +1109,7 @@ - + diff --git a/WebCms/packages.config b/WebCms/packages.config index 798889b..573c11c 100644 --- a/WebCms/packages.config +++ b/WebCms/packages.config @@ -54,6 +54,7 @@ +