| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Laconica, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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 | 
					
						
							|  |  |  |  * @package   Laconica | 
					
						
							|  |  |  |  * @author    Zach Copley <zach@controlyourself.ca> | 
					
						
							|  |  |  |  * @copyright 2008 Control Yourself, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://laconi.ca/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('LACONICA')) { | 
					
						
							|  |  |  |     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 | 
					
						
							|  |  |  |  * @package  Laconica | 
					
						
							|  |  |  |  * @author   Zach Copley <zach@controlyourself.ca> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://laconi.ca/ | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class OAuthClientCurlException extends Exception | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  |  * @package  Laconica | 
					
						
							|  |  |  |  * @author   Zach Copley <zach@controlyourself.ca> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://laconi.ca/ | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											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-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
										 |  |  |     /** | 
					
						
							|  |  |  |      * 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
										 |  |  |     /** | 
					
						
							|  |  |  |      * Make a HTTP request using cURL. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @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) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $options = array( | 
					
						
							|  |  |  |             CURLOPT_RETURNTRANSFER => true, | 
					
						
							|  |  |  |             CURLOPT_FAILONERROR    => true, | 
					
						
							|  |  |  |             CURLOPT_HEADER         => false, | 
					
						
							|  |  |  |             CURLOPT_FOLLOWLOCATION => true, | 
					
						
							|  |  |  |             CURLOPT_USERAGENT      => 'Laconica', | 
					
						
							|  |  |  |             CURLOPT_CONNECTTIMEOUT => 120, | 
					
						
							|  |  |  |             CURLOPT_TIMEOUT        => 120, | 
					
						
							|  |  |  |             CURLOPT_HTTPAUTH       => CURLAUTH_ANY, | 
					
						
							|  |  |  |             CURLOPT_SSL_VERIFYPEER => false, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Twitter is strict about accepting invalid "Expect" headers
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             CURLOPT_HTTPHEADER => array('Expect:') | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($params)) { | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |             $options[CURLOPT_POST]       = true; | 
					
						
							| 
									
										
										
										
											2009-08-04 00:46:18 +00:00
										 |  |  |             $options[CURLOPT_POSTFIELDS] = $params; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $ch = curl_init($url); | 
					
						
							|  |  |  |         curl_setopt_array($ch, $options); | 
					
						
							|  |  |  |         $response = curl_exec($ch); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($response === false) { | 
					
						
							|  |  |  |             $msg  = curl_error($ch); | 
					
						
							|  |  |  |             $code = curl_errno($ch); | 
					
						
							|  |  |  |             throw new OAuthClientCurlException($msg, $code); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         curl_close($ch); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $response; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |