Version 4.3.0
This commit is contained in:
1 parent
96997ddd8e
commit
fe1acf984a
1349 files changed
+116159
-67711
No files matched your search
@@ -64,11 +64,12 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
/**
|
||||
* Show a setup screen
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Member $member The member
|
||||
* @param bool $showingMultipleHandlers Set to TRUE if multiple options are being displayed
|
||||
* @param \IPS\Http\Url $url URL for page
|
||||
* @return string
|
||||
*/
|
||||
public function configurationScreen( \IPS\Member $member, $showingMultipleHandlers = FALSE )
|
||||
public function configurationScreen( \IPS\Member $member, $showingMultipleHandlers=FALSE, \IPS\Http\Url $url )
|
||||
{
|
||||
$mfaDetails = $member->mfa_details;
|
||||
|
||||
@@ -112,7 +113,7 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
}
|
||||
|
||||
/* Display */
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( $mfaDetails['authy']['setupMethod'], TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', TRUE, explode( ',', \IPS\Settings::i()->authy_setup ) );
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( $mfaDetails['authy']['setupMethod'], TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', TRUE, explode( ',', \IPS\Settings::i()->authy_setup ), NULL, $url );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -277,10 +278,11 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
/**
|
||||
* Get the form for a member to authenticate
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Http\Url $url URL for page
|
||||
* @return string
|
||||
*/
|
||||
public function authenticationScreen( \IPS\Member $member )
|
||||
public function authenticationScreen( \IPS\Member $member, \IPS\Http\Url $url )
|
||||
{
|
||||
$mfaDetails = $member->mfa_details;
|
||||
$availableMethods = explode( ',', \IPS\Settings::i()->authy_method );
|
||||
@@ -334,7 +336,7 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
}
|
||||
if ( isset( $mfaDetails['authy']['sent'] ) )
|
||||
{
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( $mfaDetails['authy']['sent']['method'], TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods );
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( $mfaDetails['authy']['sent']['method'], TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods, NULL, $url );
|
||||
}
|
||||
|
||||
/* Otherwise, check if they have the app installed. If they do, show the Authy authenticate page */
|
||||
@@ -352,7 +354,7 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
|
||||
if ( $userHasAuthyApp )
|
||||
{
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( 'authy', TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods, $this->_onetouchInit( $member ) );
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( 'authy', TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods, $this->_onetouchInit( $member, $url ), $url );
|
||||
}
|
||||
}
|
||||
catch ( \Exception $e ) { }
|
||||
@@ -361,7 +363,7 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
/* If it is the only option, show it anyway */
|
||||
else
|
||||
{
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( 'authy', TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods, $this->_onetouchInit( $member ) );
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( 'authy', TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods, $this->_onetouchInit( $member, $url ), $url );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -387,7 +389,7 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
}
|
||||
|
||||
/* Show screen */
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( 'sms', TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods );
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( 'sms', TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods, NULL, $url );
|
||||
}
|
||||
|
||||
/* If we have confirmed the phone call, do that now */
|
||||
@@ -412,24 +414,35 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
}
|
||||
|
||||
/* Show screen */
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( 'phone', TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods );
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( 'phone', TRUE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods, NULL, $url );
|
||||
}
|
||||
|
||||
/* Otherwise we're going to show a screen */
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( count( $availableMethods ) == 1 ? 'phone' : 'choose', FALSE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods );
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->authyAuthenticate( count( $availableMethods ) == 1 ? 'phone' : 'choose', FALSE, isset( $_SESSION['authyAuthError'] ) ? $_SESSION['authyAuthError'] : 'authy_error', FALSE, $availableMethods, NULL, $url );
|
||||
}
|
||||
|
||||
/**
|
||||
* If enabled, initiate a OneTouch request and get the ID
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Http\Url $url URL for page
|
||||
* @return string|null
|
||||
*/
|
||||
protected function _onetouchInit( \IPS\Member $member )
|
||||
{
|
||||
protected function _onetouchInit( \IPS\Member $member, \IPS\Http\Url $url )
|
||||
{
|
||||
if ( \IPS\Settings::i()->authy_onetouch )
|
||||
{
|
||||
$mfaDetails = $member->mfa_details;
|
||||
|
||||
if ( isset( $mfaDetails['onetouch'] ) and $mfaDetails['onetouch']['time'] > ( time() - 30 ) )
|
||||
{
|
||||
$response = static::onetouch( "approval_requests/" . preg_replace( '/[^A-Z0-9\-]/i', '', $mfaDetails['onetouch']['id'] ), 'get' );
|
||||
|
||||
if ( $response['approval_request']['status'] === 'pending' )
|
||||
{
|
||||
return $mfaDetails['onetouch']['id'];
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
@@ -437,9 +450,17 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
'message' => $member->language()->get('authy_onetouch_message'),
|
||||
'seconds_to_expire' => 300
|
||||
) );
|
||||
return $response['approval_request']['uuid'];
|
||||
|
||||
$mfaDetails['onetouch'] = array( 'id' => $response['approval_request']['uuid'], 'time' => time() );
|
||||
$member->mfa_details = $mfaDetails;
|
||||
$member->save();
|
||||
}
|
||||
catch ( \Exception $e ) { }
|
||||
catch ( \Exception $e )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return $mfaDetails['onetouch']['id'];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -535,8 +556,7 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
static::verifyApiKey( \IPS\Settings::i()->authy_key );
|
||||
}
|
||||
|
||||
\IPS\Db::i()->update( 'core_sys_conf_settings', array( 'conf_value' => $enabled ), array( 'conf_key=?', 'authy_enabled' ) );
|
||||
unset( \IPS\Data\Store::i()->settings );
|
||||
\IPS\Settings::i()->changeValues( array( 'authy_enabled' => $enabled ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -65,9 +65,10 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param bool $showingMultipleHandlers Set to TRUE if multiple options are being displayed
|
||||
* @param \IPS\Http\Url $url URL for page
|
||||
* @return string
|
||||
*/
|
||||
public function configurationScreen( \IPS\Member $member, $showingMultipleHandlers=FALSE )
|
||||
public function configurationScreen( \IPS\Member $member, $showingMultipleHandlers=FALSE, \IPS\Http\Url $url )
|
||||
{
|
||||
/* Generate a secret */
|
||||
if ( isset( \IPS\Request::i()->secret ) )
|
||||
@@ -142,10 +143,11 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
/**
|
||||
* Get the form for a member to authenticate
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Http\Url $url URL for page
|
||||
* @return string
|
||||
*/
|
||||
public function authenticationScreen( \IPS\Member $member )
|
||||
public function authenticationScreen( \IPS\Member $member, \IPS\Http\Url $url )
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -192,8 +194,7 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
*/
|
||||
public function toggle( $enabled )
|
||||
{
|
||||
\IPS\Db::i()->update( 'core_sys_conf_settings', array( 'conf_value' => $enabled ), array( 'conf_key=?', 'googleauth_enabled' ) );
|
||||
unset( \IPS\Data\Store::i()->settings );
|
||||
\IPS\Settings::i()->changeValues( array( 'googleauth_enabled' => $enabled ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -239,7 +239,7 @@ abstract class _MFAHandler
|
||||
}
|
||||
|
||||
/* No, show it */
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->mfaAuthenticate( $handler->authenticationScreen( $member ), $url );
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->mfaAuthenticate( $handler->authenticationScreen( $member, $url ), $url );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -260,8 +260,10 @@ abstract class _MFAHandler
|
||||
$mfaDetails['_lockouttime'] = time();
|
||||
$member->mfa_details = $mfaDetails;
|
||||
$member->save();
|
||||
|
||||
$member->logHistory( 'core', 'login', array( 'type' => 'mfalock', 'count' => $member->failed_mfa_attempts, 'unlockTime' => \IPS\DateTime::create()->add( new \DateInterval( 'PT' . \IPS\Settings::i()->mfa_lockout_time . 'M' ) )->getTimestamp() ) );
|
||||
}
|
||||
|
||||
|
||||
$lockEndTime = \IPS\DateTime::ts( $mfaDetails['_lockouttime'] )->add( new \DateInterval( 'PT' . \IPS\Settings::i()->mfa_lockout_time . 'M' ) );
|
||||
if ( $lockEndTime->getTimestamp() < time() )
|
||||
{
|
||||
@@ -277,6 +279,10 @@ abstract class _MFAHandler
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( $member->failed_mfa_attempts == \IPS\Settings::i()->security_questions_tries )
|
||||
{
|
||||
$member->logHistory( 'core', 'login', array( 'type' => 'mfalock', 'count' => $member->failed_mfa_attempts ) );
|
||||
}
|
||||
return \IPS\Theme::i()->getTemplate( 'login', 'core', 'global' )->mfaLockout();
|
||||
}
|
||||
}
|
||||
@@ -310,11 +316,12 @@ abstract class _MFAHandler
|
||||
/**
|
||||
* Show a setup screen
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Member $member The member
|
||||
* @param bool $showingMultipleHandlers Set to TRUE if multiple options are being displayed
|
||||
* @param \IPS\Http\Url $url URL for page
|
||||
* @return string
|
||||
*/
|
||||
abstract public function configurationScreen( \IPS\Member $member, $showingMultipleHandlers = FALSE );
|
||||
abstract public function configurationScreen( \IPS\Member $member, $showingMultipleHandlers=FALSE, \IPS\Http\Url $url );
|
||||
|
||||
/**
|
||||
* Submit configuration screen. Return TRUE if was accepted
|
||||
@@ -329,10 +336,11 @@ abstract class _MFAHandler
|
||||
/**
|
||||
* Get the form for a member to authenticate
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Http\Url $url URL for page
|
||||
* @return string
|
||||
*/
|
||||
abstract public function authenticationScreen( \IPS\Member $member );
|
||||
abstract public function authenticationScreen( \IPS\Member $member, \IPS\Http\Url $url );
|
||||
|
||||
/**
|
||||
* Submit authentication screen. Return TRUE if was accepted
|
||||
@@ -368,7 +376,11 @@ abstract class _MFAHandler
|
||||
*/
|
||||
public function acpConfiguration( \IPS\Member $member )
|
||||
{
|
||||
return array( new \IPS\Helpers\Form\YesNo( "mfa_{$this->key}_title", $this->memberHasConfiguredHandler( $member ), FALSE, array( 'disabled' => !$this->memberHasConfiguredHandler( $member ) ), NULL, NULL, NULL, "mfa_{$this->key}_title" ) );
|
||||
if ( $this->memberHasConfiguredHandler( $member ) )
|
||||
{
|
||||
return array( new \IPS\Helpers\Form\YesNo( "mfa_{$this->key}_title", $this->memberHasConfiguredHandler( $member ), FALSE, array(), NULL, NULL, NULL, "mfa_{$this->key}_title" ) );
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -382,7 +394,7 @@ abstract class _MFAHandler
|
||||
{
|
||||
if ( isset( $values["mfa_{$this->key}_title"] ) and !$values["mfa_{$this->key}_title"] )
|
||||
{
|
||||
if ( isset( $member->mfa_details[ $this->key ] ) )
|
||||
if ( isset( $member->mfa_details[ $this->key ] ) and $this->memberHasConfiguredHandler( $member ) )
|
||||
{
|
||||
$this->disableHandlerForMember( $member );
|
||||
}
|
||||
|
||||
@@ -65,9 +65,10 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param bool $showingMultipleHandlers Set to TRUE if multiple options are being displayed
|
||||
* @param \IPS\Http\Url $url URL for page
|
||||
* @return string
|
||||
*/
|
||||
public function configurationScreen( \IPS\Member $member, $showingMultipleHandlers=FALSE )
|
||||
public function configurationScreen( \IPS\Member $member, $showingMultipleHandlers=FALSE, \IPS\Http\Url $url )
|
||||
{
|
||||
$securityQuestions = array();
|
||||
foreach ( Question::roots() as $question )
|
||||
@@ -88,6 +89,8 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
{
|
||||
$answers = array();
|
||||
|
||||
$isReconfiguring = $this->memberHasConfiguredHandler( $member );
|
||||
|
||||
foreach ( \IPS\Request::i()->security_question as $k => $v )
|
||||
{
|
||||
$answers[ $v ] = array(
|
||||
@@ -106,7 +109,7 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
$member->save();
|
||||
|
||||
/* Log MFA Enable */
|
||||
$member->logHistory( 'core', 'mfa', array( 'handler' => $this->key, 'enable' => TRUE ) );
|
||||
$member->logHistory( 'core', 'mfa', array( 'handler' => $this->key, 'enable' => TRUE, 'reconfigure' => $isReconfiguring ) );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -119,10 +122,11 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
/**
|
||||
* Get the form for a member to authenticate
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Http\Url $url URL for page
|
||||
* @return string
|
||||
*/
|
||||
public function authenticationScreen( \IPS\Member $member )
|
||||
public function authenticationScreen( \IPS\Member $member, \IPS\Http\Url $url )
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -186,8 +190,7 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
*/
|
||||
public function toggle( $enabled )
|
||||
{
|
||||
\IPS\Db::i()->update( 'core_sys_conf_settings', array( 'conf_value' => $enabled ), array( 'conf_key=?', 'security_questions_enabled' ) );
|
||||
unset( \IPS\Data\Store::i()->settings );
|
||||
\IPS\Settings::i()->changeValues( array( 'security_questions_enabled' => $enabled ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -300,7 +303,16 @@ class _Handler extends \IPS\MFA\MFAHandler
|
||||
* @return array
|
||||
*/
|
||||
public function acpConfigurationSave( \IPS\Member $member, $values )
|
||||
{
|
||||
{
|
||||
if ( isset( $values["mfa_{$this->key}_title"] ) and !$values["mfa_{$this->key}_title"] )
|
||||
{
|
||||
if ( $this->memberHasConfiguredHandler( $member ) )
|
||||
{
|
||||
$this->disableHandlerForMember( $member );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
\IPS\Db::i()->delete( 'core_security_answers', array( 'answer_member_id=?', $member->member_id ) );
|
||||
|
||||
$toInsert = array();
|
||||
|
||||
Reference in new issue
Block a user