You are here

twitter_signin.module in Twitter 6.5

Hook implementations for twitter_signin submodule.

File

twitter_signin/twitter_signin.module
View source
<?php

/**
 * @file
 * Hook implementations for twitter_signin submodule.
 */

/**
 * Implements hook_menu().
 */
function twitter_signin_menu() {
  $items = array();
  $items['twitter/redirect'] = array(
    'title' => 'Twitter Redirect',
    'page callback' => 'twitter_signin_redirect',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
  $items['admin/settings/twitter/signin'] = array(
    'title' => 'Sign-in',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'twitter_signin_admin_settings',
    ),
    'access arguments' => array(
      'administer twitter',
    ),
    'file' => 'twitter_signin.pages.inc',
    'type' => MENU_LOCAL_TASK,
    'weight' => 5,
  );
  return $items;
}

/**
 * Implementation of hook_block().
 */
function twitter_signin_block($op = 'list', $delta = 0, $edit = array()) {
  switch ($op) {
    case 'list':
      $block[0]['info'] = t('Sign in with Twitter');
      return $block;
    case 'view':

      // Don't do anything if the credentials haven't been set up yet.
      $key = variable_get('twitter_consumer_key', '');
      $secret = variable_get('twitter_consumer_secret', '');
      if (empty($key) || empty($secret)) {
        return;
      }
      global $user;
      $block['subject'] = t('Sign in with Twitter');
      $block['content'] = twitter_signin_button();
      return $block;
  }
}

/**
 * Returns an image link for signing in with Twitter.
 */
function twitter_signin_button() {
  return theme('twitter_signin_button');
}

/**
 * Implements hook_theme().
 */
function twitter_signin_theme() {
  return array(
    'twitter_signin_button' => array(),
  );
}

/**
 * Themable function for an image link for signing in with Twitter.
 */
function theme_twitter_signin_button() {
  $button = variable_get('twitter_signin_button', 'Sign-in-with-Twitter-lighter-small.png');
  $class = 'twitter-signin-menuitem';
  if ($button == 'just-text') {
    $item = t('Sign in with Twitter');
    $class .= ' twitter-signin-menuitem-just-text';
    $link = l($item, 'twitter/redirect', array(
      'attributes' => array(
        'class' => $class,
      ),
    ));
  }
  else {
    $img = drupal_get_path('module', 'twitter_signin') . '/images/' . $button;
    $class .= ' twitter-signin-menuitem-image';
    $item = theme('image', $img, t('Sign in with Twitter'));
    $link = l($item, 'twitter/redirect', array(
      'html' => TRUE,
      'attributes' => array(
        'class' => $class,
      ),
    ));
  }
  return $link;
}

/**
 * Submit handler for Twitter signin.
 */
function twitter_signin_redirect() {
  module_load_include('inc', 'twitter');
  $key = variable_get('twitter_consumer_key', '');
  $secret = variable_get('twitter_consumer_secret', '');
  $twitter = new Twitter($key, $secret);

  // Specify a callback_url when generating our token that will match the
  // current domain.
  $oauth_callback = variable_get('twitter_oauth_callback_url', TWITTER_OAUTH_CALLBACK_URL);
  $callback_url = url($oauth_callback, array(
    'absolute' => TRUE,
  ));
  $params = array(
    'oauth_callback' => $callback_url,
  );
  $token = $twitter
    ->get_request_token($params);
  $_SESSION['twitter_oauth']['token'] = $token;
  $_SESSION['twitter_oauth']['destination'] = referer_uri();
  $_SESSION['twitter_oauth']['signin'] = TRUE;
  drupal_goto($twitter
    ->get_authenticate_url($token));
}

/**
 * Implements hook_form_alter().
 */
function twitter_signin_form_alter(&$form, $form_state, $form_id) {

  // By default don't do anything when the site is in maintenance mode, but
  // allow this to be changed so that admins can still login.
  if (defined('MAINTENANCE_MODE') && !variable_get('twitter_signin_maintenance_mode', FALSE)) {
    return;
  }
  if ($form_id == 'twitter_oauth_callback' && isset($_SESSION['twitter_oauth']['signin'])) {
    $form['#submit'] = array_merge(array(
      'twitter_signin_oauth_callback_submit',
    ), $form['#submit']);
  }

  // Don't do anything else if the credentials haven't been set up yet.
  $key = variable_get('twitter_consumer_key', '');
  $secret = variable_get('twitter_consumer_secret', '');
  if (empty($key) || empty($secret)) {
    return;
  }

  // Login forms.
  if ($form_id == 'user_login' || $form_id == 'user_login_block') {
    if (variable_get('twitter_signin_login', TRUE)) {
      $items = array();
      $items[] = twitter_signin_button();
      $form['twitter_signin'] = array(
        '#value' => theme('item_list', $items),
      );
    }
  }
  elseif ($form_id == 'user_register' && isset($_SESSION['twitter']['values'])) {
    $form['name']['#default_value'] = $_SESSION['twitter']['values']['screen_name'];
    $form['auth_twitter'] = array(
      '#type' => 'hidden',
      '#value' => $_SESSION['twitter']['values']['user_id'],
    );
  }
}

