X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FOStatus%2Factions%2Fpushcallback.php;h=9b83d43c4ddd7528fc41aedc5c728895c3b4a65b;hb=69b13cb279d7b60cb3a7beb9ad39cfe3a3b7745b;hp=2601a377a0bdf2d5b32246a05d3e43cc9dfb6686;hpb=bc46621af2bea8d2f9f132f275c70c5964f880b4;p=quix0rs-gnu-social.git diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index 2601a377a0..9b83d43c4d 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -22,13 +22,15 @@ * @maintainer Brion Vibber */ -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } - +if (!defined('STATUSNET')) { + exit(1); +} class PushCallbackAction extends Action { function handle() { + StatusNet::setApi(true); // Minimize error messages to aid in debugging parent::handle(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $this->handlePost(); @@ -36,7 +38,7 @@ class PushCallbackAction extends Action $this->handleGet(); } } - + /** * Handler for POST content updates from the hub */ @@ -45,12 +47,13 @@ class PushCallbackAction extends Action $feedid = $this->arg('feed'); common_log(LOG_INFO, "POST for feed id $feedid"); if (!$feedid) { - throw new ServerException('Empty or invalid feed id', 400); + throw new ServerException(_m('Empty or invalid feed id.'), 400); } - $profile = Ostatus_profile::staticGet('id', $feedid); - if (!$profile) { - throw new ServerException('Unknown OStatus/PuSH feed id ' . $feedid, 400); + $feedsub = FeedSub::staticGet('id', $feedid); + if (!$feedsub) { + // TRANS: Server exception. %s is a feed ID. + throw new ServerException(sprintf(_m('Unknown PuSH feed id %s'),$feedid), 400); } $hmac = ''; @@ -59,11 +62,19 @@ class PushCallbackAction extends Action } $post = file_get_contents('php://input'); - $profile->postUpdates($post, $hmac); + + // Queue this to a background process; we should return + // as quickly as possible from a distribution POST. + // If queues are disabled this'll process immediately. + $data = array('feedsub_id' => $feedsub->id, + 'post' => $post, + 'hmac' => $hmac); + $qm = QueueManager::get(); + $qm->enqueue($data, 'pushin'); } - + /** - * Handler for GET verification requests from the hub + * Handler for GET verification requests from the hub. */ function handleGet() { @@ -72,35 +83,47 @@ class PushCallbackAction extends Action $challenge = $this->arg('hub_challenge'); $lease_seconds = $this->arg('hub_lease_seconds'); $verify_token = $this->arg('hub_verify_token'); - + common_log(LOG_INFO, __METHOD__ . ": sub verification mode: $mode topic: $topic challenge: $challenge lease_seconds: $lease_seconds verify_token: $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); + // TRANS: Client exception. %s is an invalid value for hub.mode. + throw new ClientException(sprintf(_m('Bad hub.mode "$s".',$mode)), 404); } - - $profile = Ostatus_profile::staticGet('feeduri', $topic); - if (!$profile) { - common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback for unknown feed $topic"); - throw new ServerException("Bogus hub callback: unknown feed", 404); + + $feedsub = FeedSub::staticGet('uri', $topic); + if (!$feedsub) { + // TRANS: Client exception. %s is an invalid feed name. + throw new ClientException(sprintf(_m('Bad hub.topic feed "%s".'),$topic), 404); } - if ($profile->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); + if ($feedsub->verify_token !== $verify_token) { + // TRANS: Client exception. %1$s the invalid token, %2$s is the topic for which the invalid token was given. + throw new ClientException(sprintf(_m('Bad hub.verify_token %1$s for %2$s.'),$token,$topic), 404); } - if ($mode != $profile->sub_state) { - common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad mode \"$mode\" for feed $topic in state \"{$profile->sub_state}\""); - throw new ServerException("Bogus hub callback: mode doesn't match subscription state.", 404); + if ($mode == 'subscribe') { + // We may get re-sub requests legitimately. + if ($feedsub->sub_state != 'subscribe' && $feedsub->sub_state != 'active') { + // TRANS: Client exception. %s is an invalid topic. + throw new ClientException(sprintf(_m('Unexpected subscribe request for %s.'),$topic), 404); + } + } else { + if ($feedsub->sub_state != 'unsubscribe') { + // TRANS: Client exception. %s is an invalid topic. + throw new ClientException(sprintf(_m('Unexpected unsubscribe request for %s.'),$topic), 404); + } } - // OK! if ($mode == 'subscribe') { - common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); - $profile->confirmSubscribe($lease_seconds); + if ($feedsub->sub_state == 'active') { + common_log(LOG_INFO, __METHOD__ . ': sub update confirmed'); + } else { + common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); + } + $feedsub->confirmSubscribe($lease_seconds); } else { common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic"); - $profile->confirmUnsubscribe(); + $feedsub->confirmUnsubscribe(); } print $challenge; }