]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/OStatus/actions/pushcallback.php
Merge branch '0.9.x' of git@gitorious.org:statusnet/mainline into 0.9.x
[quix0rs-gnu-social.git] / plugins / OStatus / actions / pushcallback.php
1 <?php
2 /*
3  * StatusNet - the distributed open-source microblogging tool
4  * Copyright (C) 2009, StatusNet, Inc.
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 /**
21  * @package FeedSubPlugin
22  * @maintainer Brion Vibber <brion@status.net>
23  */
24
25 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
26
27
28 class PushCallbackAction extends Action
29 {
30     function handle()
31     {
32         StatusNet::setApi(true); // Minimize error messages to aid in debugging
33         parent::handle();
34         if ($_SERVER['REQUEST_METHOD'] == 'POST') {
35             $this->handlePost();
36         } else {
37             $this->handleGet();
38         }
39     }
40     
41     /**
42      * Handler for POST content updates from the hub
43      */
44     function handlePost()
45     {
46         $feedid = $this->arg('feed');
47         common_log(LOG_INFO, "POST for feed id $feedid");
48         if (!$feedid) {
49             throw new ServerException('Empty or invalid feed id', 400);
50         }
51
52         $feedsub = FeedSub::staticGet('id', $feedid);
53         if (!$feedsub) {
54             throw new ServerException('Unknown PuSH feed id ' . $feedid, 400);
55         }
56
57         $hmac = '';
58         if (isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) {
59             $hmac = $_SERVER['HTTP_X_HUB_SIGNATURE'];
60         }
61
62         $post = file_get_contents('php://input');
63
64         // Queue this to a background process; we should return
65         // as quickly as possible from a distribution POST.
66         // If queues are disabled this'll process immediately.
67         $data = array('feedsub_id' => $feedsub->id,
68                       'post' => $post,
69                       'hmac' => $hmac);
70         $qm = QueueManager::get();
71         $qm->enqueue($data, 'pushin');
72     }
73     
74     /**
75      * Handler for GET verification requests from the hub.
76      */
77     function handleGet()
78     {
79         $mode = $this->arg('hub_mode');
80         $topic = $this->arg('hub_topic');
81         $challenge = $this->arg('hub_challenge');
82         $lease_seconds = $this->arg('hub_lease_seconds');
83         $verify_token = $this->arg('hub_verify_token');
84
85         if ($mode != 'subscribe' && $mode != 'unsubscribe') {
86             throw new ClientException("Bad hub.mode $mode", 404);
87         }
88
89         $feedsub = FeedSub::staticGet('uri', $topic);
90         if (!$feedsub) {
91             throw new ClientException("Bad hub.topic feed $topic", 404);
92         }
93
94         if ($feedsub->verify_token !== $verify_token) {
95             throw new ClientException("Bad hub.verify_token $token for $topic", 404);
96         }
97
98         if ($mode == 'subscribe') {
99             // We may get re-sub requests legitimately.
100             if ($feedsub->sub_state != 'subscribe' && $feedsub->sub_state != 'active') {
101                 throw new ClientException("Unexpected subscribe request for $topic.", 404);
102             }
103         } else {
104             if ($feedsub->sub_state != 'unsubscribe') {
105                 throw new ClientException("Unexpected unsubscribe request for $topic.", 404);
106             }
107         }
108
109         if ($mode == 'subscribe') {
110             if ($feedsub->sub_state == 'active') {
111                 common_log(LOG_INFO, __METHOD__ . ': sub update confirmed');
112             } else {
113                 common_log(LOG_INFO, __METHOD__ . ': sub confirmed');
114             }
115             $feedsub->confirmSubscribe($lease_seconds);
116         } else {
117             common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic");
118             $feedsub->confirmUnsubscribe();
119         }
120         print $challenge;
121     }
122 }