summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrion Vibber <brion@pobox.com>2010-02-11 00:09:20 +0000
committerBrion Vibber <brion@pobox.com>2010-02-11 00:09:20 +0000
commit71151b2583d81e28c5f5d42a690c649f4e84f3bf (patch)
tree4b2461f04a0ee9ec4f4b25677186403657a58c3e
parent4ae760cb62657e68b6b2313e64d2bb59fe264df4 (diff)
OStatus: garbage collect unused PuSH subscriptions when the last local subscriber unsubs
-rw-r--r--plugins/OStatus/OStatusPlugin.php23
-rw-r--r--plugins/OStatus/actions/pushcallback.php19
-rw-r--r--plugins/OStatus/classes/Feedinfo.php22
3 files changed, 48 insertions, 16 deletions
diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php
index 4b9b4d2c3..ce02393e4 100644
--- a/plugins/OStatus/OStatusPlugin.php
+++ b/plugins/OStatus/OStatusPlugin.php
@@ -234,13 +234,30 @@ class OStatusPlugin extends Plugin
}
}
+
+ /**
+ * Garbage collect unused feeds on unsubscribe
+ */
+ function onEndUnsubscribe($user, $other)
+ {
+ $feed = Feedinfo::staticGet('profile_id', $other->id);
+ if ($feed) {
+ $sub = new Subscription();
+ $sub->subscribed = $other->id;
+ $sub->limit(1);
+ if (!$sub->find(true)) {
+ common_log(LOG_INFO, "Unsubscribing from now-unused feed $feed->feeduri on hub $feed->huburi");
+ $feed->unsubscribe();
+ }
+ }
+ return true;
+ }
+
function onCheckSchema() {
- // warning: the autoincrement doesn't seem to set.
- // alter table feedinfo change column id id int(11) not null auto_increment;
$schema = Schema::get();
$schema->ensureTable('feedinfo', Feedinfo::schemaDef());
$schema->ensureTable('hubsub', HubSub::schemaDef());
return true;
- }
+ }
}
diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php
index a5e02e08f..471d079ab 100644
--- a/plugins/OStatus/actions/pushcallback.php
+++ b/plugins/OStatus/actions/pushcallback.php
@@ -91,15 +91,20 @@ class PushCallbackAction extends Action
#}
// OK!
- common_log(LOG_INFO, __METHOD__ . ': sub confirmed');
- $feedinfo->sub_start = common_sql_date(time());
- if ($lease_seconds > 0) {
- $feedinfo->sub_end = common_sql_date(time() + $lease_seconds);
+ if ($mode == 'subscribe') {
+ common_log(LOG_INFO, __METHOD__ . ': sub confirmed');
+ $feedinfo->sub_start = common_sql_date(time());
+ if ($lease_seconds > 0) {
+ $feedinfo->sub_end = common_sql_date(time() + $lease_seconds);
+ } else {
+ $feedinfo->sub_end = null;
+ }
+ $feedinfo->update();
} else {
- $feedinfo->sub_end = null;
+ common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic");
+ $feedinfo->delete();
}
- $feedinfo->update();
-
+
print $challenge;
}
}
diff --git a/plugins/OStatus/classes/Feedinfo.php b/plugins/OStatus/classes/Feedinfo.php
index 2344a4a0e..d3cccd42f 100644
--- a/plugins/OStatus/classes/Feedinfo.php
+++ b/plugins/OStatus/classes/Feedinfo.php
@@ -112,9 +112,9 @@ class Feedinfo extends Memcached_DataObject
/*extra*/ null,
/*auto_increment*/ true),
new ColumnDef('profile_id', 'integer',
- null, true),
+ null, true, 'UNI'),
new ColumnDef('group_id', 'integer',
- null, true),
+ null, true, 'UNI'),
new ColumnDef('feeduri', 'varchar',
255, false, 'UNI'),
new ColumnDef('homeuri', 'varchar',
@@ -160,7 +160,7 @@ class Feedinfo extends Memcached_DataObject
function keyTypes()
{
- return array('id' => 'K', 'feeduri' => 'U'); // @fixme we'll need a profile_id key at least
+ return array('id' => 'K', 'profile_id' => 'U', 'group_id' => 'U', 'feeduri' => 'U');
}
function sequenceKey()
@@ -261,11 +261,11 @@ class Feedinfo extends Memcached_DataObject
/**
* Send a subscription request to the hub for this feed.
- * The hub will later send us a confirmation POST to /feedsub/callback.
+ * The hub will later send us a confirmation POST to /main/push/callback.
*
* @return bool true on success, false on failure
*/
- public function subscribe()
+ public function subscribe($mode='subscribe')
{
if (common_config('feedsub', 'nohub')) {
// Fake it! We're just testing remote feeds w/o hubs.
@@ -278,7 +278,7 @@ class Feedinfo extends Memcached_DataObject
try {
$callback = common_local_url('pushcallback', array('feed' => $this->id));
$headers = array('Content-Type: application/x-www-form-urlencoded');
- $post = array('hub.mode' => 'subscribe',
+ $post = array('hub.mode' => $mode,
'hub.callback' => $callback,
'hub.verify' => 'async',
'hub.verify_token' => $this->verify_token,
@@ -309,6 +309,16 @@ class Feedinfo extends Memcached_DataObject
}
/**
+ * Send an unsubscription request to the hub for this feed.
+ * The hub will later send us a confirmation POST to /main/push/callback.
+ *
+ * @return bool true on success, false on failure
+ */
+ public function unsubscribe() {
+ return $this->subscribe('unsubscribe');
+ }
+
+ /**
* Read and post notices for updates from the feed.
* Currently assumes that all items in the feed are new,
* coming from a PuSH hub.