コード例 #1
0
ファイル: start.php プロジェクト: lorea/Hydra-dev
/**
 * 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;
        }
    }
}
コード例 #2
0
ファイル: events.php プロジェクト: lorea/Hydra-dev
/**
 * 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)));
            }
        }
    }
}
コード例 #3
0
ファイル: hooks.php プロジェクト: lorea/Hydra-dev
/**
 * 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;
                }
            }
        }
    }
}
コード例 #4
0
ファイル: page_handlers.php プロジェクト: lorea/Hydra-dev
/**
 * 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;
}
コード例 #5
0
ファイル: remove.php プロジェクト: lorea/Hydra-dev
<?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);
コード例 #6
0
ファイル: functions.php プロジェクト: lorea/Hydra-dev
/**
 * 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;
}