From a2bce4e7c6cea2cb6edd4ae3ee28cc02860bbe2c Mon Sep 17 00:00:00 2001 From: VINAYAK NEVAGE Date: Sat, 7 Sep 2024 21:16:31 +0530 Subject: [PATCH] fixed/ email issue --- src/lib/isEmail.js | 115 ++++++--------------------------------------- 1 file changed, 14 insertions(+), 101 deletions(-) diff --git a/src/lib/isEmail.js b/src/lib/isEmail.js index 9d89f8db3..d71373360 100644 --- a/src/lib/isEmail.js +++ b/src/lib/isEmail.js @@ -1,5 +1,4 @@ import assertString from './util/assertString'; - import isByteLength from './isByteLength'; import isFQDN from './isFQDN'; import isIP from './isIP'; @@ -17,49 +16,8 @@ const default_email_options = { host_whitelist: [], }; -/* eslint-disable max-len */ -/* eslint-disable no-control-regex */ -const splitNameAddress = /^([^\x00-\x1F\x7F-\x9F\cX]+)]/.test(display_name_without_quotes); - if (contains_illegal) { - // if contains illegal characters, - // must to be enclosed in double-quotes, otherwise it's not a valid display name - if (display_name_without_quotes === display_name) { - return false; - } - - // the quotes in display name must start with character symbol \ - const all_start_with_back_slash = - display_name_without_quotes.split('"').length === display_name_without_quotes.split('\\"').length; - if (!all_start_with_back_slash) { - return false; - } - } - - return true; -} - +const quotedEmailUser = /^([\s\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i; // stricter pattern export default function isEmail(str, options) { assertString(str); @@ -70,14 +28,8 @@ export default function isEmail(str, options) { if (display_email) { let display_name = display_email[1]; - // Remove display name and angle brackets to get email address - // Can be done in the regex but will introduce a ReDOS (See #1597 for more info) str = str.replace(display_name, '').replace(/(^<|>$)/g, ''); - // sometimes need to trim the last space to get the display name - // because there may be a space between display name and email address - // eg. myname - // the display name is `myname` instead of `myname `, so need to trim the last space if (display_name.endsWith(' ')) { display_name = display_name.slice(0, -1); } @@ -89,42 +41,30 @@ export default function isEmail(str, options) { return false; } } + if (!options.ignore_max_length && str.length > defaultMaxEmailLength) { return false; } const parts = str.split('@'); - const domain = parts.pop(); - const lower_domain = domain.toLowerCase(); + const domain = parts.pop().toLowerCase(); - if (options.host_blacklist.includes(lower_domain)) { + if (options.host_blacklist.includes(domain)) { return false; } - if (options.host_whitelist.length > 0 && !options.host_whitelist.includes(lower_domain)) { + if (options.host_whitelist.length > 0 && !options.host_whitelist.includes(domain)) { return false; } let user = parts.join('@'); - if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) { - /* - Previously we removed dots for gmail addresses before validating. - This was removed because it allows `multiple..dots@gmail.com` - to be reported as valid, but it is not. - Gmail only normalizes single dots, removing them from here is pointless, - should be done in normalizeEmail - */ + if (options.domain_specific_validation && (domain === 'gmail.com' || domain === 'googlemail.com')) { user = user.toLowerCase(); - - // Removing sub-address from username before gmail validation const username = user.split('+')[0]; - - // Dots are not included in gmail length restriction if (!isByteLength(username.replace(/\./g, ''), { min: 6, max: 30 })) { return false; } - const user_parts = username.split('.'); for (let i = 0; i < user_parts.length; i++) { if (!gmailUserPart.test(user_parts[i])) { @@ -133,49 +73,22 @@ export default function isEmail(str, options) { } } - if (options.ignore_max_length === false && ( - !isByteLength(user, { max: 64 }) || - !isByteLength(domain, { max: 254 })) - ) { - return false; - } - - if (!isFQDN(domain, { - require_tld: options.require_tld, - ignore_max_length: options.ignore_max_length, - allow_underscores: options.allow_underscores, - })) { - if (!options.allow_ip_domain) { + if (!isFQDN(domain, { require_tld: options.require_tld })) { + if (!options.allow_ip_domain || !isIP(domain)) { return false; } - - if (!isIP(domain)) { - if (!domain.startsWith('[') || !domain.endsWith(']')) { - return false; - } - - let noBracketdomain = domain.slice(1, -1); - - if (noBracketdomain.length === 0 || !isIP(noBracketdomain)) { - return false; - } - } } - if (options.blacklisted_chars) { - if (user.search(new RegExp(`[${options.blacklisted_chars}]+`, 'g')) !== -1) return false; + if (options.blacklisted_chars && user.search(new RegExp(`[${options.blacklisted_chars}]`, 'g')) !== -1) { + return false; } - if (user[0] === '"') { - user = user.slice(1, user.length - 1); - return options.allow_utf8_local_part ? - quotedEmailUserUtf8.test(user) : - quotedEmailUser.test(user); + if (user[0] === '"' && user[user.length - 1] === '"') { + user = user.slice(1, -1); + return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user); } - const pattern = options.allow_utf8_local_part ? - emailUserUtf8Part : emailUserPart; - + const pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart; const user_parts = user.split('.'); for (let i = 0; i < user_parts.length; i++) { if (!pattern.test(user_parts[i])) {