| @@ -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 | { |