/**
  * Request an instance of the OAuthStore
  */
 public static function instance($store = 'MySQL', $options = array())
 {
     if (!OAuthStore::$instance) {
         // Select the store you want to use
         if (strpos($store, '/') === false) {
             $class = 'OAuthStore' . $store;
             $file = dirname(__FILE__) . '/store/' . $class . '.php';
         } else {
             $file = $store;
             $store = basename($file, '.php');
             $class = $store;
         }
         if (is_file($file)) {
             require_once $file;
             if (class_exists($class)) {
                 OAuthStore::$instance = new $class($options);
             } else {
                 throw new OAuthException2('Could not find class ' . $class . ' in file ' . $file);
             }
         } else {
             throw new OAuthException2('No OAuthStore for ' . $store . ' (file ' . $file . ')');
         }
     }
     return OAuthStore::$instance;
 }
 /**
  * Construct the request to be signed.  Parses or appends the parameters in the params url.
  * When you supply an params array, then the params should not be urlencoded.
  * When you supply a string, then it is assumed it is of the type application/x-www-form-urlencoded
  * 
  * @param string request	url
  * @param string method		PUT, GET, POST etc.
  * @param mixed params 		string (for urlencoded data, or array with name/value pairs)
  * @param string body		optional body for PUT and/or POST requests
  */
 function __construct($request, $method = null, $params = null, $body = null)
 {
     $this->store = OAuthStore::instance();
     if (is_string($params)) {
         parent::__construct($request, $method, $params);
     } else {
         parent::__construct($request, $method);
         if (is_array($params)) {
             foreach ($params as $name => $value) {
                 $this->setParam($name, $value);
             }
         }
     }
     // With put/ post we might have a body (not for application/x-www-form-urlencoded requests)
     if (strcasecmp($method, 'PUT') == 0 || strcasecmp($method, 'POST') == 0) {
         $this->setBody($body);
     }
 }
 /**
  * Request an access token from the site belonging to consumer_key.
  * Before this we got an request token, now we want to exchange it for
  * an access token.
  * 
  * @param string consumer_key
  * @param string token
  * @param int usr_id		user requesting the access token
  * @param string method (optional) change the method of the request, defaults to POST (as it should be)
  * @param array options (optional) extra options for request, eg token_ttl
  * @param array curl_options	optional extra options for curl request
  *  
  * @exception OAuthException2 when no key could be fetched
  * @exception OAuthException2 when no server with consumer_key registered
  */
 static function requestAccessToken($consumer_key, $token, $usr_id, $method = 'POST', $options = array(), $curl_options = array())
 {
     OAuthRequestLogger::start();
     $store = OAuthStore::instance();
     $r = $store->getServerTokenSecrets($consumer_key, $token, 'request', $usr_id);
     $uri = $r['access_token_uri'];
     $token_name = $r['token_name'];
     // Delete the server request token, this one was for one use only
     $store->deleteServerToken($consumer_key, $r['token'], 0, true);
     // Try to exchange our request token for an access token
     $oauth = new OAuthRequester($uri, $method);
     if (isset($options['oauth_verifier'])) {
         $oauth->setParam('oauth_verifier', $options['oauth_verifier']);
     }
     if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) {
         $oauth->setParam('xoauth_token_ttl', intval($options['token_ttl']));
     }
     OAuthRequestLogger::setRequestObject($oauth);
     $oauth->sign($usr_id, $r, '', 'accessToken');
     $text = $oauth->curl_raw($curl_options);
     if (empty($text)) {
         throw new OAuthException2('No answer from the server "' . $uri . '" while requesting an access token');
     }
     $data = $oauth->curl_parse($text);
     if ($data['code'] != 200) {
         throw new OAuthException2('Unexpected result from the server "' . $uri . '" (' . $data['code'] . ') while requesting an access token');
     }
     $token = array();
     $params = explode('&', $data['body']);
     foreach ($params as $p) {
         @(list($name, $value) = explode('=', $p, 2));
         $token[$oauth->urldecode($name)] = $oauth->urldecode($value);
     }
     if (!empty($token['oauth_token']) && !empty($token['oauth_token_secret'])) {
         $opts = array();
         $opts['name'] = $token_name;
         if (isset($token['xoauth_token_ttl'])) {
             $opts['token_ttl'] = $token['xoauth_token_ttl'];
         }
         $store->addServerToken($consumer_key, 'access', $token['oauth_token'], $token['oauth_token_secret'], $usr_id, $opts);
     } else {
         throw new OAuthException2('The server "' . $uri . '" did not return the oauth_token or the oauth_token_secret');
     }
     OAuthRequestLogger::flush();
 }