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 toggle-user 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('Setting User State');
$this->output->writeln('');
/** @var UserCollectionInterface $users */
$users = $grav['accounts'];
if (!$this->options['user']) {
// Get username and validate
$question = new Question('Enter a username: ');
$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 state 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('Failure! User ' . $username . ' 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('Success! User ' . $username . ' 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);
}
}