aboutsummaryrefslogtreecommitdiffstats
path: root/mod/pubsub.php
diff options
context:
space:
mode:
authorMike Macgirvin <mike@macgirvin.com>2010-09-30 19:41:22 -0700
committerMike Macgirvin <mike@macgirvin.com>2010-09-30 19:41:22 -0700
commitabe6a3286e80359d03a9f45ee86657bf84a47ac2 (patch)
tree812117e547a6dc41b5f34922fd66c2920064f196 /mod/pubsub.php
parent7ad27f5737b4c3dc800c8a707a3010ec33672389 (diff)
downloadvolse-hubzilla-abe6a3286e80359d03a9f45ee86657bf84a47ac2.tar.gz
volse-hubzilla-abe6a3286e80359d03a9f45ee86657bf84a47ac2.tar.bz2
volse-hubzilla-abe6a3286e80359d03a9f45ee86657bf84a47ac2.zip
pubsubhubbub endpoint
Diffstat (limited to 'mod/pubsub.php')
-rw-r--r--mod/pubsub.php112
1 files changed, 112 insertions, 0 deletions
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();;
+
+}
+
+
+