From 29c8591cb24af3ee51836cf5ca7fff9c424ae1f2 Mon Sep 17 00:00:00 2001 From: terrafrost Date: Wed, 3 Nov 2021 22:16:14 -0500 Subject: [PATCH] SSH2: add "smart multi factor" login mode (enabled by default) --- phpseclib/Net/SSH2.php | 78 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/phpseclib/Net/SSH2.php b/phpseclib/Net/SSH2.php index 524b895b..a95a3fd8 100644 --- a/phpseclib/Net/SSH2.php +++ b/phpseclib/Net/SSH2.php @@ -1049,6 +1049,14 @@ class Net_SSH2 */ var $regenerate_decompression_context = false; + /** + * Smart multi-factor authentication flag + * + * @var bool + * @access private + */ + var $smartMFA = true; + /** * Default Constructor. * @@ -2259,9 +2267,57 @@ class Net_SSH2 return $this->_login_helper($username); } - foreach ($args as $arg) { - if ($this->_login_helper($username, $arg)) { - return true; + while (count($args)) { + if (!$this->auth_methods_to_continue || !$this->smartMFA) { + $newargs = $args; + $args = array(); + } else { + $newargs = array(); + foreach ($this->auth_methods_to_continue as $method) { + switch ($method) { + case 'publickey': + foreach ($args as $key => $arg) { + if (is_object($arg)) { + $newargs[] = $arg; + unset($args[$key]); + break; + } + } + break; + case 'keyboard-interactive': + $hasArray = $hasString = false; + foreach ($args as $arg) { + if ($hasArray || is_array($arg)) { + $hasArray = true; + break; + } + if ($hasString || is_string($arg)) { + $hasString = true; + break; + } + } + if ($hasArray && $hasString) { + foreach ($args as $key => $arg) { + if (is_array($arg)) { + $newargs[] = $arg; + break 2; + } + } + } + case 'password': + foreach ($args as $key => $arg) { + $newargs[] = $arg; + unset($args[$key]); + break; + } + } + } + } + + foreach ($newargs as $arg) { + if ($this->_login_helper($username, $arg)) { + return true; + } } } return false; @@ -5321,4 +5377,20 @@ class Net_SSH2 { return $this->auth_methods_to_continue; } + + /** + * Enables "smart" multi-factor authentication (MFA) + */ + function enableSmartMFA() + { + $this->smartMFA = true; + } + + /** + * Disables "smart" multi-factor authentication (MFA) + */ + function disableSmartMFA() + { + $this->smartMFA = false; + } }