blob: 1f791067f69d4125a6511281bc40321781b9352a [file]
<?php
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
require_once 'external/OAuth/OAuth.php';
class ShindigOAuthProblemException extends Exception {}
class ShindigOAuthProtocolException extends Exception {}
class ShindigOAuthNoDataException extends Exception {}
class ShindigRsaSha1SignatureMethod extends OAuthSignatureMethod_RSA_SHA1 {
private $privateKey;
private $publicKey;
public function __construct($privateKey, $publicKey) {
$this->privateKey = $privateKey;
$this->publicKey = $publicKey;
}
protected function fetch_public_cert(&$request) {
return $this->publicKey;
}
protected function fetch_private_cert(&$request) {
return $this->privateKey;
}
}
class ShindigOAuth {
public static $VERSION_1_0 = "1.0";
public static $ENCODING = "UTF-8";
public static $FORM_ENCODED = "application/x-www-form-urlencoded";
public static $OAUTH_CONSUMER_KEY = "oauth_consumer_key";
public static $OAUTH_TOKEN = "oauth_token";
public static $OAUTH_TOKEN_SECRET = "oauth_token_secret";
public static $OAUTH_SIGNATURE_METHOD = "oauth_signature_method";
public static $OAUTH_SIGNATURE = "oauth_signature";
public static $OAUTH_TIMESTAMP = "oauth_timestamp";
public static $OAUTH_NONCE = "oauth_nonce";
public static $OAUTH_VERIFIER = "oauth_verifier";
public static $OAUTH_VERSION = "oauth_version";
public static $HMAC_SHA1 = "HMAC_SHA1";
public static $RSA_SHA1 = "RSA_SHA1";
public static $BEGIN_PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----";
public static $END_PRIVATE_KEY = "-----END PRIVATE KEY-----";
public static $OAUTH_PROBLEM = "oauth_problem";
}
class ShindigOAuthRequest extends OAuthRequest {
/**
* Needed so that OAuthFetcher works with the correct type of requests.
*/
public function __construct(OAuthRequest $request) {
$this->parameters = $request->parameters;
$this->http_url = $request->http_url;
$this->http_method = $request->http_method;
}
/**
* Needed so that OAuthFetcher works with the correct type of requests.
* @return ShindigOAuthRequest
*/
public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {
return new ShindigOAuthRequest(OAuthRequest::from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters));
}
/**
* Needed so that OAuthFetcher works with the correct type of requests.
* @return ShindigOAuthRequest
*/
public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {
return new ShindigOAuthRequest(OAuthRequest::from_request($http_method, $http_url, $parameters));
}
/**
* Needed in OAuthFetcher.php
*/
public function set_parameters($params) {
return $this->parameters = $params;
}
/**
* Needed in OAuthFetcher.php
*/
public function requireParameters($names) {
$present = $this->parameters;
$absent = array();
foreach ($names as $required) {
if (! in_array($required, $present)) {
$absent[] = $required;
}
}
if (count($absent) == 0) {
throw new ShindigOAuthProblemException("oauth_parameters_absent: " . ShindigOAuthUtil::urlencodeRFC3986($absent));
}
}
/**
* Needed in OAuthFetcher.php
*/
public function get_url() {
return $this->http_url;
}
/**
* Needed in SigningFetcher.php
*/
public static function generate_nonce() {
$mt = microtime();
$rand = mt_rand();
return md5($mt . $rand); // md5s look nicer than numbers
}
/**
* Needed for from_consumer_and_token
*/
private static function generate_timestamp() {
return time();
}
}
class ShindigOAuthUtil extends OAuthUtil {
public static $AUTH_SCHEME = "OAuth";
private static $AUTHORIZATION = "\ *[a-zA-Z0-9*]\ +(.*)";
private static $NVP = "(\\S*)\\s*\\=\\s*\"([^\"]*)\"";
/**
* Needed in OAuthFetcher.php
*/
public static function getPostBodyString(Array $params) {
$result = '';
$first = true;
foreach ($params as $key => $val) {
if ($first) {
$first = false;
} else {
$result .= '&';
}
$result .= ShindigOAuthUtil::urlencode_rfc3986($key) . "=" . ShindigOAuthUtil::urlencode_rfc3986($val);
}
return $result;
}
/**
* Needed in OAuthFetcher.php
* Return true if the given Content-Type header means FORM_ENCODED.
*/
public static function isFormEncoded($contentType) {
if (! isset($contentType)) {
return false;
}
$semi = strpos($contentType, ";");
if ($semi != false) {
$contentType = substr($contentType, 0, $semi);
}
return strtolower(ShindigOAuth::$FORM_ENCODED) == strtolower(trim($contentType));
}
/**
* Needed in OAuthFetcher.php
*/
public static function addParameters($url, $oauthParams) {
$url .= strchr($url, '?') === false ? '?' : '&';
foreach ($oauthParams as $key => $value) {
$url .= ShindigOAuthUtil::urlencode_rfc3986($key)."=".ShindigOAuthUtil::urlencode_rfc3986($value)."&";
}
return $url;
}
/**
* Needed in OAuthFetcher.php
*/
public static function decodeForm($form) {
$parameters = array();
$explodedForm = explode("&", $form);
foreach ($explodedForm as $params) {
$value = explode("=", $params);
if (! empty($value[0]) && ! empty($value[1])) {
$parameters[ShindigOAuthUtil::urldecode_rfc3986($value[0])] = ShindigOAuthUtil::urldecode_rfc3986($value[1]);
}
}
return $parameters;
}
/**
* Needed in OAuthFetcher.php
*
* Parse the parameters from an OAuth Authorization or WWW-Authenticate
* header. The realm is included as a parameter. If the given header doesn't
* start with "OAuth ", return an empty list.
*/
public static function decodeAuthorization($authorization) {
$into = array();
if ($authorization != null) {
$m = ereg(ShindigOAuthUtil::$AUTHORIZATION, $authorization);
if ($m !== false) {
if (strpos($authorization, ShindigOAuthUtil::$AUTH_SCHEME) == 0) {
$authorization = str_replace("OAuth ", "", $authorization);
$authParams = explode(", ", $authorization);
foreach ($authParams as $params) {
$m = ereg(ShindigOAuthUtil::$NVP, $params);
if ($m == 1) {
$keyValue = explode("=", $params);
$name = ShindigOAuthUtil::urlencode_rfc3986($keyValue[0]);
$value = ShindigOAuthUtil::urlencode_rfc3986(str_replace("\"", "", $keyValue[1]));
$into[$name] = $value;
}
}
}
}
}
return $into;
}
}