nextcloud/apps/files_external/3rdparty/Dropbox/OAuth/PEAR.php

188 lines
5.7 KiB
PHP
Raw Normal View History

<?php
/**
* Dropbox OAuth
*
* @package Dropbox
* @copyright Copyright (C) 2010 Rooftop Solutions. All rights reserved.
* @author Evert Pot (http://www.rooftopsolutions.nl/)
* @license http://code.google.com/p/dropbox-php/wiki/License MIT
*/
if (!class_exists('HTTP_OAuth_Consumer')) {
// We're going to try to load in manually
include 'HTTP/OAuth/Consumer.php';
}
if (!class_exists('HTTP_OAuth_Consumer'))
throw new Dropbox_Exception('The HTTP_OAuth_Consumer class could not be found! Did you install the pear HTTP_OAUTH class?');
/**
* This class is used to sign all requests to dropbox
*
* This classes use the PEAR HTTP_OAuth package. Make sure this is installed.
*/
class Dropbox_OAuth_PEAR extends Dropbox_OAuth {
/**
* OAuth object
*
* @var OAuth
*/
protected $oAuth;
/**
* OAuth consumer key
*
* We need to keep this around for later.
*
* @var string
*/
protected $consumerKey;
/**
* Constructor
*
* @param string $consumerKey
* @param string $consumerSecret
*/
public function __construct($consumerKey, $consumerSecret)
{
$this->OAuth = new Dropbox_OAuth_Consumer_Dropbox($consumerKey, $consumerSecret);
$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) {
parent::setToken($token,$token_secret);
$this->OAuth->setToken($this->oauth_token);
$this->OAuth->setTokenSecret($this->oauth_token_secret);
}
/**
* 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())
{
$httpRequest = new HTTP_Request2(null,
HTTP_Request2::METHOD_GET,
array(
'ssl_verify_peer' => false,
'ssl_verify_host' => false
)
);
$consumerRequest = new HTTP_OAuth_Consumer_Request();
$consumerRequest->accept($httpRequest);
$consumerRequest->setUrl($uri);
$consumerRequest->setMethod($method);
$consumerRequest->setSecrets($this->OAuth->getSecrets());
$parameters = array(
'oauth_consumer_key' => $this->consumerKey,
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $this->oauth_token,
);
if (is_array($arguments)) {
$parameters = array_merge($parameters,$arguments);
} elseif (is_string($arguments)) {
$consumerRequest->setBody($arguments);
}
$consumerRequest->setParameters($parameters);
if (count($httpHeaders)) {
foreach($httpHeaders as $k=>$v) {
$consumerRequest->setHeader($k, $v);
}
}
$response = $consumerRequest->send();
switch($response->getStatus()) {
// Not modified
case 304 :
return array(
'httpStatus' => 304,
'body' => null,
);
break;
case 400 :
throw new Dropbox_Exception_Forbidden('Forbidden. Bad input parameter. Error message should indicate which one and why.');
case 401 :
throw new Dropbox_Exception_Forbidden('Forbidden. Bad or expired token. This can happen if the user or Dropbox revoked or expired an access token. To fix, you should re-authenticate the user.');
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.');
case 404 :
throw new Dropbox_Exception_NotFound('Resource at uri: ' . $uri . ' could not be found');
case 405 :
throw new Dropbox_Exception_Forbidden('Forbidden. Request method not expected (generally should be GET or POST).');
case 500 :
throw new Dropbox_Exception_Forbidden('Server error. ' . $e->getMessage());
case 503 :
throw new Dropbox_Exception_Forbidden('Forbidden. Your app is making too many requests and is being rate limited. 503s can trigger on a per-app or per-user basis.');
case 507 :
throw new Dropbox_Exception_OverQuota('This dropbox is full');
}
return array(
'httpStatus' => $response->getStatus(),
'body' => $response->getBody()
);
}
/**
* Requests the OAuth request token.
*
* @return void
*/
public function getRequestToken() {
$this->OAuth->getRequestToken(self::URI_REQUEST_TOKEN);
$this->setToken($this->OAuth->getToken(), $this->OAuth->getTokenSecret());
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() {
$this->OAuth->getAccessToken(self::URI_ACCESS_TOKEN);
$this->setToken($this->OAuth->getToken(), $this->OAuth->getTokenSecret());
return $this->getToken();
}
}