You are here

function _oauthconnector_fetch_field in OAuth Connector 6

Same name and namespace in other branches
  1. 7 oauthconnector.module \_oauthconnector_fetch_field()
3 calls to _oauthconnector_fetch_field()
oauthconnector_oauth_common_authorized in ./oauthconnector.module
Implementation of hook_oauth_common_authorized().
_oauthconnector_avatar in ./oauthconnector.module
Information callback
_oauthconnector_info in ./oauthconnector.module
Information callback

File

./oauthconnector.module, line 428
OAuth Connector module

Code

function _oauthconnector_fetch_field($field, $provider, $access_token, $consumer = NULL) {
  static $cache = array();
  $field = $provider->mapping['fields'][$field];
  if (!isset($cache[$access_token->token_key])) {
    $cache[$access_token->token_key] = array();
  }
  if (!isset($cache[$access_token->token_key][$field['method post']])) {
    $cache[$access_token->token_key][$field['method post']] = array();
  }
  if (!isset($cache[$access_token->token_key][$field['method post']][$field['resource']])) {

    // Load the consumer token if needed
    if (!$consumer) {
      $consumer = DrupalOAuthConsumer::loadById($provider->csid, FALSE);
    }

    // Set up the rest client
    $sig_method = DrupalOAuthClient::signatureMethod(substr(strtolower($provider->consumer_advanced['signature method']), 5));
    $realm = empty($provider->consumer_advanced['authentication realm']) ? NULL : $provider->consumer_advanced['authentication realm'];
    $auth = new HttpClientOAuth($consumer, $access_token, $sig_method, TRUE, TRUE, $realm);
    switch ($provider->mapping['format']) {
      case 'xml':
        $formatter = new HttpClientXMLFormatter();
        break;
      case 'php':
        $formatter = new HttpClientBaseFormatter(HttpClientBaseFormatter::FORMAT_PHP);
        break;
      default:
        $formatter = new HttpClientBaseFormatter(HttpClientBaseFormatter::FORMAT_JSON);
        break;
    }
    $client = new HttpClient($auth, $formatter);

    // Fetch the external user
    $request_method = empty($field['method post']) ? 'get' : 'post';
    try {
      $info = (array) $client
        ->{$request_method}($field['resource']);
      $cache[$access_token->token_key][$field['method post']][$field['resource']] = $info;
    } catch (Exception $e) {
      if (is_a($e, 'HttpClientException')) {
        if ($e
          ->getCode() == 401) {

          //TODO: Save the failure in some way so that we can stop trying to use a revoked token?
          watchdog('oauthconnector', "User !uid not authenticated for %resource: @message", array(
            '!uid' => $access_token->uid,
            '%resource' => $field['resource'],
            '@message' => $e
              ->getMessage(),
          ), WATCHDOG_WARNING);
        }
        elseif ($e
          ->getCode() == 400) {
          watchdog('oauthconnector', "Bad request of %resource: @message", array(
            '%resource' => $field['resource'],
            '@message' => $e
              ->getMessage(),
          ), WATCHDOG_ERROR);
        }
      }
      else {
        watchdog('oauthconnector', 'Failed to fetch of %resource: @message', array(
          '%resource' => $field['resource'],
          '@message' => $e
            ->getMessage(),
        ), WATCHDOG_WARNING);
      }
    }
  }
  else {
    $info = $cache[$access_token->token_key][$field['method post']][$field['resource']];
  }
  $response = FALSE;
  if (!empty($info)) {
    if (!empty($field['querypath']) && module_exists('querypath')) {

      //TODO: Perhaps cache this QueryPath object as well?
      $response = _oauthconnector_object_to_qp(qp('<?xml version="1.0"?><reponse/>'), $info)
        ->find($field['field'])
        ->eq(0)
        ->text();
    }
    elseif (!empty($info[$field['field']])) {
      $response = $info[$field['field']];
    }
  }
  return $response;
}