Exemple #1
0
function gnusocial_api_init()
{
    // require libraries
    $base = elgg_get_plugins_path() . 'gnusocial_api';
    elgg_register_class('GNUSocialOAuth', "{$base}/vendors/gnusocialoauth/gnusocialOAuth.php");
    elgg_register_library('gnusocial_api', "{$base}/lib/gnusocial_api.php");
    elgg_load_library('gnusocial_api');
    // extend site views
    //elgg_extend_view('metatags', 'gnusocial_api/metatags');
    elgg_extend_view('css/elgg', 'gnusocial_api/css');
    elgg_extend_view('css/admin', 'gnusocial_api/css');
    elgg_extend_view('js/elgg', 'gnusocial_api/js');
    // sign on with gnusocial
    if (gnusocial_api_allow_sign_on_with_gnusocial()) {
        elgg_extend_view('login/extend', 'gnusocial_api/login');
    }
    // register page handler
    elgg_register_page_handler('gnusocial_api', 'gnusocial_api_pagehandler');
    // backward compatibility
    elgg_register_page_handler('gnusocialservice', 'gnusocial_api_pagehandler_deprecated');
    // register Walled Garden public pages
    elgg_register_plugin_hook_handler('public_pages', 'walled_garden', 'gnusocial_api_public_pages');
    // push wire post messages to gnusocial
    if (elgg_get_plugin_setting('wire_posts', 'gnusocial_api') == 'yes') {
        elgg_register_plugin_hook_handler('status', 'user', 'gnusocial_api_tweet');
    }
    $actions = dirname(__FILE__) . '/actions/gnusocial_api';
    elgg_register_action('gnusocial_api/interstitial_settings', "{$actions}/interstitial_settings.php", 'logged_in');
}
Exemple #2
0
/**
 * Log in a user referred from GNUSocial's OAuth API
 *
 * If the user has already linked their account with GNUSocial, it is a seamless
 * login. If this is a first time login (or a user from deprecated gnusocial login
 * plugin), we create a new account (update the account).
 *
 * If a plugin wants to be notified when someone logs in with gnusocial or a new
 * gnusocial user signs up, register for the standard login or create user events
 * and check for 'gnusocial_api' context.
 *
 * The user has to be redirected from GNUSocial for this to work. It depends on
 * the GNUSocial OAuth data.
 */
function gnusocial_api_login()
{
    // sanity check
    if (!gnusocial_api_allow_sign_on_with_gnusocial()) {
        forward();
    }
    $session = elgg_get_session();
    $token = gnusocial_api_get_access_token(get_input('oauth_verifier'));
    $persistent = false;
    $forward = '';
    // fetch login metadata from session
    $login_metadata = $session->get('gnusocial_api_login_metadata');
    $session->remove('gnusocial_api_login_metadata');
    if (!empty($login_metadata['persistent'])) {
        $persistent = true;
    }
    if (!empty($login_metadata['forward'])) {
        $forward = $login_metadata['forward'];
    }
    if (!isset($token['oauth_token']) || !isset($token['oauth_token_secret'])) {
        register_error(elgg_echo('gnusocial_api:login:error'));
        forward();
    }
    // attempt to find user and log them in.
    // else, create a new user.
    $options = array('type' => 'user', 'plugin_id' => 'gnusocial_api', 'plugin_user_setting_name_value_pairs' => array('access_key' => $token['oauth_token'], 'access_secret' => $token['oauth_token_secret']), 'limit' => 0);
    $users = elgg_get_entities_from_plugin_user_settings($options);
    if ($users) {
        if (count($users) == 1 && login($users[0], $persistent)) {
            system_message(elgg_echo('gnusocial_api:login:success'));
            forward($forward);
        } else {
            register_error(elgg_echo('gnusocial_api:login:error'));
            forward();
        }
    } else {
        $api = gnusocial_api_get_api_object($token['oauth_token'], $token['oauth_token_secret']);
        $gnusocial = $api->get('account/verify_credentials');
        // backward compatibility for deprecated GNUSocial Login plugin
        $user = FALSE;
        if ($gnusocial_user = get_user_by_username($token['screen_name'])) {
            if (($screen_name = $gnusocial_user->gnusocial_screen_name) && $screen_name == $token['screen_name']) {
                // convert existing account
                $user = $gnusocial_user;
                $forward = '';
            }
        }
        // create new user
        if (!$user) {
            $user = gnusocial_api_create_user($gnusocial);
            $site_name = elgg_get_site_entity()->name;
            system_message(elgg_echo('gnusocial_api:login:email', array($site_name)));
            $forward = "gnusocial_api/interstitial";
        }
        // set gnusocial services tokens
        elgg_set_plugin_user_setting('gnusocial_name', $token['screen_name'], $user->guid, 'gnusocial_api');
        elgg_set_plugin_user_setting('access_key', $token['oauth_token'], $user->guid, 'gnusocial_api');
        elgg_set_plugin_user_setting('access_secret', $token['oauth_token_secret'], $user->guid, 'gnusocial_api');
        // pull in GNUSocial icon
        gnusocial_api_update_user_avatar($user, $gnusocial->profile_image_url);
        // login new user
        if (login($user)) {
            system_message(elgg_echo('gnusocial_api:login:success'));
        } else {
            system_message(elgg_echo('gnusocial_api:login:error'));
        }
        forward($forward, 'gnusocial_api');
    }
    // register login error
    register_error(elgg_echo('gnusocial_api:login:error'));
    forward();
}