diff --git a/e107_core/shortcodes/batch/signup_shortcodes.php b/e107_core/shortcodes/batch/signup_shortcodes.php index 82a929565..1ecbe68c4 100755 --- a/e107_core/shortcodes/batch/signup_shortcodes.php +++ b/e107_core/shortcodes/batch/signup_shortcodes.php @@ -65,8 +65,7 @@ class signup_shortcodes extends e_shortcode // TODO - template function sc_signup_xup_login($parm) { - $pref = e107::getPref('social_login_active'); - if (empty($pref)) return ''; + if (!e107::getUserProvider()->isSocialLoginEnabled()) return ''; $size = empty($parm['size']) ? '3x' : $parm['size']; $class = empty($parm['class']) ? 'btn btn-primary' : $parm['class'] ; @@ -77,8 +76,7 @@ class signup_shortcodes extends e_shortcode // TODO - template function sc_signup_xup_signup($parm) { - $pref = e107::getPref('social_login_active'); - if (empty($pref)) return ''; + if (!e107::getUserProvider()->isSocialLoginEnabled()) return ''; $size = empty($parm['size']) ? '2x' : $parm['size']; $class = empty($parm['class']) ? 'btn btn-primary' : $parm['class'] ; diff --git a/e107_handlers/comment_class.php b/e107_handlers/comment_class.php index 7047a4b71..eea9e1205 100644 --- a/e107_handlers/comment_class.php +++ b/e107_handlers/comment_class.php @@ -313,7 +313,7 @@ class comment else { // Comment entry not allowed - point to signup link $userReg = intval(e107::pref('core','user_reg')); - $socialLogin = e107::pref('core','social_login_active'); + $socialLogin = e107::getUserProvider()->isSocialLoginEnabled(); $text = "
"; diff --git a/e107_handlers/user_handler.php b/e107_handlers/user_handler.php index 2578f8980..445203497 100644 --- a/e107_handlers/user_handler.php +++ b/e107_handlers/user_handler.php @@ -1260,13 +1260,22 @@ class e_user_provider return $type; } + /** + * Check if social logins are enabled site-wide + * @return bool TRUE if the site has social logins enabled; FALSE otherwise + */ + public function isSocialLoginEnabled() + { + return $this->social_login_config_manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_GLOBAL); + } + /** * XUP Signup Method (falls-back to XUP login when existing user is detected). * May be used as a simple XUP login link for existing and non-existing users. */ public function signup($redirectUrl = true, $loginAfterSuccess = true, $emailAfterSuccess = true) { - if (!e107::getPref('social_login_active', false)) + if (!$this->isSocialLoginEnabled()) { throw new Exception("Signup failed! This feature is disabled.", 100); // TODO lan } @@ -1449,7 +1458,7 @@ class e_user_provider public function login($redirectUrl = true) { - if (!e107::getPref('social_login_active', false)) + if (!$this->isSocialLoginEnabled()) { throw new Exception("Login failed! This feature is disabled.", 100); // TODO lan } diff --git a/e107_handlers/user_model.php b/e107_handlers/user_model.php index b9f31cd5a..01536c058 100644 --- a/e107_handlers/user_model.php +++ b/e107_handlers/user_model.php @@ -1609,7 +1609,7 @@ class e_user extends e_user_model */ final public function loginProvider($xup) { - if(!e107::getPref('social_login_active', false)) return false; + if(!e107::getUserProvider()->isSocialLoginEnabled()) return false; if($this->isUser()) return true; @@ -1724,7 +1724,7 @@ class e_user extends e_user_model public function tryProviderSession($deniedAs) { // don't allow if main admin browse front-end or there is already user session - if((!$deniedAs && $this->getSessionDataAs()) || null !== $this->_session_data || !e107::getPref('social_login_active', false)) return $this; + if((!$deniedAs && $this->getSessionDataAs()) || null !== $this->_session_data || !e107::getUserProvider()->isSocialLoginEnabled()) return $this; $hybrid = e107::getHybridAuth(); // init the auth class @@ -1883,7 +1883,7 @@ class e_user extends e_user_model $this->_initConstants(); // init any available external user provider - if(e107::getPref('social_login_active', false)) $this->initProvider(); + if(e107::getUserProvider()->isSocialLoginEnabled()) $this->initProvider(); return $this; } diff --git a/e107_plugins/social/SocialLoginConfigManager.php b/e107_plugins/social/SocialLoginConfigManager.php index 2c3663e39..2f5b76ab3 100644 --- a/e107_plugins/social/SocialLoginConfigManager.php +++ b/e107_plugins/social/SocialLoginConfigManager.php @@ -35,16 +35,24 @@ class SocialLoginConfigManager /** * Check a social login boolean (toggle) setting + * + * For backwards compatibility, if the global bit (0) is off, no other bits can be on. + * * @param int $bit Which setting to check * @return boolean TRUE if the setting is enabled, FALSE otherwise */ public function isFlagActive($bit = self::ENABLE_BIT_GLOBAL) { - return (bool)($this->config->get(self::SOCIAL_LOGIN_FLAGS) & 1 << $bit); + $flags = $this->config->get(self::SOCIAL_LOGIN_FLAGS); + if (!($flags & 1 << self::ENABLE_BIT_GLOBAL)) return false; + return (bool)($flags & 1 << $bit); } /** * Set a social login boolean (toggle) setting + * + * For backwards compatibility, if the global bit (0) is off, no other bits can be on. + * * @param int $bit Which setting to change * @param boolean $active TRUE to enable the setting, FALSE to disable the setting */ @@ -54,7 +62,9 @@ class SocialLoginConfigManager if (!is_numeric($flags)) $flags = 0x0; $flags = $flags & ~(1 << $bit) | ($active << $bit); - $this->config->set(self::SOCIAL_LOGIN_FLAGS, $flags); + + if (!($flags & 1 << self::ENABLE_BIT_GLOBAL)) $this->config->set(self::SOCIAL_LOGIN_FLAGS, 0x0); + else $this->config->set(self::SOCIAL_LOGIN_FLAGS, $flags); $this->saveConfig(); } diff --git a/e107_plugins/social/admin_config.php b/e107_plugins/social/admin_config.php index a1857ac04..fb121bacc 100644 --- a/e107_plugins/social/admin_config.php +++ b/e107_plugins/social/admin_config.php @@ -225,7 +225,9 @@ class social_ui extends e_admin_ui return "

