You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

198 lines
6.6 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
class OAuthLib extends TikiDb_Bridge
{
public function is_authorized($provider_key)
{
return ! is_null($this->retrieve_token($provider_key));
}
public function do_request($provider_key, $arguments)
{
$configuration = $this->get_configuration($provider_key);
if (! $configuration) {
return false;
}
$access = $this->retrieve_token($provider_key);
if (is_object($access)) {
$client = $access->getHttpClient($configuration);
if (isset($configuration['secretAsGet'])) {
$client->getRequest()->getQuery()->set($configuration['secretAsGet'], $access->getTokenSecret());
}
} else {
$client = TikiLib::lib('tiki')->get_http_client();
}
$client->setUri($arguments['url']);
if (isset($configuration['oauth2Token'])) {
$client->getRequest()->getQuery()->set('access_token', $configuration['oauth2Token']);
}
if (isset($arguments['post'])) {
$client->setMethod(Laminas\Http\Request::METHOD_POST);
foreach ($arguments['post'] as $key => $value) {
$client->getRequest()->getPost()->set($key, $value);
}
}
if (isset($arguments['patch'])) {
$client->setMethod(Laminas\Http\Request::METHOD_PATCH);
foreach ($arguments['patch'] as $key => $value) {
$client->getRequest()->getPost()->set($key, $value);
}
}
if (isset($arguments['get'])) {
foreach ($arguments['get'] as $key => $value) {
$client->getRequest()->getQuery()->set($key, $value);
}
}
if (isset($arguments['delete'])) {
$client->setMethod(Laminas\Http\Request::METHOD_DELETE);
}
try {
$response = $client->send();
return $response;
} catch (Laminas\Http\Exception\ExceptionInterface $e) {
return null;
}
}
public function request_token($provider_key)
{
try {
$consumer = $this->get_consumer($provider_key);
if ($consumer) {
$_SESSION['OAUTH_REQUEST_' . $provider_key] = serialize($consumer->getRequestToken());
$consumer->redirect();
}
} catch (Laminas\Oauth\Exception\ExceptionInterface $e) {
$oauth_ex = $e->getPrevious();
$prevErr = '';
if ($oauth_ex != null) {
$prevErr = $oauth_ex->getMessage();
}
die($e->getMessage() . '. Origin: ' . $prevErr);
}
}
public function request_access($provider_key)
{
$consumer = $this->get_consumer($provider_key);
$key = 'OAUTH_REQUEST_' . $provider_key;
if ($consumer && isset($_SESSION[$key])) {
try {
$accessToken = $consumer->getAccessToken($_GET, unserialize($_SESSION[$key]));
$this->store_token($provider_key, $accessToken);
unset($_SESSION[$key]);
} catch (Laminas\OAuth\Exception\ExceptionInterface $e) {
$oauth_ex = $e->getPrevious();
$prevErr = '';
if ($oauth_ex != null) {
$prevErr = $oauth_ex->getMessage();
}
die($e->getMessage() . '. Origin: ' . $prevErr);
}
}
}
private function store_token($provider_key, $accessToken)
{
$tikilib = TikiLib::lib('tiki');
$tikilib->set_preference('oauth_token_' . $provider_key, serialize($accessToken));
}
private function retrieve_token($provider_key)
{
$config = $this->get_configuration($provider_key);
if (! empty($config['oauth2Token'])) {
return $config['oauth2Token'];
}
if (! empty($config['accessToken']) && ! empty($config['accessTokenSecret'])) {
$token = new Laminas\OAuth\Token\Access();
$token->setParams(
[
'oauth_token' => $config['accessToken'],
'oauth_token_secret' => $config['accessTokenSecret'],
]
);
return $token;
}
$tikilib = TikiLib::lib('tiki');
$token = $tikilib->get_preference('oauth_token_' . $provider_key);
return $token ? unserialize($token) : null;
}
private function get_configuration($provider_key)
{
global $prefs;
$tikilib = TikiLib::lib('tiki');
$servicelib = TikiLib::lib('service');
$callback = $servicelib->getUrl(
[
'controller' => 'oauth',
'action' => 'callback',
'oauth_callback' => $provider_key,
]
);
switch ($provider_key) {
case 'vimeo':
return [
'callbackUrl' => $tikilib->tikiUrl($callback),
'siteUrl' => 'https://api.vimeo.com/oauth',
'requestTokenUrl' => 'https://api.vimeo.com/oauth/request_token',
'accessTokenUrl' => 'https://api.vimeo.com/oauth/access_token',
'authorizeUrl' => 'https://api.vimeo.com/oauth/authorize',
'consumerKey' => $prefs['vimeo_consumer_key'],
'consumerSecret' => $prefs['vimeo_consumer_secret'],
'oauth2Token' => $prefs['vimeo_access_token'],
];
case 'zotero':
return [
'callbackUrl' => $tikilib->tikiUrl($callback),
'siteUrl' => 'https://www.zotero.org/oauth',
'requestTokenUrl' => 'https://www.zotero.org/oauth/request',
'accessTokenUrl' => 'https://www.zotero.org/oauth/access',
'authorizeUrl' => 'https://www.zotero.org/oauth/authorize',
'consumerKey' => $prefs['zotero_client_key'],
'consumerSecret' => $prefs['zotero_client_secret'],
'secretAsGet' => 'key', // Tiki-specific
];
}
}
private function get_consumer($provider_key)
{
if ($configuration = $this->get_configuration($provider_key)) {
$consumer = new Laminas\OAuth\Consumer($configuration);
$httpClient = TikiLib::lib('tiki')->get_http_client();
$consumer->setHttpClient($httpClient);
return $consumer;
}
}
}