/*
 * changepassword
 *
 * part of pfSense (https://www.pfsense.org)
 * Copyright (c) 2016 Electric Sheep Fencing
 * Copyright (c) 2016-2021 Rubicon Communications, LLC (Netgate)
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

require_once("config.inc");
require_once("auth.inc");
require_once("functions.inc");

global $g, $config, $argv, $userindex;
$userindex = index_users();

$args = array_slice($argv, 3);

$password = "";
$confpassword = "";
$username = "";

$fp = fopen('php://stdin', 'r');

// If the first parameter is empty, ask for username
if (empty($args[0])) {
	echo gettext("Enter username: ");
	$username = fgets($fp);
} else {
	$username = $args[0];
}
$username = trim($username);

// If the user does not exist, bail
$user =& getUserEntry($username);
if ($user == NULL) {
	printf(gettext("User '%s' does not exist.\n"), $username);
	exit(-1);
} else {
	printf(gettext("Changing password for '%s'.\n"), $username);
}

// If the user does exist, prompt for password
while (empty($password)) {
	echo gettext("New Password") . ": ";
	exec('/bin/stty -echo');
	$password = trim(fgets($fp));
	exec('/bin/stty echo');
	echo "\n";
}

// Confirm password
while (empty($confpassword)) {
	echo gettext("Confirm New Password") . ": ";
	exec('/bin/stty -echo');
	$confpassword = trim(fgets($fp));
	exec('/bin/stty echo');
	echo "\n";
}

// Check if user is disabled
if (is_account_disabled($username)) {
	echo gettext("Account is disabled, would you like to re-enable? [y|n]") . ": ";
	if (strcasecmp(chop(fgets($fp)), "y") == 0) {
		unset($user['disabled']);
	}
}
// Check if user is expired
if (is_account_expired($username)) {
	echo gettext("Account is expired, would you like to clear the expiration date? [y|n]") . ": ";
	if (strcasecmp(chop(fgets($fp)), "y") == 0) {
		unset($user['expires']);
	}
}

fclose($fp);

// Compare password and confirm
if ($password == $confpassword) {
	//Reset password
	local_user_set_password($user, $password);
	local_user_set($user);
	write_config(sprintf(gettext("password changed for user '%s' from console."), $username));
	exit(0);
} else {
	echo gettext("New and Confirm passwords did not match.") . "\n";
	exit(-1);
}
