123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- <?php
- /**
- * @package Grav\Plugin\Login
- *
- * @copyright Copyright (C) 2014 - 2017 RocketTheme, LLC. All rights reserved.
- * @license MIT License; see LICENSE file for details.
- */
- namespace Grav\Plugin\Console;
- use Grav\Common\Config\Config;
- use Grav\Common\Grav;
- use Grav\Console\ConsoleCommand;
- use Grav\Common\File\CompiledYamlFile;
- use Grav\Common\User\User;
- use Grav\Plugin\Login\Login;
- use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
- use Symfony\Component\Console\Input\InputOption;
- use Symfony\Component\Console\Question\ChoiceQuestion;
- use Symfony\Component\Console\Question\Question;
- /**
- * Class CleanCommand
- *
- * @package Grav\Console\Cli
- */
- class ChangeUserStateCommand extends ConsoleCommand
- {
- /** @var array */
- protected $options = [];
- /** @var Login */
- protected $login;
- /**
- * Configure the command
- */
- protected function configure()
- {
- $this
- ->setName('toggle-user')
- ->setAliases(['disableuser', 'enableuser', 'toggleuser', 'change-user-state'])
- ->addOption(
- 'user',
- 'u',
- InputOption::VALUE_REQUIRED,
- 'The username'
- )
- ->addOption(
- 'state',
- 's',
- InputOption::VALUE_REQUIRED,
- 'The state of the account. Can be either `enabled` or `disabled`. [default: "enabled"]'
- )
- ->setDescription('Changes whether user can login or not')
- ->setHelp('The <info>toggle-user</info> sets a user\'s login status to enabled or disabled.')
- ;
- }
- /**
- * @return int|null|void
- */
- protected function serve()
- {
- include __DIR__ . '/../vendor/autoload.php';
- $grav = Grav::instance();
- if (!isset($grav['login'])) {
- $grav['login'] = new Login($grav);
- }
- $this->login = $grav['login'];
- $this->options = [
- 'user' => $this->input->getOption('user'),
- 'state' => $this->input->getOption('state')
- ];
- $this->validateOptions();
- $helper = $this->getHelper('question');
- $data = [];
- $this->output->writeln('<green>Setting User State</green>');
- $this->output->writeln('');
- if (!$this->options['user']) {
- // Get username and validate
- $question = new Question('Enter a <yellow>username</yellow>: ');
- $question->setValidator(function ($value) {
- $this->validate('user', $value);
- if (!User::find($value, ['username'])->exists()) {
- throw new \RuntimeException('Username "' . $value . '" does not exist, please pick another username');
- };
- return $value;
- });
- $username = $helper->ask($this->input, $this->output, $question);
- } else {
- $username = $this->options['user'];
- }
- if (!$this->options['state'] && !count(array_filter($this->options))) {
- // Choose State
- $question = new ChoiceQuestion(
- 'Please choose the <yellow>state</yellow> for the account:',
- array('enabled' => 'Enabled', 'disabled' => 'Disabled'),
- 'enabled'
- );
- $question->setErrorMessage('State %s is invalid.');
- $data['state'] = $helper->ask($this->input, $this->output, $question);
- } else {
- $data['state'] = $this->options['state'] ?: 'enabled';
- }
- // Lowercase the username for the filename
- $username = mb_strtolower($username);
- /** @var UniformResourceLocator $locator */
- $locator = Grav::instance()['locator'];
- // Grab the account file and read in the information before setting the file (prevent setting erase)
- $oldUserFile = CompiledYamlFile::instance($locator->findResource('account://' . $username . YAML_EXT, true, true));
- $oldData = (array)$oldUserFile->content();
-
- //Set the state feild to new state
- $oldData['state'] = $data['state'];
-
- // Create user object and save it using oldData (with updated state)
- $user = new User($oldData);
- $file = CompiledYamlFile::instance($locator->findResource('account://' . $username . YAML_EXT, true, true));
- $user->file($file);
- $user->save();
- $this->output->writeln('');
- $this->output->writeln('<green>Success!</green> User <cyan>' . $username . '</cyan> state set to .' . $data['state']);
- }
- /**
- *
- */
- protected function validateOptions()
- {
- foreach (array_filter($this->options) as $type => $value) {
- $this->validate($type, $value);
- }
- }
- /**
- * @param string $type
- * @param mixed $value
- * @param string $extra
- *
- * @return string
- */
- protected function validate($type, $value)
- {
- return $this->login->validateField($type, $value);
- }
- }
|