| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  | <?php | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2011-07-15 12:13:57 -07:00
										 |  |  |  * Copyright (C) 2008-2011, StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-06 12:40:58 +02:00
										 |  |  | if (!defined('GNUSOCIAL')) { exit(1); } | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-15 12:13:57 -07:00
										 |  |  | require_once 'OAuth.php'; | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-15 12:13:57 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @fixme class doc | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-10-15 00:20:36 +02:00
										 |  |  | class ApiGNUsocialOAuthDataStore extends OAuthDataStore | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-07-16 18:45:59 +02:00
										 |  |  |     function lookup_consumer($consumer_key) | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-07-16 18:45:59 +02:00
										 |  |  |         $con = Consumer::getKV('consumer_key', $consumer_key); | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-01 20:30:57 +01:00
										 |  |  |         if (!$con instanceof Consumer) { | 
					
						
							| 
									
										
										
										
											2010-10-19 20:54:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // Create an anon consumer and anon application if one
 | 
					
						
							|  |  |  |             // doesn't exist already
 | 
					
						
							| 
									
										
										
										
											2015-07-16 18:45:59 +02:00
										 |  |  |             if ($consumer_key == 'anonymous') { | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 common_debug("API OAuth - creating anonymous consumer"); | 
					
						
							| 
									
										
										
										
											2010-10-19 20:54:53 -07:00
										 |  |  |                 $con = new Consumer(); | 
					
						
							| 
									
										
										
										
											2015-07-16 18:45:59 +02:00
										 |  |  |                 $con->consumer_key    = $consumer_key; | 
					
						
							|  |  |  |                 $con->consumer_secret = $consumer_key; | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |                 $con->created         = common_sql_now(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 20:54:53 -07:00
										 |  |  |                 $result = $con->insert(); | 
					
						
							|  |  |  |                 if (!$result) { | 
					
						
							| 
									
										
										
										
											2010-10-20 19:34:27 +02:00
										 |  |  |                     // TRANS: Server error displayed when trying to create an anynymous OAuth consumer.
 | 
					
						
							|  |  |  |                     $this->serverError(_('Could not create anonymous consumer.')); | 
					
						
							| 
									
										
										
										
											2010-10-19 20:54:53 -07:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 $app = Oauth_application::getByConsumerKey('anonymous'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (!$app) { | 
					
						
							|  |  |  |                     common_debug("API OAuth - creating anonymous application"); | 
					
						
							|  |  |  |                     $app               = new OAuth_application(); | 
					
						
							|  |  |  |                     $app->owner        = 1; // XXX: What to do here?
 | 
					
						
							|  |  |  |                     $app->consumer_key = $con->consumer_key; | 
					
						
							|  |  |  |                     $app->name         = 'anonymous'; | 
					
						
							|  |  |  |                     $app->icon         = 'default-avatar-stream.png'; // XXX: Fix this!
 | 
					
						
							|  |  |  |                     $app->description  = "An anonymous application"; | 
					
						
							|  |  |  |                     // XXX: allow the user to set the access type when
 | 
					
						
							|  |  |  |                     // authorizing? Currently we default to r+w for anonymous
 | 
					
						
							|  |  |  |                     // OAuth client applications
 | 
					
						
							|  |  |  |                     $app->access_type  = 3; // read + write
 | 
					
						
							|  |  |  |                     $app->type         = 2; // desktop
 | 
					
						
							|  |  |  |                     $app->created      = common_sql_now(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     $id = $app->insert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if (!$id) { | 
					
						
							| 
									
										
										
										
											2011-04-03 23:02:24 +02:00
										 |  |  |                         // TRANS: Server error displayed when trying to create an anynymous OAuth application.
 | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |                         $this->serverError(_("Could not create anonymous OAuth application.")); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2010-10-19 20:54:53 -07:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 return null; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-19 20:54:53 -07:00
										 |  |  |         return new OAuthConsumer( | 
					
						
							|  |  |  |             $con->consumer_key, | 
					
						
							|  |  |  |             $con->consumer_secret | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-13 11:31:15 +00:00
										 |  |  |     function getAppByRequestToken($token_key) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |         // Look up the full req token
 | 
					
						
							|  |  |  |         $req_token = $this->lookup_token( | 
					
						
							|  |  |  |             null, | 
					
						
							|  |  |  |             'request', | 
					
						
							|  |  |  |             $token_key | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-01-13 11:31:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (empty($req_token)) { | 
					
						
							| 
									
										
										
										
											2011-04-01 19:46:40 +02:00
										 |  |  |             common_debug("Couldn't get request token from oauth datastore"); | 
					
						
							| 
									
										
										
										
											2010-01-13 11:31:15 +00:00
										 |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Look up the full Token
 | 
					
						
							|  |  |  |         $token = new Token(); | 
					
						
							|  |  |  |         $token->tok = $req_token->key; | 
					
						
							|  |  |  |         $result = $token->find(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($result)) { | 
					
						
							|  |  |  |             common_debug('Couldn\'t find req token in the token table.'); | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Look up the app
 | 
					
						
							|  |  |  |         $app = new Oauth_application(); | 
					
						
							|  |  |  |         $app->consumer_key = $token->consumer_key; | 
					
						
							|  |  |  |         $result = $app->find(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($result)) { | 
					
						
							|  |  |  |             return $app; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             common_debug("Couldn't find the app!"); | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-06 12:40:58 +02:00
										 |  |  |     function new_access_token($token, $consumer, $verifier = null) | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-10-07 18:32:27 -07:00
										 |  |  |         common_debug( | 
					
						
							| 
									
										
										
										
											2010-10-19 12:07:59 -07:00
										 |  |  |             sprintf( | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |                 "New access token from request token %s, consumer %s and verifier %s ", | 
					
						
							| 
									
										
										
										
											2010-10-19 12:07:59 -07:00
										 |  |  |                 $token, | 
					
						
							|  |  |  |                 $consumer, | 
					
						
							|  |  |  |                 $verifier | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |             ), | 
					
						
							|  |  |  |             __FILE__ | 
					
						
							| 
									
										
										
										
											2010-10-07 18:32:27 -07:00
										 |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-13 05:06:35 +00:00
										 |  |  |         $rt = new Token(); | 
					
						
							| 
									
										
										
										
											2010-10-07 18:32:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  |         $rt->consumer_key = $consumer->key; | 
					
						
							| 
									
										
										
										
											2010-10-07 18:32:27 -07:00
										 |  |  |         $rt->tok          = $token->key; | 
					
						
							|  |  |  |         $rt->type         = 0; // request
 | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $app = Oauth_application::getByConsumerKey($consumer->key); | 
					
						
							| 
									
										
										
										
											2010-10-07 18:32:27 -07:00
										 |  |  |         assert(!empty($app)); | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-07 18:32:27 -07:00
										 |  |  |         if ($rt->find(true) && $rt->state == 1 && $rt->verifier == $verifier) { // authorized
 | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |             common_debug('Request token found.', __FILE__); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // find the app and profile associated with this token
 | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |             $tokenAssoc = Oauth_token_association::getKV('token', $rt->tok); | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (!$tokenAssoc) { | 
					
						
							|  |  |  |                 throw new Exception( | 
					
						
							| 
									
										
										
										
											2010-10-21 03:10:46 +02:00
										 |  |  |                     // TRANS: Exception thrown when no token association could be found.
 | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |                     _('Could not find a profile and application associated with the request token.') | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-19 22:55:00 -08:00
										 |  |  |             // Check to see if we have previously issued an access token for
 | 
					
						
							|  |  |  |             // this application and profile; if so we can just return the
 | 
					
						
							|  |  |  |             // existing access token. That seems to be the best practice. It
 | 
					
						
							|  |  |  |             // makes it so users only have to authorize the app once per
 | 
					
						
							|  |  |  |             // machine.
 | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-13 05:06:35 +00:00
										 |  |  |             $appUser = new Oauth_application_user(); | 
					
						
							| 
									
										
										
										
											2010-10-07 18:32:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-13 05:06:35 +00:00
										 |  |  |             $appUser->application_id = $app->id; | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |             $appUser->profile_id     = $tokenAssoc->profile_id; | 
					
						
							| 
									
										
										
										
											2010-10-07 18:32:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-13 05:06:35 +00:00
										 |  |  |             $result = $appUser->find(true); | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-13 05:06:35 +00:00
										 |  |  |             if (!empty($result)) { | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |                 common_log(LOG_INFO, | 
					
						
							|  |  |  |                      sprintf( | 
					
						
							|  |  |  |                         "Existing access token found for application %s, profile %s.", | 
					
						
							|  |  |  |                         $app->id, | 
					
						
							|  |  |  |                         $tokenAssoc->profile_id | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                 ); | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-19 22:55:00 -08:00
										 |  |  |                 $at = null; | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-19 22:55:00 -08:00
										 |  |  |                 // Special case: we used to store request tokens in the
 | 
					
						
							|  |  |  |                 // Oauth_application_user record, and the access_type would
 | 
					
						
							|  |  |  |                 // always be 0 (no access) as a failsafe until an access
 | 
					
						
							|  |  |  |                 // token was issued and replaced the request token. There could
 | 
					
						
							|  |  |  |                 // be a few old Oauth_application_user records storing request
 | 
					
						
							|  |  |  |                 // tokens still around, and we don't want to accidentally
 | 
					
						
							|  |  |  |                 // return a useless request token instead of a new access
 | 
					
						
							|  |  |  |                 // token. So if we find one, we generate a new access token
 | 
					
						
							|  |  |  |                 // and update the existing Oauth_application_user record before
 | 
					
						
							|  |  |  |                 // returning the new access token. This should be rare.
 | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-19 22:55:00 -08:00
										 |  |  |                 if ($appUser->access_type == 0) { | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-19 22:55:00 -08:00
										 |  |  |                     $at = $this->generateNewAccessToken($consumer, $rt, $verifier); | 
					
						
							|  |  |  |                     $this->updateAppUser($appUser, $app, $at); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     $at = new Token(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     // fetch the full access token
 | 
					
						
							|  |  |  |                     $at->consumer_key = $consumer->key; | 
					
						
							|  |  |  |                     $at->tok          = $appUser->token; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     $result = $at->find(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if (!$result) { | 
					
						
							|  |  |  |                         throw new Exception( | 
					
						
							|  |  |  |                             // TRANS: Exception thrown when no access token can be issued.
 | 
					
						
							|  |  |  |                             _('Could not issue access token.') | 
					
						
							|  |  |  |                         ); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |                 // Yay, we can re-issue the access token
 | 
					
						
							|  |  |  |                 return new OAuthToken($at->tok, $at->secret); | 
					
						
							| 
									
										
										
										
											2010-01-13 05:06:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2010-10-19 20:54:53 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  |                common_log(LOG_INFO, | 
					
						
							|  |  |  |                     sprintf( | 
					
						
							|  |  |  |                         "Creating new access token for application %s, profile %s.", | 
					
						
							|  |  |  |                         $app->id, | 
					
						
							|  |  |  |                         $tokenAssoc->profile_id | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-19 22:55:00 -08:00
										 |  |  |                 $at = $this->generateNewAccessToken($consumer, $rt, $verifier); | 
					
						
							|  |  |  |                 $this->newAppUser($tokenAssoc, $app, $at); | 
					
						
							| 
									
										
										
										
											2010-01-11 01:11:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-13 05:06:35 +00:00
										 |  |  |                 // Okay, good
 | 
					
						
							|  |  |  |                 return new OAuthToken($at->tok, $at->secret); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-10-20 17:21:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // the token was not authorized or not verfied
 | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_INFO, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							|  |  |  |                     "API OAuth - Attempt to exchange unauthorized or unverified request token %s for an access token.", | 
					
						
							|  |  |  |                      $rt->tok | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-19 22:55:00 -08:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Generate a new access token and save it to the database | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Consumer $consumer the OAuth consumer | 
					
						
							|  |  |  |      * @param Token    $rt       the authorized request token | 
					
						
							|  |  |  |      * @param string   $verifier the OAuth 1.0a verifier | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @access private | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Token   $at       the new access token | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function generateNewAccessToken($consumer, $rt, $verifier) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $at = new Token(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $at->consumer_key      = $consumer->key; | 
					
						
							| 
									
										
										
										
											2013-10-21 13:20:30 +02:00
										 |  |  |         $at->tok               = common_random_hexstr(16); | 
					
						
							|  |  |  |         $at->secret            = common_random_hexstr(16); | 
					
						
							| 
									
										
										
										
											2011-01-19 22:55:00 -08:00
										 |  |  |         $at->type              = 1; // access
 | 
					
						
							|  |  |  |         $at->verifier          = $verifier; | 
					
						
							|  |  |  |         $at->verified_callback = $rt->verified_callback; // 1.0a
 | 
					
						
							|  |  |  |         $at->created           = common_sql_now(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$at->insert()) { | 
					
						
							|  |  |  |             $e = $at->_lastError; | 
					
						
							|  |  |  |             common_debug('access token "' . $at->tok . '" not inserted: "' . $e->message . '"', __FILE__); | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             common_debug('access token "' . $at->tok . '" inserted', __FILE__); | 
					
						
							|  |  |  |             // burn the old one
 | 
					
						
							|  |  |  |             $orig_rt   = clone($rt); | 
					
						
							|  |  |  |             $rt->state = 2; // used
 | 
					
						
							|  |  |  |             if (!$rt->update($orig_rt)) { | 
					
						
							|  |  |  |                 return null; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             common_debug('request token "' . $rt->tok . '" updated', __FILE__); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $at; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    /* | 
					
						
							|  |  |  |     * Add a new app user (Oauth_application_user) record | 
					
						
							|  |  |  |     * | 
					
						
							|  |  |  |     * @param Oauth_token_association $tokenAssoc token-to-app association | 
					
						
							|  |  |  |     * @param Oauth_application       $app        the OAuth client app | 
					
						
							|  |  |  |     * @param Token                   $at         the access token | 
					
						
							|  |  |  |     * | 
					
						
							|  |  |  |     * @access private | 
					
						
							|  |  |  |     * | 
					
						
							|  |  |  |     * @return void | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     private function newAppUser($tokenAssoc, $app, $at) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $appUser = new Oauth_application_user(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $appUser->profile_id     = $tokenAssoc->profile_id; | 
					
						
							|  |  |  |         $appUser->application_id = $app->id; | 
					
						
							|  |  |  |         $appUser->access_type    = $app->access_type; | 
					
						
							|  |  |  |         $appUser->token          = $at->tok; | 
					
						
							|  |  |  |         $appUser->created        = common_sql_now(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $result = $appUser->insert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$result) { | 
					
						
							|  |  |  |             common_log_db_error($appUser, 'INSERT', __FILE__); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             throw new Exception( | 
					
						
							| 
									
										
										
										
											2011-04-01 19:46:40 +02:00
										 |  |  |                 // TRANS: Exception thrown when a database error occurs.
 | 
					
						
							| 
									
										
										
										
											2011-01-19 22:55:00 -08:00
										 |  |  |                 _('Database error inserting OAuth application user.') | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    /* | 
					
						
							|  |  |  |     * Update an existing app user (Oauth_application_user) record | 
					
						
							|  |  |  |     * | 
					
						
							|  |  |  |     * @param Oauth_application_user $appUser existing app user rec | 
					
						
							|  |  |  |     * @param Oauth_application      $app     the OAuth client app | 
					
						
							|  |  |  |     * @param Token                  $at      the access token | 
					
						
							|  |  |  |     * | 
					
						
							|  |  |  |     * @access private | 
					
						
							|  |  |  |     * | 
					
						
							|  |  |  |     * @return void | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     private function updateAppUser($appUser, $app, $at) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $original = clone($appUser); | 
					
						
							|  |  |  |         $appUser->access_type = $app->access_type; | 
					
						
							|  |  |  |         $appUser->token       = $at->tok; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $result = $appUser->update($original); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$result) { | 
					
						
							|  |  |  |             common_log_db_error($appUser, 'UPDATE', __FILE__); | 
					
						
							|  |  |  |             throw new Exception( | 
					
						
							| 
									
										
										
										
											2011-04-01 19:46:40 +02:00
										 |  |  |                 // TRANS: Exception thrown when a database error occurs.
 | 
					
						
							| 
									
										
										
										
											2011-01-19 22:55:00 -08:00
										 |  |  |                 _('Database error updating OAuth application user.') | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 07:35:54 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Revoke specified access token | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Revokes the token specified by $token_key. | 
					
						
							|  |  |  |      * Throws exceptions in case of error. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $token_key the token to be revoked | 
					
						
							|  |  |  |      * @param int    $type      type of token (0 = req, 1 = access) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @access public | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function revoke_token($token_key, $type = 0) { | 
					
						
							| 
									
										
										
										
											2010-10-19 20:54:53 -07:00
										 |  |  |         $rt        = new Token(); | 
					
						
							|  |  |  |         $rt->tok   = $token_key; | 
					
						
							|  |  |  |         $rt->type  = $type; | 
					
						
							| 
									
										
										
										
											2010-02-02 07:35:54 +00:00
										 |  |  |         $rt->state = 0; | 
					
						
							| 
									
										
										
										
											2010-09-29 00:39:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 07:35:54 +00:00
										 |  |  |         if (!$rt->find(true)) { | 
					
						
							| 
									
										
										
										
											2010-09-13 00:57:35 +02:00
										 |  |  |             // TRANS: Exception thrown when an attempt is made to revoke an unknown token.
 | 
					
						
							| 
									
										
										
										
											2010-09-14 22:30:55 +02:00
										 |  |  |             throw new Exception(_('Tried to revoke unknown token.')); | 
					
						
							| 
									
										
										
										
											2010-02-02 07:35:54 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-09-29 00:39:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 07:35:54 +00:00
										 |  |  |         if (!$rt->delete()) { | 
					
						
							| 
									
										
										
										
											2010-09-13 00:57:35 +02:00
										 |  |  |             // TRANS: Exception thrown when an attempt is made to remove a revoked token.
 | 
					
						
							| 
									
										
										
										
											2010-09-14 22:30:55 +02:00
										 |  |  |             throw new Exception(_('Failed to delete revoked token.')); | 
					
						
							| 
									
										
										
										
											2010-02-02 07:35:54 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-05 17:48:32 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Create a new request token. Overrided to support OAuth 1.0a callback | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param OAuthConsumer $consumer the OAuth Consumer for this token | 
					
						
							|  |  |  |      * @param string        $callback the verified OAuth callback URL | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return OAuthToken   $token a new unauthorized OAuth request token | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-16 18:45:59 +02:00
										 |  |  |     function new_request_token($consumer, $callback = null) | 
					
						
							| 
									
										
										
										
											2010-10-05 17:48:32 -07:00
										 |  |  |     { | 
					
						
							|  |  |  |         $t = new Token(); | 
					
						
							|  |  |  |         $t->consumer_key = $consumer->key; | 
					
						
							| 
									
										
										
										
											2013-10-21 13:20:30 +02:00
										 |  |  |         $t->tok = common_random_hexstr(16); | 
					
						
							|  |  |  |         $t->secret = common_random_hexstr(16); | 
					
						
							| 
									
										
										
										
											2010-10-05 17:48:32 -07:00
										 |  |  |         $t->type = 0; // request
 | 
					
						
							|  |  |  |         $t->state = 0; // unauthorized
 | 
					
						
							|  |  |  |         $t->verified_callback = $callback; | 
					
						
							| 
									
										
										
										
											2010-10-06 19:20:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($callback === 'oob') { | 
					
						
							|  |  |  |             // six digit pin
 | 
					
						
							| 
									
										
										
										
											2010-10-07 11:01:17 -07:00
										 |  |  |             $t->verifier = mt_rand(0, 9999999); | 
					
						
							| 
									
										
										
										
											2010-10-06 19:20:47 -07:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2013-10-21 13:20:30 +02:00
										 |  |  |             $t->verifier = common_random_hexstr(8); | 
					
						
							| 
									
										
										
										
											2010-10-06 19:20:47 -07:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-06 12:40:58 +02:00
										 |  |  |         $t->created = common_sql_now(); | 
					
						
							| 
									
										
										
										
											2010-10-05 17:48:32 -07:00
										 |  |  |         if (!$t->insert()) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return new OAuthToken($t->tok, $t->secret); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-07-15 12:13:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Authorize specified OAuth token | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Authorizes the authorization token specified by $token_key. | 
					
						
							|  |  |  |      * Throws exceptions in case of error. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $token_key The token to be authorized | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @access public | 
					
						
							|  |  |  |      **/ | 
					
						
							|  |  |  |     public function authorize_token($token_key) { | 
					
						
							|  |  |  |         $rt = new Token(); | 
					
						
							|  |  |  |         $rt->tok = $token_key; | 
					
						
							|  |  |  |         $rt->type = 0; | 
					
						
							|  |  |  |         $rt->state = 0; | 
					
						
							|  |  |  |         if (!$rt->find(true)) { | 
					
						
							|  |  |  |             throw new Exception('Tried to authorize unknown token'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $orig_rt = clone($rt); | 
					
						
							|  |  |  |         $rt->state = 1; # Authorized but not used
 | 
					
						
							|  |  |  |         if (!$rt->update($orig_rt)) { | 
					
						
							|  |  |  |             throw new Exception('Failed to authorize token'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * http://oauth.net/core/1.0/#nonce
 | 
					
						
							|  |  |  |      * "The Consumer SHALL then generate a Nonce value that is unique for
 | 
					
						
							|  |  |  |      * all requests with that timestamp."
 | 
					
						
							|  |  |  |      * XXX: It's not clear why the token is here | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param type $consumer | 
					
						
							|  |  |  |      * @param type $token | 
					
						
							|  |  |  |      * @param type $nonce | 
					
						
							|  |  |  |      * @param type $timestamp | 
					
						
							|  |  |  |      * @return type | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function lookup_nonce($consumer, $token, $nonce, $timestamp) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $n = new Nonce(); | 
					
						
							|  |  |  |         $n->consumer_key = $consumer->key; | 
					
						
							|  |  |  |         $n->ts = common_sql_date($timestamp); | 
					
						
							|  |  |  |         $n->nonce = $nonce; | 
					
						
							|  |  |  |         if ($n->find(true)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2013-10-14 13:42:27 +02:00
										 |  |  |             $n->created = common_sql_now(); | 
					
						
							| 
									
										
										
										
											2011-07-15 12:13:57 -07:00
										 |  |  |             $n->insert(); | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param type $consumer | 
					
						
							|  |  |  |      * @param type $token_type | 
					
						
							|  |  |  |      * @param type $token_key | 
					
						
							|  |  |  |      * @return OAuthToken | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-16 18:45:59 +02:00
										 |  |  |     function lookup_token($consumer, $token_type, $token) | 
					
						
							| 
									
										
										
										
											2011-07-15 12:13:57 -07:00
										 |  |  |     { | 
					
						
							|  |  |  |         $t = new Token(); | 
					
						
							|  |  |  |         if (!is_null($consumer)) { | 
					
						
							|  |  |  |             $t->consumer_key = $consumer->key; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-07-16 18:45:59 +02:00
										 |  |  |         $t->tok = $token; | 
					
						
							| 
									
										
										
										
											2011-07-15 12:13:57 -07:00
										 |  |  |         $t->type = ($token_type == 'access') ? 1 : 0; | 
					
						
							|  |  |  |         if ($t->find(true)) { | 
					
						
							|  |  |  |             return new OAuthToken($t->tok, $t->secret); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param type $token_key | 
					
						
							|  |  |  |      * @return Token  | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function getTokenByKey($token_key) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $t = new Token(); | 
					
						
							|  |  |  |         $t->tok = $token_key; | 
					
						
							|  |  |  |         if ($t->find(true)) { | 
					
						
							|  |  |  |             return $t; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-01-07 18:33:17 -08:00
										 |  |  | } |