public static function getUser($jUserId, $provider = 'facebook') { if (self::$instances == null) { self::$instances = array(); } if (!array_key_exists($jUserId, self::$instances)) { self::$instances[$jUserId] = array(); } if (!array_key_exists($provider, self::$instances[$jUserId])) { $instance = new JFBConnectModelUserMap(); $instance->getData($jUserId, $provider); self::$instances[$jUserId][$provider] = $instance; } return self::$instances[$jUserId][$provider]; }
function display($tpl = null) { $actionModel = $this->getModel('OpenGraphAction', 'JFBConnectModel'); $activityModel = $this->getModel('OpenGraphActivity', 'JFBConnectModel'); $objectModel = $this->getModel('OpenGraphObject', 'JFBConnectModel'); $user = JFactory::getUser(); if ($this->getLayout() == 'activity') { $activityModel->setUserId($user->get('id')); $rows = $activityModel->getActivityForUser(); $this->rows = $rows; $this->actionModel = $actionModel; $this->objectModel = $objectModel; $pagination = $activityModel->getPagination(); $this->pagination = $pagination; } else { if ($this->getLayout() == 'settings') { $user = JFactory::getUser(); $userModel = JFBConnectModelUserMap::getUser($user->get('id'), 'facebook'); $userData = $userModel->getData(); $actionsDisabled = $userData->params->get('og_actions_disabled'); $this->actionsDisabled = $actionsDisabled; $actionModel = $this->getModel('OpenGraphAction', 'JFBConnectModel'); $actions = $actionModel->getActions(true); $editableActions = array(); foreach ($actions as $action) { if ($action->can_disable) { $editableActions[] = $action; } } $this->actions = $editableActions; } } JFBCFactory::addStylesheet('jfbconnect.css'); parent::display($tpl); }
function display($tpl = null) { $user = JFactory::getUser(); $providers = JFBCFactory::getAllProviders(); $providerData = array(); foreach ($providers as $provider) { if ($provider->appId && $provider->secretKey) { $userModel = JFBConnectModelUserMap::getUser($user->get('id'), $provider->systemName); $userData = $userModel->getData(); $providerInfo = new stdClass(); $providerInfo->profileUrl = $userData->params->get('data.profile_url'); if (empty($providerInfo->profileUrl)) { //JOOMLA 2.5 $providerInfo->profileUrl = $userData->params->get('profile_url'); } $providerInfo->isMapped = $userData->provider != null; $providerInfo->name = $provider->name; $providerInfo->provider = $provider; $providerInfo->systemName = $provider->systemName; $providerData[$provider->name] = $providerInfo; } } $this->providerData = $providerData; JFBCFactory::addStylesheet('jfbconnect.css'); parent::display($tpl); }
public function unlink() { JSession::checkToken('get') or die('Invalid Token'); $provider = JRequest::getString('provider', ''); $user = JFactory::getUser(); $userModel = JFBConnectModelUserMap::getUser($user->get('id'), $provider); $provider_user_id = $userModel->getProviderUserId($user->get('id'), $provider); $userModel->deleteMapping($provider_user_id, $provider); JFBCFactory::log(JText::sprintf('COM_JFBCONNECT_ACCOUNT_LINKED_ACCOUNTS_UNLINK_MESSAGE', $provider)); $this->setRedirect(JRoute::_('index.php?option=com_jfbconnect&view=account')); }
/** * Method to delete one or more records. * * @param array &$pks An array of record primary keys. * * @return boolean True if successful, false if an error occurs. * * Copied from the Joomla legacy folder. Removed content triggers and added deletion of scope for associated user */ public function delete(&$pks) { $pks = (array) $pks; $table = $this->getTable(); // Iterate the items to delete each one. foreach ($pks as $i => $pk) { if ($table->load($pk)) { if ($this->canDelete($table)) { // Delete any scope for the user associated with this channel $attribs = $table->attribs; if (isset($attribs->user_id)) { $userModel = JFBConnectModelUserMap::getUser($attribs->user_id, $table->provider); $userModel->removeAllScope('channel', $table->id); } if (!$table->delete($pk)) { $this->setError($table->getError()); return false; } } else { // Prune items that you can't change. unset($pks[$i]); $error = $this->getError(); if ($error) { JLog::add($error, JLog::WARNING, 'jerror'); return false; } else { JLog::add(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'), JLog::WARNING, 'jerror'); return false; } } } else { $this->setError($table->getError()); return false; } } // Clear the component's cache $this->cleanCache(); return true; }
function onAuthenticate($credentials, $options, &$response) { # authentication via facebook for Joomla always uses the FB API and secret keys # When this is present, the user's FB uid is used to look up their Joomla uid and log that user in jimport('joomla.filesystem.file'); $configFile = JPATH_ROOT . DS . 'administrator' . DS . 'components' . DS . 'com_jfbconnect' . DS . 'models' . DS . 'config.php'; if (JFile::exists($configFile)) { include_once JPATH_ROOT . DS . 'administrator' . DS . 'components' . DS . 'com_jfbconnect' . DS . 'models' . DS . 'config.php'; $configModel = new JFBConnectModelConfig(); # always check the secret username and password to indicate this is a JFBConnect login #echo "Entering JFBConnectAuth<br>"; if ($credentials['username'] != $configModel->getSetting('facebook_api_key') || $credentials['password'] != $configModel->getSetting('facebook_secret_key')) { $response->status = JAUTHENTICATE_STATUS_FAILURE; $response->error_message = 'Facebook authentication failed'; return false; } #echo "Passed API/Secret key check, this is a FB login<br>"; include_once JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_jfbconnect' . DS . 'models' . DS . 'usermap.php'; $userMapModel = new JFBConnectModelUserMap(); include_once JPATH_ROOT . DS . 'components' . DS . 'com_jfbconnect' . DS . 'libraries' . DS . 'facebook.php'; $fbClient = JFBConnectFacebookLibrary::getInstance(); $fbUserId = $fbClient->getUserId(FALSE); $app =& JFactory::getApplication(); #echo "Facebook user = "******"User is logged into FB<br>"; # Test if user has a Joomla mapping $jUserId = $userMapModel->getJoomlaUserId($fbUserId); if ($jUserId) { #echo "User has joomla mapping<br>"; $jUser = JUser::getInstance($jUserId); if ($jUser->id == null) { #echo "user NOT loaded, deleting"; $userMapModel->deleteMapping($fbUserId); return false; } $isAllowed = true; # Trigger the jfbcProfile onAuthenticate to see if the user is allowed to login if ($jUser->block) { $isAllowed = false; $app->enqueueMessage(JText::_('E_NOLOGIN_BLOCKED'), 'error'); } else { JPluginHelper::importPlugin('jfbcprofiles'); $args = array($jUserId, $fbUserId); $responses = $app->triggerEvent('jfbcProfilesOnAuthenticate', $args); $return = base64_decode(JRequest::getVar('return')); $isAllowed = true; foreach ($responses as $response) { if (is_object($response) && !$response->status) { $isAllowed = false; $app->enqueueMessage($response->message, 'error'); } } } if ($isAllowed) { $response->status = JAUTHENTICATE_STATUS_SUCCESS; $response->username = $jUser->username; if (!$configModel->getSetting('create_new_users')) { // Update the J user's email to what it is in Facebook $fbProfileFields = $fbClient->getUserProfile($fbUserId, array('email')); if ($fbProfileFields != null && $fbProfileFields['email']) { $jUser->email = $fbProfileFields['email']; $jUser->save(); } } $response->email = $jUser->email; $response->fullname = $jUser->name; $response->error_message = ''; return true; } } else { if (!$configModel->getSetting('create_new_users')) { # User is not in system, should create their account automatically #echo "Creating a pseudo-user<br>"; $fbUser = $fbClient->_getUserName($fbUserId); if ($fbUser == null) { # no information returned from FB return false; } // Get the email to use from Facebook $fbProfileFields = $fbClient->getUserProfile($fbUserId, array('email')); if ($fbProfileFields == null || !$fbProfileFields['email']) { $newEmail = $fbUser['first_name'] . "_" . $fbUserId . "@unknown.com"; } else { $newEmail = $fbProfileFields['email']; } $fullname = $fbUser['name']; $username = "******" . $fbUserId; #Use the Joomla User plugin to create the User row in the database JPluginHelper::importPlugin('user'); $user['fullname'] = $fullname; $user['username'] = $username; $user['password_clear'] = ""; $user['email'] = $newEmail; $jUser = $app->triggerEvent('_getUser', array($user)); $jUser = $jUser[0]; #Map the new user include_once JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_jfbconnect' . DS . 'models' . DS . 'usermap.php'; $userMapModel = new JFBConnectModelUserMap(); if ($userMapModel->mapUser($fbUserId, $jUser->get('id'))) { $app->enqueueMessage(JText::_('MAP USER SUCCESS')); } else { $app->enqueueMessage(JText::_('MAP USER FAIL')); } $response->status = JAUTHENTICATE_STATUS_SUCCESS; $response->email = $newEmail; $response->fullname = $fullname; $response->username = $username; $response->error_message = ''; return true; } } } } # catch everything else as an authentication failure #echo "Authentication Failure<br>"; $response->status = JAUTHENTICATE_STATUS_FAILURE; $response->error_message = 'Facebook authentication failed'; return false; }
function getJoomlaUserID() { $userMapModel = new JFBConnectModelUserMap(); return $userMapModel->getJoomlaUserId($this->jfbcLibrary->getUserId(FALSE)); }
function loginFacebookUser() { $app = JFactory::getApplication(); $jfbcLibrary = JFBConnectFacebookLibrary::getInstance(); $fbUserId = $jfbcLibrary->getUserId(FALSE); #echo "Con. Logging in FB User : "******"<br>"; require_once JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_jfbconnect' . DS . 'models' . DS . 'usermap.php'; $userMapModel = new JFBConnectModelUserMap(); $configModel = $jfbcLibrary->configModel; $user = JFactory::getUser(); if ($user->guest) { # Guest: Check if they have a Joomla user and log that user in. If not, create them one $jUserId = $userMapModel->getJoomlaUserId($fbUserId); if (!$fbUserId) { # Facebook isn't returning information about this user. Redirect them. $app->enqueueMessage('We were unable to retrieve your Facebook account information. Please try again'); $app->redirect('index.php'); } # Check if automatic email mapping is allowed, and see if that email is registered # AND the Facebook user doesn't already have a Joomla account if ($configModel->getSetting('facebook_auto_map_by_email') && !$jUserId) { $fbProfileFields = $jfbcLibrary->getUserProfile($fbUserId, array('email')); if ($fbProfileFields != null && $fbProfileFields['email']) { $fbEmail = $fbProfileFields['email']; $jUserEmailId = $userMapModel->getJoomlaUserIdFromEmail($fbEmail); if ($jUserEmailId && $jUserEmailId != 0) { // Found a user with the same email address // do final check to make sure there isn't a FB account already mapped to it $jUserId = $userMapModel->getFacebookUserId($jUserEmailId); if (!$jUserId) { if ($userMapModel->mapUser($fbUserId, $jUserEmailId)) { $app->enqueueMessage(JText::_('MAP USER SUCCESS')); } else { $app->enqueueMessage(JText::_('MAP USER FAIL')); } $app->enqueueMessage(JText::_('MAP USER SUCCESS')); $jUserId = $jUserEmailId; // Update the temp jId so that we login below } } } } if ($configModel->getSetting('create_new_users') && $jUserId == null) { # User not in system, create new users setting enabled. Redirect to the login/register form $app->redirect(JRoute::_('index.php?option=com_jfbconnect&view=loginregister', false)); } #set the initial registration variable so that the user plugin knows to map user and trigger onAfterRegistration if ($jUserId == null) { $jfbcLibrary->setInitialRegistration(); } require_once JPATH_COMPONENT . DS . 'controllers' . DS . 'loginregister.php'; $loginController = new JFBConnectControllerLoginRegister(); $loginController->login(); // Perform the login function } else { #echo "Updating mapping only"; if ($userMapModel->mapUser($fbUserId)) { $app->enqueueMessage(JText::_('MAP USER SUCCESS')); } else { $app->enqueueMessage(JText::_('MAP USER FAIL')); } } $return = base64_decode(JRequest::getVar('return')); $app->redirect($return); }
function mapCurrentUser() { $app = JFactory::getApplication(); require_once JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_jfbconnect' . DS . 'models' . DS . 'usermap.php'; $jfbcLibrary = JFBConnectFacebookLibrary::getInstance(); $userMapModel = new JFBConnectModelUserMap(); # quick check to ensure no baddies $rawFbUserId = $jfbcLibrary->getUserId(FALSE); if ($rawFbUserId != JRequest::getVar('fbid', '', 'POST')) { $return = JRoute::_('index.php?option=com_jfbconnect&view=loginregister', false); $app->enqueueMessage(JText::_('MAP USER FAIL'), 'error'); $app->redirect($return); } $username = JRequest::getVar('username', '', 'POST'); $password = JRequest::getVar('password', '', 'POST'); $error = $app->login(array('username' => $username, 'password' => $password)); if (!JError::isError($error)) { # logged in successfully $lang = JFactory::getLanguage(); $lang->load('com_jfbconnect'); if ($userMapModel->mapUser($rawFbUserId)) { $app->enqueueMessage(JText::_('MAP USER SUCCESS')); } else { $app->enqueueMessage(JText::_('MAP USER FAIL')); } #$return = base64_decode(JRequest::getVar('return')); $configModel = $jfbcLibrary->configModel; $redirectURL = $configModel->getSetting('facebook_new_user_url', 'index.php'); $app->redirect($redirectURL); } else { $return = JRoute::_('index.php?option=com_jfbconnect&view=loginregister', false); $app->redirect($return); } }
public function enabledForUser() { if ($this->can_disable) { $user = JFactory::getUser(); $userModel = JFBConnectModelUserMap::getUser($user->get('id'), 'facebook'); $userData = $userModel->getData(); $actionsDisabled = $userData->params->get('og_actions_disabled'); $actId = $this->id; if (is_object($actionsDisabled) && property_exists($actionsDisabled, $actId) && $actionsDisabled->{$actId} == 1) { return false; } } return true; }
function onBeforeDeleteUser($user) { require_once JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_jfbconnect' . DS . 'models' . DS . 'usermap.php'; $model = new JFBConnectModelUserMap(); $model->deleteMappingWithJoomlaId($user['id']); }
function getFacebookMappedId() { $userMapModel = new JFBConnectModelUserMap(); jimport('joomla.user.helper'); $jUser =& JFactory::getUser(); return $userMapModel->getFacebookUserId($jUser->id); }
private function disableAction($id) { $user = JFactory::getUser(); $userModel = JFBConnectModelUserMap::getUser($user->get('id'), 'facebook'); $userData = $userModel->getData(); $ogDisabledActions = $userData->params->get('og_actions_disabled', new stdClass()); $actionModel = $this->getModel('OpenGraphAction', 'JFBConnectModel'); $action = $actionModel->getAction($id); $actionId = $action->id; if ($action->can_disable) { $ogDisabledActions->{$actionId} = 1; } $userModel->saveParameter('og_actions_disabled', $ogDisabledActions); }
public function onBeforeLogin() { $userModel = JFBConnectModelUserMap::getUser(JFBCFactory::usermap()->getJoomlaUserId($this->getProviderUserId(), $this->systemName), $this->systemName); $requiredScope = $userModel->_data->params->get('required_scope', null); if ($requiredScope) { $checkScope = array(); foreach ($requiredScope as $key => $val) { $checkScope[] = $key; } // This may redirect the user back through the login flow to get the specific permissions for them. $neededScope = $this->checkRequiredScope($checkScope); if (count($neededScope)) { $this->fetchNewScope($neededScope); } } }
function onUserAuthenticate($credentials, $options, &$response) { $response->type = 'JFBConnectAuth'; # authentication via facebook for Joomla always uses the FB API and secret keys # When this is present, the user's FB uid is used to look up their Joomla uid and log that user in jimport('joomla.filesystem.file'); $provider = null; if (isset($options['provider'])) { $provider = $options['provider']; } if (class_exists('JFBCFactory') && $provider) { # always check the secret username and password to indicate this is a JFBConnect login #echo "Entering JFBConnectAuth<br>"; if ($credentials['username'] != $provider->appId || $credentials['password'] != $provider->secretKey) { $response->status = JAuthentication::STATUS_FAILURE; return false; } #echo "Passed API/Secret key check, this is a FB login<br>"; include_once JPATH_ADMINISTRATOR . '/components/com_jfbconnect/models/usermap.php'; $userMapModel = new JFBConnectModelUserMap(); $providerUserId = $provider->getProviderUserId(); $app = JFactory::getApplication(); #echo "Facebook user = ".$fbUserId; # test if user is logged into Facebook if ($providerUserId) { # Test if user has a Joomla mapping $jUserId = $userMapModel->getJoomlaUserId($providerUserId, $provider->name); if ($jUserId) { $jUser = JUser::getInstance($jUserId); if ($jUser->id == null) { $userMapModel->deleteMapping($providerUserId, $provider->name); return false; } if ($jUser->block) { $isAllowed = false; JFBCFactory::log(JText::_('JERROR_NOLOGIN_BLOCKED'), 'error'); } else { JPluginHelper::importPlugin('socialprofiles'); $args = array($provider->name, $jUserId, $providerUserId); $responses = $app->triggerEvent('socialProfilesOnAuthenticate', $args); $isAllowed = true; foreach ($responses as $prResponse) { if (is_object($prResponse) && !$prResponse->status) { $isAllowed = false; JFBCFactory::log($prResponse->message, 'error'); } } } if ($isAllowed) { $response->status = JAuthentication::STATUS_SUCCESS; $response->username = $jUser->username; $response->language = $jUser->getParam('language'); $response->email = $jUser->email; $response->fullname = $jUser->name; $response->error_message = ''; return true; } } } } # catch everything else as an authentication failure $response->status = JAuthentication::STATUS_FAILURE; return false; }
function login($provider = null) { if (!is_object($provider)) { $provider = JFBCFactory::provider(JRequest::getCmd('provider')); } // Let the provider do anything it wants before we try to login. $provider->onBeforeLogin(); $loginRegisterModel = $this->getModel('LoginRegister', 'JFBConnectModel'); // Set a cookie to prevent auto-logging in for the remainder of the session time $config = JFactory::getConfig(); $lifetime = $config->get('lifetime', 15); setcookie('jfbconnect_autologin_disable', 1, time() + $lifetime * 60); // Not a perfect solution, but fixes autologin loops.. $app = JFactory::getApplication(); $providerUserId = $provider->getProviderUserId(); if (!$providerUserId) { # Facebook isn't returning information about this user. Redirect them. JFBCFactory::log(JText::sprintf('COM_JFBCONNECT_UNABLE_TO_RETRIEVE_USER', $provider->name)); $app->redirect('index.php'); } $userMapModel = JFBCFactory::usermap(); $jUser = JFactory::getUser(); if (!$jUser->guest) { SCSocialUtilities::clearJFBCNewMappingEnabled(); if ($userMapModel->map($jUser->get('id'), $providerUserId, strtolower($provider->name), $provider->client->getToken())) { JFBCFactory::log(JText::sprintf('COM_JFBCONNECT_MAP_USER_SUCCESS', $provider->name)); } else { JFBCFactory::log(JText::sprintf('COM_JFBCONNECT_MAP_USER_FAIL', $provider->name)); } $return = $loginRegisterModel->getLoginRedirect($provider); $app->redirect($return); } // They're not logged in. Check if they have a Joomla user and log that user in. If not, create them one $jUserId = $userMapModel->getJoomlaUserId($providerUserId, strtolower($provider->name)); if (!$jUserId) { $profile = $provider->profile->fetchProfile($providerUserId, array('email')); $providerEmail = $profile->get('email', null); # Check if automatic email mapping is allowed, and see if that email is registered # AND the Facebook user doesn't already have a Joomla account if (!$provider->initialRegistration && JFBCFactory::config()->getSetting('facebook_auto_map_by_email')) { if ($providerEmail != null) { $jUserEmailId = $userMapModel->getJoomlaUserIdFromEmail($providerEmail); if (!empty($jUserEmailId)) { // Found a user with the same email address // do final check to make sure there isn't a FB account already mapped to it $tempId = $userMapModel->getProviderUserId($jUserEmailId, strtolower($provider->name)); if (!$tempId) { SCSocialUtilities::clearJFBCNewMappingEnabled(); if ($userMapModel->map($jUserEmailId, $providerUserId, strtolower($provider->name), $provider->client->getToken())) { JFBCFactory::log(JText::sprintf('COM_JFBCONNECT_MAP_USER_SUCCESS', $provider->name)); $jUserId = $jUserEmailId; // Update the temp jId so that we login below } else { JFBCFactory::log(JText::sprintf('COM_JFBCONNECT_MAP_USER_FAIL', $provider->name)); } } } } } // Check if no mapping, and Automatic Registration is set. If so, auto-create the new user. if (!$jUserId && JFBCFactory::config()->getSetting('automatic_registration')) { # User is not in system, should create their account automatically if ($loginRegisterModel->autoCreateUser($providerUserId, $provider)) { $jUserId = $userMapModel->getJoomlaUserId($providerUserId, strtolower($provider->name)); } } // At this point, we have nothing left to do but redirect the user to the registration page if (!$jUserId) { $return = $loginRegisterModel->getLoginRedirect($provider); $app = JFactory::getApplication(); $regComponent = JFBCFactory::config()->get('registration_component'); if ($regComponent == 'jfbconnect') { $app->redirect(JRoute::_('index.php?option=com_jfbconnect&view=loginregister&provider=' . strtolower($provider->name) . '&return=' . base64_encode($return), false)); } else { $app->setUserState('com_jfbconnect.registration.alternateflow', true); $app->setUserState('com_jfbconnect.registration.provider.name', strtolower($provider->name)); $app->setUserState('com_jfbconnect.registration.provider.user_id', $providerUserId); $plugins = $app->triggerEvent('socialProfilesGetPlugins'); foreach ($plugins as $plugin) { if ($plugin->getName() == $regComponent) { $redirect = $plugin->registration_url; } } if ($redirect) { $app->redirect(JRoute::_($redirect, false)); } } } } $jUser = JUser::getInstance($jUserId); $loginSuccess = false; // Try to log the user, but not if blocked and initial registration (then there will be a pretty message on how to activate) if (!$provider->initialRegistration || $jUser->get('block') == 0 && $provider->initialRegistration) { $options = array('silent' => 1, 'provider' => $provider, 'provider_user_id' => $providerUserId); // Disable other authentication messages // hack for J3.2.0 bug. Should remove after 3.2.1 is available. $password = $provider->secretKey; $loginSuccess = $app->login(array('username' => $provider->appId, 'password' => $password), $options); } if ($loginSuccess) { // lets update the user's access token with whatever we just received $jUser = JFactory::getUser(); $userMapModel->updateUserToken($jUser->get('id'), $provider->systemName, $provider->client->getToken()); // Store Profile URL and Avatar URL $userModel = JFBConnectModelUserMap::getUser($jUser->get('id'), $provider->name); $userModel->saveParameter('profile_url', JFBCFactory::provider($provider->name)->profile->getProfileUrl($providerUserId)); $avatarSettings = new JRegistry(); $avatarSettings->set('width', 50); $avatarSettings->set('height', 50); $userModel->saveParameter('avatar_thumb', JFBCFactory::provider($provider->name)->profile->getAvatarUrl($providerUserId, false, $avatarSettings)); if (!$provider->initialRegistration) { $args = array(strtolower($provider->name), $jUser->get('id'), $providerUserId); $app->triggerEvent('socialProfilesOnLogin', $args); } } JFactory::getApplication()->setUserState('com_jfbconnect.' . strtolower($provider->name) . '.checkForNewMapping', null); $allProviders = JFBCFactory::getAllProviders(); foreach ($allProviders as $p) { $p->checkNewMapping(); } $redirect = $loginRegisterModel->getLoginRedirect($provider); // Clear the 'alternate flow' session bit to prevent further alterations to reg pages for this user/session $app->setUserState('com_jfbconnect.registration.alternateflow', false); $app->redirect($redirect); }