| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 | <?php/** * @package    Grav\Plugin\Login * * @copyright  Copyright (C) 2014 - 2021 RocketTheme, LLC. All rights reserved. * @license    MIT License; see LICENSE file for details. */namespace Grav\Plugin\Console;use Grav\Common\Grav;use Grav\Common\User\Interfaces\UserCollectionInterface;use Grav\Console\ConsoleCommand;use Grav\Plugin\Login\Login;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('');        /** @var UserCollectionInterface $users */        $users = $grav['accounts'];        if (!$this->options['user']) {            // Get username and validate            $question = new Question('Enter a <yellow>username</yellow>: ');            $question->setValidator(function ($value) use ($users) {                $this->validate('user', $value);                if (!$users->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';        }        $user = $users->load($username);        if (!$user->exists()) {            $this->output->writeln('<red>Failure!</red> User <cyan>' . $username . '</cyan> does not exist!');            exit();        }        //Set the state field to new state        $user->set('state', $data['state']);        $user->save();        $this->invalidateCache();        $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);    }}
 |