/**
 * Form submit for the OAuth callback. Here we add in sign-in specific handling.
 */
function twitter_signin_oauth_callback_submit(&$form, &$form_state) {
  global $user;
  $success = FALSE;
  $key = variable_get('twitter_consumer_key', '');
  $secret = variable_get('twitter_consumer_secret', '');
  $response = $form_state['twitter_oauth']['response'];

  // Attempt to login as the user.
  $account = user_external_load($response['user_id']);

  // The login was successful.
  if (isset($account->uid)) {

    // Finish the login process.
    user_external_login($account, $response);
    return TRUE;
  }
  else {

    // See if the user exists on the site.
    $uid = db_result(db_query("SELECT uid FROM {twitter_account} WHERE twitter_uid= %d", $response['user_id']));

    // We have an existing Twitter account - set it up for login.
    if (!empty($uid)) {
      $account = user_load($uid);
      $edit['authname_twitter'] = $response['user_id'];
      $edit['name'] = $account->name;
      user_save($account, $edit);
      $user = $account;
      $form_state['twitter_oauth']['account'] = $account;
      $success = TRUE;
    }
    elseif (variable_get('twitter_signin_register', 0)) {

      // Check for a nickname collision.
      $account = user_load(array(
        'name' => $response['screen_name'],
      ));
      if (empty($account->uid)) {
        $password = user_password();
        $edit = array(
          'name' => $response['screen_name'],
          'pass' => $password,
          'init' => $response['screen_name'],
          'status' => 1,
          'authname_twitter' => $response['user_id'],
          'access' => time(),
        );

        // Try saving the new user account.
        try {
          $account = user_save('', $edit);
        } catch (Exception $e) {
          watchdog('oauth_login', "Exception saving new account: " . $e
            ->getMessage(), '', WATCHDOG_WARNING);
          return FALSE;
        }

        // Reload the user's account object.
        $account = user_load($account->uid);

        // Connect the Drupal user account and the Twitter account together.
        $form_state['twitter_oauth']['account'] = $account;
        $args = array(
          '!password' => $password,
          '!link' => l('set your account settings', 'user/' . $account->uid . '/edit'),
        );
        if (variable_get('twitter_signin_show_password', TRUE)) {
          drupal_set_message(t('You have been automatically registered with the password !password. Copy it to !link.', $args));
        }
        $success = TRUE;
      }
      else {
        $args = array(
          '%name' => $response['screen_name'],
          '@login' => url('user/login'),
        );
        drupal_set_message(t('The nickname %name is already in use on this site, please register below with a new nick name, or @login to continue.', $args), 'warning');
      }
    }
    else {
      drupal_set_message(t('Please log in or register to relate your Twitter account with a user.'));
    }
    if ($success) {

      // Log the user into their new account.
      $user = $account;

      // Trigger hook_user_login and other post-login cleanup.
      user_authenticate_finalize($edit);
      return TRUE;
    }
  }
  if (!$success) {
    $_SESSION['twitter']['values'] = $response;
    drupal_goto('user/login');
  }
}

/**
 * Implements hook_user().
 */
function twitter_signin_user($op, &$edit, &$account, $category = NULL) {
  switch ($op) {
    case 'insert':
    case 'login':
      _twitter_signin_add_account($edit, $account);
      break;
  }
}

/**
 * Relates a user account with a Twitter account.
 *
 * @param $account
 *   The Drupal user account.
 */
function _twitter_signin_add_account($edit, $account) {
  if (isset($_SESSION['twitter']['values'])) {
    module_load_include('inc', 'twitter');
    $key = variable_get('twitter_consumer_key', '');
    $secret = variable_get('twitter_consumer_secret', '');
    $response = $_SESSION['twitter']['values'];
    $twitter = new Twitter($key, $secret, $response['oauth_token'], $response['oauth_token_secret']);
    try {
      $twitter_account = $twitter
        ->users_show($response['screen_name']);
    } catch (TwitterException $e) {
      drupal_set_message(t('Request failed: @message.', array(
        '@message' => $e
          ->getMessage(),
      )), 'error');
      return;
    }
    $twitter_account
      ->set_auth($response);
    $twitter_account->uid = $account->uid;
    twitter_account_save($twitter_account, TRUE);
    unset($_SESSION['twitter']);
    drupal_set_message(t('You have related a Twitter account with your user. Next time you can sign in with Twitter.'));
  }
}

Functions

Namesort descending Description
theme_twitter_signin_button Themable function for an image link for signing in with Twitter.
twitter_signin_block Implementation of hook_block().
twitter_signin_button Returns an image link for signing in with Twitter.
twitter_signin_form_alter Implements hook_form_alter().
twitter_signin_menu Implements hook_menu().
twitter_signin_oauth_callback_submit Form submit for the OAuth callback. Here we add in sign-in specific handling.
twitter_signin_redirect Submit handler for Twitter signin.
twitter_signin_theme Implements hook_theme().
twitter_signin_user Implements hook_user().
_twitter_signin_add_account Relates a user account with a Twitter account.