/** * Get called during system init * * @return void */ function socialink_init() { // register classes elgg_register_classes(dirname(__FILE__) . "/vendors/oauth/classes"); elgg_register_class("LinkedIn", dirname(__FILE__) . "/vendors/simple_linkedin/linkedin_3.1.1.class.php"); // register SociaLink libraries elgg_register_library("socialink:facebook", dirname(__FILE__) . "/lib/networks/facebook.php"); elgg_register_library("socialink:linkedin", dirname(__FILE__) . "/lib/networks/linkedin.php"); elgg_register_library("socialink:twitter", dirname(__FILE__) . "/lib/networks/twitter.php"); elgg_register_library("socialink:wordpress", dirname(__FILE__) . "/lib/networks/wordpress.php"); // extend CSS elgg_extend_view("css/elgg", "socialink/css/site"); elgg_extend_view("css/admin", "socialink/css/admin"); // extend JS elgg_extend_view("js/elgg", "socialink/js"); // extend login box elgg_extend_view("forms/login", "socialink/login"); // register page handler elgg_register_page_handler("socialink", "socialink_page_handler"); // register event handlers //register_elgg_event_handler("create", "object", "socialink_create_object_handler"); elgg_register_event_handler("login:after", "user", "socialink_login_user_handler", 450); // hooks elgg_register_plugin_hook_handler("socialink:sync", "user", "socialink_sync_network_hook"); elgg_register_plugin_hook_handler("public_pages", "walled_garden", "socialink_walled_garden_hook"); elgg_register_plugin_hook_handler("register", "user", "socialink_register_user_hook", 450); // register actions elgg_register_action("socialink/remove", dirname(__FILE__) . "/actions/remove.php"); elgg_register_action("socialink/create_user", dirname(__FILE__) . "/actions/create_user.php", "public"); elgg_register_action("socialink/share", dirname(__FILE__) . "/actions/share.php"); // load necesary files socialink_load_networks(); // twitter in if (elgg_is_active_plugin("thewire") && socialink_is_available_network("twitter")) { $setting = elgg_get_plugin_setting("twitter_allow_in", "socialink"); switch ($setting) { case "fifteenmin": case "halfhour": elgg_register_plugin_hook_handler("cron", $setting, "socialink_twitter_in_cron_hook"); break; } } }
/** * Listen to the login event * * @param string $event the name of the event * @param string $type the type of the event * @param ElggUser $entity supplied entity * * @return void */ function socialink_login_user_handler($event, $type, $entity) { if (empty($entity) || !elgg_instanceof($entity, "user")) { return; } // check if the user wishes to link a network $link_network = get_input("socialink_link_network"); if (!empty($link_network) && socialink_is_available_network($link_network)) { switch ($link_network) { case "twitter": socialink_twitter_authorize($entity->getGUID()); break; case "facebook": socialink_facebook_authorize($entity->getGUID()); break; case "linkedin": socialink_linkedin_authorize($entity->getGUID()); break; case "wordpress": socialink_wordpress_authorize($entity->getGUID()); break; } unset($_SESSION["socialink_token"]); // sync network data elgg_trigger_plugin_hook("socialink:sync", "user", array("user" => $entity, "network" => $link_network)); } // check if network connections are still valid $networks = socialink_get_user_networks($entity->getGUID()); if (empty($networks)) { return; } foreach ($networks as $network) { $response = socialink_validate_network($network, $entity->getGUID()); if ($response === false) { // disconnect from this network and report to user $function = "socialink_" . $network . "_remove_connection"; if (is_callable($function)) { call_user_func($function, $entity->getGUID()); register_error(sprintf(elgg_echo("socialink:network_invalid"), elgg_echo("socialink:network:" . $network))); } } } }
/** * Synchronize social network information to a profile * * @param string $hook_name the name of the hook * @param string $entity_type the type of the hook * @param mixed $return_value current return value * @param array $params supplied params * * @return void */ function socialink_sync_network_hook($hook_name, $entity_type, $return_value, $params) { if (!empty($params) && is_array($params)) { if (isset($params["user"]) && isset($params["network"])) { $user = $params["user"]; $network = $params["network"]; if (socialink_is_available_network($network)) { switch ($network) { case "twitter": socialink_twitter_sync_profile_metadata($user->getGUID()); break; case "linkedin": socialink_linkedin_sync_profile_metadata($user->getGUID()); break; case "facebook": socialink_facebook_sync_profile_metadata($user->getGUID()); break; } } } } }
/** * The socialink page handler * * @param array $page page elements * * @return bool */ function socialink_page_handler($page) { $result = false; switch ($page[0]) { case "authorize": elgg_gatekeeper(); $user = elgg_get_logged_in_user_entity(); switch ($page[1]) { case "twitter": case "linkedin": case "facebook": case "wordpress": if (call_user_func("socialink_" . $page[1] . "_authorize")) { system_message(elgg_echo("socialink:authorize:success", array(elgg_echo("socialink:network:" . $page[1])))); } else { register_error(elgg_echo("socialink:authorize:failed", array(elgg_echo("socialink:network:" . $page[1])))); } break; } if (!empty($page[1]) && socialink_is_available_network($page[1])) { elgg_trigger_plugin_hook("socialink:sync", "user", array("user" => $user, "network" => $page[1])); } forward("settings/plugins/" . $user->username . "/socialink"); break; case "login": if (elgg_is_logged_in() || !isset($page[1])) { // invalid input forward(); } $network = $page[1]; $network_name = elgg_echo("socialink:network:" . $network); $error_msg_no_user = elgg_echo("socialink:login:error:no_user", array($network_name, $network_name)); if (!socialink_is_available_network($network)) { // unavailable network forward(); } // find hidden users (just created) $access_status = access_get_show_hidden_status(); access_show_hidden_entities(true); switch ($network) { case "twitter": $token = socialink_twitter_get_access_token(get_input("oauth_verifier")); if (!isset($token["oauth_token"]) || !isset($token["oauth_token_secret"])) { register_error($error_msg_no_user); break; } $params = array("type" => "user", "limit" => 1, "site_guids" => false, "plugin_id" => "socialink", "plugin_user_setting_name_value_pairs" => array("twitter_oauth_token" => $token["oauth_token"], "twitter_oauth_secret" => $token["oauth_token_secret"])); $users = elgg_get_entities_from_plugin_user_settings($params); if (!empty($users)) { $user = $users[0]; } else { $_SESSION["socialink_token"] = $token; forward("socialink/no_linked_account/twitter"); } break; case "linkedin": $token = socialink_linkedin_get_access_token(get_input("oauth_verifier")); if (!isset($token["oauth_token"]) || !isset($token["oauth_token_secret"])) { register_error($error_msg_no_user); break; } $params = array("type" => "user", "limit" => 1, "site_guids" => false, "plugin_id" => "socialink", "plugin_user_setting_name_value_pairs" => array("linkedin_oauth_token" => $token["oauth_token"], "linkedin_oauth_secret" => $token["oauth_token_secret"])); $users = elgg_get_entities_from_plugin_user_settings($params); if (!empty($users)) { $user = $users[0]; } else { $_SESSION["socialink_token"] = $token; forward("socialink/no_linked_account/linkedin"); } break; case "facebook": $token = socialink_facebook_get_access_token(); if (empty($token)) { register_error($error_msg_no_user); break; } $user_id = socialink_facebook_get_user_id_from_access_token($token); if (empty($user_id)) { register_error($error_msg_no_user); break; } $params = array("type" => "user", "limit" => 1, "site_guids" => false, "plugin_id" => "socialink", "plugin_user_setting_name_value_pairs" => array("facebook_user_id" => $user_id)); $users = elgg_get_entities_from_plugin_user_settings($params); if (!empty($users)) { $user = $users[0]; } else { $_SESSION["socialink_token"] = $token; forward("socialink/no_linked_account/facebook"); } break; case "wordpress": $token = socialink_wordpress_get_access_token(get_input("oauth_token")); if (isset($token['oauth_token']) && isset($token['oauth_token_secret'])) { if ($userdata = socialink_wordpress_get_user_data_from_token($token)) { $params = array("type" => "user", "limit" => 1, "site_guids" => false, "plugin_id" => "socialink", "plugin_user_setting_name_value_pairs" => array("wordpress_userid" => $userdata->ID)); if ($users = elgg_get_entities_from_plugin_user_settings($params)) { $user = $users[0]; socialink_wordpress_update_connection($token, $user->getGUID()); } else { $_SESSION["socialink_token"] = $token; forward("socialink/no_linked_account/wordpress"); } } } else { register_error($error_msg_no_user); } break; } if (!empty($user) && elgg_instanceof($user, "user")) { try { // permanent login login($user, true); // log last network elgg_set_plugin_user_setting("last_login_network", $network, $user->getGUID(), "socialink"); // sync network data elgg_trigger_plugin_hook("socialink:sync", "user", array("user" => $user, "network" => $network)); // set message and forward to correct page system_message(elgg_echo("loginok")); if (isset($_SESSION["last_forward_from"]) && $_SESSION["last_forward_from"]) { $forward_url = $_SESSION["last_forward_from"]; unset($_SESSION["last_forward_from"]); forward($forward_url); } elseif (get_input("returntoreferer")) { forward(REFERER); } else { forward(); } } catch (LoginException $e) { // validation mechanisme should report that you are not authenticated. Currently uservalidation by email doesn't do that //register_error($e->getMessage()); forward(); } } // restore hidden status access_show_hidden_entities($access_status); forward(); break; case "no_linked_account": if (elgg_is_logged_in()) { forward(); } switch ($page[1]) { case "linkedin": case "facebook": case "twitter": case "wordpress": $result = true; set_input("network", $page[1]); include dirname(dirname(__FILE__)) . "/pages/no_linked_account.php"; break; } break; case "share": elgg_gatekeeper(); $result = true; include dirname(dirname(__FILE__)) . "/pages/share.php"; break; case "forward": if (!isset($page[1]) && !isset($page[2])) { // invalid input break; } $network = $page[1]; $action = $page[2]; $allowed_actions = array("login", "authorize"); if (!socialink_is_available_network($network) || !in_array($action, $allowed_actions)) { // unavailable network or unsupported action break; } if ($action == "login") { socialink_prepare_login(); } $callback_url = elgg_get_site_url() . "socialink/" . $action . "/" . $network; $forward_url = ""; switch ($network) { case "linkedin": $forward_url = socialink_linkedin_get_authorize_url($callback_url); break; case "facebook": $forward_url = socialink_facebook_get_authorize_url($callback_url); break; case "twitter": $forward_url = socialink_twitter_get_authorize_url($callback_url); break; case "wordpress": $forward_url = socialink_wordpress_get_authorize_url($callback_url); break; } forward($forward_url); break; } return $result; }
<?php gatekeeper(); $service = get_input("service"); if (socialink_is_supported_network($service)) { $network_string = elgg_echo("socialink:network:" . $service); if (socialink_is_available_network($service)) { if (call_user_func("socialink_" . $service . "_is_connected")) { if (call_user_func("socialink_" . $service . "_remove_connection")) { system_message(elgg_echo("socialink:actions:remove:success", array($network_string))); } else { register_error(elgg_echo("socialink:actions:remove:error:remove", array($network_string))); } } else { register_error(elgg_echo("socialink:actions:remove:error:connected", array($network_string))); } } else { register_error(elgg_echo("socialink:actions:remove:error:unavailable", array($network_string))); } } else { register_error(elgg_echo("socialink:actions:remove:error:unknown_service")); } forward(REFERER);
/** * Get the profile field configuration for a social network * * @param string $network the name of the social network * * @return bool|array */ function socialink_get_configured_network_fields($network) { $result = false; if (!empty($network) && socialink_is_available_network($network)) { if (($fields = socialink_get_network_fields($network)) && !empty($fields)) { $temp = array(); foreach ($fields as $setting_name => $network_name) { if (($profile_field = elgg_get_plugin_setting($network . "_profile_" . $setting_name, "socialink")) && !empty($profile_field)) { $result[$setting_name] = $profile_field; } } if (!empty($temp)) { $result = $temp; } } } return $result; }