Processing of personal inbox enabled

This commit is contained in:
Michael 2018-09-15 10:14:56 +00:00
parent 35854a0ad1
commit 96f575fe28
2 changed files with 43 additions and 14 deletions

View file

@ -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);
} }

View file

@ -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'];