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'); }
/** * 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(); }