]> git.mxchange.org Git - friendica.git/blob - include/pubsubpublish.php
7c70059f90fd1a151f06b03d0ffe5e8cdcdce468
[friendica.git] / include / pubsubpublish.php
1 <?php
2
3 use Friendica\App;
4 use Friendica\Core\Config;
5
6 require_once('include/items.php');
7 require_once('include/ostatus.php');
8
9 function pubsubpublish_run(&$argv, &$argc){
10
11         if ($argc > 1) {
12                 $pubsubpublish_id = intval($argv[1]);
13         } else {
14                 // Inherit the creation time
15                 $queue = dba::select('workerqueue', array('created'), array('pid' => getmypid()), array('limit' => 1));
16                 if (dbm::is_result($queue)) {
17                         $process_created = $queue['created'];
18                 } else {
19                         // Normally this shouldn't happen.
20                         $process_created = datetime_convert();
21                         logger('no inherited priority! Something is wrong.');
22                 }
23
24                 // We'll push to each subscriber that has push > 0,
25                 // i.e. there has been an update (set in notifier.php).
26                 $r = q("SELECT `id`, `callback_url` FROM `push_subscriber` WHERE `push` > 0");
27
28                 foreach ($r as $rr) {
29                         logger("Publish feed to ".$rr["callback_url"], LOGGER_DEBUG);
30                         proc_run(array('priority' => PRIORITY_HIGH, 'created' => $process_created, 'dont_fork' => true),
31                                         'include/pubsubpublish.php', $rr["id"]);
32                 }
33         }
34
35         handle_pubsubhubbub($pubsubpublish_id);
36
37         return;
38 }
39
40 function handle_pubsubhubbub($id) {
41         global $a;
42
43         $r = q("SELECT * FROM `push_subscriber` WHERE `id` = %d", intval($id));
44         if (!dbm::is_result($r)) {
45                 return;
46         }
47
48         $rr = $r[0];
49
50         /// @todo Check server status with poco_check_server()
51         // Before this can be done we need a way to safely detect the server url.
52
53         logger("Generate feed of user ".$rr['nickname']." to ".$rr['callback_url']." - last updated ".$rr['last_update'], LOGGER_DEBUG);
54
55         $params = ostatus::feed($a, $rr['nickname'], $rr['last_update']);
56         $hmac_sig = hash_hmac("sha1", $params, $rr['secret']);
57
58         $headers = array("Content-type: application/atom+xml",
59                         sprintf("Link: <%s>;rel=hub,<%s>;rel=self",
60                                 App::get_baseurl().'/pubsubhubbub',
61                                 $rr['topic']),
62                         "X-Hub-Signature: sha1=".$hmac_sig);
63
64         logger('POST '.print_r($headers, true)."\n".$params, LOGGER_DEBUG);
65
66         post_url($rr['callback_url'], $params, $headers);
67         $ret = $a->get_curl_code();
68
69         if ($ret >= 200 && $ret <= 299) {
70                 logger('successfully pushed to '.$rr['callback_url']);
71
72                 // set last_update to "now", and reset push=0
73                 $date_now = datetime_convert('UTC','UTC','now','Y-m-d H:i:s');
74                 q("UPDATE `push_subscriber` SET `push` = 0, last_update = '%s' WHERE id = %d",
75                         dbesc($date_now),
76                         intval($rr['id']));
77
78         } else {
79                 logger('error when pushing to '.$rr['callback_url'].' HTTP: '.$ret);
80
81                 // we use the push variable also as a counter, if we failed we
82                 // increment this until some upper limit where we give up
83                 $new_push = intval($rr['push']) + 1;
84
85                 if ($new_push > 30) // OK, let's give up
86                         $new_push = 0;
87
88                 q("UPDATE `push_subscriber` SET `push` = %d WHERE id = %d",
89                         $new_push,
90                         intval($rr['id']));
91         }
92 }