123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- <?php
- /**
- * Licence: GPL
- * Please contact CBlue regarding any licences issues.
- * Author: noel@cblue.be
- * Copyright: CBlue SPRL, 20XX.
- *
- * External login module : FACEBOOK
- *
- * This files provides the facebookConnect() and facebook_get_url functions
- * Please edit the facebook.conf.php file to adapt it to your fb application parameter
- */
- require_once __DIR__.'/../../inc/global.inc.php';
- require_once __DIR__.'/facebook.init.php';
- require_once __DIR__.'/functions.inc.php';
- /**
- * This function connect to facebook and retrieves the user info
- * If user does not exist in chamilo, it creates it and logs in
- * If user already exists, it updates his info.
- */
- function facebookConnect()
- {
- $fb = new \Facebook\Facebook([
- 'app_id' => $GLOBALS['facebook_config']['appId'],
- 'app_secret' => $GLOBALS['facebook_config']['secret'],
- 'default_graph_version' => 'v2.2',
- ]);
- $helper = $fb->getRedirectLoginHelper();
- try {
- $accessToken = $helper->getAccessToken();
- } catch (Facebook\Exceptions\FacebookResponseException $e) {
- Display::addFlash(
- Display::return_message('Facebook Graph returned an error: '.$e->getMessage(), 'error')
- );
- header('Location: '.api_get_path(WEB_PATH));
- exit;
- } catch (Facebook\Exceptions\FacebookSDKException $e) {
- Display::addFlash(
- Display::return_message('Facebook SDK returned an error: '.$e->getMessage(), 'error')
- );
- header('Location: '.api_get_path(WEB_PATH));
- exit;
- }
- if (!isset($accessToken)) {
- if (!$helper->getError()) {
- return;
- }
- if (isset($_GET['loginFailed'])) {
- return;
- }
- $error = implode('<br>', [
- 'Error: '.$helper->getError(),
- 'Error Code: '.$helper->getErrorCode(),
- 'Error Reason: '.$helper->getErrorReason(),
- 'Error Description: '.$helper->getErrorDescription(),
- ]);
- Display::addFlash(
- Display::return_message($error, 'error', false)
- );
- header('Location: '.api_get_path(WEB_PATH));
- exit;
- }
- $oAuth2Client = $fb->getOAuth2Client();
- $tokenMetadata = $oAuth2Client->debugToken($accessToken);
- $tokenMetadata->validateAppId($GLOBALS['facebook_config']['appId']);
- $tokenMetadata->validateExpiration();
- if (!$accessToken->isLongLived()) {
- try {
- $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
- } catch (Facebook\Exceptions\FacebookSDKException $e) {
- Display::addFlash(
- Display::return_message('Error getting long-lived access token: '.$e->getMessage(), 'error')
- );
- header('Location: '.api_get_path(WEB_PATH));
- exit;
- }
- }
- try {
- $response = $fb->get('/me?fields=id,first_name,last_name,locale,email', $accessToken->getValue());
- } catch (Facebook\Exceptions\FacebookResponseException $e) {
- Display::addFlash(
- Display::return_message('Graph returned an error: '.$e->getMessage(), 'error')
- );
- header('Location: '.api_get_path(WEB_PATH));
- exit;
- } catch (Facebook\Exceptions\FacebookSDKException $e) {
- Display::addFlash(
- Display::return_message('Facebook SDK returned an error: '.$e->getMessage(), 'error')
- );
- header('Location: '.api_get_path(WEB_PATH));
- exit;
- }
- $user = $response->getGraphUser();
- $language = facebookPluginGetLanguage($user['locale']);
- if (!$language) {
- $language = 'en_US';
- }
- $u = [
- 'firstname' => $user->getFirstName(),
- 'lastname' => $user->getLastName(),
- 'status' => STUDENT,
- 'email' => $user->getEmail(),
- 'username' => changeToValidChamiloLogin($user->getEmail()),
- 'language' => $language,
- 'password' => 'facebook',
- 'auth_source' => 'facebook',
- 'extra' => [],
- ];
- $chamiloUinfo = api_get_user_info_from_email($user->getEmail());
- $_user['uidReset'] = true;
- $_user['language'] = $language;
- if ($chamiloUinfo === false) {
- // We have to create the user
- $chamilo_uid = external_add_user($u);
- if ($chamilo_uid === false) {
- Display::addFlash(
- Display::return_message(get_lang('UserNotRegistered'), 'error')
- );
- header('Location: '.api_get_path(WEB_PATH));
- exit;
- }
- $_user['user_id'] = $chamilo_uid;
- $_SESSION['_user'] = $_user;
- header('Location: '.api_get_path(WEB_PATH));
- exit();
- }
- // User already exists, update info and login
- $chamilo_uid = $chamiloUinfo['user_id'];
- $u['user_id'] = $chamilo_uid;
- external_update_user($u);
- $_user['user_id'] = $chamilo_uid;
- $_SESSION['_user'] = $_user;
- header('Location: '.api_get_path(WEB_PATH));
- exit();
- }
- /**
- * Get facebook login url for the platform.
- *
- * @return string
- */
- function facebookGetLoginUrl()
- {
- $fb = new \Facebook\Facebook([
- 'app_id' => $GLOBALS['facebook_config']['appId'],
- 'app_secret' => $GLOBALS['facebook_config']['secret'],
- 'default_graph_version' => 'v2.2',
- ]);
- $helper = $fb->getRedirectLoginHelper();
- $loginUrl = $helper->getLoginUrl(api_get_path(WEB_PATH).'?action=fbconnect', [
- 'email',
- ]);
- return $loginUrl;
- }
- /**
- * Return a valid Chamilo login
- * Chamilo login only use characters lettres, des chiffres et les signes _ . -.
- *
- * @param $in_txt
- *
- * @return mixed
- */
- function changeToValidChamiloLogin($in_txt)
- {
- return preg_replace("/[^a-zA-Z1-9_\-.]/", "_", $in_txt);
- }
- /**
- * Get user language.
- *
- * @param string $language
- *
- * @return bool
- */
- function facebookPluginGetLanguage($language = 'en_US')
- {
- $language = substr($language, 0, 2);
- $sqlResult = Database::query(
- "SELECT english_name FROM ".
- Database::get_main_table(TABLE_MAIN_LANGUAGE).
- " WHERE available = 1 AND isocode = '$language'"
- );
- if (Database::num_rows($sqlResult)) {
- $result = Database::fetch_array($sqlResult);
- return $result['english_name'];
- }
- return false;
- }
|