Recaptcha for contact and registration page implemented
This commit is contained in:
@@ -11,21 +11,30 @@ namespace LeafWeb.WebCms.Controllers
|
||||
public ActionResult Index()
|
||||
{
|
||||
var viewModel = new ContactForm();
|
||||
return PartialView(viewModel);
|
||||
// if user is logged in, pre fill the name and email
|
||||
var member = Members.GetCurrentMember();
|
||||
if (member != null)
|
||||
{
|
||||
viewModel.Name = member.Name;
|
||||
viewModel.Email= (string)member.GetProperty("Email").Value;
|
||||
|
||||
}
|
||||
return PartialView(viewModel);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[ValidateRecaptcha]
|
||||
public ActionResult Submit(ContactForm viewModel)
|
||||
{
|
||||
if (ModelState.IsValid) // HttpParamMatch indicates it's backing out from Confirm
|
||||
if (ModelState.IsValid)
|
||||
{
|
||||
BackgroundJob.Enqueue<EmailNotificationService>(
|
||||
BackgroundJob.Enqueue<EmailNotificationService>(
|
||||
e => e.SendContactEmail(viewModel));
|
||||
|
||||
var logger = LogManager.GetLogger(GetType());
|
||||
logger.Info($"Contact: Name:{viewModel.Name} Added, Email:{viewModel.Email}, Message:{viewModel.Message}");
|
||||
|
||||
SetStatusMessage("Your message has been sent!", StatusType.Success);
|
||||
SetStatusMessage($"Thank you, {viewModel.Name}. Your message has been sent" , StatusType.Success);
|
||||
return RedirectToCurrentUmbracoPage();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.Security;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Web.Models;
|
||||
using Umbraco.Web.Mvc;
|
||||
|
||||
namespace LeafWeb.WebCms.Controllers
|
||||
{
|
||||
public class RegisterController : BaseController
|
||||
{
|
||||
[HttpPost]
|
||||
//[ValidateAntiForgeryToken]
|
||||
[ValidateRecaptcha]
|
||||
[ValidateUmbracoFormRouteString]
|
||||
public ActionResult HandleRegisterMember([Bind(Prefix = "registerModel")] RegisterModel model)
|
||||
{
|
||||
if (!this.ModelState.IsValid)
|
||||
return (ActionResult)this.CurrentUmbracoPage();
|
||||
if (string.IsNullOrEmpty(model.Name) && !string.IsNullOrEmpty(model.Email))
|
||||
model.Name = model.Email;
|
||||
MembershipCreateStatus status;
|
||||
this.Members.RegisterMember(model, out status, model.LoginOnSuccess);
|
||||
switch (status)
|
||||
{
|
||||
case MembershipCreateStatus.Success:
|
||||
this.TempData["FormSuccess"] = (object)true;
|
||||
return !model.RedirectUrl.IsNullOrWhiteSpace() ? (ActionResult)this.Redirect(model.RedirectUrl) : (ActionResult)this.RedirectToCurrentUmbracoPage();
|
||||
case MembershipCreateStatus.InvalidUserName:
|
||||
this.ModelState.AddModelError(model.UsernameIsEmail || model.Username == null ? "registerModel.Email" : "registerModel.Username", "Username is not valid");
|
||||
break;
|
||||
case MembershipCreateStatus.InvalidPassword:
|
||||
this.ModelState.AddModelError("registerModel.Password", "The password is not strong enough");
|
||||
break;
|
||||
case MembershipCreateStatus.InvalidQuestion:
|
||||
case MembershipCreateStatus.InvalidAnswer:
|
||||
throw new NotImplementedException(status.ToString());
|
||||
case MembershipCreateStatus.InvalidEmail:
|
||||
this.ModelState.AddModelError("registerModel.Email", "Email is invalid");
|
||||
break;
|
||||
case MembershipCreateStatus.DuplicateUserName:
|
||||
this.ModelState.AddModelError(model.UsernameIsEmail || model.Username == null ? "registerModel.Email" : "registerModel.Username", "A member with this username already exists.");
|
||||
break;
|
||||
case MembershipCreateStatus.DuplicateEmail:
|
||||
this.ModelState.AddModelError("registerModel.Email", "A member with this e-mail address already exists");
|
||||
break;
|
||||
case MembershipCreateStatus.UserRejected:
|
||||
case MembershipCreateStatus.InvalidProviderUserKey:
|
||||
case MembershipCreateStatus.DuplicateProviderUserKey:
|
||||
case MembershipCreateStatus.ProviderError:
|
||||
this.ModelState.AddModelError("registerModel", "An error occurred creating the member: " + (object)status);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
return (ActionResult)this.CurrentUmbracoPage();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Http.Results;
|
||||
using System.Web.Mvc;
|
||||
using hbehr.recaptcha;
|
||||
using log4net;
|
||||
using Umbraco.Web.Mvc;
|
||||
|
||||
namespace LeafWeb.WebCms.Controllers
|
||||
{
|
||||
public class ValidateRecaptchaAttribute : ActionFilterAttribute
|
||||
{
|
||||
public override void OnActionExecuting(ActionExecutingContext context)
|
||||
{
|
||||
if (context != null)
|
||||
{
|
||||
//https://github.com/henriqb/ReCaptcha-Asp-Net
|
||||
//https://stackoverflow.com/questions/58328542/trying-the-samesite-attribute-fix-for-the-google-recaptcha-v2-warning-on-chrome
|
||||
|
||||
var userResponse = context.RequestContext.HttpContext.Request.Params["g-recaptcha-response"];
|
||||
var validCaptcha = userResponse != null && ReCaptcha.ValidateCaptcha(userResponse);
|
||||
if (!validCaptcha)
|
||||
{
|
||||
context.Result = new System.Web.Mvc.RedirectResult("/error");
|
||||
}
|
||||
}
|
||||
base.OnActionExecuting(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user