| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Class for doing OAuth authentication against Twitter | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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/>. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  |  * @category  TwitterauthorizationAction | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package   StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author    Zach Copely <zach@status.net> | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @copyright 2009 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +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-01 08:20:44 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 10:41:36 -04:00
										 |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 00:59:06 +00:00
										 |  |  | require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Class for doing OAuth authentication against Twitter | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2009-09-08 16:02:57 -07:00
										 |  |  |  * Peforms the OAuth "dance" between StatusNet and Twitter -- requests a token, | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |  * authorizes it, and exchanges it for an access token.  It also creates a link | 
					
						
							| 
									
										
										
										
											2009-09-08 16:02:57 -07:00
										 |  |  |  * (Foreign_link) between the StatusNet user and Twitter user and stores the | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |  * access token and secret in the link. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Twitter | 
					
						
							| 
									
										
										
										
											2009-09-08 16:02:57 -07:00
										 |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Zach Copley <zach@status.net> | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |  * @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-01 08:20:44 +00:00
										 |  |  | class TwitterauthorizationAction extends Action | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Initialize class members. Looks for 'oauth_token' parameter. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array $args misc. arguments | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean true | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  |     function prepare($args) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::prepare($args); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->oauth_token = $this->arg('oauth_token'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Handler method | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array $args is ignored since it's now passed in in prepare() | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return nothing | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  |     function handle($args) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::handle($args); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!common_logged_in()) { | 
					
						
							|  |  |  |             $this->clientError(_('Not logged in.'), 403); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         $user  = common_current_user(); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  |         $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // If there's already a foreign link record, it means we already
 | 
					
						
							|  |  |  |         // have an access token, and this is unecessary. So go back.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($flink)) { | 
					
						
							|  |  |  |             common_redirect(common_local_url('twittersettings')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // $this->oauth_token is only populated once Twitter authorizes our
 | 
					
						
							|  |  |  |         // request token. If it's empty we're at the beginning of the auth
 | 
					
						
							|  |  |  |         // process
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($this->oauth_token)) { | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             $this->authorizeRequestToken(); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $this->saveAccessToken(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Asks Twitter for a request token, and then redirects to Twitter | 
					
						
							|  |  |  |      * to authorize it. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return nothing | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function authorizeRequestToken() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         try { | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             // Get a new request token and authorize it
 | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             $client  = new TwitterOAuthClient(); | 
					
						
							| 
									
										
										
										
											2009-08-10 07:00:59 +00:00
										 |  |  |             $req_tok = | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |               $client->getRequestToken(TwitterOAuthClient::$requestTokenURL); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             // Sock the request token away in the session temporarily
 | 
					
						
							| 
									
										
										
										
											2009-08-03 22:46:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             $_SESSION['twitter_request_token']        = $req_tok->key; | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |             $_SESSION['twitter_request_token_secret'] = $req_tok->secret; | 
					
						
							| 
									
										
										
										
											2009-08-03 22:46:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             $auth_link = $client->getAuthorizeLink($req_tok); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         } catch (OAuthClientException $e) { | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             $msg = sprintf('OAuth client cURL error - code: %1s, msg: %2s', | 
					
						
							|  |  |  |                            $e->getCode(), $e->getMessage()); | 
					
						
							|  |  |  |             $this->serverError(_('Couldn\'t link your Twitter account.')); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         common_redirect($auth_link); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Called when Twitter returns an authorized request token. Exchanges | 
					
						
							|  |  |  |      * it for an access token and stores it. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return nothing | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function saveAccessToken() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         // Check to make sure Twitter returned the same request
 | 
					
						
							|  |  |  |         // token we sent them
 | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         if ($_SESSION['twitter_request_token'] != $this->oauth_token) { | 
					
						
							|  |  |  |             $this->serverError(_('Couldn\'t link your Twitter account.')); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         try { | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             $client = new TwitterOAuthClient($_SESSION['twitter_request_token'], | 
					
						
							|  |  |  |                 $_SESSION['twitter_request_token_secret']); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             // Exchange the request token for an access token
 | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |             $atok = $client->getAccessToken(TwitterOAuthClient::$accessTokenURL); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             // Test the access token and get the user's Twitter info
 | 
					
						
							| 
									
										
										
										
											2009-08-03 22:46:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             $client       = new TwitterOAuthClient($atok->key, $atok->secret); | 
					
						
							| 
									
										
										
										
											2009-08-10 06:05:43 +00:00
										 |  |  |             $twitter_user = $client->verifyCredentials(); | 
					
						
							| 
									
										
										
										
											2009-08-03 22:46:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         } catch (OAuthClientException $e) { | 
					
						
							|  |  |  |             $msg = sprintf('OAuth client cURL error - code: %1$s, msg: %2$s', | 
					
						
							| 
									
										
										
										
											2009-08-03 22:46:01 +00:00
										 |  |  |                            $e->getCode(), $e->getMessage()); | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |             $this->serverError(_('Couldn\'t link your Twitter account.')); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         // Save the access token and Twitter user info
 | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         $this->saveForeignLink($atok, $twitter_user); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         // Clean up the the mess we made in the session
 | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         unset($_SESSION['twitter_request_token']); | 
					
						
							|  |  |  |         unset($_SESSION['twitter_request_token_secret']); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         common_redirect(common_local_url('twittersettings')); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Saves a Foreign_link between Twitter user and local user, | 
					
						
							|  |  |  |      * which includes the access token and secret. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param OAuthToken $access_token the access token to save | 
					
						
							|  |  |  |      * @param mixed      $twitter_user twitter API user object | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return nothing | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function saveForeignLink($access_token, $twitter_user) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $user = common_current_user(); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         $flink = new Foreign_link(); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         $flink->user_id     = $user->id; | 
					
						
							|  |  |  |         $flink->foreign_id  = $twitter_user->id; | 
					
						
							|  |  |  |         $flink->service     = TWITTER_SERVICE; | 
					
						
							| 
									
										
										
										
											2009-08-10 07:00:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $creds = TwitterOAuthClient::packToken($access_token); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $flink->credentials = $creds; | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         $flink->created     = common_sql_now(); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         // Defaults: noticesync on, everything else off
 | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  |         $flink->set_flags(true, false, false, false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $flink_id = $flink->insert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($flink_id)) { | 
					
						
							|  |  |  |             common_log_db_error($flink, 'INSERT', __FILE__); | 
					
						
							|  |  |  |                 $this->serverError(_('Couldn\'t link your Twitter account.')); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-08-08 18:13:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         save_twitter_user($twitter_user->id, $twitter_user->screen_name); | 
					
						
							| 
									
										
										
										
											2009-08-01 08:20:44 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |