aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--boot.php2
-rw-r--r--database.sql3
-rw-r--r--include/items.php234
-rw-r--r--include/poller.php239
-rw-r--r--mod/dfrn_confirm.php3
-rw-r--r--mod/pubsub.php112
-rw-r--r--update.php8
7 files changed, 363 insertions, 238 deletions
diff --git a/boot.php b/boot.php
index a264da2e6..9ebdef1bf 100644
--- a/boot.php
+++ b/boot.php
@@ -2,7 +2,7 @@
set_time_limit(0);
-define ( 'BUILD_ID' , 1003 );
+define ( 'BUILD_ID' , 1004 );
define ( 'EOL', "<br />\r\n");
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
diff --git a/database.sql b/database.sql
index 8f349ab21..fd709878d 100644
--- a/database.sql
+++ b/database.sql
@@ -61,7 +61,6 @@ CREATE TABLE IF NOT EXISTS `contact` (
`issued-id` char(255) NOT NULL,
`dfrn-id` char(255) NOT NULL,
`url` char(255) NOT NULL,
- `issued-pubkey` char(255) NOT NULL,
`pubkey` text NOT NULL,
`prvkey` text NOT NULL,
`request` text NOT NULL,
@@ -70,8 +69,6 @@ CREATE TABLE IF NOT EXISTS `contact` (
`confirm` text NOT NULL,
`aes_allow` tinyint(1) NOT NULL DEFAULT '0',
`ret-aes` tinyint(1) NOT NULL DEFAULT '0',
- `ret-id` char(255) NOT NULL,
- `ret-pubkey` text NOT NULL,
`last-update` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`name-date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`uri-date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
diff --git a/include/items.php b/include/items.php
index 42355cc3c..839baf4b6 100644
--- a/include/items.php
+++ b/include/items.php
@@ -570,3 +570,237 @@ function dfrn_deliver($contact,$atom,$debugging = false) {
return $res->status;
}
+
+
+function consume_feed($xml,$importer,$contact) {
+
+ require_once('simplepie/simplepie.inc');
+
+ $feed = new SimplePie();
+ $feed->set_raw_data($xml);
+ $feed->enable_order_by_date(false);
+ $feed->init();
+
+ // Check at the feed level for updated contact name and/or photo
+
+ $name_updated = '';
+ $new_name = '';
+ $photo_timestamp = '';
+ $photo_url = '';
+
+ $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
+ if($rawtags) {
+ $elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
+ if($elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']) {
+ $name_updated = $elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated'];
+ $new_name = $elems['name'][0]['data'];
+ }
+ if(($elems['link'][0]['attribs']['']['rel'] === 'photo') && ($elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated'])) {
+ $photo_timestamp = datetime_convert('UTC','UTC',$elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated']);
+ $photo_url = $elems['link'][0]['attribs']['']['href'];
+ }
+ }
+ if(! $photo_timestamp) {
+ $photo_rawupdate = $feed->get_feed_tags(NAMESPACE_DFRN,'icon-updated');
+ if($photo_rawupdate) {
+ $photo_timestamp = datetime_convert('UTC','UTC',$photo_rawupdate[0]['data']);
+ $photo_url = $feed->get_image_url();
+ }
+ }
+ if(($photo_timestamp) && (strlen($photo_url)) && ($photo_timestamp > $contact['avatar-date'])) {
+
+ require_once("Photo.php");
+ $photo_failure = false;
+
+ $r = q("SELECT `resource-id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d LIMIT 1",
+ intval($contact['id']),
+ intval($contact['uid'])
+ );
+ if(count($r)) {
+ $resource_id = $r[0]['resource-id'];
+ $img_str = fetch_url($photo_url,true);
+ $img = new Photo($img_str);
+ if($img) {
+ q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND contact-id` = %d AND `uid` = %d",
+ dbesc($resource_id),
+ intval($contact['id']),
+ intval($contact['uid'])
+ );
+
+ $img->scaleImageSquare(175);
+
+ $hash = $resource_id;
+ $r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), t('Contact Photos') , 4);
+
+ $img->scaleImage(80);
+ $r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), t('Contact Photos') , 5);
+ if($r)
+ q("UPDATE `contact` SET `avatar-date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ dbesc(datetime_convert()),
+ intval($contact['uid']),
+ intval($contact['id'])
+ );
+ }
+ }
+ }
+
+ if(($name_updated) && (strlen($new_name)) && ($name_updated > $contact['name-date'])) {
+ q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ dbesc(notags(trim($new_name))),
+ dbesc(datetime_convert()),
+ intval($contact['uid']),
+ intval($contact['id'])
+ );
+ }
+
+ // Now process the feed
+ if($feed->get_item_quantity()) {
+ foreach($feed->get_items() as $item) {
+
+ $deleted = false;
+
+ $rawdelete = $item->get_item_tags( NAMESPACE_TOMB, 'deleted-entry');
+ if(isset($rawdelete[0]['attribs']['']['ref'])) {
+ $uri = $rawthread[0]['attribs']['']['ref'];
+ $deleted = true;
+ if(isset($rawdelete[0]['attribs']['']['when'])) {
+ $when = $rawthread[0]['attribs']['']['when'];
+ $when = datetime_convert('UTC','UTC', $when, 'Y-m-d H:i:s');
+ }
+ else
+ $when = datetime_convert('UTC','UTC','now','Y-m-d H:i:s');
+ }
+ if($deleted) {
+ $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($uri),
+ intval($importer['uid'])
+ );
+ if(count($r)) {
+ $item = $r[0];
+ if($item['uri'] == $item['parent-uri']) {
+ $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
+ `body` = '', `title` = ''
+ WHERE `parent-uri` = '%s' AND `uid` = %d",
+ dbesc($when),
+ dbesc(datetime_convert()),
+ dbesc($item['uri']),
+ intval($importer['uid'])
+ );
+ }
+ else {
+ $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
+ `body` = '', `title` = ''
+ WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($when),
+ dbesc(datetime_convert()),
+ dbesc($uri),
+ intval($importer['uid'])
+ );
+ if($item['last-child']) {
+ // ensure that last-child is set in case the comment that had it just got wiped.
+ $q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d ",
+ dbesc(datetime_convert()),
+ dbesc($item['parent-uri']),
+ intval($item['uid'])
+ );
+ // who is the last child now?
+ $r = q("SELECT `id` FROM `item` WHERE `parent-uri` = '%s' AND `type` != 'activity' AND `deleted` = 0 AND `uid` = %d
+ ORDER BY `edited` DESC LIMIT 1",
+ dbesc($item['parent-uri']),
+ intval($importer['uid'])
+ );
+ if(count($r)) {
+ q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1",
+ intval($r[0]['id'])
+ );
+ }
+ }
+ }
+ }
+ continue;
+ }
+
+
+ $is_reply = false;
+ $item_id = $item->get_id();
+ $rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to');
+ if(isset($rawthread[0]['attribs']['']['ref'])) {
+ $is_reply = true;
+ $parent_uri = $rawthread[0]['attribs']['']['ref'];
+ }
+
+
+ if($is_reply) {
+
+ // Have we seen it? If not, import it.
+
+ $item_id = $item->get_id();
+
+ $r = q("SELECT `uid`, `last-child`, `edited` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($item_id),
+ intval($importer['uid'])
+ );
+ // FIXME update content if 'updated' changes
+ if(count($r)) {
+ $allow = $item->get_item_tags( NAMESPACE_DFRN, 'comment-allow');
+ if($allow && $allow[0]['data'] != $r[0]['last-child']) {
+ $r = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d",
+ dbesc(datetime_convert()),
+ dbesc($parent_uri),
+ intval($importer['uid'])
+ );
+ $r = q("UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ intval($allow[0]['data']),
+ dbesc(datetime_convert()),
+ dbesc($item_id),
+ intval($importer['uid'])
+ );
+
+ }
+ continue;
+ }
+ $datarray = get_atom_elements($item);
+ $datarray['parent-uri'] = $parent_uri;
+ $datarray['uid'] = $importer['uid'];
+ $datarray['contact-id'] = $contact['id'];
+ if(($datarray['verb'] == ACTIVITY_LIKE) || ($datarray['verb'] == ACTIVITY_DISLIKE)) {
+ $datarray['type'] = 'activity';
+ $datarray['gravity'] = GRAVITY_LIKE;
+ }
+
+ $r = item_store($datarray);
+ continue;
+ }
+
+ else {
+ // Head post of a conversation. Have we seen it? If not, import it.
+
+ $item_id = $item->get_id();
+ $r = q("SELECT `uid`, `last-child`, `edited` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($item_id),
+ intval($importer['uid'])
+ );
+ if(count($r)) {
+ $allow = $item->get_item_tags( NAMESPACE_DFRN, 'comment-allow');
+ if($allow && $allow[0]['data'] != $r[0]['last-child']) {
+ $r = q("UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ intval($allow[0]['data']),
+ dbesc(datetime_convert()),
+ dbesc($item_id),
+ intval($importer['uid'])
+ );
+ }
+ continue;
+ }
+ $datarray = get_atom_elements($item);
+ $datarray['parent-uri'] = $item_id;
+ $datarray['uid'] = $importer['uid'];
+ $datarray['contact-id'] = $contact['id'];
+ $r = item_store($datarray);
+ continue;
+
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/include/poller.php b/include/poller.php
index 6b0719b92..986c00913 100644
--- a/include/poller.php
+++ b/include/poller.php
@@ -23,7 +23,7 @@
$contacts = q("SELECT * FROM `contact`
WHERE ( `dfrn-id` != '' OR (`issued-id` != '' AND `duplex` = 1))
- AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 ORDER BY RAND()");
+ AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 AND `usehub` = 0 ORDER BY RAND()");
if(! count($contacts))
killme();
@@ -37,24 +37,24 @@
switch ($contact['priority']) {
case 5:
- if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', t . " + 1 month"))
+ if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 month"))
$update = true;
break;
case 4:
- if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', t . " + 1 week"))
+ if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 week"))
$update = true;
break;
case 3:
- if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', t . " + 1 day"))
+ if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
$update = true;
break;
case 2:
- if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', t . " + 12 hour"))
+ if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 12 hour"))
$update = true;
break;
case 1:
default:
- if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', t . " + 1 hour"))
+ if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 hour"))
$update = true;
break;
}
@@ -160,234 +160,9 @@
if(! strlen($xml))
continue;
- $feed = new SimplePie();
- $feed->set_raw_data($xml);
- $feed->enable_order_by_date(false);
- $feed->init();
-
- // Check at the feed level for updated contact name and/or photo
-
- $name_updated = '';
- $new_name = '';
- $photo_timestamp = '';
- $photo_url = '';
-
- $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, author);
- if($rawtags) {
- $elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
- if($elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']) {
- $name_updated = $elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated'];
- $new_name = $elems['name'][0]['data'];
- }
- if(($elems['link'][0]['attribs']['']['rel'] === 'photo') && ($elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated'])) {
- $photo_timestamp = datetime_convert('UTC','UTC',$elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated']);
- $photo_url = $elems['link'][0]['attribs']['']['href'];
- }
- }
- if(! $photo_timestamp) {
- $photo_rawupdate = $feed->get_feed_tags(NAMESPACE_DFRN,'icon-updated');
- if($photo_rawupdate) {
- $photo_timestamp = datetime_convert('UTC','UTC',$photo_rawupdate[0]['data']);
- $photo_url = $feed->get_image_url();
- }
- }
- if(($photo_timestamp) && (strlen($photo_url)) && ($photo_timestamp > $contact['avatar-date'])) {
-
- require_once("Photo.php");
- $photo_failure = false;
-
- $r = q("SELECT `resource-id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d LIMIT 1",
- intval($contact['id']),
- intval($contact['uid'])
- );
- if(count($r)) {
- $resource_id = $r[0]['resource-id'];
- $img_str = fetch_url($photo_url,true);
- $img = new Photo($img_str);
- if($img) {
- q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND contact-id` = %d AND `uid` = %d",
- dbesc($resource_id),
- intval($contact['id']),
- intval($contact['uid'])
- );
-
- $img->scaleImageSquare(175);
-
- $hash = $resource_id;
- $r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), t('Contact Photos') , 4);
-
- $img->scaleImage(80);
- $r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), t('Contact Photos') , 5);
- if($r)
- q("UPDATE `contact` SET `avatar-date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- intval($contact['uid']),
- intval($contact['id'])
- );
- }
- }
- }
- if(($name_updated) && (strlen($new_name)) && ($name_updated > $contact['name-date'])) {
- q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(notags(trim($new_name))),
- dbesc(datetime_convert()),
- intval($contact['uid']),
- intval($contact['id'])
- );
- }
+ consume_feed($xml,$importer,$contact);
- // Now process the feed
- if($feed->get_item_quantity()) {
- foreach($feed->get_items() as $item) {
-
- $deleted = false;
-
- $rawdelete = $item->get_item_tags( NAMESPACE_TOMB, 'deleted-entry');
- if(isset($rawdelete[0]['attribs']['']['ref'])) {
- $uri = $rawthread[0]['attribs']['']['ref'];
- $deleted = true;
- if(isset($rawdelete[0]['attribs']['']['when'])) {
- $when = $rawthread[0]['attribs']['']['when'];
- $when = datetime_convert('UTC','UTC', $when, 'Y-m-d H:i:s');
- }
- else
- $when = datetime_convert('UTC','UTC','now','Y-m-d H:i:s');
- }
- if($deleted) {
- $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($uri),
- intval($importer['uid'])
- );
- if(count($r)) {
- $item = $r[0];
- if($item['uri'] == $item['parent-uri']) {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
- `body` = '', `title` = ''
- WHERE `parent-uri` = '%s' AND `uid` = %d",
- dbesc($when),
- dbesc(datetime_convert()),
- dbesc($item['uri']),
- intval($importer['uid'])
- );
- }
- else {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
- `body` = '', `title` = ''
- WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($when),
- dbesc(datetime_convert()),
- dbesc($uri),
- intval($importer['uid'])
- );
- if($item['last-child']) {
- // ensure that last-child is set in case the comment that had it just got wiped.
- $q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d ",
- dbesc(datetime_convert()),
- dbesc($item['parent-uri']),
- intval($item['uid'])
- );
- // who is the last child now?
- $r = q("SELECT `id` FROM `item` WHERE `parent-uri` = '%s' AND `type` != 'activity' AND `deleted` = 0 AND `uid` = %d
- ORDER BY `edited` DESC LIMIT 1",
- dbesc($item['parent-uri']),
- intval($importer['uid'])
- );
- if(count($r)) {
- q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1",
- intval($r[0]['id'])
- );
- }
- }
- }
- }
- continue;
- }
-
-
- $is_reply = false;
- $item_id = $item->get_id();
- $rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to');
- if(isset($rawthread[0]['attribs']['']['ref'])) {
- $is_reply = true;
- $parent_uri = $rawthread[0]['attribs']['']['ref'];
- }
-
-
- if($is_reply) {
-
- // Have we seen it? If not, import it.
-
- $item_id = $item->get_id();
-
- $r = q("SELECT `uid`, `last-child`, `edited` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item_id),
- intval($importer['uid'])
- );
- // FIXME update content if 'updated' changes
- if(count($r)) {
- $allow = $item->get_item_tags( NAMESPACE_DFRN, 'comment-allow');
- if($allow && $allow[0]['data'] != $r[0]['last-child']) {
- $r = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d",
- dbesc(datetime_convert()),
- dbesc($parent_uri),
- intval($importer['uid'])
- );
- $r = q("UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- intval($allow[0]['data']),
- dbesc(datetime_convert()),
- dbesc($item_id),
- intval($importer['uid'])
- );
-
-
- }
- continue;
- }
- $datarray = get_atom_elements($item);
- $datarray['parent-uri'] = $parent_uri;
- $datarray['uid'] = $importer['uid'];
- $datarray['contact-id'] = $contact['id'];
- if(($datarray['verb'] == ACTIVITY_LIKE) || ($datarray['verb'] == ACTIVITY_DISLIKE)) {
- $datarray['type'] = 'activity';
- $datarray['gravity'] = GRAVITY_LIKE;
- }
-
- $r = item_store($datarray);
- continue;
- }
-
- else {
- // Head post of a conversation. Have we seen it? If not, import it.
-
- $item_id = $item->get_id();
- $r = q("SELECT `uid`, `last-child`, `edited` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item_id),
- intval($importer['uid'])
- );
- if(count($r)) {
- $allow = $item->get_item_tags( NAMESPACE_DFRN, 'comment-allow');
- if($allow && $allow[0]['data'] != $r[0]['last-child']) {
- $r = q("UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- intval($allow[0]['data']),
- dbesc(datetime_convert()),
- dbesc($item_id),
- intval($importer['uid'])
- );
- }
- continue;
- }
-
- $datarray = get_atom_elements($item);
- $datarray['parent-uri'] = $item_id;
- $datarray['uid'] = $importer['uid'];
- $datarray['contact-id'] = $contact['id'];
- $r = item_store($datarray);
- continue;
-
- }
- }
- }
$r = q("UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1",
dbesc(datetime_convert()),
intval($contact['id'])
diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php
index 584358507..5808b6fec 100644
--- a/mod/dfrn_confirm.php
+++ b/mod/dfrn_confirm.php
@@ -239,8 +239,7 @@ function dfrn_confirm_post(&$a) {
$pubkey = openssl_pkey_get_details($res);
$public_key = $pubkey["key"];
- $r = q("UPDATE `contact` SET `issued-pubkey` = '%s', `prvkey` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
- dbesc($public_key),
+ $r = q("UPDATE `contact` SET `prvkey` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
dbesc($private_key),
intval($contact_id),
intval($uid)
diff --git a/mod/pubsub.php b/mod/pubsub.php
new file mode 100644
index 000000000..3a3122d72
--- /dev/null
+++ b/mod/pubsub.php
@@ -0,0 +1,112 @@
+<?php
+
+function hub_return($valid,$body) {
+
+ if($valid) {
+ header($_SERVER["SERVER_PROTOCOL"] . ' 200 ' . 'OK');
+ echo $body;
+ killme();
+ }
+ else {
+ header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . 'Not Found');
+ killme();
+ }
+
+ // NOTREACHED
+}
+
+// when receiving an XML feed, always return OK
+
+function hub_post_return() {
+
+ header($_SERVER["SERVER_PROTOCOL"] . ' 200 ' . 'OK');
+ killme();
+
+}
+
+
+
+function pubsub_init(&$a) {
+
+ $nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : '');
+ $contact_id = (($a->argc > 2) ? intval($a->argv[2]) : 0);
+
+ if($_SERVER['REQUEST_METHOD'] === 'GET') {
+
+ $hub_mode = notags(trim($_GET['hub.mode']));
+ $hub_topic = notags(trim($_GET['hub.topic']));
+ $hub_challenge = notags(trim($_GET['hub.challenge']));
+ $hub_lease = notags(trim($_GET['hub.lease_seconds']));
+ $hub_verify = notags(trim($_GET['hub.verify_token']));
+
+ $subscribe = (($hub_mode === 'subscribe') ? 1 : 0);
+
+ $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' LIMIT 1",
+ dbesc($nick)
+ );
+ if(! count($r))
+ hub_return(false, '');
+
+ $owner = $r[0];
+
+ $sql_extra = ((strlen($hub_verify)) ? sprintf(" AND `hub-verify` = '%s' ", dbesc($hub_verify)) : '');
+
+ $r = q("SELECT * FROM `contact` WHERE `poll` = '%s' AND `id` = %d AND `uid` = %d AND `blocked` = 0 $sql_extra LIMIT 1",
+ dbesc($hub_topic),
+ intval($contact_id),
+ intval($owner['uid'])
+ );
+ if(! count($r))
+ hub_return(false, '');
+
+ $contact = $r[0];
+
+ // We must initiate an unsubscribe request with a verify_token.
+ // Don't allow outsiders to unsubscribe us.
+
+ if(($hub_mode === 'unsubscribe') && (! strlen($hub_verify)))
+ hub_return(false, '');
+
+ $r = q("UPDATE `contact` SET `usehub` = %d WHERE `id` = %d LIMIT 1",
+ intval($subscribe),
+ intval($contact['id'])
+ );
+
+ hub_return(true, $hub_challenge);
+
+ }
+}
+
+
+function pubsub_post(&$a) {
+
+ $xml = file_get_contents('php://input');
+
+ $nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : '');
+ $contact_id = (($a->argc > 2) ? intval($a->argv[2]) : 0);
+
+ $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' LIMIT 1",
+ dbesc($nick)
+ );
+ if(! count($r))
+ hub_post_return();
+
+ $importer = $r[0];
+
+ $r = q("SELECT * FROM `contact` WHERE `usehub` = 1 AND `id` = %d AND `uid` = %d AND `blocked` = 0 LIMIT 1",
+ intval($contact_id),
+ intval($importer['uid'])
+ );
+ if(! count($r))
+ hub_post_return();
+
+ $contact = $r[0];
+
+ consume_feed($xml,$importer,$contact);
+
+ hub_post_return();;
+
+}
+
+
+
diff --git a/update.php b/update.php
index 1fe58486b..6b0bc770e 100644
--- a/update.php
+++ b/update.php
@@ -22,3 +22,11 @@ function update_1001() {
function update_1002() {
q("ALTER TABLE `item` ADD `gravity` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `wall` ");
}
+
+function update_1003() {
+ q("ALTER TABLE `contact` DROP `issued-pubkey` , DROP `ret-id` , DROP `ret-pubkey` ");
+ q("ALTER TABLE `contact` ADD `usehub` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `ret-aes`");
+ q("ALTER TABLE `contact` ADD `hub-verify` CHAR( 255 ) NOT NULL AFTER `usehub`");
+ q("ALTER TABLE `contact` ADD INDEX ( `uid` ) , ADD INDEX ( `self` ), ADD INDEX ( `issued-id` ), ADD INDEX ( `dfrn-id` )");
+ q("ALTER TABLE `contact` ADD INDEX ( `blocked` ), ADD INDEX ( `readonly` )");
+} \ No newline at end of file