. */ /** * @package FeedSubPlugin * @maintainer Brion Vibber */ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } class PushCallbackAction extends Action { function handle() { parent::handle(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $this->handlePost(); } else { $this->handleGet(); } } /** * Handler for POST content updates from the hub */ function handlePost() { $feedid = $this->arg('feed'); common_log(LOG_INFO, "POST for feed id $feedid"); if (!$feedid) { throw new ServerException('Empty or invalid feed id', 400); } $feedinfo = Feedinfo::staticGet('id', $feedid); if (!$feedinfo) { throw new ServerException('Unknown feed id ' . $feedid, 400); } $hmac = ''; if (isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) { $hmac = $_SERVER['HTTP_X_HUB_SIGNATURE']; } $post = file_get_contents('php://input'); $feedinfo->postUpdates($post, $hmac); } /** * Handler for GET verification requests from the hub */ function handleGet() { $mode = $this->arg('hub_mode'); $topic = $this->arg('hub_topic'); $challenge = $this->arg('hub_challenge'); $lease_seconds = $this->arg('hub_lease_seconds'); $verify_token = $this->arg('hub_verify_token'); if ($mode != 'subscribe' && $mode != 'unsubscribe') { common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with mode \"$mode\""); throw new ServerException("Bogus hub callback: bad mode", 404); } $feedinfo = Feedinfo::staticGet('feeduri', $topic); if (!$feedinfo) { common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback for unknown feed $topic"); throw new ServerException("Bogus hub callback: unknown feed", 404); } # Can't currently set the token in our sub api #if ($feedinfo->verify_token !== $verify_token) { # common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad token \"$verify_token\" for feed $topic"); # throw new ServerError("Bogus hub callback: bad token", 404); #} // 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); } else { $feedinfo->sub_end = null; } $feedinfo->update(); print $challenge; } }