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; - } - -}