" . LAN_SOCIAL_UPDATE_REQUIRED . "

"; } - $text = " + $text = $this->generateAdminFormJs(); + + $text .= "
@@ -466,6 +468,53 @@ class social_ui extends e_admin_ui return $text; } + + private function generateAdminFormJs() + { + return << +var e107 = e107 || {'settings': {}, 'behaviors': {}}; + +let socialLoginSwitches = { + 'social-login-test-page__switch': null, +}; + +function socialLoginSwitchesHighstate(element) { + if (element === undefined) return; + + let isActive = element.checked; + + if (isActive) { + for (let key in socialLoginSwitches) { + let toggle = $('[name='+key+']'); + toggle.bootstrapSwitch('disabled', false); + if (socialLoginSwitches[key] !== null) toggle.bootstrapSwitch('state', socialLoginSwitches[key]); + } + } else { + for (let key in socialLoginSwitches) { + let toggle = $('[name='+key+']'); + socialLoginSwitches[key] = toggle.bootstrapSwitch('state'); + toggle.bootstrapSwitch('state', false); + toggle.bootstrapSwitch('disabled', true); + } + } +} + +(function ($) +{ + e107.behaviors.manageSocialLoginSwitches = { + attach: function (context, settings) { + let globalSwitch = $('[name=social-login-active__switch]'); + socialLoginSwitchesHighstate(globalSwitch.get(0)); + globalSwitch.on('switchChange.bootstrapSwitch', function(event) { + socialLoginSwitchesHighstate(event.target); + }); + }, + }; +})(jQuery); + +EOD; + } } diff --git a/e107_plugins/social/e_shortcode.php b/e107_plugins/social/e_shortcode.php index ef1775048..1c3ee6eec 100644 --- a/e107_plugins/social/e_shortcode.php +++ b/e107_plugins/social/e_shortcode.php @@ -164,7 +164,7 @@ class social_shortcodes extends e_shortcode function sc_social_login($parm=null) { - $pref = e107::pref('core', 'social_login_active'); + $pref = e107::getUserProvider()->isSocialLoginEnabled(); diff --git a/e107_tests/tests/unit/plugins/social/SocialLoginConfigManagerTest.php b/e107_tests/tests/unit/plugins/social/SocialLoginConfigManagerTest.php index b7cad210e..b59fb4fc9 100644 --- a/e107_tests/tests/unit/plugins/social/SocialLoginConfigManagerTest.php +++ b/e107_tests/tests/unit/plugins/social/SocialLoginConfigManagerTest.php @@ -55,22 +55,48 @@ class SocialLoginConfigManagerTest extends \Codeception\Test\Unit $this->manager = new SocialLoginConfigManager($this->pref); } - public function testFlagSetting() + public function testFlagSettingOff() { $this->pref->set(SocialLoginConfigManager::SOCIAL_LOGIN_FLAGS, 0x0); $this->manager = new SocialLoginConfigManager($this->pref); $this->assertFalse($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_GLOBAL)); $this->assertFalse($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_TEST_PAGE)); + } + public function testFlagSettingGlobalOffPreventsOthersOn() + { $this->manager->setFlag(SocialLoginConfigManager::ENABLE_BIT_GLOBAL, 0); $this->manager->setFlag(SocialLoginConfigManager::ENABLE_BIT_TEST_PAGE, 1); $this->assertFalse($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_GLOBAL)); - $this->assertTrue($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_TEST_PAGE)); + $this->assertFalse($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_TEST_PAGE)); + } + public function testFlagSettingGlobalOnAllowsOtherToggles() + { $this->manager->setFlag(SocialLoginConfigManager::ENABLE_BIT_GLOBAL, 1); $this->manager->setFlag(SocialLoginConfigManager::ENABLE_BIT_TEST_PAGE, 0); $this->assertTrue($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_GLOBAL)); $this->assertFalse($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_TEST_PAGE)); + + $this->manager->setFlag(SocialLoginConfigManager::ENABLE_BIT_TEST_PAGE, 1); + $this->assertTrue($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_GLOBAL)); + $this->assertTrue($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_TEST_PAGE)); + } + + /** + * Don't break existing client code that checks if social_login_active is 0 or not! + * If the global bit is 0, all the other bits should be 0, too. + */ + public function testFlagGlobalOffTurnsAllOff() + { + $this->pref->set(SocialLoginConfigManager::SOCIAL_LOGIN_FLAGS, ~0); + $this->manager = new SocialLoginConfigManager($this->pref); + $this->assertTrue($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_GLOBAL)); + $this->assertTrue($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_TEST_PAGE)); + + $this->manager->setFlag(SocialLoginConfigManager::ENABLE_BIT_GLOBAL, 0); + $this->assertFalse($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_GLOBAL)); + $this->assertFalse($this->manager->isFlagActive(SocialLoginConfigManager::ENABLE_BIT_TEST_PAGE)); } public function testIsProviderEnabled() diff --git a/index.php b/index.php index 8eec5a839..9d0359573 100644 --- a/index.php +++ b/index.php @@ -120,7 +120,7 @@ // unset($_SESSION['E:SOCIAL']); - if(vartrue($_GET['provider']) && !isset($_SESSION['E:SOCIAL']) && e107::getPref('social_login_active', false) && (e_ADMIN_AREA !== true)) + if(vartrue($_GET['provider']) && !isset($_SESSION['E:SOCIAL']) && e107::getUserProvider()->isSocialLoginEnabled() && (e_ADMIN_AREA !== true)) { $hybridauth = e107::getHybridAuth(); diff --git a/login.php b/login.php index 2d0210180..0d540405e 100644 --- a/login.php +++ b/login.php @@ -13,7 +13,7 @@ require_once("class2.php"); -if ((USER || e_LOGIN != e_SELF || (empty($pref['user_reg']) && empty($pref['social_login_active']))) && e_QUERY !== 'preview' && !getperms('0') ) // Disable page if user logged in, or some custom e_LOGIN value is used. +if ((USER || e_LOGIN != e_SELF || (empty($pref['user_reg']) && !e107::getUserProvider()->isSocialLoginEnabled())) && e_QUERY !== 'preview' && !getperms('0') ) // Disable page if user logged in, or some custom e_LOGIN value is used. { $prev = e107::getRedirect()->getPreviousUrl();