Add VerificationToken for new members
This commit is contained in:
@@ -8,7 +8,7 @@ using Umbraco.Web;
|
|||||||
using Umbraco.ModelsBuilder;
|
using Umbraco.ModelsBuilder;
|
||||||
using Umbraco.ModelsBuilder.Umbraco;
|
using Umbraco.ModelsBuilder.Umbraco;
|
||||||
[assembly: PureLiveAssembly]
|
[assembly: PureLiveAssembly]
|
||||||
[assembly:ModelsBuilderAssembly(PureLive = true, SourceHash = "79624ab1619e0f80")]
|
[assembly:ModelsBuilderAssembly(PureLive = true, SourceHash = "94dd4dfa3bd286e0")]
|
||||||
[assembly:System.Reflection.AssemblyVersion("0.0.0.1")]
|
[assembly:System.Reflection.AssemblyVersion("0.0.0.1")]
|
||||||
|
|
||||||
|
|
||||||
@@ -586,6 +586,15 @@ namespace Umbraco.Web.PublishedContentModels
|
|||||||
{
|
{
|
||||||
get { return this.GetPropertyValue<string>("umbracoMemberPasswordRetrievalQuestion"); }
|
get { return this.GetPropertyValue<string>("umbracoMemberPasswordRetrievalQuestion"); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///<summary>
|
||||||
|
/// Verification Token
|
||||||
|
///</summary>
|
||||||
|
[ImplementPropertyType("VerificationToken")]
|
||||||
|
public string VerificationToken
|
||||||
|
{
|
||||||
|
get { return this.GetPropertyValue<string>("VerificationToken"); }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ using Umbraco.ModelsBuilder;
|
|||||||
using Umbraco.ModelsBuilder.Umbraco;
|
using Umbraco.ModelsBuilder.Umbraco;
|
||||||
|
|
||||||
[assembly: PureLiveAssembly]
|
[assembly: PureLiveAssembly]
|
||||||
[assembly:ModelsBuilderAssembly(PureLive = true, SourceHash = "79624ab1619e0f80")]
|
[assembly:ModelsBuilderAssembly(PureLive = true, SourceHash = "94dd4dfa3bd286e0")]
|
||||||
[assembly:System.Reflection.AssemblyVersion("0.0.0.2")]
|
[assembly:System.Reflection.AssemblyVersion("0.0.0.2")]
|
||||||
|
|
||||||
namespace Umbraco.Web.PublishedContentModels
|
namespace Umbraco.Web.PublishedContentModels
|
||||||
@@ -570,6 +570,15 @@ namespace Umbraco.Web.PublishedContentModels
|
|||||||
{
|
{
|
||||||
get { return this.GetPropertyValue<string>("umbracoMemberPasswordRetrievalQuestion"); }
|
get { return this.GetPropertyValue<string>("umbracoMemberPasswordRetrievalQuestion"); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///<summary>
|
||||||
|
/// Verification Token
|
||||||
|
///</summary>
|
||||||
|
[ImplementPropertyType("VerificationToken")]
|
||||||
|
public string VerificationToken
|
||||||
|
{
|
||||||
|
get { return this.GetPropertyValue<string>("VerificationToken"); }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
79624ab1619e0f80
|
94dd4dfa3bd286e0
|
||||||
@@ -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<IMember> 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<IMember> 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<EmailNotificationService>(
|
||||||
|
email => email.SendVerifyMemberEmail(e.Entity.Email));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<IMember> e)
|
|
||||||
{
|
|
||||||
sender.AssignRole(e.Entity.Username, "Unverified");
|
|
||||||
sender.Save(e.Entity);
|
|
||||||
|
|
||||||
// Send Email
|
|
||||||
BackgroundJob.Enqueue<EmailNotificationService>(
|
|
||||||
email => email.SendVerifyMemberEmail(e.Entity));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,7 +7,11 @@ using LeafWeb.Core.DAL;
|
|||||||
using LeafWeb.Core.Entities;
|
using LeafWeb.Core.Entities;
|
||||||
using LeafWeb.Core.Utility;
|
using LeafWeb.Core.Utility;
|
||||||
using LeafWeb.WebCms.Models;
|
using LeafWeb.WebCms.Models;
|
||||||
|
using Umbraco.Core;
|
||||||
using Umbraco.Core.Models;
|
using Umbraco.Core.Models;
|
||||||
|
using Umbraco.Web;
|
||||||
|
using Umbraco.Web.PublishedCache;
|
||||||
|
using Umbraco.Web.Security;
|
||||||
|
|
||||||
namespace LeafWeb.WebCms.Services
|
namespace LeafWeb.WebCms.Services
|
||||||
{
|
{
|
||||||
@@ -32,7 +36,7 @@ namespace LeafWeb.WebCms.Services
|
|||||||
|
|
||||||
private readonly DataService _dataService;
|
private readonly DataService _dataService;
|
||||||
|
|
||||||
private readonly DownloadUrlService _downloadUrlService;
|
private readonly UrlService _urlService;
|
||||||
|
|
||||||
private string FormatSubject(string subject, LeafInput leafInput)
|
private string FormatSubject(string subject, LeafInput leafInput)
|
||||||
{
|
{
|
||||||
@@ -43,7 +47,7 @@ namespace LeafWeb.WebCms.Services
|
|||||||
{
|
{
|
||||||
_dataService = dataService;
|
_dataService = dataService;
|
||||||
|
|
||||||
_downloadUrlService = new DownloadUrlService();
|
_urlService = new UrlService();
|
||||||
|
|
||||||
_smtpClient = new SmtpClient(
|
_smtpClient = new SmtpClient(
|
||||||
ConfigurationManager.AppSettings["SmtpHost"],
|
ConfigurationManager.AppSettings["SmtpHost"],
|
||||||
@@ -114,7 +118,7 @@ namespace LeafWeb.WebCms.Services
|
|||||||
|
|
||||||
if (downloadLink)
|
if (downloadLink)
|
||||||
{
|
{
|
||||||
var downloadUrl = _downloadUrlService.GetDownloadUrl(leafInput);
|
var downloadUrl = _urlService.GetDownloadUrl(leafInput);
|
||||||
|
|
||||||
body +=
|
body +=
|
||||||
"Download results with the following link:"
|
"Download results with the following link:"
|
||||||
@@ -197,12 +201,18 @@ namespace LeafWeb.WebCms.Services
|
|||||||
SendMessage(message);
|
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)
|
if (leafInput.OutputWarningMessage != null)
|
||||||
return Environment.NewLine + Environment.NewLine
|
return Environment.NewLine + Environment.NewLine
|
||||||
@@ -230,5 +240,6 @@ namespace LeafWeb.WebCms.Services
|
|||||||
{
|
{
|
||||||
_dataService.Dispose();
|
_dataService.Dispose();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -187,6 +187,9 @@
|
|||||||
<HintPath>..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll</HintPath>
|
<HintPath>..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="MlkPwgen, Version=0.3.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\MlkPwgen.0.3.0\lib\net45\MlkPwgen.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
|
<Reference Include="MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll</HintPath>
|
<HintPath>..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
@@ -1097,7 +1100,7 @@
|
|||||||
<Compile Include="Controllers\LeafWebPageIds.cs" />
|
<Compile Include="Controllers\LeafWebPageIds.cs" />
|
||||||
<Compile Include="Controllers\QueueController.cs" />
|
<Compile Include="Controllers\QueueController.cs" />
|
||||||
<Compile Include="Controllers\ResultsController.cs" />
|
<Compile Include="Controllers\ResultsController.cs" />
|
||||||
<Compile Include="EventHandlers\MemberRegistrationEventHandler.cs" />
|
<Compile Include="EventHandlers\MemberEvents.cs" />
|
||||||
<Compile Include="Models\ChartViewModel.cs" />
|
<Compile Include="Models\ChartViewModel.cs" />
|
||||||
<Compile Include="Models\ContactForm.cs" />
|
<Compile Include="Models\ContactForm.cs" />
|
||||||
<Compile Include="Models\LeafInputDetails.cs" />
|
<Compile Include="Models\LeafInputDetails.cs" />
|
||||||
@@ -1106,7 +1109,7 @@
|
|||||||
<Compile Include="Models\QueueViewModel.cs" />
|
<Compile Include="Models\QueueViewModel.cs" />
|
||||||
<Compile Include="Models\SelectListViewModel.cs" />
|
<Compile Include="Models\SelectListViewModel.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Services\DownloadUrlService.cs" />
|
<Compile Include="Services\UrlService.cs" />
|
||||||
<Compile Include="Services\EmailNotificationService.cs" />
|
<Compile Include="Services\EmailNotificationService.cs" />
|
||||||
<Compile Include="Services\LeafGasCharter.cs" />
|
<Compile Include="Services\LeafGasCharter.cs" />
|
||||||
<Compile Include="Services\PiscalQueue\FinishComplete.cs" />
|
<Compile Include="Services\PiscalQueue\FinishComplete.cs" />
|
||||||
|
|||||||
@@ -54,6 +54,7 @@
|
|||||||
<package id="Microsoft.Owin.Security.OAuth" version="4.1.0" targetFramework="net452" />
|
<package id="Microsoft.Owin.Security.OAuth" version="4.1.0" targetFramework="net452" />
|
||||||
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net452" />
|
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net452" />
|
||||||
<package id="MiniProfiler" version="2.1.0" targetFramework="net452" />
|
<package id="MiniProfiler" version="2.1.0" targetFramework="net452" />
|
||||||
|
<package id="MlkPwgen" version="0.3.0" targetFramework="net452" />
|
||||||
<package id="MySql.Data" version="6.9.9" targetFramework="net452" />
|
<package id="MySql.Data" version="6.9.9" targetFramework="net452" />
|
||||||
<package id="NETStandard.Library" version="2.0.3" targetFramework="net452" />
|
<package id="NETStandard.Library" version="2.0.3" targetFramework="net452" />
|
||||||
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net452" />
|
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net452" />
|
||||||
|
|||||||
Reference in New Issue
Block a user