245 lines
8.1 KiB
PHP
245 lines
8.1 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Dropbox OAuth
|
||
|
*
|
||
|
* @package Dropbox
|
||
|
* @copyright Copyright (C) 2010 Rooftop Solutions. All rights reserved.
|
||
|
* @author Michael Johansen <michael@taskcamp.com>
|
||
|
* @license http://code.google.com/p/dropbox-php/wiki/License MIT
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* This class is used to sign all requests to dropbox
|
||
|
*
|
||
|
* This classes use the Zend_Oauth package.
|
||
|
*/
|
||
|
class Dropbox_OAuth_Zend extends Dropbox_OAuth {
|
||
|
|
||
|
/**
|
||
|
* OAuth object
|
||
|
*
|
||
|
* @var Zend_Oauth_Consumer
|
||
|
*/
|
||
|
protected $oAuth;
|
||
|
/**
|
||
|
* OAuth consumer key
|
||
|
*
|
||
|
* We need to keep this around for later.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $consumerKey;
|
||
|
/**
|
||
|
*
|
||
|
* @var Zend_Oauth_Token
|
||
|
*/
|
||
|
protected $zend_oauth_token;
|
||
|
|
||
|
/**
|
||
|
* Constructor
|
||
|
*
|
||
|
* @param string $consumerKey
|
||
|
* @param string $consumerSecret
|
||
|
*/
|
||
|
public function __construct($consumerKey, $consumerSecret) {
|
||
|
if (!class_exists('Zend_Oauth_Consumer')) {
|
||
|
// We're going to try to load in manually
|
||
|
include 'Zend/Oauth/Consumer.php';
|
||
|
}
|
||
|
if (!class_exists('Zend_Oauth_Consumer'))
|
||
|
throw new Dropbox_Exception('The Zend_Oauth_Consumer class could not be found!');
|
||
|
$this->OAuth = new Zend_Oauth_Consumer(array(
|
||
|
"consumerKey" => $consumerKey,
|
||
|
"consumerSecret" => $consumerSecret,
|
||
|
"requestTokenUrl" => self::URI_REQUEST_TOKEN,
|
||
|
"accessTokenUrl" => self::URI_ACCESS_TOKEN,
|
||
|
"authorizeUrl" => self::URI_AUTHORIZE,
|
||
|
"signatureMethod" => "HMAC-SHA1",
|
||
|
));
|
||
|
$this->consumerKey = $consumerKey;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the request token and secret.
|
||
|
*
|
||
|
* The tokens can also be passed as an array into the first argument.
|
||
|
* The array must have the elements token and token_secret.
|
||
|
*
|
||
|
* @param string|array $token
|
||
|
* @param string $token_secret
|
||
|
* @return void
|
||
|
*/
|
||
|
public function setToken($token, $token_secret = null) {
|
||
|
if (is_a($token, "Zend_Oauth_Token")) {
|
||
|
if (is_a($token, "Zend_Oauth_Token_Access")) {
|
||
|
$this->OAuth->setToken($token);
|
||
|
}
|
||
|
$this->zend_oauth_token = $token;
|
||
|
return parent::setToken($token->getToken(), $token->getTokenSecret());
|
||
|
} elseif (is_string($token) && is_null($token_secret)) {
|
||
|
return $this->setToken(unserialize($token));
|
||
|
} elseif (isset($token['zend_oauth_token'])) {
|
||
|
return $this->setToken(unserialize($token['zend_oauth_token']));
|
||
|
} else {
|
||
|
parent::setToken($token, $token_secret);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Fetches a secured oauth url and returns the response body.
|
||
|
*
|
||
|
* @param string $uri
|
||
|
* @param mixed $arguments
|
||
|
* @param string $method
|
||
|
* @param array $httpHeaders
|
||
|
* @return string
|
||
|
*/
|
||
|
public function fetch($uri, $arguments = array(), $method = 'GET', $httpHeaders = array()) {
|
||
|
$token = $this->OAuth->getToken();
|
||
|
if (!is_a($token, "Zend_Oauth_Token")) {
|
||
|
if (is_a($this->zend_oauth_token, "Zend_Oauth_Token_Access")) {
|
||
|
$token = $this->zend_oauth_token;
|
||
|
} else {
|
||
|
$token = new Zend_Oauth_Token_Access();
|
||
|
$token->setToken($this->oauth_token);
|
||
|
$token->setTokenSecret($this->oauth_token_secret);
|
||
|
}
|
||
|
}
|
||
|
/* @var $token Zend_Oauth_Token_Access */
|
||
|
$oauthOptions = array(
|
||
|
'consumerKey' => $this->consumerKey,
|
||
|
'signatureMethod' => "HMAC-SHA1",
|
||
|
'consumerSecret' => $this->OAuth->getConsumerSecret(),
|
||
|
);
|
||
|
$config = array("timeout" => 15);
|
||
|
|
||
|
/* @var $consumerRequest Zend_Oauth_Client */
|
||
|
$consumerRequest = $token->getHttpClient($oauthOptions);
|
||
|
$consumerRequest->setMethod($method);
|
||
|
if (is_array($arguments)) {
|
||
|
$consumerRequest->setUri($uri);
|
||
|
if ($method == "GET") {
|
||
|
foreach ($arguments as $param => $value) {
|
||
|
$consumerRequest->setParameterGet($param, $value);
|
||
|
}
|
||
|
} else {
|
||
|
foreach ($arguments as $param => $value) {
|
||
|
$consumerRequest->setParameterPost($param, $value);
|
||
|
}
|
||
|
}
|
||
|
} elseif (is_string($arguments)) {
|
||
|
preg_match("/\?file=(.*)$/i", $uri, $matches);
|
||
|
if (isset($matches[1])) {
|
||
|
$uri = str_replace($matches[0], "", $uri);
|
||
|
$filename = $matches[1];
|
||
|
$uri = Zend_Uri::factory($uri);
|
||
|
$uri->addReplaceQueryParameters(array("file" => $filename));
|
||
|
$consumerRequest->setParameterGet("file", $filename);
|
||
|
}
|
||
|
$consumerRequest->setUri($uri);
|
||
|
$consumerRequest->setRawData($arguments);
|
||
|
} elseif (is_resource($arguments)) {
|
||
|
$consumerRequest->setUri($uri);
|
||
|
/** Placeholder for Oauth streaming support. */
|
||
|
}
|
||
|
if (count($httpHeaders)) {
|
||
|
foreach ($httpHeaders as $k => $v) {
|
||
|
$consumerRequest->setHeaders($k, $v);
|
||
|
}
|
||
|
}
|
||
|
$response = $consumerRequest->request();
|
||
|
$body = Zend_Json::decode($response->getBody());
|
||
|
switch ($response->getStatus()) {
|
||
|
// Not modified
|
||
|
case 304 :
|
||
|
return array(
|
||
|
'httpStatus' => 304,
|
||
|
'body' => null,
|
||
|
);
|
||
|
break;
|
||
|
case 403 :
|
||
|
throw new Dropbox_Exception_Forbidden('Forbidden.
|
||
|
This could mean a bad OAuth request, or a file or folder already existing at the target location.
|
||
|
' . $body["error"] . "\n");
|
||
|
case 404 :
|
||
|
throw new Dropbox_Exception_NotFound('Resource at uri: ' . $uri . ' could not be found. ' .
|
||
|
$body["error"] . "\n");
|
||
|
case 507 :
|
||
|
throw new Dropbox_Exception_OverQuota('This dropbox is full. ' .
|
||
|
$body["error"] . "\n");
|
||
|
}
|
||
|
|
||
|
return array(
|
||
|
'httpStatus' => $response->getStatus(),
|
||
|
'body' => $response->getBody(),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Requests the OAuth request token.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function getRequestToken() {
|
||
|
$token = $this->OAuth->getRequestToken();
|
||
|
$this->setToken($token);
|
||
|
return $this->getToken();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Requests the OAuth access tokens.
|
||
|
*
|
||
|
* This method requires the 'unauthorized' request tokens
|
||
|
* and, if successful will set the authorized request tokens.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function getAccessToken() {
|
||
|
if (is_a($this->zend_oauth_token, "Zend_Oauth_Token_Request")) {
|
||
|
$requestToken = $this->zend_oauth_token;
|
||
|
} else {
|
||
|
$requestToken = new Zend_Oauth_Token_Request();
|
||
|
$requestToken->setToken($this->oauth_token);
|
||
|
$requestToken->setTokenSecret($this->oauth_token_secret);
|
||
|
}
|
||
|
$token = $this->OAuth->getAccessToken($_GET, $requestToken);
|
||
|
$this->setToken($token);
|
||
|
return $this->getToken();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the oauth request tokens as an associative array.
|
||
|
*
|
||
|
* The array will contain the elements 'token' and 'token_secret' and the serialized
|
||
|
* Zend_Oauth_Token object.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function getToken() {
|
||
|
//$token = $this->OAuth->getToken();
|
||
|
//return serialize($token);
|
||
|
return array(
|
||
|
'token' => $this->oauth_token,
|
||
|
'token_secret' => $this->oauth_token_secret,
|
||
|
'zend_oauth_token' => serialize($this->zend_oauth_token),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the authorization url
|
||
|
*
|
||
|
* Overloading Dropbox_OAuth to use the built in functions in Zend_Oauth
|
||
|
*
|
||
|
* @param string $callBack Specify a callback url to automatically redirect the user back
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getAuthorizeUrl($callBack = null) {
|
||
|
if ($callBack)
|
||
|
$this->OAuth->setCallbackUrl($callBack);
|
||
|
return $this->OAuth->getRedirectUrl();
|
||
|
}
|
||
|
|
||
|
}
|