1<?php
2
3namespace OAuth\OAuth1\Service;
4
5use OAuth\OAuth1\Signature\SignatureInterface;
6use OAuth\OAuth1\Token\StdOAuth1Token;
7use OAuth\Common\Http\Exception\TokenResponseException;
8use OAuth\Common\Http\Uri\Uri;
9use OAuth\Common\Consumer\CredentialsInterface;
10use OAuth\Common\Http\Uri\UriInterface;
11use OAuth\Common\Storage\TokenStorageInterface;
12use OAuth\Common\Http\Client\ClientInterface;
13
14class Xing extends AbstractService
15{
16    public function __construct(
17        CredentialsInterface $credentials,
18        ClientInterface $httpClient,
19        TokenStorageInterface $storage,
20        SignatureInterface $signature,
21        UriInterface $baseApiUri = null
22    ) {
23        parent::__construct($credentials, $httpClient, $storage, $signature, $baseApiUri);
24
25        if (null === $baseApiUri) {
26            $this->baseApiUri = new Uri('https://api.xing.com/v1/');
27        }
28    }
29
30    /**
31     * {@inheritdoc}
32     */
33    public function getAuthorizationEndpoint()
34    {
35        return new Uri('https://api.xing.com/v1/authorize');
36    }
37
38    /**
39     * {@inheritdoc}
40     */
41    public function getAccessTokenEndpoint()
42    {
43        return new Uri('https://api.xing.com/v1/access_token');
44    }
45
46    /**
47     * {@inheritdoc}
48     */
49    public function getRequestTokenEndpoint()
50    {
51        return new Uri('https://api.xing.com/v1/request_token');
52    }
53
54    /**
55     * {@inheritdoc}
56     */
57    protected function parseRequestTokenResponse($responseBody)
58    {
59        parse_str($responseBody, $data);
60
61        if (null === $data || !is_array($data)) {
62            throw new TokenResponseException('Unable to parse response.');
63        } elseif (!isset($data['oauth_callback_confirmed']) || $data['oauth_callback_confirmed'] !== 'true') {
64            throw new TokenResponseException('Error in retrieving token.');
65        }
66
67        return $this->parseAccessTokenResponse($responseBody);
68    }
69
70    /**
71     * {@inheritdoc}
72     */
73    protected function parseAccessTokenResponse($responseBody)
74    {
75        parse_str($responseBody, $data);
76        $errors = json_decode($responseBody);
77
78        if (null === $data || !is_array($data)) {
79            throw new TokenResponseException('Unable to parse response.');
80        } elseif ($errors) {
81            throw new TokenResponseException('Error in retrieving token: "' . $errors->error_name . '"');
82        }
83
84        $token = new StdOAuth1Token();
85
86        $token->setRequestToken($data['oauth_token']);
87        $token->setRequestTokenSecret($data['oauth_token_secret']);
88        $token->setAccessToken($data['oauth_token']);
89        $token->setAccessTokenSecret($data['oauth_token_secret']);
90
91        $token->setEndOfLife(StdOAuth1Token::EOL_NEVER_EXPIRES);
92        unset($data['oauth_token'], $data['oauth_token_secret']);
93        $token->setExtraParams($data);
94
95        return $token;
96    }
97}
98