/usr/share/php/Seld/CliPrompt/CliPrompt.php is in php-cli-prompt 1.0.1+dfsg-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | <?php
/*
* This file is part of CLI Prompt.
*
* (c) Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Seld\CliPrompt;
class CliPrompt
{
/**
* Prompts the user for input and shows what they type
*
* @return string
*/
public static function prompt()
{
$stdin = fopen('php://stdin', 'r');
$answer = self::trimAnswer(fgets($stdin, 4096));
fclose($stdin);
return $answer;
}
/**
* Prompts the user for input and hides what they type
*
* @param bool $allowFallback If prompting fails for any reason and this is set to true the prompt
* will be done using the regular prompt() function, otherwise a
* \RuntimeException is thrown.
* @return string
* @throws RuntimeException on failure to prompt, unless $allowFallback is true
*/
public static function hiddenPrompt($allowFallback = false)
{
// handle windows
if (defined('PHP_WINDOWS_VERSION_BUILD')) {
// fallback to hiddeninput executable
$exe = __DIR__.'\\..\\res\\hiddeninput.exe';
// handle code running from a phar
if ('phar:' === substr(__FILE__, 0, 5)) {
$tmpExe = sys_get_temp_dir().'/hiddeninput.exe';
// use stream_copy_to_stream instead of copy
// to work around https://bugs.php.net/bug.php?id=64634
$source = fopen($exe, 'r');
$target = fopen($tmpExe, 'w+');
stream_copy_to_stream($source, $target);
fclose($source);
fclose($target);
unset($source, $target);
$exe = $tmpExe;
}
$answer = self::trimAnswer(shell_exec($exe));
// clean up
if (isset($tmpExe)) {
unlink($tmpExe);
}
// output a newline to be on par with the regular prompt()
echo PHP_EOL;
return $answer;
}
if (file_exists('/usr/bin/env')) {
// handle other OSs with bash/zsh/ksh/csh if available to hide the answer
$test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null";
foreach (array('bash', 'zsh', 'ksh', 'csh') as $sh) {
if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) {
$shell = $sh;
break;
}
}
if (isset($shell)) {
$readCmd = ($shell === 'csh') ? 'set mypassword = $<' : 'read -r mypassword';
$command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd);
$value = self::trimAnswer(shell_exec($command));
// output a newline to be on par with the regular prompt()
echo PHP_EOL;
return $value;
}
}
// not able to hide the answer
if (!$allowFallback) {
throw new \RuntimeException('Could not prompt for input in a secure fashion, aborting');
}
return self::prompt();
}
private static function trimAnswer($str)
{
return preg_replace('{\r?\n$}D', '', $str);
}
}
|