]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/OStatus/actions/pushcallback.php
OStatus: garbage collect unused PuSH subscriptions when the last local subscriber...
[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         parent::handle();
33         if ($_SERVER['REQUEST_METHOD'] == 'POST') {
34             $this->handlePost();
35         } else {
36             $this->handleGet();
37         }
38     }
39     
40     /**
41      * Handler for POST content updates from the hub
42      */
43     function handlePost()
44     {
45         $feedid = $this->arg('feed');
46         common_log(LOG_INFO, "POST for feed id $feedid");
47         if (!$feedid) {
48             throw new ServerException('Empty or invalid feed id', 400);
49         }
50
51         $feedinfo = Feedinfo::staticGet('id', $feedid);
52         if (!$feedinfo) {
53             throw new ServerException('Unknown feed id ' . $feedid, 400);
54         }
55
56         $hmac = '';
57         if (isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) {
58             $hmac = $_SERVER['HTTP_X_HUB_SIGNATURE'];
59         }
60
61         $post = file_get_contents('php://input');
62         $feedinfo->postUpdates($post, $hmac);
63     }
64     
65     /**
66      * Handler for GET verification requests from the hub
67      */
68     function handleGet()
69     {
70         $mode = $this->arg('hub_mode');
71         $topic = $this->arg('hub_topic');
72         $challenge = $this->arg('hub_challenge');
73         $lease_seconds = $this->arg('hub_lease_seconds');
74         $verify_token = $this->arg('hub_verify_token');
75         
76         if ($mode != 'subscribe' && $mode != 'unsubscribe') {
77             common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with mode \"$mode\"");
78             throw new ServerException("Bogus hub callback: bad mode", 404);
79         }
80         
81         $feedinfo = Feedinfo::staticGet('feeduri', $topic);
82         if (!$feedinfo) {
83             common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback for unknown feed $topic");
84             throw new ServerException("Bogus hub callback: unknown feed", 404);
85         }
86
87         # Can't currently set the token in our sub api
88         #if ($feedinfo->verify_token !== $verify_token) {
89         #    common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad token \"$verify_token\" for feed $topic");
90         #    throw new ServerError("Bogus hub callback: bad token", 404);
91         #}
92         
93         // OK!
94         if ($mode == 'subscribe') {
95             common_log(LOG_INFO, __METHOD__ . ': sub confirmed');
96             $feedinfo->sub_start = common_sql_date(time());
97             if ($lease_seconds > 0) {
98                 $feedinfo->sub_end = common_sql_date(time() + $lease_seconds);
99             } else {
100                 $feedinfo->sub_end = null;
101             }
102             $feedinfo->update();
103         } else {
104             common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic");
105             $feedinfo->delete();
106         }
107
108         print $challenge;
109     }
110 }