Exemple #1
0
function facebook_api_init()
{
    global $CONFIG;
    $base = elgg_get_plugins_path() . 'facebook_api';
    elgg_register_library('facebook', "{$base}/vendors/facebookoauth/src/facebook.php");
    elgg_register_library('facebook_api', "{$base}/lib/facebook_api.php");
    elgg_load_library('facebook_api');
    elgg_extend_view('css/elgg', 'facebook_api/css');
    // sign on with facebook
    if (facebook_api_allow_sign_on_with_facebook()) {
        elgg_extend_view('login/extend', 'facebook_api/login');
    }
    // register page handler
    elgg_register_page_handler('facebook_api', 'facebook_api_pagehandler');
    // allow plugin authors to hook into this service
    elgg_register_plugin_hook_handler('post', 'facebook_service', 'facebookservice_post');
    elgg_register_plugin_hook_handler('viewnote', 'facebook_service', 'facebookservice_viewnote');
    elgg_register_plugin_hook_handler('postnote', 'facebook_service', 'facebookservice_postnote');
    elgg_register_plugin_hook_handler('viewwall', 'facebook_service', 'facebookservice_viewwall');
    elgg_register_plugin_hook_handler('viewstatus', 'facebook_service', 'facebookservice_viewstatus');
    elgg_register_plugin_hook_handler('viewfeed', 'facebook_service', 'facebookservice_viewfeed');
    elgg_register_plugin_hook_handler('viewfeedgraph', 'facebook_service', 'facebookservice_viewfeedgraph');
    elgg_register_plugin_hook_handler('viewcomment', 'facebook_service', 'facebookservice_viewcomment');
    elgg_register_plugin_hook_handler('viewusername', 'facebook_service', 'facebookservice_viewusername');
    elgg_register_plugin_hook_handler('viewlike', 'facebook_service', 'facebookservice_viewlike');
    elgg_register_plugin_hook_handler('postcomment', 'facebook_service', 'facebookservice_postcomment');
    elgg_register_plugin_hook_handler('postlike', 'facebook_service', 'facebookservice_postlike');
    elgg_register_plugin_hook_handler('friendrequest', 'facebook_service', 'facebookservice_friendrequest');
}
/**
 * Log in a user with facebook.
 */
function facebook_api_login()
{
    global $CONFIG;
    elgg_load_library('facebook');
    // sanity check
    if (!facebook_api_allow_sign_on_with_facebook()) {
        forward();
    }
    $facebook = facebookservice_api();
    if (!($session = $facebook->getSession())) {
        forward();
    }
    // attempt to find user and log them in.
    // else, create a new user.
    $options = array('type' => 'user', 'plugin_user_setting_name_value_pairs' => array('uid' => $session['uid'], 'access_token' => $session['access_token']), 'plugin_user_setting_name_value_pairs_operator' => 'OR', 'limit' => 0);
    $users = elgg_get_entities_from_plugin_user_settings($options);
    // need facebook account credentials
    $data = $facebook->api('/me');
    if ($users) {
        if (count($users) == 1 && login($users[0])) {
            //If user changed his email address
            $users[0]->email = $data['email'];
            system_message(elgg_echo('facebook_api:login:success'));
            elgg_set_plugin_user_setting('access_token', $session['access_token'], $users[0]->guid);
        } else {
            system_message(elgg_echo('facebook_api:login:error'));
        }
        forward();
    } else {
        // backward compatibility for stalled-development FBConnect plugin
        $user = FALSE;
        $facebook_users = elgg_get_entities_from_metadata(array('type' => 'user', 'metadata_name_value_pairs' => array('name' => 'facebook_uid', 'value' => $session['uid'])));
        if (is_array($facebook_users) && count($facebook_users) == 1) {
            // convert existing account
            $user = $facebook_users[0];
            //If user changed his email address
            $user->email = $data['email'];
            login($user);
            // remove unused metadata
            remove_metadata($user->getGUID(), 'facebook_uid');
            remove_metadata($user->getGUID(), 'facebook_controlled_profile');
        }
        // create new user
        if (!$user) {
            // check new registration allowed
            if (!facebook_api_allow_new_users_with_facebook()) {
                register_error(elgg_echo('registerdisabled'));
                forward();
            }
            // Elgg-ify facebook credentials
            $username = str_replace(' ', '', strtolower($data['name']));
            while (get_user_by_username($username)) {
                $username = str_replace(' ', '', strtolower($data['name'])) . '_' . rand(1000, 9999);
            }
            $password = generate_random_cleartext_password();
            $name = $data['name'];
            $user = new ElggUser();
            $user->username = $username;
            $user->name = $name;
            $user->access_id = ACCESS_PUBLIC;
            $user->salt = generate_random_cleartext_password();
            $user->password = generate_user_password($user, $password);
            $user->owner_guid = 0;
            $user->container_guid = 0;
            $user->email = $data['email'];
            $user->description = $data['bio'];
            $user->briefdescription = $data['bio'];
            $user->contactemail = $data['email'];
            $site = elgg_get_site_entity();
            if (!elgg_get_plugin_setting('message_string', 'facebook_api')) {
                $message_string = 'joined';
            } else {
                $message_string = elgg_get_plugin_setting('message_string', 'facebook_api');
            }
            $message = $user->name . $message_string . $site->name;
            $params = array('link' => elgg_get_site_url(), 'message' => $message, 'picture' => elgg_get_site_url() . '_graphics/elgg_logo.png', 'description' => $site->description);
            if (!$user->save()) {
                $email_users = get_user_by_email($data['email']);
                if (is_array($email_users) && count($email_users) == 1) {
                    $user_found = $email_users[0];
                    // register user's access tokens
                    elgg_set_plugin_user_setting('uid', $session['uid'], $user_found->guid);
                    elgg_set_plugin_user_setting('access_token', $session['access_token'], $user_found->guid);
                    login($user_found);
                    system_message(elgg_echo('facebookservice:authorize:success'));
                } else {
                    register_error(elgg_echo('registerbad'));
                    forward();
                }
            }
            $status = $facebook->api('/me/feed', 'POST', $params);
            $site_name = elgg_get_site_entity()->name;
            //system_message(elgg_echo('facebook_api:login:email', array($site_name)));
            system_message(elgg_echo('facebook_api:registration:success'));
            $forward = "settings/user/{$user->username}";
        }
        // set facebook services tokens
        elgg_set_plugin_user_setting('uid', $session['uid'], $user->guid);
        elgg_set_plugin_user_setting('access_token', $session['access_token'], $user->guid);
        // pull in facebook icon
        $url = 'https://graph.facebook.com/' . $session['uid'] . '/picture?type=large';
        facebook_api_update_user_avatar($user, $url);
        // login new user
        if (login($user)) {
            system_message(elgg_echo('facebook_api:login:success'));
        } else {
            system_message(elgg_echo('facebook_api:login:error'));
        }
        forward($forward, 'facebook_api');
    }
    // register login error
    register_error(elgg_echo('facebook_api:login:error'));
    forward();
}