Added a bunch of function commment blocks
This commit is contained in:
parent
c571c1323f
commit
48af79dbb4
|
@ -32,6 +32,19 @@ if (!defined('STATUSNET')) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dummy aggregator that acts as a proper notification handler. It
|
||||||
|
* doesn't do anything but respond correctly when notified via
|
||||||
|
* REST. Mostly, this is just and action I used to develop the plugin
|
||||||
|
* and easily test things end-to-end. I'm leaving it in here as it
|
||||||
|
* may be useful for developing the plugin further.
|
||||||
|
*
|
||||||
|
* @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/
|
||||||
|
**/
|
||||||
class LoggingAggregatorAction extends Action
|
class LoggingAggregatorAction extends Action
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -45,6 +58,7 @@ class LoggingAggregatorAction extends Action
|
||||||
*
|
*
|
||||||
* @return boolean false if user doesn't exist
|
* @return boolean false if user doesn't exist
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function prepare($args)
|
function prepare($args)
|
||||||
{
|
{
|
||||||
parent::prepare($args);
|
parent::prepare($args);
|
||||||
|
@ -58,6 +72,14 @@ class LoggingAggregatorAction extends Action
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the request
|
||||||
|
*
|
||||||
|
* @param array $args $_REQUEST data (unused)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
|
||||||
function handle($args)
|
function handle($args)
|
||||||
{
|
{
|
||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
|
@ -98,6 +120,14 @@ class LoggingAggregatorAction extends Action
|
||||||
$this->url . ' has been updated.');
|
$this->url . ' has been updated.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show an XML error when things go badly
|
||||||
|
*
|
||||||
|
* @param string $msg the error message
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
|
||||||
function showError($msg)
|
function showError($msg)
|
||||||
{
|
{
|
||||||
header('HTTP/1.1 400 Bad Request');
|
header('HTTP/1.1 400 Bad Request');
|
||||||
|
|
|
@ -31,10 +31,29 @@ if (!defined('STATUSNET')) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for notifying cloud-enabled RSS aggregators that StatusNet
|
||||||
|
* feeds have been updated.
|
||||||
|
*
|
||||||
|
* @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/
|
||||||
|
**/
|
||||||
class RSSCloudNotifier {
|
class RSSCloudNotifier {
|
||||||
|
|
||||||
const MAX_FAILURES = 3;
|
const MAX_FAILURES = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send an HTTP GET to the notification handler with a
|
||||||
|
* challenge string to see if it repsonds correctly.
|
||||||
|
*
|
||||||
|
* @param String $endpoint URL of the notification handler
|
||||||
|
* @param String $feed the feed being subscribed to
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
function challenge($endpoint, $feed)
|
function challenge($endpoint, $feed)
|
||||||
{
|
{
|
||||||
$code = common_confirmation_code(128);
|
$code = common_confirmation_code(128);
|
||||||
|
@ -60,7 +79,7 @@ class RSSCloudNotifier {
|
||||||
// NOTE: the spec says that the body must contain the string
|
// NOTE: the spec says that the body must contain the string
|
||||||
// challenge. It doesn't say that the body must contain the
|
// challenge. It doesn't say that the body must contain the
|
||||||
// challenge string ONLY, although that seems to be the way
|
// challenge string ONLY, although that seems to be the way
|
||||||
// the other implementations have interpreted it.
|
// the other implementors have interpreted it.
|
||||||
|
|
||||||
if (strpos($body, $code) !== false) {
|
if (strpos($body, $code) !== false) {
|
||||||
common_log(LOG_INFO, 'RSSCloud plugin - ' .
|
common_log(LOG_INFO, 'RSSCloud plugin - ' .
|
||||||
|
@ -82,6 +101,15 @@ class RSSCloudNotifier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HTTP POST a notification that a feed has been updated
|
||||||
|
* ('ping the cloud').
|
||||||
|
*
|
||||||
|
* @param String $endpoint URL of the notification handler
|
||||||
|
* @param String $feed the feed being subscribed to
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
function postUpdate($endpoint, $feed) {
|
function postUpdate($endpoint, $feed) {
|
||||||
|
|
||||||
$headers = array();
|
$headers = array();
|
||||||
|
@ -111,6 +139,14 @@ class RSSCloudNotifier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify all subscribers to a profile feed that it has changed.
|
||||||
|
*
|
||||||
|
* @param Profile $profile the profile whose feed has been
|
||||||
|
* updated
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
function notify($profile)
|
function notify($profile)
|
||||||
{
|
{
|
||||||
$feed = common_path('api/statuses/user_timeline/') .
|
$feed = common_path('api/statuses/user_timeline/') .
|
||||||
|
@ -131,6 +167,18 @@ class RSSCloudNotifier {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle problems posting cloud notifications. Increment the failure
|
||||||
|
* count, or delete the subscription if the maximum number of failures
|
||||||
|
* is exceeded.
|
||||||
|
*
|
||||||
|
* XXX: Redo with proper DB_DataObject methods once I figure out what
|
||||||
|
* what the problem is with pluginized DB_DataObjects. -Z
|
||||||
|
*
|
||||||
|
* @param RSSCloudSubscription $cloudSub the subscription in question
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
function handleFailure($cloudSub)
|
function handleFailure($cloudSub)
|
||||||
{
|
{
|
||||||
$failCnt = $cloudSub->failures + 1;
|
$failCnt = $cloudSub->failures + 1;
|
||||||
|
@ -172,8 +220,6 @@ class RSSCloudNotifier {
|
||||||
' WHERE subscribed = ' . $cloudSub->subscribed .
|
' WHERE subscribed = ' . $cloudSub->subscribed .
|
||||||
' AND url = \'' . $cloudSub->url . '\'';
|
' AND url = \'' . $cloudSub->url . '\'';
|
||||||
|
|
||||||
common_debug($qry);
|
|
||||||
|
|
||||||
$result = $cloudSub->query($qry);
|
$result = $cloudSub->query($qry);
|
||||||
|
|
||||||
if (!$result) {
|
if (!$result) {
|
||||||
|
|
|
@ -31,15 +31,35 @@ if (!defined('STATUSNET')) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
define('RSSCLOUDPLUGIN_VERSION', '0.1');
|
/**
|
||||||
|
* Plugin class for adding RSSCloud capabilities to StatusNet
|
||||||
|
*
|
||||||
|
* @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/
|
||||||
|
**/
|
||||||
|
|
||||||
class RSSCloudPlugin extends Plugin
|
class RSSCloudPlugin extends Plugin
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Our friend, the constructor
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
function __construct()
|
function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup the info for the subscription handler. Allow overriding
|
||||||
|
* to point at another cloud hub (not currently used).
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
|
||||||
function onInitializePlugin()
|
function onInitializePlugin()
|
||||||
{
|
{
|
||||||
$this->domain = common_config('rsscloud', 'domain');
|
$this->domain = common_config('rsscloud', 'domain');
|
||||||
|
@ -91,6 +111,16 @@ class RSSCloudPlugin extends Plugin
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Automatically load the actions and libraries used by
|
||||||
|
* the RSSCloud plugin
|
||||||
|
*
|
||||||
|
* @param Class $cls the class
|
||||||
|
*
|
||||||
|
* @return boolean hook return
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
function onAutoload($cls)
|
function onAutoload($cls)
|
||||||
{
|
{
|
||||||
switch ($cls)
|
switch ($cls)
|
||||||
|
@ -110,10 +140,17 @@ class RSSCloudPlugin extends Plugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a <cloud> element to the RSS feed (after the rss <channel>
|
||||||
|
* element is started).
|
||||||
|
*
|
||||||
|
* @param Action $action
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
|
||||||
function onStartApiRss($action)
|
function onStartApiRss($action)
|
||||||
{
|
{
|
||||||
// XXX: Add RSS 1.0 user feeds
|
|
||||||
|
|
||||||
if (get_class($action) == 'ApiTimelineUserAction') {
|
if (get_class($action) == 'ApiTimelineUserAction') {
|
||||||
|
|
||||||
$attrs = array('domain' => $this->domain,
|
$attrs = array('domain' => $this->domain,
|
||||||
|
@ -141,6 +178,7 @@ class RSSCloudPlugin extends Plugin
|
||||||
*
|
*
|
||||||
* @return boolean hook return
|
* @return boolean hook return
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function onStartEnqueueNotice($notice, &$transports)
|
function onStartEnqueueNotice($notice, &$transports)
|
||||||
{
|
{
|
||||||
array_push($transports, 'rsscloud');
|
array_push($transports, 'rsscloud');
|
||||||
|
@ -155,6 +193,7 @@ class RSSCloudPlugin extends Plugin
|
||||||
*
|
*
|
||||||
* @return boolean hook return
|
* @return boolean hook return
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function onUnqueueHandleNotice(&$notice, $queue)
|
function onUnqueueHandleNotice(&$notice, $queue)
|
||||||
{
|
{
|
||||||
if (($queue == 'rsscloud') && ($this->_isLocal($notice))) {
|
if (($queue == 'rsscloud') && ($this->_isLocal($notice))) {
|
||||||
|
@ -179,12 +218,20 @@ class RSSCloudPlugin extends Plugin
|
||||||
*
|
*
|
||||||
* @return boolean locality
|
* @return boolean locality
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function _isLocal($notice)
|
function _isLocal($notice)
|
||||||
{
|
{
|
||||||
return ($notice->is_local == Notice::LOCAL_PUBLIC ||
|
return ($notice->is_local == Notice::LOCAL_PUBLIC ||
|
||||||
$notice->is_local == Notice::LOCAL_NONPUBLIC);
|
$notice->is_local == Notice::LOCAL_NONPUBLIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the rsscloud_subscription table if it's not
|
||||||
|
* already in the DB
|
||||||
|
*
|
||||||
|
* @return boolean hook return
|
||||||
|
*/
|
||||||
|
|
||||||
function onCheckSchema() {
|
function onCheckSchema() {
|
||||||
$schema = Schema::get();
|
$schema = Schema::get();
|
||||||
$schema->ensureTable('rsscloud_subscription',
|
$schema->ensureTable('rsscloud_subscription',
|
||||||
|
@ -205,6 +252,16 @@ class RSSCloudPlugin extends Plugin
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add RSSCloudQueueHandler to the list of valid daemons to
|
||||||
|
* start
|
||||||
|
*
|
||||||
|
* @param array $daemons the list of daemons to run
|
||||||
|
*
|
||||||
|
* @return boolean hook return
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
function onGetValidDaemons($daemons)
|
function onGetValidDaemons($daemons)
|
||||||
{
|
{
|
||||||
array_push($daemons, INSTALLDIR .
|
array_push($daemons, INSTALLDIR .
|
||||||
|
|
|
@ -32,6 +32,16 @@ if (!defined('STATUSNET')) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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/
|
||||||
|
**/
|
||||||
|
|
||||||
class RSSCloudRequestNotifyAction extends Action
|
class RSSCloudRequestNotifyAction extends Action
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -41,6 +51,7 @@ class RSSCloudRequestNotifyAction extends Action
|
||||||
*
|
*
|
||||||
* @return boolean false if user doesn't exist
|
* @return boolean false if user doesn't exist
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function prepare($args)
|
function prepare($args)
|
||||||
{
|
{
|
||||||
parent::prepare($args);
|
parent::prepare($args);
|
||||||
|
@ -62,6 +73,18 @@ class RSSCloudRequestNotifyAction extends Action
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
function handle($args)
|
function handle($args)
|
||||||
{
|
{
|
||||||
parent::handle($args);
|
parent::handle($args);
|
||||||
|
@ -137,6 +160,15 @@ class RSSCloudRequestNotifyAction extends Action
|
||||||
$this->showResult(true, $msg);
|
$this->showResult(true, $msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate that the requested feed is one we serve
|
||||||
|
* up via RSSCloud.
|
||||||
|
*
|
||||||
|
* @param string $feed the feed in question
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
|
||||||
function validateFeed($feed)
|
function validateFeed($feed)
|
||||||
{
|
{
|
||||||
$user = $this->userFromFeed($feed);
|
$user = $this->userFromFeed($feed);
|
||||||
|
@ -148,6 +180,13 @@ class RSSCloudRequestNotifyAction extends Action
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pull all of the urls (url1, url2, url3...urlN) that
|
||||||
|
* the subscriber wants to subscribe to.
|
||||||
|
*
|
||||||
|
* @return array $feeds the list of feeds
|
||||||
|
*/
|
||||||
|
|
||||||
function getFeeds()
|
function getFeeds()
|
||||||
{
|
{
|
||||||
$feeds = array();
|
$feeds = array();
|
||||||
|
@ -161,6 +200,15 @@ class RSSCloudRequestNotifyAction extends Action
|
||||||
return $feeds;
|
return $feeds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
function testNotificationHandler($feed)
|
function testNotificationHandler($feed)
|
||||||
{
|
{
|
||||||
common_debug("RSSCloudPlugin - testNotificationHandler()");
|
common_debug("RSSCloudPlugin - testNotificationHandler()");
|
||||||
|
@ -185,6 +233,13 @@ class RSSCloudRequestNotifyAction extends Action
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build the URL for the notification handler based on the
|
||||||
|
* parameters passed in with the subscription request.
|
||||||
|
*
|
||||||
|
* @return string notification handler url
|
||||||
|
*/
|
||||||
|
|
||||||
function getNotifyUrl()
|
function getNotifyUrl()
|
||||||
{
|
{
|
||||||
if (isset($this->domain)) {
|
if (isset($this->domain)) {
|
||||||
|
@ -194,12 +249,20 @@ class RSSCloudRequestNotifyAction extends Action
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
function userFromFeed($feed)
|
function userFromFeed($feed)
|
||||||
{
|
{
|
||||||
// We only do profile feeds
|
// We only do profile feeds
|
||||||
|
|
||||||
// XXX: Add cloud element to RSS 1.0 feeds?
|
|
||||||
|
|
||||||
$path = common_path('api/statuses/user_timeline/');
|
$path = common_path('api/statuses/user_timeline/');
|
||||||
$valid = '%^' . $path . '(?<nickname>.*)\.rss$%';
|
$valid = '%^' . $path . '(?<nickname>.*)\.rss$%';
|
||||||
|
|
||||||
|
@ -213,6 +276,14 @@ class RSSCloudRequestNotifyAction extends Action
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save an RSSCloud subscription
|
||||||
|
*
|
||||||
|
* @param $feed a valid profile feed
|
||||||
|
*
|
||||||
|
* @return boolean success result
|
||||||
|
*/
|
||||||
|
|
||||||
function saveSubscription($feed)
|
function saveSubscription($feed)
|
||||||
{
|
{
|
||||||
$user = $this->userFromFeed($feed);
|
$user = $this->userFromFeed($feed);
|
||||||
|
@ -241,6 +312,16 @@ class RSSCloudRequestNotifyAction extends Action
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
function showResult($success, $msg)
|
function showResult($success, $msg)
|
||||||
{
|
{
|
||||||
$this->startXML();
|
$this->startXML();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user