| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  | <?php | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2009, StatusNet, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @package FeedSubPlugin | 
					
						
							|  |  |  |  * @maintainer Brion Vibber <brion@status.net> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 14:06:36 -08:00
										 |  |  | class PushCallbackAction extends Action | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  | { | 
					
						
							|  |  |  |     function handle() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-02-21 14:28:06 -08:00
										 |  |  |         StatusNet::setApi(true); // Minimize error messages to aid in debugging
 | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         parent::handle(); | 
					
						
							|  |  |  |         if ($_SERVER['REQUEST_METHOD'] == 'POST') { | 
					
						
							|  |  |  |             $this->handlePost(); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $this->handleGet(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Handler for POST content updates from the hub | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function handlePost() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $feedid = $this->arg('feed'); | 
					
						
							|  |  |  |         common_log(LOG_INFO, "POST for feed id $feedid"); | 
					
						
							|  |  |  |         if (!$feedid) { | 
					
						
							|  |  |  |             throw new ServerException('Empty or invalid feed id', 400); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 21:22:21 +00:00
										 |  |  |         $feedsub = FeedSub::staticGet('id', $feedid); | 
					
						
							|  |  |  |         if (!$feedsub) { | 
					
						
							|  |  |  |             throw new ServerException('Unknown PuSH feed id ' . $feedid, 400); | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-02-08 11:06:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $hmac = ''; | 
					
						
							|  |  |  |         if (isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) { | 
					
						
							|  |  |  |             $hmac = $_SERVER['HTTP_X_HUB_SIGNATURE']; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         $post = file_get_contents('php://input'); | 
					
						
							| 
									
										
										
										
											2010-02-16 23:31:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 13:40:59 -08:00
										 |  |  |         // Queue this to a background process; we should return
 | 
					
						
							| 
									
										
										
										
											2010-02-16 23:31:11 +00:00
										 |  |  |         // as quickly as possible from a distribution POST.
 | 
					
						
							| 
									
										
										
										
											2010-02-21 13:40:59 -08:00
										 |  |  |         // If queues are disabled this'll process immediately.
 | 
					
						
							|  |  |  |         $data = array('feedsub_id' => $feedsub->id, | 
					
						
							|  |  |  |                       'post' => $post, | 
					
						
							|  |  |  |                       'hmac' => $hmac); | 
					
						
							|  |  |  |         $qm = QueueManager::get(); | 
					
						
							|  |  |  |         $qm->enqueue($data, 'pushinput'); | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Handler for GET verification requests from the hub | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function handleGet() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $mode = $this->arg('hub_mode'); | 
					
						
							|  |  |  |         $topic = $this->arg('hub_topic'); | 
					
						
							|  |  |  |         $challenge = $this->arg('hub_challenge'); | 
					
						
							|  |  |  |         $lease_seconds = $this->arg('hub_lease_seconds'); | 
					
						
							|  |  |  |         $verify_token = $this->arg('hub_verify_token'); | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         if ($mode != 'subscribe' && $mode != 'unsubscribe') { | 
					
						
							|  |  |  |             common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with mode \"$mode\"");
 | 
					
						
							|  |  |  |             throw new ServerException("Bogus hub callback: bad mode", 404); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2010-02-18 21:22:21 +00:00
										 |  |  |         $feedsub = FeedSub::staticGet('uri', $topic); | 
					
						
							|  |  |  |         if (!$feedsub) { | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |             common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback for unknown feed $topic"); | 
					
						
							|  |  |  |             throw new ServerException("Bogus hub callback: unknown feed", 404); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 21:22:21 +00:00
										 |  |  |         if ($feedsub->verify_token !== $verify_token) { | 
					
						
							| 
									
										
										
										
											2010-02-12 01:11:46 +00:00
										 |  |  |             common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad token \"$verify_token\" for feed $topic");
 | 
					
						
							| 
									
										
										
										
											2010-02-18 18:20:48 +00:00
										 |  |  |             throw new ServerException("Bogus hub callback: bad token", 404); | 
					
						
							| 
									
										
										
										
											2010-02-12 01:11:46 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 21:22:21 +00:00
										 |  |  |         if ($mode != $feedsub->sub_state) { | 
					
						
							|  |  |  |             common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad mode \"$mode\" for feed $topic in state \"{$feedsub->sub_state}\""); | 
					
						
							| 
									
										
										
										
											2010-02-12 01:11:46 +00:00
										 |  |  |             throw new ServerException("Bogus hub callback: mode doesn't match subscription state.", 404); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         // OK!
 | 
					
						
							| 
									
										
										
										
											2010-02-11 00:09:20 +00:00
										 |  |  |         if ($mode == 'subscribe') { | 
					
						
							|  |  |  |             common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); | 
					
						
							| 
									
										
										
										
											2010-02-18 21:22:21 +00:00
										 |  |  |             $feedsub->confirmSubscribe($lease_seconds); | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-02-11 00:09:20 +00:00
										 |  |  |             common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic"); | 
					
						
							| 
									
										
										
										
											2010-02-18 21:22:21 +00:00
										 |  |  |             $feedsub->confirmUnsubscribe(); | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |         print $challenge; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |