PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.1.0
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.1.0
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
← All changes | back/Helpers/ImportHelper.php +61 -30 11.0.5 → 11.1.0 View file →
@@ -48,9 +48,9 @@
48 48 }
49 49
50 50 $extension = strtolower(acym_fileGetExt($importFile['name']));
51 51
52 - if (!preg_match('#^(csv)$#Ui', $extension) || preg_match('#\.(php.?|.?htm.?|pl|py|jsp|asp|sh|cgi)$#Ui', $importFile['name'])) {
52 + if (!preg_match('#^(csv)$#Ui', $extension) || acym_isForbiddenFileExtension($importFile['name'])) {
53 53 acym_enqueueMessage(acym_translationSprintf('ACYM_ACCEPTED_TYPE', esc_html($extension), $this->config->get('allowed_files')), 'error');
54 54
55 55 return false;
56 56 }
@@ -114,9 +114,9 @@
114 114 {
115 115 global $acymCmsUserVars;
116 116
117 117 //Update the users which already have a userid
118 - $query = 'UPDATE IGNORE '.$acymCmsUserVars->table.' as b, #__acym_user as a SET a.email = b.'.$acymCmsUserVars->email.', a.name = b.'.$acymCmsUserVars->name.', a.active = 1 - b.'.$acymCmsUserVars->blocked.' WHERE a.cms_id = b.'.$acymCmsUserVars->id.' AND a.cms_id IS NOT NULL';
118 + $query = 'UPDATE IGNORE '.$acymCmsUserVars->table.' as b, #__acym_user as a SET a.email = LOWER(b.'.$acymCmsUserVars->email.'), a.name = b.'.$acymCmsUserVars->name.', a.active = 1 - b.'.$acymCmsUserVars->blocked.' WHERE a.cms_id = b.'.$acymCmsUserVars->id.' AND a.cms_id IS NOT NULL';
119 119 $nbUpdated = acym_query($query);
120 120
121 121 //Step 1 : update the existing ones.
122 122 //Update the users to give them a userid
@@ -142,9 +142,9 @@
142 142 //Step 3 : insert the new ones
143 143 $time = time();
144 144 $formattedTime = acym_date($time, 'Y-m-d H:i:s');
145 145 $sourceImport = 'Import on '.$formattedTime;
146 - $query = 'INSERT IGNORE INTO #__acym_user (`name`,`email`,`creation_date`,`active`,`cms_id`, `source`) SELECT `user`.`'.$acymCmsUserVars->name.'`,`user`.`'.$acymCmsUserVars->email.'`,`user`.`'.$acymCmsUserVars->registered.'`,1 - `user`.'.$acymCmsUserVars->blocked.',`user`.`'.$acymCmsUserVars->id.'`,\''.$sourceImport.'\' FROM '.$acymCmsUserVars->table.' AS `user` ';
146 + $query = 'INSERT IGNORE INTO #__acym_user (`name`,`email`,`creation_date`,`active`,`cms_id`, `source`) SELECT `user`.`'.$acymCmsUserVars->name.'`,LOWER(`user`.`'.$acymCmsUserVars->email.'`),`user`.`'.$acymCmsUserVars->registered.'`,1 - `user`.'.$acymCmsUserVars->blocked.',`user`.`'.$acymCmsUserVars->id.'`,\''.$sourceImport.'\' FROM '.$acymCmsUserVars->table.' AS `user` ';
147 147
148 148 $queryJoin = [];
149 149 $queryWhere = [];
150 150 if (ACYM_CMS === 'wordpress' && is_multisite()) {
@@ -280,10 +280,13 @@
280 280
281 281 $sourceTxt = 'Import on '.$formattedTime;
282 282 $select['`source`'] = acym_escapeDB($sourceTxt);
283 283
284 + $emailColumn = acym_secureDBColumn($select['`email`']);
285 + $select['`email`'] = 'LOWER('.$emailColumn.')';
286 +
284 287 $query = 'INSERT IGNORE INTO #__acym_user ('.implode(' , ', array_keys($select)).') SELECT '.implode(' , ', $select);
285 - $query .= ' FROM '.acym_secureDBColumn($table).' WHERE '.acym_secureDBColumn($select['`email`']).' LIKE "%@%"';
288 + $query .= ' FROM '.acym_secureDBColumn($table).' WHERE '.$emailColumn.' LIKE "%@%"';
286 289 if (!empty($this->dbWhere)) {
287 290 $query .= ' AND ( '.implode(' ) AND (', $this->dbWhere).' )';
288 291 }
289 292
@@ -318,9 +321,9 @@
318 321 $query = 'INSERT IGNORE INTO #__acym_user_has_list (`user_id`,`list_id`,`status`,`subscription_date`) ';
319 322 $query .= 'SELECT user.`id`, list.`id`, 1, '.acym_escapeDB(gmdate('Y-m-d H:i:s', time())).'
320 323 FROM #__acym_list AS list, #__acym_user AS user
321 324 WHERE list.`id` IN ('.implode(',', $listsSubscribe).')
322 - AND user.`email` IN (SELECT '.acym_secureDBColumn($select['`email`']).' FROM '.acym_secureDBColumn($table).')';
325 + AND user.`email` IN (SELECT LOWER('.$emailColumn.') FROM '.acym_secureDBColumn($table).')';
323 326
324 327 $nbsubscribed = acym_query($query);
325 328 acym_enqueueMessage(acym_translationSprintf('ACYM_IMPORT_SUBSCRIPTION', $nbsubscribed));
326 329
@@ -335,9 +338,9 @@
335 338 $sourceImport = 'import_on_'.$formattedTime.'_mailpoet';
336 339
337 340 $query = 'INSERT IGNORE INTO #__acym_user (`name`,`email`,`creation_date`,`active`, `confirmed`,`cms_id`, `source`)
338 341 SELECT CONCAT(`subscriber`.`first_name`, `subscriber`.`last_name`),
339 - `subscriber`.`email`,
342 + LOWER(`subscriber`.`email`),
340 343 `subscriber`.`created_at`,
341 344 IF(`subscriber`.`status` = "inactive", 0, 1),
342 345 IF(`subscriber`.`status` = "subscribed", 1, 0),
343 346 `subscriber`.`wp_user_id`,
@@ -501,34 +504,41 @@
501 504
502 505 return $lists;
503 506 }
504 507
505 - public function additionalDataUsersImport(bool $isGeneric): string
508 + public function displayAdditionalDataUsersImport(bool $isGeneric): void
506 509 {
507 510 $buttonAddListId = $isGeneric ? 'acym__users__generic__import__create-list__button' : 'acym__users__import__create-list__button';
508 511 $buttonImportClass = $isGeneric ? 'acym__users__import__generic__import__button' : 'acym__users__import__button';
509 512 $buttonSkipId = $isGeneric ? 'acym__users__generic__import__skip__button' : 'acym__users__import__skip__button';
510 513 $buttonImportDataTask = $isGeneric ? 'listing' : '';
511 -
512 - return '<div class="cell align-right grid-x margin-bottom-2">
513 - <div id="acym__users__import__create-list" class="grid-x" style="display: none;">
514 - <label for="acym__users__import__create-list__field" class="margin-right-1 acym_vcenter">'.acym_translation('ACYM_LIST_NAME').' : </label>
515 - <div>
516 - <input id="acym__users__import__create-list__field" type="text">
517 - </div>
518 - </div>
519 - <button type="button" class="button button-secondary margin-left-1 acym_vcenter margin-right-2" id="'.$buttonAddListId.'">'.acym_translation(
520 - 'ACYM_CREATE_NEW_LIST'
521 - ).'</button>
522 - <i style="display: none;" class="acym_vcenter acymicon-circle-o-notch acymicon-spin" id="acym__users__import__create-list__loading-logo"></i>
523 - </div>
524 - <div class="cell align-right grid-x">
525 - <button type="button" class="button-secondary button cell shrink margin-right-1" id="'.$buttonSkipId.'">'.acym_translation('ACYM_SKIP').'</button>
526 - <button
527 - type="button"
528 - class="button-primary button acy_button_submit cell shrink margin-right-2 '.$buttonImportClass.'"
529 - id="acym__entity_select__button__submit" data-task="'.$buttonImportDataTask.'">'.acym_translation('ACYM_SUBSCRIBE_USERS_TO_THESE_LISTS').'</button>
530 - </div>';
514 + ?>
515 + <div class="cell align-right grid-x margin-bottom-2">
516 + <div id="acym__users__import__create-list" class="grid-x" style="display: none;">
517 + <label for="acym__users__import__create-list__field" class="margin-right-1 acym_vcenter">
518 + <?php echo esc_html(acym_translation('ACYM_LIST_NAME')); ?> :
519 + </label>
520 + <div>
521 + <input id="acym__users__import__create-list__field" type="text">
522 + </div>
523 + </div>
524 + <button type="button" class="button button-secondary margin-left-1 acym_vcenter margin-right-2" id="<?php echo esc_attr($buttonAddListId); ?>">
525 + <?php echo esc_html(acym_translation('ACYM_CREATE_NEW_LIST')); ?>
526 + </button>
527 + <i style="display: none;" class="acym_vcenter acymicon-circle-o-notch acymicon-spin" id="acym__users__import__create-list__loading-logo"></i>
528 + </div>
529 + <div class="cell align-right grid-x">
530 + <button type="button" class="button-secondary button cell shrink margin-right-1" id="<?php echo esc_attr($buttonSkipId); ?>">
531 + <?php echo esc_html(acym_translation('ACYM_SKIP')); ?>
532 + </button>
533 + <button
534 + type="button"
535 + class="button-primary button acy_button_submit cell shrink margin-right-2 <?php echo esc_attr($buttonImportClass); ?>"
536 + id="acym__entity_select__button__submit" data-task="<?php echo esc_attr($buttonImportDataTask); ?>">
537 + <?php echo esc_html(acym_translation('ACYM_SUBSCRIBE_USERS_TO_THESE_LISTS')); ?>
538 + </button>
539 + </div>
540 + <?php
531 541 }
532 542
533 543 private function createUploadFolder(): string
534 544 {
@@ -738,8 +748,9 @@
738 748 if (!empty($newUser->email)) {
739 749 $newUser->email = acym_punycode($newUser->email);
740 750 }
741 751 $newUser->email = trim(str_replace([' ', "\t"], '', $encodingHelper->change($newUser->email, 'UTF-8', 'ISO-8859-1')));
752 + $newUser->email = strtolower($newUser->email);
742 753
743 754
744 755 if (!acym_isValidEmail($newUser->email)) {
745 756 static $errorcountfail = 0;
@@ -932,8 +943,10 @@
932 943 foreach ($colNames as $oneColumn) {
933 944 acym_secureDBColumn($oneColumn);
934 945 }
935 946
947 + $dateColumns = $this->getUserDateColumns();
948 +
936 949 $queryInsertUsers = 'INSERT'.($this->overwrite ? '' : ' IGNORE').' INTO #__acym_user (`'.implode('`,`', $colNames).'`) VALUES (';
937 950 $values = [];
938 951 $customFieldsvalues = [];
939 952 $allemails = [];
@@ -945,15 +958,17 @@
945 958 if ($map === 'customfields') continue;
946 959
947 960 $oneValue = htmlspecialchars_decode($oneValue, ENT_QUOTES);
948 961
949 - if ($map !== 'id') {
962 + if ($map === 'id') {
963 + $oneValue = intval($oneValue);
964 + } elseif (isset($dateColumns[$map]) && strlen(trim((string)$oneValue)) === 0) {
965 + $oneValue = 'NULL';
966 + } else {
950 967 $oneValue = acym_escapeDB($oneValue);
951 968 if ($map === 'email') {
952 969 $allemails[] = $oneValue;
953 970 }
954 - } else {
955 - $oneValue = intval($oneValue);
956 971 }
957 972
958 973 $value[] = $oneValue;
959 974 }
@@ -1011,8 +1026,24 @@
1011 1026 }
1012 1027
1013 1028
1014 1029 $this->allUserIds = array_merge($this->allUserIds, array_keys($importedUsers));
1030 + }
1031 +
1032 + private function getUserDateColumns(): array
1033 + {
1034 + static $dateColumns = null;
1035 + if ($dateColumns === null) {
1036 + $dateColumns = [];
1037 + foreach (acym_loadObjectList('SHOW COLUMNS FROM #__acym_user') as $column) {
1038 + $isDateColumn = stripos($column->Type, 'date') !== false || stripos($column->Type, 'time') !== false;
1039 + if ($isDateColumn && strtoupper($column->Null) === 'YES') {
1040 + $dateColumns[strtolower($column->Field)] = true;
1041 + }
1042 + }
1043 + }
1044 +
1045 + return $dateColumns;
1015 1046 }
1016 1047
1017 1048 private function checkData(object &$user, int $timestamp)
1018 1049 {