[Fusionforge-commits] r12941 - in trunk/src/plugins/oauthprovider: . 3rd-party 3rd-party/oauth-php 3rd-party/oauth-php/doc 3rd-party/oauth-php/example

Olivier Berger olberger at fusionforge.org
Tue Mar 29 08:51:45 CEST 2011


Author: olberger
Date: 2011-03-29 08:51:45 +0200 (Tue, 29 Mar 2011)
New Revision: 12941

Added:
   trunk/src/plugins/oauthprovider/3rd-party/
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/CHANGELOG.txt
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/LICENSE.txt
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/OAuth.php
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/OAuth_TestServer.php
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/doc/
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/doc/design.txt
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/access_token.php
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/client.php
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/common.inc.php
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/echo_api.php
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/index.php
   trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/request_token.php
Log:
Adding lib OAuth PHP as svn checkout -r 622 http://oauth.googlecode.com/svn/code/php

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/CHANGELOG.txt
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/CHANGELOG.txt	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/CHANGELOG.txt	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,15 @@
+== 2008.08.04 ==
+* Added LICENSE.txt file with MIT license, copyright owner is perhaps
+	dubious however.
+== 2008.07.22 ==
+* Change to encoding to fix last change to encoding of spaces
+== 2008.07.15 ==
+* Another change to encoding per 
+	http://groups.google.com/group/oauth/browse_thread/thread/d39931d39b4af4bd
+* A change to port handling to better deal with https and the like per
+  http://groups.google.com/group/oauth/browse_thread/thread/1b203a51d9590226
+* Fixed a small bug per
+	http://code.google.com/p/oauth/issues/detail?id=26
+* Added missing base_string debug info when using RSA-SHA1
+* Increased size of example endpoint input field and added note about
+  query strings

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/LICENSE.txt
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/LICENSE.txt	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/LICENSE.txt	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,22 @@
+The MIT License
+
+Copyright (c) 2007 Andy Smith
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/OAuth.php
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/OAuth.php	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/OAuth.php	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,755 @@
+<?php
+// vim: foldmethod=marker
+
+/* Generic exception class
+ */
+class OAuthException extends Exception {/*{{{*/
+  // pass
+}/*}}}*/
+
+class OAuthConsumer {/*{{{*/
+  public $key;
+  public $secret;
+
+  function __construct($key, $secret, $callback_url=NULL) {/*{{{*/
+    $this->key = $key;
+    $this->secret = $secret;
+    $this->callback_url = $callback_url;
+  }/*}}}*/
+}/*}}}*/
+
+class OAuthToken {/*{{{*/
+  // access tokens and request tokens
+  public $key;
+  public $secret;
+
+  /**
+   * key = the token
+   * secret = the token secret
+   */
+  function __construct($key, $secret) {/*{{{*/
+    $this->key = $key;
+    $this->secret = $secret;
+  }/*}}}*/
+
+  /**
+   * generates the basic string serialization of a token that a server
+   * would respond to request_token and access_token calls with
+   */
+  function to_string() {/*{{{*/
+    return "oauth_token=" . OAuthUtil::urlencodeRFC3986($this->key) . 
+        "&oauth_token_secret=" . OAuthUtil::urlencodeRFC3986($this->secret);
+  }/*}}}*/
+
+  function __toString() {/*{{{*/
+    return $this->to_string();
+  }/*}}}*/
+}/*}}}*/
+
+class OAuthSignatureMethod {/*{{{*/
+  public function check_signature(&$request, $consumer, $token, $signature) {
+    $built = $this->build_signature($request, $consumer, $token);
+    return $built == $signature;
+  }
+}/*}}}*/
+
+class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {/*{{{*/
+  function get_name() {/*{{{*/
+    return "HMAC-SHA1";
+  }/*}}}*/
+
+  public function build_signature($request, $consumer, $token) {/*{{{*/
+    $base_string = $request->get_signature_base_string();
+    $request->base_string = $base_string;
+
+    $key_parts = array(
+      $consumer->secret,
+      ($token) ? $token->secret : ""
+    );
+
+    $key_parts = array_map(array('OAuthUtil','urlencodeRFC3986'), $key_parts);
+    $key = implode('&', $key_parts);
+
+    return base64_encode( hash_hmac('sha1', $base_string, $key, true));
+  }/*}}}*/
+}/*}}}*/
+
+class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {/*{{{*/
+  public function get_name() {/*{{{*/
+    return "PLAINTEXT";
+  }/*}}}*/
+
+  public function build_signature($request, $consumer, $token) {/*{{{*/
+    $sig = array(
+      OAuthUtil::urlencodeRFC3986($consumer->secret)
+    );
+
+    if ($token) {
+      array_push($sig, OAuthUtil::urlencodeRFC3986($token->secret));
+    } else {
+      array_push($sig, '');
+    }
+
+    $raw = implode("&", $sig);
+    // for debug purposes
+    $request->base_string = $raw;
+
+    return OAuthUtil::urlencodeRFC3986($raw);
+  }/*}}}*/
+}/*}}}*/
+
+class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {/*{{{*/
+  public function get_name() {/*{{{*/
+    return "RSA-SHA1";
+  }/*}}}*/
+
+  protected function fetch_public_cert(&$request) {/*{{{*/
+    // not implemented yet, ideas are:
+    // (1) do a lookup in a table of trusted certs keyed off of consumer
+    // (2) fetch via http using a url provided by the requester
+    // (3) some sort of specific discovery code based on request
+    //
+    // either way should return a string representation of the certificate
+    throw Exception("fetch_public_cert not implemented");
+  }/*}}}*/
+
+  protected function fetch_private_cert(&$request) {/*{{{*/
+    // not implemented yet, ideas are:
+    // (1) do a lookup in a table of trusted certs keyed off of consumer
+    //
+    // either way should return a string representation of the certificate
+    throw Exception("fetch_private_cert not implemented");
+  }/*}}}*/
+
+  public function build_signature(&$request, $consumer, $token) {/*{{{*/
+    $base_string = $request->get_signature_base_string();
+    $request->base_string = $base_string;
+  
+    // Fetch the private key cert based on the request
+    $cert = $this->fetch_private_cert($request);
+
+    // Pull the private key ID from the certificate
+    $privatekeyid = openssl_get_privatekey($cert);
+
+    // Sign using the key
+    $ok = openssl_sign($base_string, $signature, $privatekeyid);   
+
+    // Release the key resource
+    openssl_free_key($privatekeyid);
+  
+    return base64_encode($signature);
+  } /*}}}*/
+
+  public function check_signature(&$request, $consumer, $token, $signature) {/*{{{*/
+    $decoded_sig = base64_decode($signature);
+
+    $base_string = $request->get_signature_base_string();
+  
+    // Fetch the public key cert based on the request
+    $cert = $this->fetch_public_cert($request);
+
+    // Pull the public key ID from the certificate
+    $publickeyid = openssl_get_publickey($cert);
+
+    // Check the computed signature against the one passed in the query
+    $ok = openssl_verify($base_string, $decoded_sig, $publickeyid);   
+
+    // Release the key resource
+    openssl_free_key($publickeyid);
+  
+    return $ok == 1;
+  } /*}}}*/
+}/*}}}*/
+
+class OAuthRequest {/*{{{*/
+  private $parameters;
+  private $http_method;
+  private $http_url;
+  // for debug purposes
+  public $base_string;
+  public static $version = '1.0';
+
+  function __construct($http_method, $http_url, $parameters=NULL) {/*{{{*/
+    @$parameters or $parameters = array();
+    $this->parameters = $parameters;
+    $this->http_method = $http_method;
+    $this->http_url = $http_url;
+  }/*}}}*/
+
+
+  /**
+   * attempt to build up a request from what was passed to the server
+   */
+  public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {/*{{{*/
+    $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") ? 'http' : 'https';
+    @$http_url or $http_url = $scheme . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
+    @$http_method or $http_method = $_SERVER['REQUEST_METHOD'];
+    
+    $request_headers = OAuthRequest::get_headers();
+
+    // let the library user override things however they'd like, if they know
+    // which parameters to use then go for it, for example XMLRPC might want to
+    // do this
+    if ($parameters) {
+      $req = new OAuthRequest($http_method, $http_url, $parameters);
+    }
+    // next check for the auth header, we need to do some extra stuff
+    // if that is the case, namely suck in the parameters from GET or POST
+    // so that we can include them in the signature
+    else if (@substr($request_headers['Authorization'], 0, 5) == "OAuth") {
+      $header_parameters = OAuthRequest::split_header($request_headers['Authorization']);
+      if ($http_method == "GET") {
+        $req_parameters = $_GET;
+      } 
+      else if ($http_method == "POST") {
+        $req_parameters = $_POST;
+      } 
+      $parameters = array_merge($header_parameters, $req_parameters);
+      $req = new OAuthRequest($http_method, $http_url, $parameters);
+    }
+    else if ($http_method == "GET") {
+      $req = new OAuthRequest($http_method, $http_url, $_GET);
+    }
+    else if ($http_method == "POST") {
+      $req = new OAuthRequest($http_method, $http_url, $_POST);
+    }
+    return $req;
+  }/*}}}*/
+
+  /**
+   * pretty much a helper function to set up the request
+   */
+  public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {/*{{{*/
+    @$parameters or $parameters = array();
+    $defaults = array("oauth_version" => OAuthRequest::$version,
+                      "oauth_nonce" => OAuthRequest::generate_nonce(),
+                      "oauth_timestamp" => OAuthRequest::generate_timestamp(),
+                      "oauth_consumer_key" => $consumer->key);
+    $parameters = array_merge($defaults, $parameters);
+
+    if ($token) {
+      $parameters['oauth_token'] = $token->key;
+    }
+    return new OAuthRequest($http_method, $http_url, $parameters);
+  }/*}}}*/
+
+  public function set_parameter($name, $value) {/*{{{*/
+    $this->parameters[$name] = $value;
+  }/*}}}*/
+
+  public function get_parameter($name) {/*{{{*/
+    return $this->parameters[$name];
+  }/*}}}*/
+
+  public function get_parameters() {/*{{{*/
+    return $this->parameters;
+  }/*}}}*/
+
+  /**
+   * Returns the normalized parameters of the request
+   * 
+   * This will be all (except oauth_signature) parameters,
+   * sorted first by key, and if duplicate keys, then by
+   * value.
+   *
+   * The returned string will be all the key=value pairs
+   * concated by &.
+   * 
+   * @return string
+   */
+  public function get_signable_parameters() {/*{{{*/
+    // Grab all parameters
+    $params = $this->parameters;
+		
+    // Remove oauth_signature if present
+    if (isset($params['oauth_signature'])) {
+      unset($params['oauth_signature']);
+    }
+		
+    // Urlencode both keys and values
+    $keys = array_map(array('OAuthUtil', 'urlencodeRFC3986'), array_keys($params));
+    $values = array_map(array('OAuthUtil', 'urlencodeRFC3986'), array_values($params));
+    $params = array_combine($keys, $values);
+
+    // Sort by keys (natsort)
+    uksort($params, 'strnatcmp');
+
+    // Generate key=value pairs
+    $pairs = array();
+    foreach ($params as $key=>$value ) {
+      if (is_array($value)) {
+        // If the value is an array, it's because there are multiple 
+        // with the same key, sort them, then add all the pairs
+        natsort($value);
+        foreach ($value as $v2) {
+          $pairs[] = $key . '=' . $v2;
+        }
+      } else {
+        $pairs[] = $key . '=' . $value;
+      }
+    }
+		
+    // Return the pairs, concated with &
+    return implode('&', $pairs);
+  }/*}}}*/
+
+  /**
+   * Returns the base string of this request
+   *
+   * The base string defined as the method, the url
+   * and the parameters (normalized), each urlencoded
+   * and the concated with &.
+   */
+  public function get_signature_base_string() {/*{{{*/
+    $parts = array(
+      $this->get_normalized_http_method(),
+      $this->get_normalized_http_url(),
+      $this->get_signable_parameters()
+    );
+
+    $parts = array_map(array('OAuthUtil', 'urlencodeRFC3986'), $parts);
+
+    return implode('&', $parts);
+  }/*}}}*/
+
+  /**
+   * just uppercases the http method
+   */
+  public function get_normalized_http_method() {/*{{{*/
+    return strtoupper($this->http_method);
+  }/*}}}*/
+
+  /**
+   * parses the url and rebuilds it to be
+   * scheme://host/path
+   */
+  public function get_normalized_http_url() {/*{{{*/
+    $parts = parse_url($this->http_url);
+
+    $port = @$parts['port'];
+    $scheme = $parts['scheme'];
+    $host = $parts['host'];
+    $path = @$parts['path'];
+
+    $port or $port = ($scheme == 'https') ? '443' : '80';
+
+    if (($scheme == 'https' && $port != '443')
+        || ($scheme == 'http' && $port != '80')) {
+      $host = "$host:$port";
+    }
+    return "$scheme://$host$path";
+  }/*}}}*/
+
+  /**
+   * builds a url usable for a GET request
+   */
+  public function to_url() {/*{{{*/
+    $out = $this->get_normalized_http_url() . "?";
+    $out .= $this->to_postdata();
+    return $out;
+  }/*}}}*/
+
+  /**
+   * builds the data one would send in a POST request
+   */
+  public function to_postdata() {/*{{{*/
+    $total = array();
+    foreach ($this->parameters as $k => $v) {
+      $total[] = OAuthUtil::urlencodeRFC3986($k) . "=" . OAuthUtil::urlencodeRFC3986($v);
+    }
+    $out = implode("&", $total);
+    return $out;
+  }/*}}}*/
+
+  /**
+   * builds the Authorization: header
+   */
+  public function to_header($realm="") {/*{{{*/
+    $out ='"Authorization: OAuth realm="' . $realm . '",';
+    $total = array();
+    foreach ($this->parameters as $k => $v) {
+      if (substr($k, 0, 5) != "oauth") continue;
+      $out .= ',' . OAuthUtil::urlencodeRFC3986($k) . '="' . OAuthUtil::urlencodeRFC3986($v) . '"';
+    }
+    return $out;
+  }/*}}}*/
+
+  public function __toString() {/*{{{*/
+    return $this->to_url();
+  }/*}}}*/
+
+
+  public function sign_request($signature_method, $consumer, $token) {/*{{{*/
+    $this->set_parameter("oauth_signature_method", $signature_method->get_name());
+    $signature = $this->build_signature($signature_method, $consumer, $token);
+    $this->set_parameter("oauth_signature", $signature);
+  }/*}}}*/
+
+  public function build_signature($signature_method, $consumer, $token) {/*{{{*/
+    $signature = $signature_method->build_signature($this, $consumer, $token);
+    return $signature;
+  }/*}}}*/
+
+  /**
+   * util function: current timestamp
+   */
+  private static function generate_timestamp() {/*{{{*/
+    return time();
+  }/*}}}*/
+
+  /**
+   * util function: current nonce
+   */
+  private static function generate_nonce() {/*{{{*/
+    $mt = microtime();
+    $rand = mt_rand();
+
+    return md5($mt . $rand); // md5s look nicer than numbers
+  }/*}}}*/
+
+  /**
+   * util function for turning the Authorization: header into
+   * parameters, has to do some unescaping
+   */
+  private static function split_header($header) {/*{{{*/
+    // remove 'OAuth ' at the start of a header 
+    $header = substr($header, 6); 
+
+    // error cases: commas in parameter values?
+    $parts = explode(",", $header);
+    $out = array();
+    foreach ($parts as $param) {
+      $param = ltrim($param);
+      // skip the "realm" param, nobody ever uses it anyway
+      if (substr($param, 0, 5) != "oauth") continue;
+
+      $param_parts = explode("=", $param);
+
+      // rawurldecode() used because urldecode() will turn a "+" in the
+      // value into a space
+      $out[$param_parts[0]] = rawurldecode(substr($param_parts[1], 1, -1));
+    }
+    return $out;
+  }/*}}}*/
+
+  /**
+   * helper to try to sort out headers for people who aren't running apache
+   */
+  private static function get_headers() {/*{{{*/
+    if (function_exists('apache_request_headers')) {
+      // we need this to get the actual Authorization: header
+      // because apache tends to tell us it doesn't exist
+      return apache_request_headers();
+    }
+    // otherwise we don't have apache and are just going to have to hope
+    // that $_SERVER actually contains what we need
+    $out = array();
+    foreach ($_SERVER as $key => $value) {
+      if (substr($key, 0, 5) == "HTTP_") {
+        // this is chaos, basically it is just there to capitalize the first
+        // letter of every word that is not an initial HTTP and strip HTTP
+        // code from przemek
+        $key = str_replace(" ", "-", ucwords(strtolower(str_replace("_", " ", substr($key, 5)))));
+        $out[$key] = $value;
+      }
+    }
+    return $out;
+  }/*}}}*/
+}/*}}}*/
+
+class OAuthServer {/*{{{*/
+  protected $timestamp_threshold = 300; // in seconds, five minutes
+  protected $version = 1.0;             // hi blaine
+  protected $signature_methods = array();
+
+  protected $data_store;
+
+  function __construct($data_store) {/*{{{*/
+    $this->data_store = $data_store;
+  }/*}}}*/
+
+  public function add_signature_method($signature_method) {/*{{{*/
+    $this->signature_methods[$signature_method->get_name()] = 
+        $signature_method;
+  }/*}}}*/
+  
+  // high level functions
+
+  /**
+   * process a request_token request
+   * returns the request token on success
+   */
+  public function fetch_request_token(&$request) {/*{{{*/
+    $this->get_version($request);
+
+    $consumer = $this->get_consumer($request);
+
+    // no token required for the initial token request
+    $token = NULL;
+
+    $this->check_signature($request, $consumer, $token);
+
+    $new_token = $this->data_store->new_request_token($consumer);
+
+    return $new_token;
+  }/*}}}*/
+
+  /**
+   * process an access_token request
+   * returns the access token on success
+   */
+  public function fetch_access_token(&$request) {/*{{{*/
+    $this->get_version($request);
+
+    $consumer = $this->get_consumer($request);
+
+    // requires authorized request token
+    $token = $this->get_token($request, $consumer, "request");
+
+    $this->check_signature($request, $consumer, $token);
+
+    $new_token = $this->data_store->new_access_token($token, $consumer);
+
+    return $new_token;
+  }/*}}}*/
+
+  /**
+   * verify an api call, checks all the parameters
+   */
+  public function verify_request(&$request) {/*{{{*/
+    $this->get_version($request);
+    $consumer = $this->get_consumer($request);
+    $token = $this->get_token($request, $consumer, "access");
+    $this->check_signature($request, $consumer, $token);
+    return array($consumer, $token);
+  }/*}}}*/
+
+  // Internals from here
+  /**
+   * version 1
+   */
+  private function get_version(&$request) {/*{{{*/
+    $version = $request->get_parameter("oauth_version");
+    if (!$version) {
+      $version = 1.0;
+    }
+    if ($version && $version != $this->version) {
+      throw new OAuthException("OAuth version '$version' not supported");
+    }
+    return $version;
+  }/*}}}*/
+
+  /**
+   * figure out the signature with some defaults
+   */
+  private function get_signature_method(&$request) {/*{{{*/
+    $signature_method =  
+        @$request->get_parameter("oauth_signature_method");
+    if (!$signature_method) {
+      $signature_method = "PLAINTEXT";
+    }
+    if (!in_array($signature_method, 
+                  array_keys($this->signature_methods))) {
+      throw new OAuthException(
+        "Signature method '$signature_method' not supported try one of the following: " . implode(", ", array_keys($this->signature_methods))
+      );      
+    }
+    return $this->signature_methods[$signature_method];
+  }/*}}}*/
+
+  /**
+   * try to find the consumer for the provided request's consumer key
+   */
+  private function get_consumer(&$request) {/*{{{*/
+    $consumer_key = @$request->get_parameter("oauth_consumer_key");
+    if (!$consumer_key) {
+      throw new OAuthException("Invalid consumer key");
+    }
+
+    $consumer = $this->data_store->lookup_consumer($consumer_key);
+    if (!$consumer) {
+      throw new OAuthException("Invalid consumer");
+    }
+
+    return $consumer;
+  }/*}}}*/
+
+  /**
+   * try to find the token for the provided request's token key
+   */
+  private function get_token(&$request, $consumer, $token_type="access") {/*{{{*/
+    $token_field = @$request->get_parameter('oauth_token');
+    $token = $this->data_store->lookup_token(
+      $consumer, $token_type, $token_field
+    );
+    if (!$token) {
+      throw new OAuthException("Invalid $token_type token: $token_field");
+    }
+    return $token;
+  }/*}}}*/
+
+  /**
+   * all-in-one function to check the signature on a request
+   * should guess the signature method appropriately
+   */
+  private function check_signature(&$request, $consumer, $token) {/*{{{*/
+    // this should probably be in a different method
+    $timestamp = @$request->get_parameter('oauth_timestamp');
+    $nonce = @$request->get_parameter('oauth_nonce');
+
+    $this->check_timestamp($timestamp);
+    $this->check_nonce($consumer, $token, $nonce, $timestamp);
+
+    $signature_method = $this->get_signature_method($request);
+
+    $signature = $request->get_parameter('oauth_signature');    
+    $valid_sig = $signature_method->check_signature(
+      $request, 
+      $consumer, 
+      $token, 
+      $signature
+    );
+
+    if (!$valid_sig) {
+      throw new OAuthException("Invalid signature");
+    }
+  }/*}}}*/
+
+  /**
+   * check that the timestamp is new enough
+   */
+  private function check_timestamp($timestamp) {/*{{{*/
+    // verify that timestamp is recentish
+    $now = time();
+    if ($now - $timestamp > $this->timestamp_threshold) {
+      throw new OAuthException("Expired timestamp, yours $timestamp, ours $now");
+    }
+  }/*}}}*/
+
+  /**
+   * check that the nonce is not repeated
+   */
+  private function check_nonce($consumer, $token, $nonce, $timestamp) {/*{{{*/
+    // verify that the nonce is uniqueish
+    $found = $this->data_store->lookup_nonce($consumer, $token, $nonce, $timestamp);
+    if ($found) {
+      throw new OAuthException("Nonce already used: $nonce");
+    }
+  }/*}}}*/
+
+
+
+}/*}}}*/
+
+class OAuthDataStore {/*{{{*/
+  function lookup_consumer($consumer_key) {/*{{{*/
+    // implement me
+  }/*}}}*/
+
+  function lookup_token($consumer, $token_type, $token) {/*{{{*/
+    // implement me
+  }/*}}}*/
+
+  function lookup_nonce($consumer, $token, $nonce, $timestamp) {/*{{{*/
+    // implement me
+  }/*}}}*/
+
+  function fetch_request_token($consumer) {/*{{{*/
+    // return a new token attached to this consumer
+  }/*}}}*/
+
+  function fetch_access_token($token, $consumer) {/*{{{*/
+    // return a new access token attached to this consumer
+    // for the user associated with this token if the request token
+    // is authorized
+    // should also invalidate the request token
+  }/*}}}*/
+
+}/*}}}*/
+
+
+/*  A very naive dbm-based oauth storage
+ */
+class SimpleOAuthDataStore extends OAuthDataStore {/*{{{*/
+  private $dbh;
+
+  function __construct($path = "oauth.gdbm") {/*{{{*/
+    $this->dbh = dba_popen($path, 'c', 'gdbm');
+  }/*}}}*/
+
+  function __destruct() {/*{{{*/
+    dba_close($this->dbh);
+  }/*}}}*/
+
+  function lookup_consumer($consumer_key) {/*{{{*/
+    $rv = dba_fetch("consumer_$consumer_key", $this->dbh);
+    if ($rv === FALSE) {
+      return NULL;
+    }
+    $obj = unserialize($rv);
+    if (!($obj instanceof OAuthConsumer)) {
+      return NULL;
+    }
+    return $obj;
+  }/*}}}*/
+
+  function lookup_token($consumer, $token_type, $token) {/*{{{*/
+    $rv = dba_fetch("${token_type}_${token}", $this->dbh);
+    if ($rv === FALSE) {
+      return NULL;
+    }
+    $obj = unserialize($rv);
+    if (!($obj instanceof OAuthToken)) {
+      return NULL;
+    }
+    return $obj;
+  }/*}}}*/
+
+  function lookup_nonce($consumer, $token, $nonce, $timestamp) {/*{{{*/
+    if (dba_exists("nonce_$nonce", $this->dbh)) {
+      return TRUE;
+    } else {
+      dba_insert("nonce_$nonce", "1", $this->dbh);
+      return FALSE;
+    }
+  }/*}}}*/
+
+  function new_token($consumer, $type="request") {/*{{{*/
+    $key = md5(time());
+    $secret = time() + time();
+    $token = new OAuthToken($key, md5(md5($secret)));
+    if (!dba_insert("${type}_$key", serialize($token), $this->dbh)) {
+      throw new OAuthException("doooom!");
+    }
+    return $token;
+  }/*}}}*/
+
+  function new_request_token($consumer) {/*{{{*/
+    return $this->new_token($consumer, "request");
+  }/*}}}*/
+
+  function new_access_token($token, $consumer) {/*{{{*/
+
+    $token = $this->new_token($consumer, 'access');
+    dba_delete("request_" . $token->key, $this->dbh);
+    return $token;
+  }/*}}}*/
+}/*}}}*/
+
+class OAuthUtil {/*{{{*/
+  public static function urlencodeRFC3986($string) {/*{{{*/
+    return str_replace('+', ' ',
+                       str_replace('%7E', '~', rawurlencode($string)));
+    
+  }/*}}}*/
+    
+
+  // This decode function isn't taking into consideration the above 
+  // modifications to the encoding process. However, this method doesn't 
+  // seem to be used anywhere so leaving it as is.
+  public static function urldecodeRFC3986($string) {/*{{{*/
+    return rawurldecode($string);
+  }/*}}}*/
+}/*}}}*/
+
+?>

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/OAuth_TestServer.php
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/OAuth_TestServer.php	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/OAuth_TestServer.php	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,106 @@
+<?php //vim: foldmethod=marker
+//require_once("OAuth.php");
+
+class TestOAuthServer extends OAuthServer {
+  public function get_signature_methods() {
+    return $this->signature_methods;
+  }
+}
+
+class TestOAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod_RSA_SHA1 {
+  public function fetch_private_cert(&$request) {
+    $cert = <<<EOD
+-----BEGIN PRIVATE KEY-----
+MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALRiMLAh9iimur8V
+A7qVvdqxevEuUkW4K+2KdMXmnQbG9Aa7k7eBjK1S+0LYmVjPKlJGNXHDGuy5Fw/d
+7rjVJ0BLB+ubPK8iA/Tw3hLQgXMRRGRXXCn8ikfuQfjUS1uZSatdLB81mydBETlJ
+hI6GH4twrbDJCR2Bwy/XWXgqgGRzAgMBAAECgYBYWVtleUzavkbrPjy0T5FMou8H
+X9u2AC2ry8vD/l7cqedtwMPp9k7TubgNFo+NGvKsl2ynyprOZR1xjQ7WgrgVB+mm
+uScOM/5HVceFuGRDhYTCObE+y1kxRloNYXnx3ei1zbeYLPCHdhxRYW7T0qcynNmw
+rn05/KO2RLjgQNalsQJBANeA3Q4Nugqy4QBUCEC09SqylT2K9FrrItqL2QKc9v0Z
+zO2uwllCbg0dwpVuYPYXYvikNHHg+aCWF+VXsb9rpPsCQQDWR9TT4ORdzoj+Nccn
+qkMsDmzt0EfNaAOwHOmVJ2RVBspPcxt5iN4HI7HNeG6U5YsFBb+/GZbgfBT3kpNG
+WPTpAkBI+gFhjfJvRw38n3g/+UeAkwMI2TJQS4n8+hid0uus3/zOjDySH3XHCUno
+cn1xOJAyZODBo47E+67R4jV1/gzbAkEAklJaspRPXP877NssM5nAZMU0/O/NGCZ+
+3jPgDUno6WbJn5cqm8MqWhW1xGkImgRk+fkDBquiq4gPiT898jusgQJAd5Zrr6Q8
+AO/0isr/3aa6O6NLQxISLKcPDk2NOccAfS/xOtfOz4sJYM3+Bs4Io9+dZGSDCA54
+Lw03eHTNQghS0A==
+-----END PRIVATE KEY-----
+EOD;
+    return $cert;
+  }
+
+  public function fetch_public_cert(&$request) {
+    $cert = <<<EOD
+-----BEGIN CERTIFICATE-----
+MIIBpjCCAQ+gAwIBAgIBATANBgkqhkiG9w0BAQUFADAZMRcwFQYDVQQDDA5UZXN0
+IFByaW5jaXBhbDAeFw03MDAxMDEwODAwMDBaFw0zODEyMzEwODAwMDBaMBkxFzAV
+BgNVBAMMDlRlc3QgUHJpbmNpcGFsMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
+gQC0YjCwIfYoprq/FQO6lb3asXrxLlJFuCvtinTF5p0GxvQGu5O3gYytUvtC2JlY
+zypSRjVxwxrsuRcP3e641SdASwfrmzyvIgP08N4S0IFzEURkV1wp/IpH7kH41Etb
+mUmrXSwfNZsnQRE5SYSOhh+LcK2wyQkdgcMv11l4KoBkcwIDAQABMA0GCSqGSIb3
+DQEBBQUAA4GBAGZLPEuJ5SiJ2ryq+CmEGOXfvlTtEL2nuGtr9PewxkgnOjZpUy+d
+4TvuXJbNQc8f4AMWL/tO9w0Fk80rWKp9ea8/df4qMq5qlFWlx6yOLQxumNOmECKb
+WpkUQDIDJEoFUzKMVuJf4KO/FJ345+BNLGgbJ6WujreoM1X/gYfdnJ/J
+-----END CERTIFICATE-----
+EOD;
+    return $cert;
+  }
+} 
+
+/**
+ * A mock store for testing
+ */
+class MockOAuthDataStore extends OAuthDataStore {/*{{{*/
+    private $consumer;
+    private $request_token;
+    private $access_token;
+    private $nonce;
+
+    function __construct() {/*{{{*/
+        $this->consumer = new OAuthConsumer("key", "secret", NULL);
+        $this->request_token = new OAuthToken("requestkey", "requestsecret", 1);
+        $this->access_token = new OAuthToken("accesskey", "accesssecret", 1);
+        $this->nonce = "nonce";
+    }/*}}}*/
+
+    function lookup_consumer($consumer_key) {/*{{{*/
+        if ($consumer_key == $this->consumer->key) return $this->consumer;
+        return NULL;
+    }/*}}}*/
+
+    function lookup_token($consumer, $token_type, $token) {/*{{{*/
+        $token_attrib = $token_type . "_token";
+        if ($consumer->key == $this->consumer->key
+            && $token == $this->$token_attrib->key) {
+            return $this->$token_attrib;
+        }
+        return NULL;
+    }/*}}}*/
+
+    function lookup_nonce($consumer, $token, $nonce, $timestamp) {/*{{{*/
+        if ($consumer->key == $this->consumer->key
+            && (($token && $token->key == $this->request_token->key)
+                || ($token && $token->key == $this->access_token->key))
+            && $nonce == $this->nonce) {
+            return $this->nonce;
+        }
+        return NULL;
+    }/*}}}*/
+
+    function new_request_token($consumer) {/*{{{*/
+        if ($consumer->key == $this->consumer->key) {
+            return $this->request_token;
+        }
+        return NULL;
+    }/*}}}*/
+
+    function new_access_token($token, $consumer) {/*{{{*/
+        if ($consumer->key == $this->consumer->key
+            && $token->key == $this->request_token->key) {
+            return $this->access_token;
+        }
+        return NULL;
+    }/*}}}*/
+}/*}}}*/
+?>

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/doc/design.txt
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/doc/design.txt	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/doc/design.txt	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,68 @@
+Interfaces:
+
+# OAuthConsumer is a data type that represents the identity of the Consumer
+# via its shared secret with the Service Provider.
+OAuthConsumer
+  - key : str
+  - secret : str
+
+# OAuthToken is a data type that represents an End User via either an access
+# or request token
+OAuthToken
+  - token : str
+  - secret : str
+  - to_string() -> str
+  - (static) from_string() -> OAuthToken
+
+# OAuthSignatureMethod is a strategy class that implements a signature method
+OAuthSignatureMethod
+  - get_name() -> str
+  - build_signature (OAuthRequest, OAuthConsumer, OAuthToken) -> str
+
+# OAuthRequest represents the request and can be seriali
+OAuthRequest:
+  - OAuthRequest(str http_method, str http_url, [dict parameters]) -> constructor
+  - set_parameter(str parameter, str value) -> void
+    - example parameters: oauth_consumer_key, foo
+  - get_parameter(str parameter) -> str
+  - get_parameters() -> dict
+
+  - get_normalized_http_method() -> str
+  - get_normalized_http_url() -> str
+  - get_signable_params() -> dict
+
+  - to_header () -> str   # serialize as a header for an HTTPAuth request
+  - to_postdata () -> str # serialize as post data for a POST request
+  - to_url () -> str      # serialize as a url for a GET request
+  - sign_request(OAuthSignatureMethod, OAuthConsumer, OAuthToken) -> void
+  - build_signature(OAuthSignatureMethod, OAuthConsumer, OAuthToken) -> str
+  - (static) from_request([str http_method, str http_url, dict parameters])
+  - (static) from_consumer_and_token(OAuthConsumer, OAuthToken, str http_method, str http_url, [dict parameters]) -> OAuthRequest
+
+
+# OAuthServer is a worker to check a requests validity against a data store
+OAuthServer:
+  - OAuthServer(OAuthDataStore) -> constructor
+  - set_data_store(OAuthDataStore) -> void
+  - get_data_store() -> OAuthDataStore
+
+  - fetch_request_token (OAuthRequest) -> OAuthToken
+  - fetch_access_token (OAuthRequest) -> OAuthToken
+  - verify_request (OAuthRequest) -> OAuthToken
+
+# OAuthClient is a worker to attempt to execute a request
+OAuthClient:
+  - OAuthClient(OAuthConsumer, OAuthToken) -> constructor
+  - get_consumer() -> OAuthConsumer
+  - get_token() -> OAuthToken
+
+  - fetch_request_token (OAuthRequest) -> OAuthToken
+  - fetch_access_token (OAuthRequest) -> OAuthToken
+
+# OAuthDataStore is a database abstraction used to lookup consumers and tokens
+OAuthDataStore:
+  - lookup_consumer(str key) -> OAuthConsumer
+  - lookup_token(OAuthConsumer, str token_type, str token_token) -> OAuthToken
+  - lookup_nonce(OAuthConsumer, OAuthToken, str nonce, int timestamp) -> OAuthToken
+  - fetch_request_token(OAuthConsumer) -> OAuthToken
+  - fetch_access_token(OAuthConsumer, OAuthToken) -> OAuthToken

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/access_token.php
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/access_token.php	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/access_token.php	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,14 @@
+<?php
+require_once("common.inc.php");
+
+try {
+  $req = OAuthRequest::from_request();
+  $token = $test_server->fetch_access_token($req);
+  print $token;
+} catch (OAuthException $e) {
+  print($e->getMessage() . "\n<hr />\n");
+  print_r($req);
+  die();
+}
+
+?>

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/client.php
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/client.php	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/client.php	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,133 @@
+<?php
+require_once("common.inc.php");
+
+$key = @$_REQUEST['key'];
+$secret = @$_REQUEST['secret'];
+$token = @$_REQUEST['token'];
+$token_secret = @$_REQUEST['token_secret'];
+$endpoint = @$_REQUEST['endpoint'];
+$action = @$_REQUEST['action'];
+$dump_request = @$_REQUEST['dump_request'];
+$user_sig_method = @$_REQUEST['sig_method'];
+$sig_method = $hmac_method;
+if ($user_sig_method) {
+  $sig_method = $sig_methods[$user_sig_method];
+}
+
+$test_consumer = new OAuthConsumer($key, $secret, NULL);
+
+$test_token = NULL;
+if ($token) {
+  $test_token = new OAuthConsumer($token, $token_secret);
+}
+
+
+if ($action == "request_token") {
+  $parsed = parse_url($endpoint);
+  $params = array();
+  parse_str($parsed['query'], $params);
+
+  $req_req = OAuthRequest::from_consumer_and_token($test_consumer, NULL, "GET", $endpoint, $params);
+  $req_req->sign_request($sig_method, $test_consumer, NULL);
+  if ($dump_request) {
+    Header('Content-type: text/plain');
+    print "request url: " . $req_req->to_url(). "\n";
+    print_r($req_req);
+    exit;
+  }
+  Header("Location: $req_req");
+} 
+else if ($action == "authorize") {
+  $callback_url = "$base_url/client.php?key=$key&secret=$secret&token=$token&token_secret=$token_secret&endpoint=" . urlencode($endpoint);
+  $auth_url = $endpoint . "?oauth_token=$token&oauth_callback=".urlencode($callback_url);
+  if ($dump_request) {
+    Header('Content-type: text/plain');
+    print("auth_url: " . $auth_url);
+    exit;
+  }
+  Header("Location: $auth_url");
+}
+else if ($action == "access_token") {
+  $parsed = parse_url($endpoint);
+  $params = array();
+  parse_str($parsed['query'], $params);
+
+  $acc_req = OAuthRequest::from_consumer_and_token($test_consumer, $test_token, "GET", $endpoint, $params);
+  $acc_req->sign_request($sig_method, $test_consumer, $test_token);
+  if ($dump_request) {
+    Header('Content-type: text/plain');
+    print "request url: " . $acc_req->to_url() . "\n";
+    print_r($acc_req);
+    exit;
+  }
+  Header("Location: $acc_req");
+}
+
+?>
+<html>
+<head>
+<title>OAuth Test Client</title>
+</head>
+<body>
+<div><a href="index.php">server</a> | <a href="client.php">client</a></div>
+<h1>OAuth Test Client</h1>
+<h2>Instructions for Use</h2>
+<p>This is a test client that will let you test your OAuth server code. Enter the appropriate information below to test.</p>
+<p>Note: we don't store any of the information you type in.</p>
+
+<form method="POST" name="oauth_client">
+<h3>Choose a Signature Method</h3>
+<select name="sig_method">
+<?php
+foreach ($sig_methods as $name=> $method) {
+  $selected = "";
+  if ($name == $sig_method->get_name()) {
+    $selected = " selected='selected'";
+  }
+  print "<option value='$name'$selected>$name</option>\n";
+}
+?>
+</select>
+<h3>Enter The Endpoint to Test</h3>
+endpoint: <input type="text" name="endpoint" value="<?php echo $endpoint; ?>" size="100"/><br />
+<small style="color: green">Note: You can include query parameters in there to have them parsed in and signed too</small>
+<h3>Enter Your Consumer Key / Secret</h3>
+consumer key: <input type="text" name="key" value="<?php echo $key; ?>" /><br />
+consumer secret: <input type="text" name="secret" value="<?php echo $secret;?>" /><br />
+dump request, don't redirect: <input type="checkbox" name="dump_request" value="1" <?php if ($dump_request) echo 'checked="checked"'; ?>/><br />
+make a token request (don't forget to copy down the values you get)
+<input type="submit" name="action" value="request_token" />
+<h3>Enter Your Request Token / Secret</h3>
+token: <input type="text" name="token" value="<?php echo $token; ?>" /><br />
+token secret: <input type="text" name="token_secret" value="<?php echo $token_secret; ?>" /><br />
+<p><strong>Don't forget to update your endpoint to point at the auth or access token url</strong></p>
+try to authorize this token: <input type="submit" name="action" value="authorize" /><br />
+try to get an access token: <input type="submit" name="action" value="access_token" /><br />
+
+<h3>Currently Supported Signature Methods</h3>
+<p>Current signing method is: <?php echo $sig_method->get_name() ?></p>
+<ul>
+<?php
+foreach ($sig_methods as $key => $method) {
+  
+  print "<li>$key";
+  if ($key != $sig_method->get_name()) {
+    print "(<a href='?sig_method=$key'>switch</a>)";
+  }
+  print "</li>\n";
+}
+?>
+</ul>
+
+<?php 
+if ("RSA-SHA1" == $sig_method->get_name()) {
+  // passing test_server as a dummy referecne
+  print "<pre>" . $sig_method->fetch_private_cert($test_server). "</pre>\n";
+  print "<pre>" . $sig_method->fetch_public_cert($test_server) . "</pre>\n";
+}
+?>
+
+<h3>Further Resources</h3>
+<p>There is also a <a href="index.php">test server</a> implementation in here.</p>
+<p>The code running this example can be downloaded from the PHP section of the OAuth google code project: <a href="http://code.google.com/p/oauth/">http://code.google.com/p/oauth/</a>
+</body>

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/common.inc.php
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/common.inc.php	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/common.inc.php	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,26 @@
+<?php
+require_once("../OAuth.php");
+require_once("../OAuth_TestServer.php");
+
+/*
+ * Config Section
+ */
+$domain = $_SERVER['HTTP_HOST'];
+$base = "/oauth/example";
+$base_url = "http://$domain$base";
+
+/**
+ * Some default objects
+ */
+
+$test_server = new TestOAuthServer(new MockOAuthDataStore());
+$hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
+$plaintext_method = new OAuthSignatureMethod_PLAINTEXT();
+$rsa_method = new TestOAuthSignatureMethod_RSA_SHA1();
+
+$test_server->add_signature_method($hmac_method);
+$test_server->add_signature_method($plaintext_method);
+$test_server->add_signature_method($rsa_method);
+
+$sig_methods = $test_server->get_signature_methods();
+?>

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/echo_api.php
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/echo_api.php	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/echo_api.php	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,21 @@
+<?php
+require_once("common.inc.php");
+
+try {
+  $req = OAuthRequest::from_request();
+  list($consumer, $token) = $test_server->verify_request($req);
+
+  // lsit back the non-OAuth params
+  $total = array();
+  foreach($req->get_parameters() as $k => $v) {
+    if (substr($k, 0, 5) == "oauth") continue;
+    $total[] = urlencode($k) . "=" . urlencode($v);
+  }
+  print implode("&", $total);
+} catch (OAuthException $e) {
+  print($e->getMessage() . "\n<hr />\n");
+  print_r($req);
+  die();
+}
+
+?>

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/index.php
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/index.php	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/index.php	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,108 @@
+<?php
+require_once("common.inc.php");
+
+
+$test_consumer = new OAuthConsumer("key", "secret", NULL);
+$req_token = new OAuthConsumer("requestkey", "requestsecret", 1);
+$acc_token = new OAuthConsumer("accesskey", "accesssecret", 1);
+
+$sig_method = $hmac_method;
+$user_sig_method = @$_GET['sig_method'];
+if ($user_sig_method) {
+  $sig_method = $sig_methods[$user_sig_method];
+}
+
+$req_req = OAuthRequest::from_consumer_and_token($test_consumer, NULL, "GET", $base_url . "/request_token.php");
+$req_req->sign_request($sig_method, $test_consumer, NULL);
+
+$acc_req = OAuthRequest::from_consumer_and_token($test_consumer, $req_token, "GET", $base_url . "/access_token.php");
+$acc_req->sign_request($sig_method, $test_consumer, $req_token);
+
+$echo_req = OAuthRequest::from_consumer_and_token($test_consumer, $acc_token, "GET", $base_url . "/echo_api.php", array("method"=> "foo%20bar", "bar" => "baz"));
+$echo_req->sign_request($sig_method, $test_consumer, $acc_token);
+
+?>
+<html>
+<head>
+<title>OAuth Test Server</title>
+</head>
+<body>
+<div><a href="index.php">server</a> | <a href="client.php">client</a></div>
+<h1>OAuth Test Server</h1>
+<h2>Instructions for Use</h2>
+<p>This is a test server with a predefined static set of keys and tokens, you can make your requests using them to test your code (and mine ;)).</p>
+<h3>Your Consumer Key / Secret</h3>
+<ul>
+<li>consumer key: <code><strong>key</strong></code></li>
+<li>consumer secret: <code><strong>secret</strong></code></li>
+</ul>
+<p>Use this key and secret for all your requests.</p>
+<h3>Getting a Request Token</h3>
+
+<ul>
+<li>request token endpoint: <code><strong><?php echo $base_url . "/request_token.php"; ?></strong></code></li>
+</ul>
+
+<p>A successful request will return the following:</p>
+<p><code>oauth_token=requestkey&oauth_token_secret=requestsecret</code></p>
+
+<p>An unsuccessful request will attempt to describe what went wrong.</p>
+
+<h4>Example</h4>
+<a href="<?php echo $req_req; ?>"><?php echo $req_req; ?></a>
+
+<h3>Getting an Access Token</h3>
+<p>The Request Token provided above is already authorized, you may use it to request an Access Token right away.</p>
+
+<ul>
+<li>access token endpoint: <code><strong><?php echo $base_url . "/access_token.php"; ?></strong></code></li>
+</ul>
+
+<p>A successful request will return the following:</p>
+<p><code>oauth_token=accesskey&oauth_token_secret=accesssecret</code></p>
+
+<p>An unsuccessful request will attempt to describe what went wrong.</p>
+
+<h4>Example</h4>
+<a href="<?php echo $acc_req; ?>"><?php echo $acc_req; ?></a>
+
+<h3>Making Authenticated Calls</h3>
+<p>Using your Access Token you can make authenticated calls.</p>
+
+<ul>
+<li>api endpoint: <code><strong><?php echo $base_url . "/echo_api.php"; ?></strong></code></li>
+</ul>
+<p>
+A successful request will echo the non-OAuth parameters sent to it, for example:</p>
+<p><code>method=foo&bar=baz</code></p>
+<p>An unsuccessful request will attempt to describe what went wrong.</p>
+
+<h4>Example</h4>
+<a href="<?php echo $echo_req; ?>"><?php echo $echo_req; ?></a>
+
+<h3>Currently Supported Signature Methods</h3>
+<p>Current signing method is: <?php echo $user_sig_method ?></p>
+<ul>
+<?php
+$sig_methods = $test_server->get_signature_methods();
+foreach ($sig_methods as $key => $method) {
+  print "<li>$key";
+  if ($key != $sig_method->get_name()) {
+    print "(<a href='?sig_method=$key'>switch</a>)";
+  }
+  print "</li>\n";
+}
+?>
+</ul>
+
+<?php 
+if ("RSA-SHA1" == $sig_method->get_name()) {
+  print "<pre>" . $sig_method->fetch_private_cert($req_req) . "</pre>\n";
+  print "<pre>" . $sig_method->fetch_public_cert($req_req) . "</pre>\n";
+}
+?>
+
+<h3>Further Resources</h3>
+<p>There is also a <a href="client.php">test client</a> implementation in here.</p>
+<p>The code running this example can be downloaded from the PHP section of the OAuth google code project: <a href="http://code.google.com/p/oauth/">http://code.google.com/p/oauth/</a>
+</body>

Added: trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/request_token.php
===================================================================
--- trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/request_token.php	                        (rev 0)
+++ trunk/src/plugins/oauthprovider/3rd-party/oauth-php/example/request_token.php	2011-03-29 06:51:45 UTC (rev 12941)
@@ -0,0 +1,14 @@
+<?php
+require_once("common.inc.php");
+
+try {
+  $req = OAuthRequest::from_request();
+  $token = $test_server->fetch_request_token($req);
+  print $token;
+} catch (OAuthException $e) {
+  print($e->getMessage() . "\n<hr />\n");
+  print_r($req);
+  die();
+}
+
+?>




More information about the Fusionforge-commits mailing list