| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |  * Action to let RSSCloud aggregators request update notification when | 
					
						
							|  |  |  |  * user profile feeds change. | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Plugin | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Action class to handle RSSCloud notification (subscription) requests | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Plugin | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							|  |  |  |  **/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | class RSSCloudRequestNotifyAction extends Action | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Initialization. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array $args Web and URL arguments | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean false if user doesn't exist | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     function prepare($args) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::prepare($args); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |         $this->ip   = $_SERVER['REMOTE_ADDR']; | 
					
						
							|  |  |  |         $this->port = $this->arg('port'); | 
					
						
							|  |  |  |         $this->path = $this->arg('path'); | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($this->path[0] != '/') { | 
					
						
							|  |  |  |             $this->path = '/' . $this->path; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |         $this->protocol  = $this->arg('protocol'); | 
					
						
							|  |  |  |         $this->procedure = $this->arg('notifyProcedure'); | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         $this->domain    = $this->arg('domain'); | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |         $this->feeds = $this->getFeeds(); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Handle the request | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Checks for all the required parameters for a subscription, | 
					
						
							|  |  |  |      * validates that the feed being subscribed to is real, and then | 
					
						
							|  |  |  |      * saves the subsctiption. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array $args $_REQUEST data (unused) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     function handle($args) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         parent::handle($args); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         if ($_SERVER['REQUEST_METHOD'] != 'POST') { | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |             $this->showResult(false, 'Request must be POST.'); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         $missing = array(); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         if (empty($this->port)) { | 
					
						
							|  |  |  |             $missing[] = 'port'; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         if (empty($this->path)) { | 
					
						
							|  |  |  |             $missing[] = 'path'; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         if (empty($this->protocol)) { | 
					
						
							|  |  |  |             $missing[] = 'protocol'; | 
					
						
							| 
									
										
										
										
											2009-12-13 20:30:17 +00:00
										 |  |  |         } else if (strtolower($this->protocol) != 'http-post') { | 
					
						
							|  |  |  |             $msg = 'Only http-post notifications are supported at this time.'; | 
					
						
							|  |  |  |             $this->showResult(false, $msg); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!isset($this->procedure)) { | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |             $missing[] = 'notifyProcedure'; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         if (!empty($missing)) { | 
					
						
							|  |  |  |             $msg = 'The following parameters were missing from the request body: ' . | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |                 implode(', ', $missing) . '.'; | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |             $this->showResult(false, $msg); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |             return; | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (empty($this->feeds)) { | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |             $msg = 'You must provide at least one valid profile feed url ' . | 
					
						
							|  |  |  |               '(url1, url2, url3 ... urlN).'; | 
					
						
							| 
									
										
										
										
											2009-12-13 20:30:17 +00:00
										 |  |  |             $this->showResult(false, $msg); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |             return; | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         // We have to validate everything before saving anything.
 | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  |         // We only return one success or failure no matter how
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         // many feeds the subscriber is trying to subscribe to
 | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         foreach ($this->feeds as $feed) { | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |             if (!$this->validateFeed($feed)) { | 
					
						
							| 
									
										
										
										
											2010-01-06 07:44:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 $nh = $this->getNotifyUrl(); | 
					
						
							|  |  |  |                 common_log(LOG_WARNING, | 
					
						
							|  |  |  |                            "RSSCloud plugin - $nh tried to subscribe to invalid feed: $feed"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |                 $msg = 'Feed subscription failed - Not a valid feed.'; | 
					
						
							|  |  |  |                 $this->showResult(false, $msg); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |             if (!$this->testNotificationHandler($feed)) { | 
					
						
							|  |  |  |                 $msg = 'Feed subscription failed - ' . | 
					
						
							|  |  |  |                 'notification handler doesn\'t respond correctly.'; | 
					
						
							|  |  |  |                 $this->showResult(false, $msg); | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  |                 return; | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         foreach ($this->feeds as $feed) { | 
					
						
							|  |  |  |             $this->saveSubscription($feed); | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  |         // XXX: What to do about deleting stale subscriptions?
 | 
					
						
							|  |  |  |         // 25 hours seems harsh. WordPress doesn't ever remove
 | 
					
						
							|  |  |  |         // subscriptions.
 | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  |         $msg = 'Thanks for the subscription. ' . | 
					
						
							|  |  |  |           'When the feed(s) update(s) we\'ll notify you.'; | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  |         $this->showResult(true, $msg); | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Validate that the requested feed is one we serve | 
					
						
							|  |  |  |      * up via RSSCloud. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $feed the feed in question | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |     function validateFeed($feed) | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         $user = $this->userFromFeed($feed); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         if (empty($user)) { | 
					
						
							|  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Pull all of the urls (url1, url2, url3...urlN) that | 
					
						
							|  |  |  |      * the subscriber wants to subscribe to. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array $feeds the list of feeds | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |     function getFeeds() | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         $feeds = array(); | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |         while (list($key, $feed) = each($this->args)) { | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |             if (preg_match('/^url\d*$/', $key)) { | 
					
						
							|  |  |  |                 $feeds[] = $feed; | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         return $feeds; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Test that a notification handler is there and is reponding | 
					
						
							|  |  |  |      * correctly.  This is called before adding a subscription. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $feed the feed to verify | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean success result | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |     function testNotificationHandler($feed) | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  |         $notifyUrl = $this->getNotifyUrl(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         $notifier = new RSSCloudNotifier(); | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         if (isset($this->domain)) { | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // 'domain' param set, so we have to use GET and send a challenge
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-06 07:44:34 +00:00
										 |  |  |             common_log(LOG_INFO, | 
					
						
							|  |  |  |                        'RSSCloud plugin - Testing notification handler with challenge: ' . | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  |                        $notifyUrl); | 
					
						
							|  |  |  |             return $notifier->challenge($notifyUrl, $feed); | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-01-06 07:44:34 +00:00
										 |  |  |             common_log(LOG_INFO, 'RSSCloud plugin - Testing notification handler: ' . | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  |                        $notifyUrl); | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  |             return $notifier->postUpdate($notifyUrl, $feed); | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Build the URL for the notification handler based on the | 
					
						
							|  |  |  |      * parameters passed in with the subscription request. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string notification handler url | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  |     function getNotifyUrl() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (isset($this->domain)) { | 
					
						
							|  |  |  |             return 'http://' . $this->domain . ':' . $this->port . $this->path; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return 'http://' . $this->ip . ':' . $this->port . $this->path; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Uses the nickname part of the subscribed feed URL to figure out | 
					
						
							|  |  |  |      * whethere there's really a user with such a feed.  Used to | 
					
						
							|  |  |  |      * validate feeds before adding a subscription. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $feed the feed in question | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean success | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |     function userFromFeed($feed) | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |         // We only do profile feeds
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |         $path  = common_path('api/statuses/user_timeline/'); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |         $valid = '%^' . $path . '(?<nickname>.*)\.rss$%'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (preg_match($valid, $feed, $matches)) { | 
					
						
							|  |  |  |             $user = User::staticGet('nickname', $matches['nickname']); | 
					
						
							|  |  |  |             if (!empty($user)) { | 
					
						
							|  |  |  |                 return $user; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Save an RSSCloud subscription | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |      * @param string $feed a valid profile feed | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return boolean success result | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |     function saveSubscription($feed) | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         $user = $this->userFromFeed($feed); | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  |         $notifyUrl = $this->getNotifyUrl(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $sub = RSSCloudSubscription::getSubscription($user->id, $notifyUrl); | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         if ($sub) { | 
					
						
							| 
									
										
										
										
											2010-01-06 07:44:34 +00:00
										 |  |  |             common_log(LOG_INFO, "RSSCloud plugin - $notifyUrl refreshed subscription" . | 
					
						
							|  |  |  |                          " to user $user->nickname (id: $user->id)."); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             $sub = new RSSCloudSubscription(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $sub->subscribed = $user->id; | 
					
						
							| 
									
										
										
										
											2009-12-08 06:26:11 +00:00
										 |  |  |             $sub->url        = $notifyUrl; | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  |             $sub->created    = common_sql_now(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!$sub->insert()) { | 
					
						
							|  |  |  |                 common_log_db_error($sub, 'INSERT', __FILE__); | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-06 07:44:34 +00:00
										 |  |  |             common_log(LOG_INFO, "RSSCloud plugin - $notifyUrl subscribed" . | 
					
						
							|  |  |  |                        " to user $user->nickname (id: $user->id)"); | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-12-07 09:10:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-04 17:32:17 -08:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 17:50:10 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Show an XML message indicating the subscription | 
					
						
							|  |  |  |      * was successful or failed. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param boolean $success whether it was good or bad | 
					
						
							|  |  |  |      * @param string  $msg     the message to output | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean success result | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  |     function showResult($success, $msg) | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->startXML(); | 
					
						
							| 
									
										
										
										
											2009-12-14 21:24:49 +00:00
										 |  |  |         $this->elementStart('notifyResult', | 
					
						
							|  |  |  |                             array('success' => ($success) ? 'true' : 'false', | 
					
						
							|  |  |  |                                   'msg'     => $msg)); | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  |         $this->endXML(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-21 00:54:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:20:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 |