Processing of personal inbox enabled
This commit is contained in:
parent
35854a0ad1
commit
96f575fe28
2 changed files with 43 additions and 14 deletions
|
@ -7,6 +7,7 @@ namespace Friendica\Module;
|
||||||
use Friendica\BaseModule;
|
use Friendica\BaseModule;
|
||||||
use Friendica\Protocol\ActivityPub;
|
use Friendica\Protocol\ActivityPub;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
|
use Friendica\Database\DBA;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ActivityPub Inbox
|
* ActivityPub Inbox
|
||||||
|
@ -30,11 +31,21 @@ class Inbox extends BaseModule
|
||||||
}
|
}
|
||||||
|
|
||||||
$tempfile = tempnam(get_temppath(), $filename);
|
$tempfile = tempnam(get_temppath(), $filename);
|
||||||
file_put_contents($tempfile, json_encode(['header' => $_SERVER, 'body' => $postdata]));
|
file_put_contents($tempfile, json_encode(['argv' => $a->argv, 'header' => $_SERVER, 'body' => $postdata]));
|
||||||
|
|
||||||
logger('Incoming message stored under ' . $tempfile);
|
logger('Incoming message stored under ' . $tempfile);
|
||||||
|
|
||||||
ActivityPub::processInbox($postdata, $_SERVER);
|
if (!empty($a->argv[1])) {
|
||||||
|
$user = DBA::selectFirst('user', ['uid'], ['nickname' => $a->argv[1]]);
|
||||||
|
if (!DBA::isResult($user)) {
|
||||||
|
System::httpExit(404);
|
||||||
|
}
|
||||||
|
$uid = $user['uid'];
|
||||||
|
} else {
|
||||||
|
$uid = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ActivityPub::processInbox($postdata, $_SERVER, $uid);
|
||||||
|
|
||||||
System::httpExit(202);
|
System::httpExit(202);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,20 @@ use Friendica\Network\Probe;
|
||||||
*
|
*
|
||||||
* Digest: https://tools.ietf.org/html/rfc5843
|
* Digest: https://tools.ietf.org/html/rfc5843
|
||||||
* https://tools.ietf.org/html/draft-cavage-http-signatures-10#ref-15
|
* https://tools.ietf.org/html/draft-cavage-http-signatures-10#ref-15
|
||||||
|
*
|
||||||
|
* To-do:
|
||||||
|
*
|
||||||
|
* Receiver:
|
||||||
|
* - Activities: Follow, Accept, Update
|
||||||
|
* - Object Types: Person, Tombstome
|
||||||
|
*
|
||||||
|
* Transmitter:
|
||||||
|
* - Activities: Like, Dislike, Follow, Accept, Update
|
||||||
|
* - Object Tyoes: Article, Announce, Person, Tombstone
|
||||||
|
*
|
||||||
|
* General:
|
||||||
|
* - Message distribution
|
||||||
|
* - Endpoints: Outbox, Object, Follower, Following
|
||||||
*/
|
*/
|
||||||
class ActivityPub
|
class ActivityPub
|
||||||
{
|
{
|
||||||
|
@ -187,7 +201,7 @@ class ActivityPub
|
||||||
$owner = User::getOwnerDataById($uid);
|
$owner = User::getOwnerDataById($uid);
|
||||||
|
|
||||||
$data = ['@context' => 'https://www.w3.org/ns/activitystreams',
|
$data = ['@context' => 'https://www.w3.org/ns/activitystreams',
|
||||||
'id' => 'https://pirati.ca/' . strtolower($activity) . '/' . System::createGUID(),
|
'id' => 'https://pirati.ca/activity/' . System::createGUID(),
|
||||||
'type' => $activity,
|
'type' => $activity,
|
||||||
'actor' => $owner['url'],
|
'actor' => $owner['url'],
|
||||||
'object' => $profile['url']];
|
'object' => $profile['url']];
|
||||||
|
@ -486,9 +500,9 @@ class ActivityPub
|
||||||
return $profile;
|
return $profile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function processInbox($body, $header)
|
public static function processInbox($body, $header, $uid)
|
||||||
{
|
{
|
||||||
logger('Incoming message', LOGGER_DEBUG);
|
logger('Incoming message for user ' . $uid, LOGGER_DEBUG);
|
||||||
|
|
||||||
if (!self::verifySignature($body, $header)) {
|
if (!self::verifySignature($body, $header)) {
|
||||||
logger('Invalid signature, message will be discarded.', LOGGER_DEBUG);
|
logger('Invalid signature, message will be discarded.', LOGGER_DEBUG);
|
||||||
|
@ -502,7 +516,7 @@ class ActivityPub
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self::processActivity($activity, $body);
|
self::processActivity($activity, $body, $uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function fetchOutbox($url)
|
public static function fetchOutbox($url)
|
||||||
|
@ -528,7 +542,7 @@ class ActivityPub
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function processActivity($activity, $body = '')
|
function processActivity($activity, $body = '', $uid = null)
|
||||||
{
|
{
|
||||||
if (empty($activity['type'])) {
|
if (empty($activity['type'])) {
|
||||||
logger('Empty type', LOGGER_DEBUG);
|
logger('Empty type', LOGGER_DEBUG);
|
||||||
|
@ -578,21 +592,25 @@ class ActivityPub
|
||||||
unset($activity['location']);
|
unset($activity['location']);
|
||||||
unset($activity['signature']);
|
unset($activity['signature']);
|
||||||
*/
|
*/
|
||||||
|
// Fetch all receivers from to, cc, bto and bcc
|
||||||
if (!in_array($activity['type'], ['Like', 'Dislike'])) {
|
|
||||||
$receivers = self::getReceivers($activity);
|
$receivers = self::getReceivers($activity);
|
||||||
if (empty($receivers)) {
|
|
||||||
logger('No receivers found', LOGGER_DEBUG);
|
// When it is a delivery to a personal inbox we add that user to the receivers
|
||||||
return;
|
if (!empty($uid)) {
|
||||||
|
$owner = User::getOwnerDataById($uid);
|
||||||
|
$additional = [$owner['url'] => $uid];
|
||||||
|
$receivers = array_merge($receivers, $additional);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger('Receivers: ' . json_encode($receivers), LOGGER_DEBUG);
|
||||||
|
|
||||||
|
if (!in_array($activity['type'], ['Like', 'Dislike'])) {
|
||||||
$item = self::fetchObject($object_url, $activity['object']);
|
$item = self::fetchObject($object_url, $activity['object']);
|
||||||
if (empty($item)) {
|
if (empty($item)) {
|
||||||
logger("Object data couldn't be processed", LOGGER_DEBUG);
|
logger("Object data couldn't be processed", LOGGER_DEBUG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$receivers = [];
|
|
||||||
$item['object'] = $object_url;
|
$item['object'] = $object_url;
|
||||||
$item['receiver'] = [];
|
$item['receiver'] = [];
|
||||||
$item['type'] = $activity['type'];
|
$item['type'] = $activity['type'];
|
||||||
|
|
Loading…
Reference in a new issue