| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Base class for doing OAuth calls as a consumer | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Action | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package   StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author    Zach Copley <zach@status.net> | 
					
						
							| 
									
										
										
										
											2009-08-28 07:02:27 +00:00
										 |  |  |  * @copyright 2009 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link      http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 10:41:36 -04:00
										 |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  | require_once 'OAuth.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Exception wrapper for cURL errors | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Integration | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package  StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author   Zach Copley <zach@status.net> | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link     http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  | class OAuthClientException extends Exception | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Base class for doing OAuth calls as a consumer | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Integration | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package  StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author   Zach Copley <zach@status.net> | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link     http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  | class OAuthClient | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     var $consumer; | 
					
						
							|  |  |  |     var $token; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Constructor | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Can be initialized with just consumer key and secret for requesting new | 
					
						
							|  |  |  |      * tokens or with additional request token or access token | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $consumer_key       consumer key | 
					
						
							|  |  |  |      * @param string $consumer_secret    consumer secret | 
					
						
							|  |  |  |      * @param string $oauth_token        user's token | 
					
						
							|  |  |  |      * @param string $oauth_token_secret user's secret | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return nothing | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |     function __construct($consumer_key, $consumer_secret, | 
					
						
							|  |  |  |                          $oauth_token = null, $oauth_token_secret = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1(); | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |         $this->consumer    = new OAuthConsumer($consumer_key, $consumer_secret); | 
					
						
							|  |  |  |         $this->token       = null; | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (isset($oauth_token) && isset($oauth_token_secret)) { | 
					
						
							|  |  |  |             $this->token = new OAuthToken($oauth_token, $oauth_token_secret); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Gets a request token from the given url | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $url OAuth endpoint for grabbing request tokens | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return OAuthToken $token the request token | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function getRequestToken($url) | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |         $response = $this->oAuthGet($url); | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $arr = array(); | 
					
						
							|  |  |  |         parse_str($response, $arr); | 
					
						
							|  |  |  |         if (isset($arr['oauth_token']) && isset($arr['oauth_token_secret'])) { | 
					
						
							|  |  |  |             $token = new OAuthToken($arr['oauth_token'], @$arr['oauth_token_secret']); | 
					
						
							|  |  |  |             return $token; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             throw new OAuthClientException(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Builds a link that can be redirected to in order to | 
					
						
							|  |  |  |      * authorize a request token. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string     $url            endpoint for authorizing request tokens | 
					
						
							|  |  |  |      * @param OAuthToken $request_token  the request token to be authorized | 
					
						
							|  |  |  |      * @param string     $oauth_callback optional callback url | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string $authorize_url the url to redirect to | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function getAuthorizeLink($url, $request_token, $oauth_callback = null) | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |         $authorize_url = $url . '?oauth_token=' . | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |             $request_token->key; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($oauth_callback)) { | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |             $authorize_url .= '&oauth_callback=' . urlencode($oauth_callback); | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |         return $authorize_url; | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Fetches an access token | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $url OAuth endpoint for exchanging authorized request tokens | 
					
						
							|  |  |  |      *                     for access tokens | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return OAuthToken $token the access token | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function getAccessToken($url) | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |         $response = $this->oAuthPost($url); | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |         parse_str($response); | 
					
						
							|  |  |  |         $token = new OAuthToken($oauth_token, $oauth_token_secret); | 
					
						
							|  |  |  |         return $token; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Use HTTP GET to make a signed OAuth request | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $url OAuth endpoint | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return mixed the request | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |     function oAuthGet($url) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $request = OAuthRequest::from_consumer_and_token($this->consumer, | 
					
						
							|  |  |  |             $this->token, 'GET', $url, null); | 
					
						
							|  |  |  |         $request->sign_request($this->sha1_method, | 
					
						
							|  |  |  |             $this->consumer, $this->token); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $this->httpRequest($request->to_url()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Use HTTP POST to make a signed OAuth request | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $url    OAuth endpoint | 
					
						
							|  |  |  |      * @param array  $params additional post parameters | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return mixed the request | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |     function oAuthPost($url, $params = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $request = OAuthRequest::from_consumer_and_token($this->consumer, | 
					
						
							|  |  |  |             $this->token, 'POST', $url, $params); | 
					
						
							|  |  |  |         $request->sign_request($this->sha1_method, | 
					
						
							|  |  |  |             $this->consumer, $this->token); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $this->httpRequest($request->get_normalized_http_url(), | 
					
						
							|  |  |  |             $request->to_postdata()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Make a HTTP request. | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param string $url    Where to make the | 
					
						
							|  |  |  |      * @param array  $params post parameters | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return mixed the request | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |     function httpRequest($url, $params = null) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $request = new HTTPClient($url); | 
					
						
							|  |  |  |         $request->setConfig(array( | 
					
						
							|  |  |  |             'connect_timeout' => 120, | 
					
						
							|  |  |  |             'timeout' => 120, | 
					
						
							|  |  |  |             'follow_redirects' => true, | 
					
						
							|  |  |  |             'ssl_verify_peer' => false, | 
					
						
							|  |  |  |         )); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Twitter is strict about accepting invalid "Expect" headers
 | 
					
						
							|  |  |  |         $request->setHeader('Expect', ''); | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (isset($params)) { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |             $request->setMethod(HTTP_Request2::METHOD_POST); | 
					
						
							|  |  |  |             $request->setBody($params); | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         try { | 
					
						
							|  |  |  |             $response = $request->send(); | 
					
						
							|  |  |  |             $code = $response->getStatus(); | 
					
						
							|  |  |  |             if ($code < 200 || $code >= 400) { | 
					
						
							|  |  |  |                 throw new OAuthClientException($response->getBody(), $code); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return $response->getBody(); | 
					
						
							|  |  |  |         } catch (Exception $e) { | 
					
						
							|  |  |  |             throw new OAuthClientException($e->getMessage(), $e->getCode()); | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |