/src/Adapter/AbstractAdapter.php
PHP | 372 lines | 173 code | 57 blank | 142 comment | 10 complexity | bb5b28cc28add2ae3e76c72a4f1ea5a3 MD5 | raw file
- <?php
- /*!
- * Hybridauth
- * https://hybridauth.github.io | https://github.com/hybridauth/hybridauth
- * (c) 2017 Hybridauth authors | https://hybridauth.github.io/license.html
- */
- namespace Hybridauth\Adapter;
- use Hybridauth\Exception\NotImplementedException;
- use Hybridauth\Exception\InvalidArgumentException;
- use Hybridauth\Exception\HttpClientFailureException;
- use Hybridauth\Exception\HttpRequestFailedException;
- use Hybridauth\Storage\StorageInterface;
- use Hybridauth\Storage\Session;
- use Hybridauth\Logger\LoggerInterface;
- use Hybridauth\Logger\Logger;
- use Hybridauth\HttpClient\HttpClientInterface;
- use Hybridauth\HttpClient\Curl as HttpClient;
- use Hybridauth\Data;
- /**
- * Class AbstractAdapter
- */
- abstract class AbstractAdapter implements AdapterInterface
- {
- use DataStoreTrait;
- /**
- * Provider ID (unique name).
- *
- * @var string
- */
- protected $providerId = '';
- /**
- * Specific Provider config.
- *
- * @var mixed
- */
- protected $config = [];
- /**
- * Extra Provider parameters.
- *
- * @var array
- */
- protected $params;
- /**
- * Callback url
- *
- * @var string
- */
- protected $callback = '';
- /**
- * Storage.
- *
- * @var StorageInterface
- */
- public $storage;
- /**
- * HttpClient.
- *
- * @var HttpClientInterface
- */
- public $httpClient;
- /**
- * Logger.
- *
- * @var LoggerInterface
- */
- public $logger;
- /**
- * Whether to validate API status codes of http responses
- *
- * @var bool
- */
- protected $validateApiResponseHttpCode = true;
- /**
- * Common adapters constructor.
- *
- * @param array $config
- * @param HttpClientInterface $httpClient
- * @param StorageInterface $storage
- * @param LoggerInterface $logger
- */
- public function __construct(
- $config = [],
- HttpClientInterface $httpClient = null,
- StorageInterface $storage = null,
- LoggerInterface $logger = null
- ) {
- $this->providerId = (new \ReflectionClass($this))->getShortName();
- $this->config = new Data\Collection($config);
- $this->setHttpClient($httpClient);
- $this->setStorage($storage);
- $this->setLogger($logger);
- $this->configure();
- $this->logger->debug(sprintf('Initialize %s, config: ', get_class($this)), $config);
- $this->initialize();
- }
- /**
- * Load adapter's configuration
- */
- abstract protected function configure();
- /**
- * Adapter initializer
- */
- abstract protected function initialize();
- /**
- * {@inheritdoc}
- */
- abstract public function isConnected();
- /**
- * {@inheritdoc}
- */
- public function apiRequest($url, $method = 'GET', $parameters = [], $headers = [], $multipart = false)
- {
- throw new NotImplementedException('Provider does not support this feature.');
- }
- /**
- * {@inheritdoc}
- */
- public function maintainToken()
- {
- // Nothing needed for most providers
- }
- /**
- * {@inheritdoc}
- */
- public function getUserProfile()
- {
- throw new NotImplementedException('Provider does not support this feature.');
- }
- /**
- * {@inheritdoc}
- */
- public function getUserContacts()
- {
- throw new NotImplementedException('Provider does not support this feature.');
- }
- /**
- * {@inheritdoc}
- */
- public function getUserPages()
- {
- throw new NotImplementedException('Provider does not support this feature.');
- }
- /**
- * {@inheritdoc}
- */
- public function getUserActivity($stream)
- {
- throw new NotImplementedException('Provider does not support this feature.');
- }
- /**
- * {@inheritdoc}
- */
- public function setUserStatus($status)
- {
- throw new NotImplementedException('Provider does not support this feature.');
- }
- /**
- * {@inheritdoc}
- */
- public function setPageStatus($status, $pageId)
- {
- throw new NotImplementedException('Provider does not support this feature.');
- }
- /**
- * {@inheritdoc}
- */
- public function disconnect()
- {
- $this->clearStoredData();
- }
- /**
- * {@inheritdoc}
- */
- public function getAccessToken()
- {
- $tokenNames = [
- 'access_token',
- 'access_token_secret',
- 'token_type',
- 'refresh_token',
- 'expires_in',
- 'expires_at',
- ];
- $tokens = [];
- foreach ($tokenNames as $name) {
- if ($this->getStoredData($name)) {
- $tokens[$name] = $this->getStoredData($name);
- }
- }
- return $tokens;
- }
- /**
- * {@inheritdoc}
- */
- public function setAccessToken($tokens = [])
- {
- $this->clearStoredData();
- foreach ($tokens as $token => $value) {
- $this->storeData($token, $value);
- }
- // Re-initialize token parameters.
- $this->initialize();
- }
- /**
- * {@inheritdoc}
- */
- public function setHttpClient(HttpClientInterface $httpClient = null)
- {
- $this->httpClient = $httpClient ?: new HttpClient();
- if ($this->config->exists('curl_options') && method_exists($this->httpClient, 'setCurlOptions')) {
- $this->httpClient->setCurlOptions($this->config->get('curl_options'));
- }
- }
- /**
- * {@inheritdoc}
- */
- public function getHttpClient()
- {
- return $this->httpClient;
- }
- /**
- * {@inheritdoc}
- */
- public function setStorage(StorageInterface $storage = null)
- {
- $this->storage = $storage ?: new Session();
- }
- /**
- * {@inheritdoc}
- */
- public function getStorage()
- {
- return $this->storage;
- }
- /**
- * {@inheritdoc}
- */
- public function setLogger(LoggerInterface $logger = null)
- {
- $this->logger = $logger ?: new Logger(
- $this->config->get('debug_mode'),
- $this->config->get('debug_file')
- );
- if (method_exists($this->httpClient, 'setLogger')) {
- $this->httpClient->setLogger($this->logger);
- }
- }
- /**
- * {@inheritdoc}
- */
- public function getLogger()
- {
- return $this->logger;
- }
- /**
- * Set Adapter's API callback url
- *
- * @param string $callback
- *
- * @throws InvalidArgumentException
- */
- protected function setCallback($callback)
- {
- if (!filter_var($callback, FILTER_VALIDATE_URL)) {
- throw new InvalidArgumentException('A valid callback url is required.');
- }
- $this->callback = $callback;
- }
- /**
- * Overwrite Adapter's API endpoints
- *
- * @param array|Data\Collection $endpoints
- */
- protected function setApiEndpoints($endpoints = null)
- {
- if (empty($endpoints)) {
- return;
- }
- $collection = is_array($endpoints) ? new Data\Collection($endpoints) : $endpoints;
- $this->apiBaseUrl = $collection->get('api_base_url') ?: $this->apiBaseUrl;
- $this->authorizeUrl = $collection->get('authorize_url') ?: $this->authorizeUrl;
- $this->accessTokenUrl = $collection->get('access_token_url') ?: $this->accessTokenUrl;
- }
- /**
- * Validate signed API responses Http status code.
- *
- * Since the specifics of error responses is beyond the scope of RFC6749 and OAuth Core specifications,
- * Hybridauth will consider any HTTP status code that is different than '200 OK' as an ERROR.
- *
- * @param string $error String to pre append to message thrown in exception
- *
- * @throws HttpClientFailureException
- * @throws HttpRequestFailedException
- */
- protected function validateApiResponse($error = '')
- {
- $error .= !empty($error) ? '. ' : '';
- if ($this->httpClient->getResponseClientError()) {
- throw new HttpClientFailureException(
- $error . 'HTTP client error: ' . $this->httpClient->getResponseClientError() . '.'
- );
- }
- // if validateApiResponseHttpCode is set to false, we by pass verification of http status code
- if (!$this->validateApiResponseHttpCode) {
- return;
- }
- $status = $this->httpClient->getResponseHttpCode();
- if ($status < 200 || $status > 299) {
- throw new HttpRequestFailedException(
- $error . 'HTTP error ' . $this->httpClient->getResponseHttpCode() .
- '. Raw Provider API response: ' . $this->httpClient->getResponseBody() . '.'
- );
- }
- }
- }