diff --git a/bin/console b/bin/console
index c973195ff6..ddff5c0565 100755
--- a/bin/console
+++ b/bin/console
@@ -49,7 +49,7 @@ use Alchemy\Phrasea\Command\Task\TaskStart;
use Alchemy\Phrasea\Command\Task\TaskState;
use Alchemy\Phrasea\Command\Task\TaskStop;
use Alchemy\Phrasea\Command\User\UserCreateCommand;
-use Alchemy\Phrasea\Command\User\UserSetPasswordCommand;
+use Alchemy\Phrasea\Command\User\UserPasswordCommand;
use Alchemy\Phrasea\Command\User\UserListCommand;
use Alchemy\Phrasea\Command\UpgradeDBDatas;
@@ -120,7 +120,7 @@ $cli->command(new CreateDataboxCommand('databox:create'));
$cli->command(new UserCreateCommand('user:create'));
-$cli->command(new UserSetPasswordCommand('user:set-password'));
+$cli->command(new UserPasswordCommand('user:password'));
$cli->command(new UserListCommand('user:list'));
diff --git a/lib/Alchemy/Phrasea/Command/User/UserPasswordCommand.php b/lib/Alchemy/Phrasea/Command/User/UserPasswordCommand.php
new file mode 100644
index 0000000000..403d96f4ab
--- /dev/null
+++ b/lib/Alchemy/Phrasea/Command/User/UserPasswordCommand.php
@@ -0,0 +1,140 @@
+setDescription('Set user password in Phraseanet')
+ ->addOption('user_id', null, InputOption::VALUE_REQUIRED, 'The id of user.')
+ ->addOption('generate', null, InputOption::VALUE_NONE, 'Generate the password')
+ ->addOption('password', null, InputOption::VALUE_OPTIONAL, 'The password')
+ ->addOption('send_mail_password', null, InputOption::VALUE_NONE, 'Send email link to user for password renewing, work only if password and generate are not define')
+ ->addOption('password_hash', null, InputOption::VALUE_OPTIONAL, 'Define a password hashed, work only with password_nonce')
+ ->addOption('password_nonce', null, InputOption::VALUE_OPTIONAL, 'Define a password nonce, work only with password_hash')
+ ->addOption('get_hash', null, InputOption::VALUE_NONE, 'return the password hashed')
+
+ ->setHelp('');
+
+ return $this;
+ }
+
+ protected function doExecute(InputInterface $input, OutputInterface $output)
+ {
+ $dialog = $this->getHelperSet()->get('dialog');
+ $userRepository = $this->container['repo.users'];
+ $userManipulator = $this->container['manipulator.user'];
+
+ $user = $userRepository->find($input->getOption('user_id'));
+ $password = $input->getOption('password');
+ $generate = $input->getOption('generate');
+ $sendMailPassword = $input->getOption('send_mail_password');
+ $getHash = $input->getOption('get_hash');
+ $passwordHash = $input->getOption('password_hash');
+ $passwordNonce = $input->getOption('password_nonce');
+
+
+ if ($user === null) {
+ $output->writeln('Not found User.');
+ return 0;
+ }
+
+ if ($passwordHash && $passwordNonce) {
+ $user->setNonce($passwordNonce);
+ $user->setPassword($passwordHash);
+ $userManipulator->updateUser($user);
+
+ $output->writeln('password set with hashed pass');
+
+ return 0;
+ }
+
+ if ($generate) {
+ $password = $this->container['random.medium']->generateString(64);
+ } else {
+ if (!$password && $sendMailPassword) {
+ $this->sendPasswordSetupMail($user);
+
+ return 0;
+ } elseif (!$password && !$sendMailPassword && ! $getHash) {
+ $output->writeln('choose one option to set a password!');
+
+ return 0;
+ }
+ }
+
+ if ($password) {
+ do {
+ $continue = mb_strtolower($dialog->ask($output, 'Do you want really set password to this user? (y/N)', 'N'));
+ } while (!in_array($continue, ['y', 'n']));
+
+ if ($continue !== 'y') {
+ $output->writeln('Aborting !');
+
+ return;
+ }
+
+ $userManipulator->setPassword($user,$password);
+ }
+
+ if (($password || $generate || $getHash) && $user->getPassword()) {
+ $hash = [
+ 'password' => $user->getPassword(),
+ 'nonce' => $user->getNonce()
+ ];
+
+ echo json_encode($hash);
+ } elseif (is_null($password)) {
+ $output->writeln('password undefined');
+ }
+
+ return 0;
+ }
+
+ /**
+ * Send mail for renew password
+ * @param User $user
+ */
+ private function sendPasswordSetupMail(User $user)
+ {
+ $this->setDelivererLocator(new LazyLocator($this->container, 'notification.deliverer'));
+ $receiver = Receiver::fromUser($user);
+
+ $token = $this->container['manipulator.token']->createResetPasswordToken($user);
+
+ $mail = MailRequestPasswordSetup::create($this->container, $receiver);
+ $servername = $this->container['conf']->get('servername');
+ $mail->setButtonUrl('http://'.$servername.'/login/renew-password/?token='.$token->getValue());
+ $mail->setLogin($user->getLogin());
+
+ $this->deliver($mail);
+ }
+
+}
diff --git a/lib/Alchemy/Phrasea/Command/User/UserSetPasswordCommand.php b/lib/Alchemy/Phrasea/Command/User/UserSetPasswordCommand.php
deleted file mode 100644
index 963910db02..0000000000
--- a/lib/Alchemy/Phrasea/Command/User/UserSetPasswordCommand.php
+++ /dev/null
@@ -1,79 +0,0 @@
-setDescription('Set user password in Phraseanet')
- ->addOption('user_id', null, InputOption::VALUE_REQUIRED, 'The id of user.')
- ->addOption('generate', null, InputOption::VALUE_NONE, 'Generate the password')
- ->addOption('password', null, InputOption::VALUE_OPTIONAL, 'The password')
- ->setHelp('');
-
- return $this;
- }
-
- protected function doExecute(InputInterface $input, OutputInterface $output)
- {
-
- $dialog = $this->getHelperSet()->get('dialog');
- $userRepository = $this->container['repo.users'];
- $userManipulator = $this->container['manipulator.user'];
- $user = $userRepository->find($input->getOption('user_id'));
- $password = $input->getOption('password');
- $generate = $input->getOption('generate');
-
- if ($user === null) {
- $output->writeln('Not found User.');
- return 0;
- }
-
- if ($generate) {
- $password = $this->container['random.medium']->generateString(64);
- } else {
- if (!$password) {
- $output->writeln('--password option not specified');
- return 0;
- }
- }
-
- do {
- $continue = mb_strtolower($dialog->ask($output, 'Do you want really set password to this user? (y/N)', 'N'));
- } while (!in_array($continue, ['y', 'n']));
-
- if ($continue !== 'y') {
- $output->writeln('Aborting !');
-
- return;
- }
-
- $userManipulator->setPassword($user,$password);
- $output->writeln('New password: ' . $password . '');
-
- return 0;
- }
-
-}