From 2eb4912dbf3e0c26b8945ee7a64ac0ff1c9ce9ce Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 30 Mar 2018 19:17:12 +0000 Subject: [PATCH] New functionality to set a password for a given user --- src/Core/Console.php | 2 + src/Core/Console/NewPassword.php | 91 ++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 src/Core/Console/NewPassword.php diff --git a/src/Core/Console.php b/src/Core/Console.php index eb6e08057a..02a0b66ae2 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -22,6 +22,7 @@ class Console extends \Asika\SimpleConsole\Console 'globalcommunityblock' => __NAMESPACE__ . '\Console\GlobalCommunityBlock', 'globalcommunitysilence' => __NAMESPACE__ . '\Console\GlobalCommunitySilence', 'maintenance' => __NAMESPACE__ . '\Console\Maintenance', + 'newpassword' => __NAMESPACE__ . '\Console\NewPassword', 'php2po' => __NAMESPACE__ . '\Console\PhpToPo', 'po2php' => __NAMESPACE__ . '\Console\PoToPhp', 'typo' => __NAMESPACE__ . '\Console\Typo', @@ -42,6 +43,7 @@ Commands: globalcommunitysilence Silence remote profile from global community page help Show help about a command, e.g (bin/console help config) maintenance Set maintenance mode for this node + newpassword Set an new password for a given user php2po Generate a messages.po file from a strings.php file po2php Generate a strings.php file from a messages.po file typo Checks for parse errors in Friendica files diff --git a/src/Core/Console/NewPassword.php b/src/Core/Console/NewPassword.php new file mode 100644 index 0000000000..9d40e454bb --- /dev/null +++ b/src/Core/Console/NewPassword.php @@ -0,0 +1,91 @@ + + * @author Hypolite Petovan + */ +class NewPassword extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = << [-h|--help|-?] [-v] + +Description + Creates a new password for a user without using the "forgot password" functionality. + +Options + -h|--help|-? Show help information + -v Show more debug information. +HELP; + return $help; + } + + protected function doExecute() + { + $a = get_app(); + + if ($this->getOption('v')) { + $this->out('Class: ' . __CLASS__); + $this->out('Arguments: ' . var_export($this->args, true)); + $this->out('Options: ' . var_export($this->options, true)); + } + + if (count($this->args) == 0) { + $this->out($this->getHelp()); + return 0; + } + + if (count($this->args) > 2) { + throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments'); + } + + require_once '.htconfig.php'; + $result = \dba::connect($db_host, $db_user, $db_pass, $db_data); + unset($db_host, $db_user, $db_pass, $db_data); + + if (!$result) { + throw new \RuntimeException('Unable to connect to database'); + } + + $nick = $this->getArgument(0); + $password = $this->getArgument(1); + + $user = dba::selectFirst('user', ['uid'], ['nickname' => $nick]); + if (!DBM::is_result($user)) { + throw new \RuntimeException(L10n::t('User not found')); + } + + if (!Config::get('system', 'disable_password_exposed', false) && User::isPasswordExposed($password)) { + throw new \RuntimeException(L10n::t('The new password has been exposed in a public data dump, please choose another.')); + } + + if (!User::updatePassword($user['uid'], $password)) { + throw new \RuntimeException(L10n::t('Password update failed. Please try again.')); + } + + $this->out(L10n::t('Password changed.', $nick)); + + return 0; + } +}