| 
									
										
										
										
											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> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-08 10:42:59 -07:00
										 |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 14:06:36 -08:00
										 |  |  | class PushCallbackAction extends Action | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-20 17:21:56 +02:00
										 |  |  |     protected function handle() | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-02-27 12:44:15 +01:00
										 |  |  |         GNUsocial::setApi(true); // Minimize error messages to aid in debugging
 | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         parent::handle(); | 
					
						
							| 
									
										
										
										
											2013-10-20 17:21:56 +02:00
										 |  |  |         if ($this->isPost()) { | 
					
						
							|  |  |  |             return $this->handlePost(); | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-10-20 17:21:56 +02:00
										 |  |  |          | 
					
						
							|  |  |  |         return $this->handleGet(); | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * 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) { | 
					
						
							| 
									
										
										
										
											2011-04-29 18:59:47 +02:00
										 |  |  |             // TRANS: Server exception thrown when referring to a non-existing or empty feed.
 | 
					
						
							| 
									
										
										
										
											2010-09-19 15:17:36 +02:00
										 |  |  |             throw new ServerException(_m('Empty or invalid feed id.'), 400); | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         $feedsub = FeedSub::getKV('id', $feedid); | 
					
						
							| 
									
										
										
										
											2014-03-03 00:01:13 +01:00
										 |  |  |         if (!$feedsub instanceof FeedSub) { | 
					
						
							| 
									
										
										
										
											2010-09-19 15:17:36 +02:00
										 |  |  |             // TRANS: Server exception. %s is a feed ID.
 | 
					
						
							|  |  |  |             throw new ServerException(sprintf(_m('Unknown PuSH feed id %s'),$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(); | 
					
						
							| 
									
										
										
										
											2010-02-24 20:36:36 +00:00
										 |  |  |         $qm->enqueue($data, 'pushin'); | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-02-21 14:46:26 -08:00
										 |  |  |      * Handler for GET verification requests from the hub. | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2017-04-21 09:31:27 +02:00
										 |  |  |     public function handleGet() | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $mode = $this->arg('hub_mode'); | 
					
						
							|  |  |  |         $topic = $this->arg('hub_topic'); | 
					
						
							|  |  |  |         $challenge = $this->arg('hub_challenge'); | 
					
						
							| 
									
										
										
										
											2016-01-13 19:24:38 +01:00
										 |  |  |         $lease_seconds = $this->arg('hub_lease_seconds');   // Must be >0 for PuSH 0.4! And only checked on mode='subscribe' of course
 | 
					
						
							| 
									
										
										
										
											2013-11-02 20:02:28 +01:00
										 |  |  |         common_log(LOG_INFO, __METHOD__ . ": sub verification mode: $mode topic: $topic challenge: $challenge lease_seconds: $lease_seconds"); | 
					
						
							| 
									
										
										
										
											2010-02-21 14:46:26 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         if ($mode != 'subscribe' && $mode != 'unsubscribe') { | 
					
						
							| 
									
										
										
										
											2010-09-19 15:17:36 +02:00
										 |  |  |             // TRANS: Client exception. %s is an invalid value for hub.mode.
 | 
					
						
							|  |  |  |             throw new ClientException(sprintf(_m('Bad hub.mode "$s".',$mode)), 404); | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-02-21 14:46:26 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         $feedsub = FeedSub::getKV('uri', $topic); | 
					
						
							| 
									
										
										
										
											2013-11-02 20:02:28 +01:00
										 |  |  |         if (!$feedsub instanceof FeedSub) { | 
					
						
							| 
									
										
										
										
											2010-09-19 15:17:36 +02:00
										 |  |  |             // TRANS: Client exception. %s is an invalid feed name.
 | 
					
						
							|  |  |  |             throw new ClientException(sprintf(_m('Bad hub.topic feed "%s".'),$topic), 404); | 
					
						
							| 
									
										
										
										
											2009-11-20 09:42:19 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-21 14:46:26 -08:00
										 |  |  |         if ($mode == 'subscribe') { | 
					
						
							|  |  |  |             // We may get re-sub requests legitimately.
 | 
					
						
							|  |  |  |             if ($feedsub->sub_state != 'subscribe' && $feedsub->sub_state != 'active') { | 
					
						
							| 
									
										
										
										
											2010-09-19 15:17:36 +02:00
										 |  |  |                 // TRANS: Client exception. %s is an invalid topic.
 | 
					
						
							|  |  |  |                 throw new ClientException(sprintf(_m('Unexpected subscribe request for %s.'),$topic), 404); | 
					
						
							| 
									
										
										
										
											2010-02-21 14:46:26 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             if ($feedsub->sub_state != 'unsubscribe') { | 
					
						
							| 
									
										
										
										
											2010-09-19 15:17:36 +02:00
										 |  |  |                 // TRANS: Client exception. %s is an invalid topic.
 | 
					
						
							|  |  |  |                 throw new ClientException(sprintf(_m('Unexpected unsubscribe request for %s.'),$topic), 404); | 
					
						
							| 
									
										
										
										
											2010-02-21 14:46:26 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-02-12 01:11:46 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-11 00:09:20 +00:00
										 |  |  |         if ($mode == 'subscribe') { | 
					
						
							| 
									
										
										
										
											2017-04-21 09:31:27 +02:00
										 |  |  |             $renewal = ($feedsub->sub_state == 'active'); | 
					
						
							|  |  |  |             if ($renewal) { | 
					
						
							| 
									
										
										
										
											2010-02-21 14:46:26 -08:00
										 |  |  |                 common_log(LOG_INFO, __METHOD__ . ': sub update confirmed'); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-04-21 09:31:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 21:22:21 +00:00
										 |  |  |             $feedsub->confirmSubscribe($lease_seconds); | 
					
						
							| 
									
										
										
										
											2017-04-21 09:31:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (!$renewal) { | 
					
						
							|  |  |  |                 // Kickstart the feed by importing its most recent backlog
 | 
					
						
							|  |  |  |                 // FIXME: Send this to background queue handling
 | 
					
						
							|  |  |  |                 common_log(LOG_INFO, __METHOD__ . ': Confirmed a new subscription, importing backlog...'); | 
					
						
							|  |  |  |                 $feedsub->importFeed(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |