From 322bd4e41e4ef004daf48df85fad3dc9abac8fcc Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 7 Jan 2015 14:32:39 +1100 Subject: [PATCH] Fixes: U4-5717 Member email validation does not allow valid domains (Umbraco 7.1.4) --- .../validation/valemail.directive.js | 44 +++++++++++++++++++ .../views/propertyeditors/email/email.html | 5 ++- .../unit/common/directives/val-email.spec.js | 34 ++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/validation/valemail.directive.js create mode 100644 src/Umbraco.Web.UI.Client/test/unit/common/directives/val-email.spec.js diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valemail.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valemail.directive.js new file mode 100644 index 0000000000..7f3e3a75c2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valemail.directive.js @@ -0,0 +1,44 @@ +/** + * @ngdoc directive + * @name umbraco.directives.directive:valEmail + * @restrict A + * @description A custom directive to validate an email address string, this is required because angular's default validator is incorrect. + **/ +function valEmail(valEmailExpression) { + + return { + require: 'ngModel', + restrict: "A", + link: function (scope, elm, attrs, ctrl) { + + var patternValidator = function (viewValue) { + //NOTE: we don't validate on empty values, use required validator for that + if (!viewValue || valEmailExpression.EMAIL_REGEXP.test(viewValue)) { + // it is valid + ctrl.$setValidity('valEmail', true); + //assign a message to the validator + ctrl.errorMsg = ""; + return viewValue; + } + else { + // it is invalid, return undefined (no model update) + ctrl.$setValidity('valEmail', false); + //assign a message to the validator + ctrl.errorMsg = "Invalid email"; + return undefined; + } + }; + + ctrl.$formatters.push(patternValidator); + ctrl.$parsers.push(patternValidator); + } + }; +} + +angular.module('umbraco.directives') + .directive("valEmail", valEmail) + .factory('valEmailExpression', function() { + return { + EMAIL_REGEXP: /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i + }; + }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/email/email.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/email/email.html index f93b4c7a9a..0081d6ac26 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/email/email.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/email/email.html @@ -1,13 +1,14 @@ 
- Required - Invalid email + Invalid email
diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/directives/val-email.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/directives/val-email.spec.js new file mode 100644 index 0000000000..265689988d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/test/unit/common/directives/val-email.spec.js @@ -0,0 +1,34 @@ +describe('valEmail directive tests', function() { + + var valEmailExpression; + + beforeEach(module('umbraco')); + + beforeEach(inject(function ($injector) { + //TODO: I have no idea why this doesn't work!!?? it freakin should + //valEmailExpression = $injector.get('valEmailExpression'); + + //in the meantime, i've had to hard code the regex statement here + valEmailExpression = { + EMAIL_REGEXP: /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i + }; + + })); + + describe('EMAIL_REGEXP', function () { + /* global EMAIL_REGEXP: false */ + it('should validate email', function () { + expect(valEmailExpression.EMAIL_REGEXP.test('a@b.com')).toBe(true); + expect(valEmailExpression.EMAIL_REGEXP.test('a@b.museum')).toBe(true); + expect(valEmailExpression.EMAIL_REGEXP.test('a@B.c')).toBe(true); + expect(valEmailExpression.EMAIL_REGEXP.test('a@.b.c')).toBe(false); + expect(valEmailExpression.EMAIL_REGEXP.test('a@-b.c')).toBe(false); + expect(valEmailExpression.EMAIL_REGEXP.test('a@b-.c')).toBe(false); + expect(valEmailExpression.EMAIL_REGEXP.test('a@3b.c')).toBe(true); + expect(valEmailExpression.EMAIL_REGEXP.test('a@b')).toBe(true); + expect(valEmailExpression.EMAIL_REGEXP.test('abc@xyz.financial')).toBe(true); + + }); + }); + +}); \ No newline at end of file