/** * Request email from user */ function oa_social_login_request_email() { //Get the current user $current_user = wp_get_current_user(); //Check if logged in if (!empty($current_user->ID) and is_numeric($current_user->ID)) { //Current user $user_id = $current_user->ID; //Check if email has to be requested $oa_social_login_request_email = get_user_meta($user_id, 'oa_social_login_request_email', true); if (!empty($oa_social_login_request_email)) { //Display modal dialog? $display_modal = true; //Messaging $message = ''; //Read settings $settings = get_option('oa_social_login_settings'); //Make sure that the email is still required if (empty($settings['plugin_require_email'])) { //Do not display the modal dialog $display_modal = false; //Stop asking for the email delete_user_meta($user_id, 'oa_social_login_request_email'); } //Form submitted if (isset($_POST) and !empty($_POST['oa_social_login_action'])) { if ($_POST['oa_social_login_action'] == 'confirm_email') { $user_email = empty($_POST['oa_social_login_email']) ? '' : trim($_POST['oa_social_login_email']); if (empty($user_email)) { $message = __('Please enter your email address', 'oa_social_login'); } else { if (!is_email($user_email)) { $message = __('This email is not valid', 'oa_social_login'); } elseif (email_exists($user_email)) { $message = __('This email is already used by another account', 'oa_social_login'); } else { wp_update_user(array('ID' => $user_id, 'user_email' => $user_email)); delete_user_meta($user_id, 'oa_social_login_request_email'); $display_modal = false; } } } } //Display modal dialog? if ($display_modal === true) { //Read Settings $oa_social_login_settings = get_option('oa_social_login_settings'); //Read the social network $oa_social_login_identity_provider = get_user_meta($user_id, 'oa_social_login_identity_provider', true); //Caption $caption = isset($oa_social_login_settings['plugin_require_email_text']) ? $oa_social_login_settings['plugin_require_email_text'] : __('<strong>We unfortunately could not retrieve your email address from %s.</strong> Please enter your email address in the form below in order to continue.', 'oa_social_login'); //Add CSS oa_social_login_add_site_css(); //Show email request form ?> <div id="oa_social_login_overlay"></div> <div id="oa_social_login_modal"> <div class="oa_social_login_modal_outer"> <div class="oa_social_login_modal_inner"> <div class="oa_social_login_modal_title"> <?php printf(__('You have successfully connected with %s!', 'oa_social_login'), '<strong>' . $oa_social_login_identity_provider . '</strong>'); ?> </div> <?php if (strlen(trim($caption)) > 0) { ?> <div class="oa_social_login_modal_notice"><?php echo str_replace('%s', $oa_social_login_identity_provider, $caption); ?> </div> <?php } ?> <div class="oa_social_login_modal_body"> <div class="oa_social_login_modal_subtitle"> <?php _e('Please enter your email address', 'oa_social_login'); ?> : </div> <form method="post" action=""> <fieldset> <div> <input type="text" name="oa_social_login_email" class="oa_social_login_confirm_text" value="<?php echo !empty($_POST['oa_social_login_email']) ? oa_social_login_esc_attr($_POST['oa_social_login_email']) : ''; ?> " /> <input type="hidden" name="oa_social_login_action" value="confirm_email" size="30" /> </div> <div class="oa_social_login_modal_error"> <?php echo $message; ?> </div> <div class="oa_social_login_buttons"> <input class="oa_social_login_button_confirm" type="submit" value="<?php _e('Confirm', 'oa_social_login'); ?> " /> <input class="oa_social_login_button_cancel" type="button" value="<?php _e('Cancel', 'oa_social_login'); ?> " onclick="window.location.href='<?php echo esc_url(wp_logout_url(oa_social_login_get_current_url())); ?> '" /> </div> </fieldset> </form> </div> </div> </div> </div> <?php } } } }
/** * Handle the callback */ function oa_social_login_callback() { //Callback Handler if (isset($_POST) and !empty($_POST['oa_action']) and $_POST['oa_action'] == 'social_login' and !empty($_POST['connection_token'])) { //OneAll Connection token $connection_token = trim($_POST['connection_token']); //Read settings $settings = get_option('oa_social_login_settings'); //API Settings $api_connection_handler = (!empty($settings['api_connection_handler']) and $settings['api_connection_handler'] == 'fsockopen') ? 'fsockopen' : 'curl'; $api_connection_use_https = (!isset($settings['api_connection_use_https']) or $settings['api_connection_use_https'] == '1') ? true : false; $api_subdomain = !empty($settings['api_subdomain']) ? trim($settings['api_subdomain']) : ''; //We cannot make a connection without a subdomain if (!empty($api_subdomain)) { //See: http://docs.oneall.com/api/resources/connections/read-connection-details/ $api_resource_url = ($api_connection_use_https ? 'https' : 'http') . '://' . $api_subdomain . '.api.oneall.com/connections/' . $connection_token . '.json'; //API Credentials $api_credentials = array(); $api_credentials['api_key'] = !empty($settings['api_key']) ? $settings['api_key'] : ''; $api_credentials['api_secret'] = !empty($settings['api_secret']) ? $settings['api_secret'] : ''; //Retrieve connection details $result = oa_social_login_do_api_request($api_connection_handler, $api_resource_url, $api_credentials); //Check result if (is_object($result) and property_exists($result, 'http_code') and $result->http_code == 200 and property_exists($result, 'http_data')) { //Decode result $decoded_result = @json_decode($result->http_data); if (is_object($decoded_result) and isset($decoded_result->response->result->data->user)) { //User data $user_data = $decoded_result->response->result->data->user; //Social network profile data $identity = $user_data->identity; //Unique user token provided by OneAll $user_token = $user_data->user_token; //Identity Provider $user_identity_provider = $identity->source->name; //Thumbnail $user_thumbnail = !empty($identity->thumbnailUrl) ? trim($identity->thumbnailUrl) : ''; //Picture $user_picture = !empty($identity->pictureUrl) ? trim($identity->pictureUrl) : ''; //About Me $user_about_me = !empty($identity->aboutMe) ? trim($identity->aboutMe) : ''; //Note $user_note = !empty($identity->note) ? trim($identity->note) : ''; //Firstname $user_first_name = !empty($identity->name->givenName) ? $identity->name->givenName : ''; //Lastname $user_last_name = !empty($identity->name->familyName) ? $identity->name->familyName : ''; //Fullname if (!empty($identity->name->formatted)) { $user_full_name = $identity->name->formatted; } elseif (!empty($identity->name->displayName)) { $user_full_name = $identity->name->displayName; } else { $user_full_name = trim($user_first_name . ' ' . $user_last_name); } // Email Address. $user_email = ''; if (property_exists($identity, 'emails') and is_array($identity->emails)) { $user_email_is_verified = false; while ($user_email_is_verified !== true and list(, $email) = each($identity->emails)) { $user_email = $email->value; $user_email_is_verified = $email->is_verified == '1'; } } //User Website if (!empty($identity->profileUrl)) { $user_website = $identity->profileUrl; } elseif (!empty($identity->urls[0]->value)) { $user_website = $identity->urls[0]->value; } else { $user_website = ''; } //Preferred Username if (!empty($identity->preferredUsername)) { $user_login = $identity->preferredUsername; } elseif (!empty($identity->displayName)) { $user_login = $identity->displayName; } else { $user_login = $user_full_name; } //New user created? $new_registration = false; //Sanitize Login $user_login = str_replace('.', '-', $user_login); $user_login = sanitize_user($user_login, true); // Get user by token $user_id = oa_social_login_get_userid_by_token($user_token); //Try to link to existing account if (!is_numeric($user_id)) { //This is a new user $new_registration = true; //Linking enabled? if (!isset($settings['plugin_link_verified_accounts']) or $settings['plugin_link_verified_accounts'] == '1') { //Only if email is verified if (!empty($user_email) and $user_email_is_verified === true) { //Read existing user if (($user_id_tmp = email_exists($user_email)) !== false) { $user_data = get_userdata($user_id_tmp); if ($user_data !== false) { $user_id = $user_data->ID; $user_login = $user_data->user_login; //Refresh the meta data delete_metadata('user', null, 'oa_social_login_user_token', $user_token, true); update_user_meta($user_id, 'oa_social_login_user_token', $user_token); update_user_meta($user_id, 'oa_social_login_identity_provider', $user_identity_provider); //Refresh the cache wp_cache_delete($user_id, 'users'); wp_cache_delete($user_login, 'userlogins'); } } } } } //New User if (!is_numeric($user_id)) { //Username is mandatory if (!isset($user_login) or strlen(trim($user_login)) == 0) { $user_login = $user_identity_provider . 'User'; } // BuddyPress : See bp_core_strip_username_spaces() if (function_exists('bp_core_strip_username_spaces')) { $user_login = str_replace(' ', '-', $user_login); } //Username must be unique if (username_exists($user_login)) { $i = 1; $user_login_tmp = $user_login; do { $user_login_tmp = $user_login . $i++; } while (username_exists($user_login_tmp)); $user_login = $user_login_tmp; } //Email Filter $user_email = apply_filters('oa_social_login_filter_new_user_email', $user_email); //Email must be unique $placeholder_email_used = false; if (!isset($user_email) or !is_email($user_email) or email_exists($user_email)) { $user_email = oa_social_login_create_rand_email(); $placeholder_email_used = true; } //Setup the user's password $user_password = wp_generate_password(); $user_password = apply_filters('oa_social_login_filter_new_user_password', $user_password); //Setup the user's role $user_role = get_option('default_role'); $user_role = apply_filters('oa_social_login_filter_new_user_role', $user_role); //Build user data $user_fields = array('user_login' => $user_login, 'display_name' => !empty($user_full_name) ? $user_full_name : $user_login, 'user_email' => $user_email, 'first_name' => $user_first_name, 'last_name' => $user_last_name, 'user_url' => $user_website, 'user_pass' => $user_password, 'role' => $user_role); //Filter for user_data $user_fields = apply_filters('oa_social_login_filter_new_user_fields', $user_fields); //Hook before adding the user do_action('oa_social_login_action_before_user_insert', $user_fields, $identity); // Create a new user $user_id = wp_insert_user($user_fields); if (is_numeric($user_id) and ($user_data = get_userdata($user_id)) !== false) { //Refresh the meta data delete_metadata('user', null, 'oa_social_login_user_token', $user_token, true); //Save OneAll user meta-data update_user_meta($user_id, 'oa_social_login_user_token', $user_token); update_user_meta($user_id, 'oa_social_login_identity_provider', $user_identity_provider); //Save WordPress user meta-data if (!empty($user_about_me) or !empty($user_note)) { $user_description = !empty($user_about_me) ? $user_about_me : $user_note; update_user_meta($user_id, 'description', $user_description); } //Email is required if (!empty($settings['plugin_require_email'])) { //We don't have the real email if ($placeholder_email_used) { update_user_meta($user_id, 'oa_social_login_request_email', 1); } } //Notify Administrator if (!empty($settings['plugin_notify_admin'])) { oa_social_login_user_notification($user_id, $user_identity_provider); } //Refresh the cache wp_cache_delete($user_id, 'users'); wp_cache_delete($user_login, 'userlogins'); //WordPress hook do_action('user_register', $user_id); //Social Login Hook do_action('oa_social_login_action_after_user_insert', $user_data, $identity); } } //Sucess $user_data = get_userdata($user_id); if ($user_data !== false) { //Hooks to be used by third parties do_action('oa_social_login_action_before_user_login', $user_data, $identity, $new_registration); //Update user thumbnail if (!empty($user_thumbnail)) { update_user_meta($user_id, 'oa_social_login_user_thumbnail', $user_thumbnail); } //Update user picture if (!empty($user_picture)) { update_user_meta($user_id, 'oa_social_login_user_picture', $user_picture); } //Set the cookie and login wp_clear_auth_cookie(); wp_set_auth_cookie($user_data->ID, true); do_action('wp_login', $user_data->user_login, $user_data); //Where did the user come from? $oa_social_login_source = !empty($_REQUEST['oa_social_login_source']) ? strtolower(trim($_REQUEST['oa_social_login_source'])) : ''; //Use safe redirection? $redirect_to_safe = false; //Build the url to redirect the user to switch ($oa_social_login_source) { //*************** Registration *************** case 'registration': //Default redirection $redirect_to = admin_url(); //Redirection in URL if (!empty($_GET['redirect_to'])) { $redirect_to = $_GET['redirect_to']; $redirect_to_safe = true; } else { //Redirection customized if (isset($settings['plugin_registration_form_redirect'])) { switch (strtolower($settings['plugin_registration_form_redirect'])) { //Current case 'current': $redirect_to = oa_social_login_get_current_url(); break; //Homepage //Homepage case 'homepage': $redirect_to = home_url(); break; //Custom //Custom case 'custom': if (isset($settings['plugin_registration_form_redirect_custom_url']) and strlen(trim($settings['plugin_registration_form_redirect_custom_url'])) > 0) { $redirect_to = trim($settings['plugin_registration_form_redirect_custom_url']); } break; //Default/Dashboard //Default/Dashboard default: case 'dashboard': $redirect_to = admin_url(); break; } } } break; //*************** Login *************** //*************** Login *************** case 'login': //Default redirection $redirect_to = home_url(); //Redirection in URL if (!empty($_GET['redirect_to'])) { $redirect_to = $_GET['redirect_to']; $redirect_to_safe = true; } else { //Redirection customized if (isset($settings['plugin_login_form_redirect'])) { switch (strtolower($settings['plugin_login_form_redirect'])) { //Current case 'current': global $pagenow; //Do not redirect to the login page as this would logout the user. if (empty($pagenow) or $pagenow != 'wp-login.php') { $redirect_to = oa_social_login_get_current_url(); } else { $redirect_to = home_url(); } break; //Dashboard //Dashboard case 'dashboard': $redirect_to = admin_url(); break; //Custom //Custom case 'custom': if (isset($settings['plugin_login_form_redirect_custom_url']) and strlen(trim($settings['plugin_login_form_redirect_custom_url'])) > 0) { $redirect_to = trim($settings['plugin_login_form_redirect_custom_url']); } break; //Default/Homepage //Default/Homepage default: case 'homepage': $redirect_to = home_url(); break; } } } break; // *************** Comments *************** // *************** Comments *************** case 'comments': $redirect_to = oa_social_login_get_current_url() . '#comments'; break; //*************** Widget/Shortcode *************** //*************** Widget/Shortcode *************** default: case 'widget': case 'shortcode': // This is a new user $opt_key = $new_registration === true ? 'register' : 'login'; //Default value $redirect_to = oa_social_login_get_current_url(); //Redirection customized if (isset($settings['plugin_shortcode_' . $opt_key . '_redirect'])) { switch (strtolower($settings['plugin_shortcode_' . $opt_key . '_redirect'])) { //Current case 'current': $redirect_to = oa_social_login_get_current_url(); break; //Homepage //Homepage case 'homepage': $redirect_to = home_url(); break; //Dashboard //Dashboard case 'dashboard': $redirect_to = admin_url(); break; //Custom //Custom case 'custom': if (isset($settings['plugin_shortcode_' . $opt_key . '_redirect_url']) and strlen(trim($settings['plugin_shortcode_' . $opt_key . '_redirect_url'])) > 0) { $redirect_to = trim($settings['plugin_shortcode_' . $opt_key . '_redirect_url']); } break; } } break; } //Check if url set if (!isset($redirect_to) or strlen(trim($redirect_to)) == 0) { $redirect_to = home_url(); } //Filter for redirection urls if ($new_registration === true) { $redirect_to = apply_filters('oa_social_login_filter_registration_redirect_url', $redirect_to, $user_data); } else { $redirect_to = apply_filters('oa_social_login_filter_login_redirect_url', $redirect_to, $user_data); } //Hooks for other plugins do_action('oa_social_login_action_before_user_redirect', $user_data, $identity, $redirect_to); //Use safe redirection if ($redirect_to_safe === true) { wp_safe_redirect($redirect_to); } else { wp_redirect($redirect_to); } exit; } } } } } }