Browse Source

Functionality is now split

pull/5815/head
Michael 3 years ago
parent
commit
3ab837f3c7
  1. 31
      include/api.php
  2. 4
      mod/dfrn_confirm.php
  3. 2
      mod/profile.php
  4. 8
      src/Model/Contact.php
  5. 2
      src/Module/Inbox.php
  6. 2
      src/Module/Objects.php
  7. 1720
      src/Protocol/ActivityPub.php
  8. 24
      src/Protocol/ActivityPub/Processor.php
  9. 83
      src/Protocol/ActivityPub/Receiver.php
  10. 4
      src/Protocol/ActivityPub/Transmitter.php
  11. 6
      src/Worker/APDelivery.php
  12. 6
      src/Worker/Notifier.php
  13. 2
      src/Worker/ProfileUpdate.php

31
include/api.php

@ -4844,70 +4844,69 @@ function api_share_as_retweet(&$item)
/// @TODO "$1" should maybe mean '$1' ?
$attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "$1", $body);
/*
* Skip if there is no shared message in there
* we already checked this in diaspora::isReshare()
* but better one more than one less...
*/
if ($body == $attributes) {
* Skip if there is no shared message in there
* we already checked this in diaspora::isReshare()
* but better one more than one less...
*/
if (($body == $attributes) || empty($attributes)) {
return false;
}
// build the fake reshared item
$reshared_item = $item;
$author = "";
preg_match("/author='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") {
if (!empty($matches[1])) {
$author = html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8');
}
preg_match('/author="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") {
if (!empty($matches[1])) {
$author = $matches[1];
}
$profile = "";
preg_match("/profile='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") {
if (!empty($matches[1])) {
$profile = $matches[1];
}
preg_match('/profile="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") {
if (!empty($matches[1])) {
$profile = $matches[1];
}
$avatar = "";
preg_match("/avatar='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") {
if (!empty($matches[1])) {
$avatar = $matches[1];
}
preg_match('/avatar="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") {
if (!empty($matches[1])) {
$avatar = $matches[1];
}
$link = "";
preg_match("/link='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") {
if (!empty($matches[1])) {
$link = $matches[1];
}
preg_match('/link="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") {
if (!empty($matches[1])) {
$link = $matches[1];
}
$posted = "";
preg_match("/posted='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") {
if (!empty($matches[1])) {
$posted = $matches[1];
}
preg_match('/posted="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") {
if (!empty($matches[1])) {
$posted = $matches[1];
}

4
mod/dfrn_confirm.php

@ -337,7 +337,7 @@ function dfrn_confirm_post(App $a, $handsfree = null)
);
} else {
if ($network == Protocol::ACTIVITYPUB) {
ActivityPub::transmitContactAccept($contact['url'], $contact['hub-verify'], $uid);
ActivityPub\Transmitter::transmitContactAccept($contact['url'], $contact['hub-verify'], $uid);
$pending = true;
} else {
$pending = false;
@ -394,7 +394,7 @@ function dfrn_confirm_post(App $a, $handsfree = null)
Group::addMember(User::getDefaultGroup($uid, $contact["network"]), $contact['id']);
if ($network == Protocol::ACTIVITYPUB && $duplex) {
ActivityPub::transmitActivity('Follow', $contact['url'], $uid);
ActivityPub\Transmitter::transmitActivity('Follow', $contact['url'], $uid);
}
// Let's send our user to the contact editor in case they want to

2
mod/profile.php

@ -53,7 +53,7 @@ function profile_init(App $a)
if (ActivityPub::isRequest()) {
$user = DBA::selectFirst('user', ['uid'], ['nickname' => $which]);
if (DBA::isResult($user)) {
$data = ActivityPub::profile($user['uid']);
$data = ActivityPub\Transmitter::profile($user['uid']);
echo json_encode($data);
header('Content-Type: application/activity+json');
exit();

8
src/Model/Contact.php

@ -557,10 +557,10 @@ class Contact extends BaseObject
} elseif ($contact['network'] == Protocol::DIASPORA) {
Diaspora::sendUnshare($user, $contact);
} elseif ($contact['network'] == Protocol::ACTIVITYPUB) {
ActivityPub::transmitContactUndo($contact['url'], $user['uid']);
ActivityPub\Transmitter::transmitContactUndo($contact['url'], $user['uid']);
if ($dissolve) {
ActivityPub::transmitContactReject($contact['url'], $contact['hub-verify'], $user['uid']);
ActivityPub\Transmitter::transmitContactReject($contact['url'], $contact['hub-verify'], $user['uid']);
}
}
}
@ -1769,7 +1769,7 @@ class Contact extends BaseObject
$ret = Diaspora::sendShare($a->user, $contact);
logger('share returns: ' . $ret);
} elseif ($contact['network'] == Protocol::ACTIVITYPUB) {
$ret = ActivityPub::transmitActivity('Follow', $contact['url'], $uid);
$ret = ActivityPub\Transmitter::transmitActivity('Follow', $contact['url'], $uid);
logger('Follow returns: ' . $ret);
}
}
@ -1846,7 +1846,7 @@ class Contact extends BaseObject
}
if ($contact['network'] == Protocol::ACTIVITYPUB) {
ActivityPub::transmitContactAccept($contact['url'], $contact['hub-verify'], $importer['uid']);
ActivityPub\Transmitter::transmitContactAccept($contact['url'], $contact['hub-verify'], $importer['uid']);
}
// send email notification to owner?

2
src/Module/Inbox.php

@ -48,7 +48,7 @@ class Inbox extends BaseModule
$uid = 0;
}
ActivityPub::processInbox($postdata, $_SERVER, $uid);
ActivityPub\Receiver::processInbox($postdata, $_SERVER, $uid);
System::httpExit(202);
}

2
src/Module/Objects.php

@ -32,7 +32,7 @@ class Objects extends BaseModule
System::httpExit(404);
}
$data = ActivityPub::createObjectFromItemID($item['id']);
$data = ActivityPub\Transmitter::createObjectFromItemID($item['id']);
header('Content-Type: application/activity+json');
echo json_encode($data);

1720
src/Protocol/ActivityPub.php

File diff suppressed because it is too large

24
src/Protocol/ActivityPub/Processor.php

@ -116,7 +116,7 @@ class Processor
* @param array $activity
* @param $body
*/
private static function createItem($activity, $body)
public static function createItem($activity, $body)
{
$item = [];
$item['verb'] = ACTIVITY_POST;
@ -144,7 +144,7 @@ class Processor
* @param array $activity
* @param $body
*/
private static function likeItem($activity, $body)
public static function likeItem($activity, $body)
{
$item = [];
$item['verb'] = ACTIVITY_LIKE;
@ -161,7 +161,7 @@ class Processor
* @param array $activity
* @param $body
*/
private static function deleteItem($activity)
public static function deleteItem($activity)
{
$owner = Contact::getIdForURL($activity['owner']);
$object = JsonLD::fetchElement($activity, 'object', 'id');
@ -175,7 +175,7 @@ class Processor
* @param array $activity
* @param $body
*/
private static function dislikeItem($activity, $body)
public static function dislikeItem($activity, $body)
{
$item = [];
$item['verb'] = ACTIVITY_DISLIKE;
@ -272,7 +272,7 @@ class Processor
$activity['published'] = $object['published'];
$activity['type'] = 'Create';
ActivityPub::processActivity($activity);
ActivityPub\Receiver::processActivity($activity);
logger('Activity ' . $url . ' had been fetched and processed.');
}
@ -281,7 +281,7 @@ class Processor
*
* @param array $activity
*/
private static function followUser($activity)
public static function followUser($activity)
{
$actor = JsonLD::fetchElement($activity, 'object', 'id');
$uid = User::getIdForURL($actor);
@ -321,7 +321,7 @@ class Processor
*
* @param array $activity
*/
private static function updatePerson($activity)
public static function updatePerson($activity)
{
if (empty($activity['object']['id'])) {
return;
@ -336,7 +336,7 @@ class Processor
*
* @param array $activity
*/
private static function deletePerson($activity)
public static function deletePerson($activity)
{
if (empty($activity['object']['id']) || empty($activity['object']['actor'])) {
logger('Empty object id or actor.', LOGGER_DEBUG);
@ -362,7 +362,7 @@ class Processor
*
* @param array $activity
*/
private static function acceptFollowUser($activity)
public static function acceptFollowUser($activity)
{
$actor = JsonLD::fetchElement($activity, 'object', 'actor');
$uid = User::getIdForURL($actor);
@ -395,7 +395,7 @@ class Processor
*
* @param array $activity
*/
private static function rejectFollowUser($activity)
public static function rejectFollowUser($activity)
{
$actor = JsonLD::fetchElement($activity, 'object', 'actor');
$uid = User::getIdForURL($actor);
@ -424,7 +424,7 @@ class Processor
*
* @param array $activity
*/
private static function undoActivity($activity)
public static function undoActivity($activity)
{
$activity_url = JsonLD::fetchElement($activity, 'object', 'id');
if (empty($activity_url)) {
@ -449,7 +449,7 @@ class Processor
*
* @param array $activity
*/
private static function undoFollowUser($activity)
public static function undoFollowUser($activity)
{
$object = JsonLD::fetchElement($activity, 'object', 'object');
$uid = User::getIdForURL($object);

83
src/Protocol/ActivityPub/Receiver.php

@ -95,7 +95,7 @@ class Receiver
$trust_source = false;
}
ActivityPub::processActivity($activity, $body, $uid, $trust_source);
self::processActivity($activity, $body, $uid, $trust_source);
}
/**
@ -116,7 +116,7 @@ class Receiver
}
// Fetch all receivers from to, cc, bto and bcc
$receivers = ActivityPub::getReceivers($activity, $actor);
$receivers = self::getReceivers($activity, $actor);
// When it is a delivery to a personal inbox we add that user to the receivers
if (!empty($uid)) {
@ -135,7 +135,7 @@ class Receiver
// Fetch the content only on activities where this matters
if (in_array($activity['type'], ['Create', 'Announce'])) {
$object_data = ActivityPub::fetchObject($object_id, $activity['object'], $trust_source);
$object_data = self::fetchObject($object_id, $activity['object'], $trust_source);
if (empty($object_data)) {
logger("Object data couldn't be processed", LOGGER_DEBUG);
return [];
@ -145,7 +145,7 @@ class Receiver
} elseif (in_array($activity['type'], ['Like', 'Dislike'])) {
// Create a mostly empty array out of the activity data (instead of the object).
// This way we later don't have to check for the existence of ech individual array element.
$object_data = ActivityPub::processObject($activity);
$object_data = self::processObject($activity);
$object_data['name'] = $activity['type'];
$object_data['author'] = $activity['actor'];
$object_data['object'] = $object_id;
@ -157,7 +157,7 @@ class Receiver
$object_data['object_type'] = JsonLD::fetchElement($activity, 'object', 'type');
}
$object_data = ActivityPub::addActivityFields($object_data, $activity);
$object_data = self::addActivityFields($object_data, $activity);
$object_data['type'] = $activity['type'];
$object_data['owner'] = $actor;
@ -176,7 +176,7 @@ class Receiver
* @param integer $uid User ID
* @param $trust_source
*/
private static function processActivity($activity, $body = '', $uid = null, $trust_source = false)
public static function processActivity($activity, $body = '', $uid = null, $trust_source = false)
{
if (empty($activity['type'])) {
logger('Empty type', LOGGER_DEBUG);
@ -195,7 +195,7 @@ class Receiver
}
// $trust_source is called by reference and is set to true if the content was retrieved successfully
$object_data = ActivityPub::prepareObjectData($activity, $uid, $trust_source);
$object_data = self::prepareObjectData($activity, $uid, $trust_source);
if (empty($object_data)) {
logger('No object data found', LOGGER_DEBUG);
return;
@ -208,54 +208,54 @@ class Receiver
switch ($activity['type']) {
case 'Create':
case 'Announce':
ActivityPub::createItem($object_data, $body);
ActivityPub\Processor::createItem($object_data, $body);
break;
case 'Like':
ActivityPub::likeItem($object_data, $body);
ActivityPub\Processor::likeItem($object_data, $body);
break;
case 'Dislike':
ActivityPub::dislikeItem($object_data, $body);
ActivityPub\Processor::dislikeItem($object_data, $body);
break;
case 'Update':
if (in_array($object_data['object_type'], ActivityPub::CONTENT_TYPES)) {
/// @todo
} elseif (in_array($object_data['object_type'], ActivityPub::ACCOUNT_TYPES)) {
ActivityPub::updatePerson($object_data, $body);
ActivityPub\Processor::updatePerson($object_data, $body);
}
break;
case 'Delete':
if ($object_data['object_type'] == 'Tombstone') {
ActivityPub::deleteItem($object_data, $body);
ActivityPub\Processor::deleteItem($object_data, $body);
} elseif (in_array($object_data['object_type'], ActivityPub::ACCOUNT_TYPES)) {
ActivityPub::deletePerson($object_data, $body);
ActivityPub\Processor::deletePerson($object_data, $body);
}
break;
case 'Follow':
ActivityPub::followUser($object_data);
ActivityPub\Processor::followUser($object_data);
break;
case 'Accept':
if ($object_data['object_type'] == 'Follow') {
ActivityPub::acceptFollowUser($object_data);
ActivityPub\Processor::acceptFollowUser($object_data);
}
break;
case 'Reject':
if ($object_data['object_type'] == 'Follow') {
ActivityPub::rejectFollowUser($object_data);
ActivityPub\Processor::rejectFollowUser($object_data);
}
break;
case 'Undo':
if ($object_data['object_type'] == 'Follow') {
ActivityPub::undoFollowUser($object_data);
ActivityPub\Processor::undoFollowUser($object_data);
} elseif (in_array($object_data['object_type'], ActivityPub::ACTIVITY_TYPES)) {
ActivityPub::undoActivity($object_data);
ActivityPub\Processor::undoActivity($object_data);
}
break;
@ -346,7 +346,7 @@ class Receiver
}
}
ActivityPub::switchContacts($receivers, $actor);
self::switchContacts($receivers, $actor);
return $receivers;
}
@ -392,12 +392,12 @@ class Receiver
foreach ($receivers as $receiver) {
$contact = DBA::selectFirst('contact', ['id'], ['uid' => $receiver, 'network' => Protocol::OSTATUS, 'nurl' => normalise_link($actor)]);
if (DBA::isResult($contact)) {
ActivityPub::switchContact($contact['id'], $receiver, $actor);
self::switchContact($contact['id'], $receiver, $actor);
}
$contact = DBA::selectFirst('contact', ['id'], ['uid' => $receiver, 'network' => Protocol::OSTATUS, 'alias' => [normalise_link($actor), $actor]]);
if (DBA::isResult($contact)) {
ActivityPub::switchContact($contact['id'], $receiver, $actor);
self::switchContact($contact['id'], $receiver, $actor);
}
}
}
@ -461,7 +461,7 @@ class Receiver
return false;
}
logger('Using already stored item for url ' . $object_id, LOGGER_DEBUG);
$data = ActivityPub::createNote($item);
$data = ActivityPub\Transmitter::createNote($item);
}
if (empty($data['type'])) {
@ -470,14 +470,14 @@ class Receiver
}
if (in_array($data['type'], ActivityPub::CONTENT_TYPES)) {
return ActivityPub::processObject($data);
return self::processObject($data);
}
if ($data['type'] == 'Announce') {
if (empty($data['object'])) {
return false;
}
return ActivityPub::fetchObject($data['object']);
return self::fetchObject($data['object']);
}
logger('Unhandled object type: ' . $data['type'], LOGGER_DEBUG);
@ -533,7 +533,7 @@ class Receiver
$object_data['tags'] = defaults($object, 'tag', null);
$object_data['service'] = JsonLD::fetchElement($object, 'instrument', 'name', 'type', 'Service');
$object_data['alternate-url'] = JsonLD::fetchElement($object, 'url', 'href');
$object_data['receiver'] = ActivityPub::getReceivers($object, $object_data['owner']);
$object_data['receiver'] = self::getReceivers($object, $object_data['owner']);
// Common object data:
@ -560,37 +560,4 @@ class Receiver
return $object_data;
}
/**
* @brief
*
* @param $url
* @param $child
*/
private static function fetchMissingActivity($url, $child)
{
if (Config::get('system', 'ostatus_full_threads')) {
return;
}
$object = ActivityPub::fetchContent($url);
if (empty($object)) {
logger('Activity ' . $url . ' was not fetchable, aborting.');
return;
}
$activity = [];
$activity['@context'] = $object['@context'];
unset($object['@context']);
$activity['id'] = $object['id'];
$activity['to'] = defaults($object, 'to', []);
$activity['cc'] = defaults($object, 'cc', []);
$activity['actor'] = $child['author'];
$activity['object'] = $object;
$activity['published'] = $object['published'];
$activity['type'] = 'Create';
ActivityPub::processActivity($activity);
logger('Activity ' . $url . ' had been fetched and processed.');
}
}

4
src/Protocol/ActivityPub/Transmitter.php

@ -283,7 +283,7 @@ class Transmitter
*
* @return permission array
*/
public static function createPermissionBlockForItem($item)
private static function createPermissionBlockForItem($item)
{
$data = ['to' => [], 'cc' => []];
@ -684,7 +684,7 @@ class Transmitter
'id' => System::baseUrl() . '/activity/' . System::createGUID(),
'type' => 'Delete',
'actor' => $owner['url'],
'object' => self::profile($uid),
'object' => $owner['url'],
'published' => DateTimeFormat::utcNow(DateTimeFormat::ATOM),
'to' => [ActivityPub::PUBLIC_COLLECTION],
'cc' => []];

6
src/Worker/APDelivery.php

@ -19,11 +19,11 @@ class APDelivery extends BaseObject
} elseif ($cmd == Delivery::SUGGESTION) {
} elseif ($cmd == Delivery::RELOCATION) {
} elseif ($cmd == Delivery::REMOVAL) {
ActivityPub::transmitProfileDeletion($uid, $inbox);
ActivityPub\Transmitter::transmitProfileDeletion($uid, $inbox);
} elseif ($cmd == Delivery::PROFILEUPDATE) {
ActivityPub::transmitProfileUpdate($uid, $inbox);
ActivityPub\Transmitter::transmitProfileUpdate($uid, $inbox);
} else {
$data = ActivityPub::createActivityFromItem($item_id);
$data = ActivityPub\Transmitter::createActivityFromItem($item_id);
if (!empty($data)) {
HTTPSignature::transmit($data, $inbox, $uid);
}

6
src/Worker/Notifier.php

@ -100,7 +100,7 @@ class Notifier
Contact::terminateFriendship($user, $contact, true);
}
$inboxes = ActivityPub::fetchTargetInboxesforUser(0);
$inboxes = ActivityPub\Transmitter::fetchTargetInboxesforUser(0);
foreach ($inboxes as $inbox) {
logger('Account removal for user ' . $uid . ' to ' . $inbox .' via ActivityPub', LOGGER_DEBUG);
Worker::add(['priority' => $a->queue['priority'], 'created' => $a->queue['created'], 'dont_fork' => true],
@ -425,11 +425,11 @@ class Notifier
$inboxes = [];
if ($target_item['origin']) {
$inboxes = ActivityPub::fetchTargetInboxes($target_item, $uid);
$inboxes = ActivityPub\Transmitter::fetchTargetInboxes($target_item, $uid);
}
if ($parent['origin']) {
$parent_inboxes = ActivityPub::fetchTargetInboxes($parent, $uid);
$parent_inboxes = ActivityPub\Transmitter::fetchTargetInboxes($parent, $uid);
$inboxes = array_merge($inboxes, $parent_inboxes);
}

2
src/Worker/ProfileUpdate.php

@ -19,7 +19,7 @@ class ProfileUpdate {
$a = BaseObject::getApp();
$inboxes = ActivityPub::fetchTargetInboxesforUser($uid);
$inboxes = ActivityPub\Transmitter::fetchTargetInboxesforUser($uid);
foreach ($inboxes as $inbox) {
logger('Profile update for user ' . $uid . ' to ' . $inbox .' via ActivityPub', LOGGER_DEBUG);

Loading…
Cancel
Save