diff --git a/bin/console.php b/bin/console.php index 90e4be3928..9c25279d37 100755 --- a/bin/console.php +++ b/bin/console.php @@ -6,4 +6,4 @@ include_once dirname(__DIR__) . '/boot.php'; $a = new Friendica\App(dirname(__DIR__)); \Friendica\BaseObject::setApp($a); -(new Friendica\Core\Console())->execute(); +(new Friendica\Core\Console($argv))->execute(); diff --git a/mod/admin.php b/mod/admin.php index 3cbb70d3c5..4ae5eb70b0 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -635,8 +635,21 @@ function admin_page_federation(App $a) $v = $newVv; } - foreach ($v as $key => $vv) - $v[$key]["version"] = trim(strip_tags($vv["version"])); + // Assure that the versions are sorted correctly + $v2 = []; + $versions = []; + foreach ($v as $vv) { + $version = trim(strip_tags($vv["version"])); + $v2[$version] = $vv; + $versions[] = $version; + } + + usort($versions, 'version_compare'); + + $v = []; + foreach ($versions as $version) { + $v[] = $v2[$version]; + } // the 3rd array item is needed for the JavaScript graphs as JS does // not like some characters in the names of variables... diff --git a/mod/profiles.php b/mod/profiles.php index bec09e2d07..8bb09aa6dd 100644 --- a/mod/profiles.php +++ b/mod/profiles.php @@ -14,6 +14,7 @@ use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; +use Friendica\Model\Contact; use Friendica\Model\GContact; use Friendica\Model\Item; use Friendica\Model\Profile; diff --git a/src/App.php b/src/App.php index 2330bc1185..55623e1e81 100644 --- a/src/App.php +++ b/src/App.php @@ -212,12 +212,6 @@ class App . $this->basepath . DIRECTORY_SEPARATOR . 'library' . PATH_SEPARATOR . $this->basepath); - - if (is_array($_SERVER['argv']) && $_SERVER['argc'] > 1 && substr(end($_SERVER['argv']), 0, 4) == 'http') { - $this->set_baseurl(array_pop($_SERVER['argv'])); - $_SERVER['argc'] --; - } - if ((x($_SERVER, 'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'], 0, 9) === 'pagename=') { $this->query_string = substr($_SERVER['QUERY_STRING'], 9); @@ -868,9 +862,6 @@ class App array_unshift($args, ((x($this->config, 'php_path')) && (strlen($this->config['php_path'])) ? $this->config['php_path'] : 'php')); - // add baseurl to args. cli scripts can't construct it - $args[] = $this->get_baseurl(); - for ($x = 0; $x < count($args); $x ++) { $args[$x] = escapeshellarg($args[$x]); } diff --git a/src/Core/Console.php b/src/Core/Console.php index eb6e08057a..a1143ae1d9 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 a 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..d44286d28f --- /dev/null +++ b/src/Core/Console/NewPassword.php @@ -0,0 +1,89 @@ + + */ +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.')); + + return 0; + } +}