diff --git a/lib/Alchemy/Phrasea/Setup/Version/MailChecker.php b/lib/Alchemy/Phrasea/Setup/Version/MailChecker.php
new file mode 100644
index 0000000000..10e1b6ca5d
--- /dev/null
+++ b/lib/Alchemy/Phrasea/Setup/Version/MailChecker.php
@@ -0,0 +1,64 @@
+get_connection()->prepare($sql);
+ $stmt->execute();
+ $rs = $stmt->fetchAll(\PDO::FETCH_ASSOC);
+ $stmt->closeCursor();
+
+ $users = array();
+
+ foreach ($rs as $row) {
+ if (!isset($users[$row['usr_mail']])) {
+ $users[$row['usr_mail']] = array();
+ }
+
+ $users[$row['usr_mail']][] = $row;
+ }
+
+ $badUsers = array();
+
+ foreach ($users as $email => $usrs) {
+ if (count($usrs) > 1) {
+ $badUsers[$email] = array();
+ foreach ($usrs as $usrInfo) {
+ $badUsers[$email][$usrInfo['usr_id']] = $usrInfo;
+ }
+ }
+ }
+
+ unset($users);
+
+ return $badUsers;
+ }
+}
diff --git a/lib/classes/Setup/Upgrade.php b/lib/classes/Setup/Upgrade.php
index 266b9f9e4b..e45d85202f 100644
--- a/lib/classes/Setup/Upgrade.php
+++ b/lib/classes/Setup/Upgrade.php
@@ -10,6 +10,7 @@
*/
use Alchemy\Phrasea\Application;
+use Alchemy\Phrasea\Setup\Version\MailChecker;
/**
* UpgradeManager for Phraseanet.
@@ -64,8 +65,9 @@ class Setup_Upgrade
$this->appbox = $app['phraseanet.appbox'];
- if (count(User_Adapter::get_wrong_email_users($app)) > 0) {
- throw new Exception_Setup_FixBadEmailAddresses('Please fix the database before starting');
+ if (version_compare($this->appbox->get_version(), '3.9', '<')
+ && count(MailChecker::getWrongEmailUsers($app)) > 0) {
+ throw new \Exception_Setup_FixBadEmailAddresses('Please fix the database before starting');
}
$this->write_lock();
diff --git a/lib/classes/User/Adapter.php b/lib/classes/User/Adapter.php
index 3024c53ec4..aa852223e8 100644
--- a/lib/classes/User/Adapter.php
+++ b/lib/classes/User/Adapter.php
@@ -1172,45 +1172,6 @@ class User_Adapter implements User_Interface, cache_cacheableInterface
return $this;
}
- public static function get_wrong_email_users(Application $app)
- {
-
- $sql = 'SELECT usr_mail, usr_id FROM usr WHERE usr_mail IS NOT NULL';
-
- $stmt = $app['phraseanet.appbox']->get_connection()->prepare($sql);
- $stmt->execute();
-
- $rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
-
- $stmt->closeCursor();
-
- $users = array();
-
- foreach ($rs as $row) {
- if (!isset($users[$row['usr_mail']])) {
- $users[$row['usr_mail']] = array();
- }
-
- $users[$row['usr_mail']][] = $row['usr_id'];
- }
-
- $bad_users = array();
-
- foreach ($users as $email => $usrs) {
- if (count($usrs) > 1) {
- $bad_users[$email] = array();
- foreach ($usrs as $usr_id) {
- $user = User_Adapter::getInstance($usr_id, $app);
- $bad_users[$email][$user->get_id()] = $user;
- }
- }
- }
-
- unset($users);
-
- return $bad_users;
- }
-
public function setPrefs($prop, $value)
{
$this->load_preferences();
diff --git a/lib/classes/module/console/systemMailCheck.php b/lib/classes/module/console/systemMailCheck.php
index 59598048b8..17940fddd6 100644
--- a/lib/classes/module/console/systemMailCheck.php
+++ b/lib/classes/module/console/systemMailCheck.php
@@ -17,6 +17,7 @@
* @link www.phraseanet.com
*/
use Alchemy\Phrasea\Command\Command;
+use Alchemy\Phrasea\Setup\Version\MailChecker;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@@ -41,7 +42,10 @@ class module_console_systemMailCheck extends Command
{
$output->writeln("Processing...");
- $bad_users = User_Adapter::get_wrong_email_users($this->container);
+ $bad_users = array();
+ if (version_compare($this->getService('phraseanet.appbox')->get_version(), '3.9', '<')) {
+ $bad_users = MailChecker::getWrongEmailUsers($this->container);
+ }
foreach ($bad_users as $email => $users) {
if ($input->getOption('list')) {
@@ -112,12 +116,14 @@ class module_console_systemMailCheck extends Command
$output->writeln($email);
foreach ($users as $user) {
+ $dateConn = new \DateTime($user['last_conn']);
+
$output->writeln(
sprintf(
"\t %5d %40s %s"
- , $user->get_id()
- , $user->get_display_name()
- , $user->get_last_connection()->format('Y m d')
+ , $user['usr_id']
+ , $user['usr_login']
+ , $dateConn->format('Y m d')
)
);
}
diff --git a/lib/classes/module/console/systemUpgrade.php b/lib/classes/module/console/systemUpgrade.php
index 05827825e9..57241460c8 100644
--- a/lib/classes/module/console/systemUpgrade.php
+++ b/lib/classes/module/console/systemUpgrade.php
@@ -67,12 +67,12 @@ class module_console_systemUpgrade extends Command
try {
$output->write('Upgrading...', true);
- if (count(User_Adapter::get_wrong_email_users($this->container)) > 0) {
+ try {
+ $upgrader = new Setup_Upgrade($this->container, $input->getOption('force'));
+ } catch (\Exception_Setup_FixBadEmailAddresses $e) {
return $output->writeln(sprintf('You have to fix your database before upgrade with the system:mailCheck command '));
}
- $upgrader = new Setup_Upgrade($this->container, $input->getOption('force'));
-
$queries = $this->getService('phraseanet.appbox')->forceUpgrade($upgrader, $this->container);
if ($input->getOption('dump')) {
diff --git a/tests/Alchemy/Tests/Phrasea/Setup/Version/MailCheckerTest.php b/tests/Alchemy/Tests/Phrasea/Setup/Version/MailCheckerTest.php
new file mode 100644
index 0000000000..edeaa7fb15
--- /dev/null
+++ b/tests/Alchemy/Tests/Phrasea/Setup/Version/MailCheckerTest.php
@@ -0,0 +1,29 @@
+get_connection();
+ $now = new \DateTime();
+
+ $stmt = $conn->prepare('CREATE TEMPORARY TABLE usr_tmp (usr_id INT, usr_mail VARCHAR(50), usr_login VARCHAR(50), last_conn DATETIME);');
+ $stmt->execute();
+ $stmt->closeCursor();
+ $stmt = $conn->prepare('INSERT INTO usr_tmp (usr_id, usr_mail, usr_login, last_conn) VALUES(1, "email@email.com", "login1", "'.$now->format('Y-m-D H:i:s').'");');
+ $stmt->execute();
+ $stmt->closeCursor();
+ $stmt = $conn->prepare('INSERT INTO usr_tmp (usr_id, usr_mail, usr_login, last_conn) VALUES(2, "email@email.com", "login2", "'.$now->format('Y-m-D H:i:s').'");');
+ $stmt->execute();
+ $stmt->closeCursor();
+ unset($stmt);
+ $users = MailChecker::getWrongEmailUsers(self::$DI['app'], 'usr_tmp');
+
+ $this->assertEquals(1, count($users));
+ $this->assertEquals(2, count($users['email@email.com']));
+ }
+}