You are here

function simple_fb_connect_return_from_fb in Simple FB Connect 7.2

Page callback for /user/simple-fb-connect/return.

Facebook returns the user here after user has authenticated in FB.

1 string reference to 'simple_fb_connect_return_from_fb'
simple_fb_connect_menu in ./simple_fb_connect.module
Implements hook_menu().

File

./simple_fb_connect.module, line 167
Simple Facebook Login Module for Drupal Sites.

Code

function simple_fb_connect_return_from_fb() {

  // Validate configuration.
  if (!simple_fb_connect_initialize()) {
    drupal_goto('user');
  }

  // FB SDK can start FacebookSession from the page where FB returned the user.
  $return_url = simple_fb_connect_get_return_url();
  $login_helper = new FacebookRedirectLoginHelper($return_url);
  if (!simple_fb_connect_save_session($login_helper)) {
    drupal_set_message(t("Facebook login failed."), "error");
    drupal_goto('user');
  }

  // Get a validated FacebookSession object.
  if (!($fb_session = simple_fb_connect_get_session())) {
    drupal_set_message(t("Facebook login failed."), "error");
    simple_fb_connect_destroy_session();
    drupal_goto('user');
  }

  // Check that user authorized our app to access user's email address.
  if (!simple_fb_connect_check_permission($fb_session, 'email')) {
    $site_name = variable_get('site_name');
    if ($site_name) {
      drupal_set_message(t("Facebook login failed. @site_name requires permission to get your email address from Facebook. Please try again and give the permission.", array(
        '@site_name' => $site_name,
      )), "error");
    }
    else {
      drupal_set_message(t("Facebook login failed. This site requires permission to get your email address from Facebook. Please try again and give the permission."), "error");
    }

    // Preserve the post login URL from the previous attempt.
    $post_login_url = simple_fb_connect_get_post_login_url();
    simple_fb_connect_destroy_session();

    // Set the email permission reprompt flag and save post-login URL.
    $_SESSION['simple_fb_connect']['reprompt'] = TRUE;
    $_SESSION['simple_fb_connect']['post_login_url'] = $post_login_url;
    drupal_goto('user');
  }

  // Get the user's Facebook profile from Facebook API.
  if (!($fb_profile = simple_fb_connect_get_fb_profile($fb_session))) {
    drupal_set_message(t("Facebook login failed."), "error");
    simple_fb_connect_destroy_session();
    drupal_goto('user');
  }

  // Get user's email address from the profile. It is possible that FB profile
  // does not have email address (user can sign up with a phone number only).
  if (!($email = simple_fb_connect_get_email($fb_profile))) {
    drupal_set_message(t('Facebook login failed. This site requires an email address. Please add one in your Facebook profile.'), 'error');
    simple_fb_connect_destroy_session();
    drupal_goto('user');
  }

  // Check if we have an existing Drupal user with the same email address and try to log in.
  if ($drupal_user = user_load_by_mail($email)) {
    if (simple_fb_connect_login_user($drupal_user)) {
      $post_login_url = simple_fb_connect_get_post_login_url();
      simple_fb_connect_go_to_redirect_url($post_login_url, $drupal_user);
    }
    else {
      simple_fb_connect_destroy_session();
      drupal_goto('user');
    }
  }

  // If there was no existing user, try to create a new user and try to log in.
  if ($drupal_user = simple_fb_connect_create_user($fb_profile, $fb_session)) {
    if (simple_fb_connect_login_user($drupal_user)) {

      // Check if new users should be redirected to Drupal user form.
      $redirect_to_user_form = variable_get('simple_fb_connect_redirect_user_form', 0);
      if ($redirect_to_user_form) {
        drupal_set_message(t("Please take a moment to confirm your account details. Since you logged in with Facebook, you don't need to update your password."));
        $post_login_url = 'user/' . $drupal_user->uid . '/edit';
        simple_fb_connect_go_to_redirect_url($post_login_url, $drupal_user);
      }

      // If user wasn't redirected to user form, use the normal post login path.
      $post_login_url = simple_fb_connect_get_post_login_url();
      simple_fb_connect_go_to_redirect_url($post_login_url, $drupal_user);
    }
    else {

      // New user was successfully created but the account is blocked.
      drupal_set_message(t('You will receive an email when a site administrator activates your account.'), 'warning');
      $post_login_url = simple_fb_connect_get_post_login_url();
      simple_fb_connect_destroy_session();
      simple_fb_connect_go_to_redirect_url($post_login_url, $drupal_user);
    }
  }
  else {

    // New user could not be created.
    simple_fb_connect_destroy_session();
    drupal_goto('user');
  }

  // We should never reach this point because the user is redirected in all
  // cases to some other page. If we ever get here, return "access denied" page.
  return MENU_ACCESS_DENIED;
}