From 51cfb48c752de9d56197aca5aefb0879f5d24d8a Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 19 Jun 2019 15:12:27 +0200 Subject: [PATCH] Show error when role-based email is used [MAILPOET-2101] --- .../src/subscribers/importExport/import.jsx | 9 +++- .../importExport/import/sanitize_csv_data.jsx | 43 +++++++++++++++++++ views/subscribers/importExport/import.html | 1 + .../import/step_data_manipulation.html | 3 ++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/assets/js/src/subscribers/importExport/import.jsx b/assets/js/src/subscribers/importExport/import.jsx index d5eeffba92..0821e7adc3 100644 --- a/assets/js/src/subscribers/importExport/import.jsx +++ b/assets/js/src/subscribers/importExport/import.jsx @@ -126,7 +126,7 @@ jQuery(document).ready(() => { jQuery('#subscribers_data_import_results:visible').hide(); // show parse statistics if any duplicate/invalid records were found - if (subscribers.invalid.length || subscribers.duplicate.length) { + if (subscribers.invalid.length || subscribers.duplicate.length || subscribers.role.length) { // count repeating e-mails inside duplicate array and present them in // 'email (xN)' format duplicates = {}; @@ -145,7 +145,7 @@ jQuery(document).ready(() => { importResults = { notice: MailPoet.I18n.t('importNoticeSkipped').replace( '%1$s', - `${subscribers.invalid.length + subscribers.duplicate.length}` + `${subscribers.invalid.length + subscribers.duplicate.length + subscribers.role.length}` ), invalid: (subscribers.invalid.length) ? MailPoet.I18n.t('importNoticeInvalid') @@ -157,6 +157,11 @@ jQuery(document).ready(() => { .replace('%1$s', `${subscribers.duplicate.length}`) .replace('%2$s', subscribers.duplicate.join(', ')) : null, + role: (subscribers.role.length) + ? MailPoet.I18n.t('importNoticeRoleBased') + .replace('%1$s', `${subscribers.role.length.toLocaleString()}`) + .replace('%2$s', subscribers.role.join(', ')) + : null, }; jQuery('#subscribers_data_parse_results').html( subscribersDataParseResultsTemplate(importResults) diff --git a/assets/js/src/subscribers/importExport/import/sanitize_csv_data.jsx b/assets/js/src/subscribers/importExport/import/sanitize_csv_data.jsx index 315eea1ef0..6d68c09554 100644 --- a/assets/js/src/subscribers/importExport/import/sanitize_csv_data.jsx +++ b/assets/js/src/subscribers/importExport/import/sanitize_csv_data.jsx @@ -3,6 +3,42 @@ import jQuery from 'jquery'; import _ from 'underscore'; +const ROLE_EMAILS = [ + 'abuse', + 'compliance', + 'devnull', + 'dns', + 'ftp', + 'hostmaster', + 'inoc', + 'ispfeedback', + 'ispsupport', + 'list-request', + 'list', + 'maildaemon', + 'noc', + 'no-reply', + 'noreply', + 'null', + 'phish', + 'phishing', + 'postmaster', + 'privacy', + 'registrar', + 'root', + 'security', + 'spam', + 'sysadmin', + 'undisclosed-recipients', + 'unsubscribe', + 'usenet', + 'uucp', + 'webmaster', + 'www', +]; + +const isRoleEmail = email => ROLE_EMAILS.findIndex(element => email.startsWith(element)) >= 0; + const detectAndCleanupEmail = (emailString) => { let test; // decode HTML entities @@ -31,6 +67,9 @@ const detectAndCleanupEmail = (emailString) => { if (!window.mailpoet_email_regex.test(email)) { return false; } + if (isRoleEmail(email)) { + return false; + } return email; }; @@ -39,6 +78,7 @@ function sanitizeCSVData(csvData) { const parsedEmails = []; const duplicateEmails = []; const invalidEmails = []; + const roleEmails = []; let emailColumnPosition = null; let columnCount = null; let isHeaderFound = false; @@ -82,6 +122,8 @@ function sanitizeCSVData(csvData) { email = detectAndCleanupEmail(rowData[emailColumnPosition]); if (_.has(parsedEmails, email)) { duplicateEmails.push(email); + } else if (isRoleEmail(rowData[emailColumnPosition])) { + roleEmails.push(rowData[emailColumnPosition]); } else if (!window.mailpoet_email_regex.test(email)) { invalidEmails.push(rowData[emailColumnPosition]); } else { @@ -116,6 +158,7 @@ function sanitizeCSVData(csvData) { subscribersCount: processedSubscribers.length, duplicate: duplicateEmails, invalid: invalidEmails, + role: roleEmails, }; } return null; diff --git a/views/subscribers/importExport/import.html b/views/subscribers/importExport/import.html index 19511613b6..277451ef98 100644 --- a/views/subscribers/importExport/import.html +++ b/views/subscribers/importExport/import.html @@ -44,6 +44,7 @@ 'noValidRecords': __('No valid records were found. This file needs to be formatted in a CSV style (comma-separated). Look at some [link]examples on our support site.[/link]'), 'importNoticeSkipped': __('%1$s records had issues and were skipped.'), 'importNoticeInvalid': __('%1$s emails are not valid: %2$s'), +'importNoticeRoleBased': _x('%1$s role-based addresses are not permitted: %2$s', 'Error message when importing addresses like postmaster@domain.com'), 'importNoticeDuplicate': __('%1$s emails appear more than once in your file: %2$s'), 'hideDetails': __('Hide details'), 'showDetails': __('Show more details'), diff --git a/views/subscribers/importExport/import/step_data_manipulation.html b/views/subscribers/importExport/import/step_data_manipulation.html index 159b1af4c3..7f185ce6ea 100644 --- a/views/subscribers/importExport/import/step_data_manipulation.html +++ b/views/subscribers/importExport/import/step_data_manipulation.html @@ -14,6 +14,9 @@ {{#if invalid}}

{{{invalid}}}

{{/if}} + {{#if role}} +

{{{role}}}

+ {{/if}}