2017-11-19 18:36:20 +01:00
< ? php
/**
2020-02-09 16:18:46 +01:00
* @ copyright Copyright ( C ) 2020 , Friendica
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
2017-11-19 18:36:20 +01:00
*/
namespace Friendica\Worker ;
2018-10-29 22:20:46 +01:00
use Friendica\Core\Logger ;
2018-07-20 14:19:26 +02:00
use Friendica\Database\DBA ;
2019-12-30 23:00:08 +01:00
use Friendica\DI ;
2018-07-20 04:15:21 +02:00
use Friendica\Model\PushSubscriber ;
2017-11-19 18:36:20 +01:00
use Friendica\Protocol\OStatus ;
2018-01-27 05:24:23 +01:00
use Friendica\Util\Network ;
2017-11-19 18:36:20 +01:00
2018-07-10 04:39:59 +02:00
class PubSubPublish
{
2017-11-19 18:36:20 +01:00
public static function execute ( $pubsubpublish_id = 0 )
{
2018-05-18 01:30:49 +02:00
if ( $pubsubpublish_id == 0 ) {
2018-05-18 00:17:03 +02:00
return ;
2017-11-19 18:36:20 +01:00
}
2018-05-18 01:30:49 +02:00
self :: publish ( $pubsubpublish_id );
2017-11-19 18:36:20 +01:00
}
2018-07-10 04:39:59 +02:00
private static function publish ( $id )
{
2018-07-20 14:19:26 +02:00
$subscriber = DBA :: selectFirst ( 'push_subscriber' , [], [ 'id' => $id ]);
2018-07-21 14:46:04 +02:00
if ( ! DBA :: isResult ( $subscriber )) {
2017-11-19 18:36:20 +01:00
return ;
}
2019-10-04 01:33:41 +02:00
/// @todo Check server status with GServer::check()
2017-11-19 18:36:20 +01:00
// Before this can be done we need a way to safely detect the server url.
2018-10-30 14:58:45 +01:00
Logger :: log ( " Generate feed of user " . $subscriber [ 'nickname' ] . " to " . $subscriber [ 'callback_url' ] . " - last updated " . $subscriber [ 'last_update' ], Logger :: DEBUG );
2017-11-19 18:36:20 +01:00
2018-05-18 00:17:03 +02:00
$last_update = $subscriber [ 'last_update' ];
$params = OStatus :: feed ( $subscriber [ 'nickname' ], $last_update );
2017-11-19 18:36:20 +01:00
if ( ! $params ) {
return ;
}
2018-05-18 00:17:03 +02:00
$hmac_sig = hash_hmac ( " sha1 " , $params , $subscriber [ 'secret' ]);
2017-11-19 18:36:20 +01:00
2018-01-15 14:05:12 +01:00
$headers = [ " Content-type: application/atom+xml " ,
2017-11-19 18:36:20 +01:00
sprintf ( " Link: <%s>;rel=hub,<%s>;rel=self " ,
2019-12-30 23:00:08 +01:00
DI :: baseUrl () . '/pubsubhubbub/' . $subscriber [ 'nickname' ],
2018-05-18 00:17:03 +02:00
$subscriber [ 'topic' ]),
" X-Hub-Signature: sha1= " . $hmac_sig ];
2017-11-19 18:36:20 +01:00
2018-10-30 14:58:45 +01:00
Logger :: log ( 'POST ' . print_r ( $headers , true ) . " \n " . $params , Logger :: DATA );
2017-11-19 18:36:20 +01:00
2018-10-10 21:15:26 +02:00
$postResult = Network :: post ( $subscriber [ 'callback_url' ], $params , $headers );
$ret = $postResult -> getReturnCode ();
2017-11-19 18:36:20 +01:00
if ( $ret >= 200 && $ret <= 299 ) {
2018-10-29 22:20:46 +01:00
Logger :: log ( 'Successfully pushed to ' . $subscriber [ 'callback_url' ]);
2017-11-19 18:36:20 +01:00
2018-05-19 05:56:29 +02:00
PushSubscriber :: reset ( $subscriber [ 'id' ], $last_update );
2017-11-19 18:36:20 +01:00
} else {
2018-10-29 22:20:46 +01:00
Logger :: log ( 'Delivery error when pushing to ' . $subscriber [ 'callback_url' ] . ' HTTP: ' . $ret );
2017-11-19 18:36:20 +01:00
2018-05-19 05:56:29 +02:00
PushSubscriber :: delay ( $subscriber [ 'id' ]);
2017-11-19 18:36:20 +01:00
}
}
}