mirror of
https://github.com/YunoHost-Apps/kanboard_ynh.git
synced 2024-09-03 19:36:17 +02:00
5e51bcd6e9
Kanboard 1.0.6
229 lines
6.7 KiB
PHP
229 lines
6.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* OAuth service factory.
|
|
*
|
|
* PHP version 5.4
|
|
*
|
|
* @category OAuth
|
|
* @author David Desberg <david@daviddesberg.com>
|
|
* @author Pieter Hordijk <info@pieterhordijk.com>
|
|
* @copyright Copyright (c) 2013 The authors
|
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
|
*/
|
|
|
|
namespace OAuth;
|
|
|
|
use OAuth\Common\Service\ServiceInterface;
|
|
use OAuth\Common\Consumer\CredentialsInterface;
|
|
use OAuth\Common\Storage\TokenStorageInterface;
|
|
use OAuth\Common\Http\Client\ClientInterface;
|
|
use OAuth\Common\Http\Client\StreamClient;
|
|
use OAuth\Common\Http\Uri\UriInterface;
|
|
use OAuth\Common\Exception\Exception;
|
|
use OAuth\OAuth1\Signature\Signature;
|
|
|
|
class ServiceFactory
|
|
{
|
|
/**
|
|
*@var ClientInterface
|
|
*/
|
|
protected $httpClient;
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $serviceClassMap = array(
|
|
'OAuth1' => array(),
|
|
'OAuth2' => array()
|
|
);
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $serviceBuilders = array(
|
|
'OAuth2' => 'buildV2Service',
|
|
'OAuth1' => 'buildV1Service',
|
|
);
|
|
|
|
/**
|
|
* @param ClientInterface $httpClient
|
|
*
|
|
* @return ServiceFactory
|
|
*/
|
|
public function setHttpClient(ClientInterface $httpClient)
|
|
{
|
|
$this->httpClient = $httpClient;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Register a custom service to classname mapping.
|
|
*
|
|
* @param string $serviceName Name of the service
|
|
* @param string $className Class to instantiate
|
|
*
|
|
* @return ServiceFactory
|
|
*
|
|
* @throws Exception If the class is nonexistent or does not implement a valid ServiceInterface
|
|
*/
|
|
public function registerService($serviceName, $className)
|
|
{
|
|
if (!class_exists($className)) {
|
|
throw new Exception(sprintf('Service class %s does not exist.', $className));
|
|
}
|
|
|
|
$reflClass = new \ReflectionClass($className);
|
|
|
|
foreach (array('OAuth2', 'OAuth1') as $version) {
|
|
if ($reflClass->implementsInterface('OAuth\\' . $version . '\\Service\\ServiceInterface')) {
|
|
$this->serviceClassMap[$version][ucfirst($serviceName)] = $className;
|
|
|
|
return $this;
|
|
}
|
|
}
|
|
|
|
throw new Exception(sprintf('Service class %s must implement ServiceInterface.', $className));
|
|
}
|
|
|
|
/**
|
|
* Builds and returns oauth services
|
|
*
|
|
* It will first try to build an OAuth2 service and if none found it will try to build an OAuth1 service
|
|
*
|
|
* @param string $serviceName Name of service to create
|
|
* @param CredentialsInterface $credentials
|
|
* @param TokenStorageInterface $storage
|
|
* @param array|null $scopes If creating an oauth2 service, array of scopes
|
|
* @param UriInterface|null $baseApiUri
|
|
*
|
|
* @return ServiceInterface
|
|
*/
|
|
public function createService(
|
|
$serviceName,
|
|
CredentialsInterface $credentials,
|
|
TokenStorageInterface $storage,
|
|
$scopes = array(),
|
|
UriInterface $baseApiUri = null
|
|
) {
|
|
if (!$this->httpClient) {
|
|
// for backwards compatibility.
|
|
$this->httpClient = new StreamClient();
|
|
}
|
|
|
|
foreach ($this->serviceBuilders as $version => $buildMethod) {
|
|
$fullyQualifiedServiceName = $this->getFullyQualifiedServiceName($serviceName, $version);
|
|
|
|
if (class_exists($fullyQualifiedServiceName)) {
|
|
return $this->$buildMethod($fullyQualifiedServiceName, $credentials, $storage, $scopes, $baseApiUri);
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Gets the fully qualified name of the service
|
|
*
|
|
* @param string $serviceName The name of the service of which to get the fully qualified name
|
|
* @param string $type The type of the service to get (either OAuth1 or OAuth2)
|
|
*
|
|
* @return string The fully qualified name of the service
|
|
*/
|
|
private function getFullyQualifiedServiceName($serviceName, $type)
|
|
{
|
|
$serviceName = ucfirst($serviceName);
|
|
|
|
if (isset($this->serviceClassMap[$type][$serviceName])) {
|
|
return $this->serviceClassMap[$type][$serviceName];
|
|
}
|
|
|
|
return '\\OAuth\\' . $type . '\\Service\\' . $serviceName;
|
|
}
|
|
|
|
/**
|
|
* Builds v2 services
|
|
*
|
|
* @param string $serviceName The fully qualified service name
|
|
* @param CredentialsInterface $credentials
|
|
* @param TokenStorageInterface $storage
|
|
* @param array|null $scopes Array of scopes for the service
|
|
* @param UriInterface|null $baseApiUri
|
|
*
|
|
* @return ServiceInterface
|
|
*
|
|
* @throws Exception
|
|
*/
|
|
private function buildV2Service(
|
|
$serviceName,
|
|
CredentialsInterface $credentials,
|
|
TokenStorageInterface $storage,
|
|
array $scopes,
|
|
UriInterface $baseApiUri = null
|
|
) {
|
|
return new $serviceName(
|
|
$credentials,
|
|
$this->httpClient,
|
|
$storage,
|
|
$this->resolveScopes($serviceName, $scopes),
|
|
$baseApiUri
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Resolves scopes for v2 services
|
|
*
|
|
* @param string $serviceName The fully qualified service name
|
|
* @param array $scopes List of scopes for the service
|
|
*
|
|
* @return array List of resolved scopes
|
|
*/
|
|
private function resolveScopes($serviceName, array $scopes)
|
|
{
|
|
$reflClass = new \ReflectionClass($serviceName);
|
|
$constants = $reflClass->getConstants();
|
|
|
|
$resolvedScopes = array();
|
|
foreach ($scopes as $scope) {
|
|
$key = strtoupper('SCOPE_' . $scope);
|
|
|
|
if (array_key_exists($key, $constants)) {
|
|
$resolvedScopes[] = $constants[$key];
|
|
} else {
|
|
$resolvedScopes[] = $scope;
|
|
}
|
|
}
|
|
|
|
return $resolvedScopes;
|
|
}
|
|
|
|
/**
|
|
* Builds v1 services
|
|
*
|
|
* @param string $serviceName The fully qualified service name
|
|
* @param CredentialsInterface $credentials
|
|
* @param TokenStorageInterface $storage
|
|
* @param array $scopes
|
|
* @param UriInterface $baseApiUri
|
|
*
|
|
* @return ServiceInterface
|
|
*
|
|
* @throws Exception
|
|
*/
|
|
private function buildV1Service(
|
|
$serviceName,
|
|
CredentialsInterface $credentials,
|
|
TokenStorageInterface $storage,
|
|
$scopes,
|
|
UriInterface $baseApiUri = null
|
|
) {
|
|
if (!empty($scopes)) {
|
|
throw new Exception(
|
|
'Scopes passed to ServiceFactory::createService but an OAuth1 service was requested.'
|
|
);
|
|
}
|
|
|
|
return new $serviceName($credentials, $this->httpClient, $storage, new Signature($credentials), $baseApiUri);
|
|
}
|
|
}
|