Cleaned code

This commit is contained in:
Michael 2018-09-25 21:18:37 +00:00
parent 834422d52f
commit e91a1dfa8e
3 changed files with 53 additions and 114 deletions

View file

@ -566,7 +566,7 @@ class ActivityPub
if (DBA::isResult($conversation) && !empty($conversation['conversation-uri'])) { if (DBA::isResult($conversation) && !empty($conversation['conversation-uri'])) {
$conversation_uri = $conversation['conversation-uri']; $conversation_uri = $conversation['conversation-uri'];
} else { } else {
$conversation_uri = $item['parent-uri']; $conversation_uri = str_replace('/object/', '/context/', $item['parent-uri']);
} }
return $conversation_uri; return $conversation_uri;
} }
@ -938,6 +938,9 @@ class ActivityPub
if (LDSignature::isSigned($activity)) { if (LDSignature::isSigned($activity)) {
$ld_signer = LDSignature::getSigner($activity); $ld_signer = LDSignature::getSigner($activity);
if (empty($ld_signer)) {
logger('Invalid JSON-LD signature from ' . $actor, LOGGER_DEBUG);
}
if (!empty($ld_signer && ($actor == $http_signer))) { if (!empty($ld_signer && ($actor == $http_signer))) {
logger('The HTTP and the JSON-LD signature belong to ' . $ld_signer, LOGGER_DEBUG); logger('The HTTP and the JSON-LD signature belong to ' . $ld_signer, LOGGER_DEBUG);
$trust_source = true; $trust_source = true;
@ -1005,52 +1008,33 @@ class ActivityPub
logger('Receivers: ' . json_encode($receivers), LOGGER_DEBUG); logger('Receivers: ' . json_encode($receivers), LOGGER_DEBUG);
if (is_string($activity['object'])) { $object_id = JsonLD::fetchElement($activity, 'object', 'id');
$object_url = $activity['object']; if (empty($object_id)) {
} elseif (!empty($activity['object']['id'])) {
$object_url = $activity['object']['id'];
} else {
logger('No object found', LOGGER_DEBUG); logger('No object found', LOGGER_DEBUG);
return []; return [];
} }
// Fetch the content only on activities where this matters // Fetch the content only on activities where this matters
if (in_array($activity['type'], ['Create', 'Announce'])) { if (in_array($activity['type'], ['Create', 'Announce'])) {
$object_data = self::fetchObject($object_url, $activity['object'], $trust_source); $object_data = self::fetchObject($object_id, $activity['object'], $trust_source);
if (empty($object_data)) { if (empty($object_data)) {
logger("Object data couldn't be processed", LOGGER_DEBUG); logger("Object data couldn't be processed", LOGGER_DEBUG);
return []; return [];
} }
// We had been able to retrieve the object data - so we can trust the source // We had been able to retrieve the object data - so we can trust the source
$trust_source = true; $trust_source = true;
} elseif ($activity['type'] == 'Update') {
$object_data = [];
$object_data['object_type'] = JsonLD::fetchElement($activity, 'object', 'type');
$object_data['object'] = $activity['object'];
} elseif ($activity['type'] == 'Accept') {
$object_data = [];
$object_data['object_type'] = JsonLD::fetchElement($activity, 'object', 'type');
$object_data['object'] = JsonLD::fetchElement($activity, 'object', 'actor');
} elseif ($activity['type'] == 'Undo') {
$object_data = [];
$object_data['object_type'] = JsonLD::fetchElement($activity, 'object', 'type');
if ($object_data['object_type'] == 'Follow') {
$object_data['object'] = JsonLD::fetchElement($activity, 'object', 'object');
} else {
$object_data['object'] = $activity['object'];
}
} elseif (in_array($activity['type'], ['Like', 'Dislike'])) { } elseif (in_array($activity['type'], ['Like', 'Dislike'])) {
// Create a mostly empty array out of the activity data (instead of the object). // 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. // This way we later don't have to check for the existence of ech individual array element.
$object_data = self::processCommonData($activity); $object_data = self::ProcessObject($activity);
$object_data['name'] = $activity['type']; $object_data['name'] = $activity['type'];
$object_data['author'] = $activity['actor']; $object_data['author'] = $activity['actor'];
$object_data['object'] = $object_url; $object_data['object'] = $object_id;
} elseif ($activity['type'] == 'Follow') {
$object_data['id'] = $activity['id'];
$object_data['object'] = $object_url;
} else { } else {
$object_data = []; $object_data = [];
$object_data['id'] = $activity['id'];
$object_data['object'] = $activity['object'];
$object_data['object_type'] = JsonLD::fetchElement($activity, 'object', 'type');
} }
$object_data = self::addActivityFields($object_data, $activity); $object_data = self::addActivityFields($object_data, $activity);
@ -1059,6 +1043,8 @@ class ActivityPub
$object_data['owner'] = $actor; $object_data['owner'] = $actor;
$object_data['receiver'] = array_merge(defaults($object_data, 'receiver', []), $receivers); $object_data['receiver'] = array_merge(defaults($object_data, 'receiver', []), $receivers);
logger('Processing ' . $object_data['type'] . ' ' . $object_data['object_type'] . ' ' . $object_data['id'], LOGGER_DEBUG);
return $object_data; return $object_data;
} }
@ -1080,14 +1066,6 @@ class ActivityPub
} }
// Non standard
// title, atomUri, context_id, statusnetConversationId
// To-Do?
// context, location, signature;
logger('Processing activity: ' . $activity['type'], LOGGER_DEBUG);
// $trust_source is called by reference and is set to true if the content was retrieved successfully // $trust_source is called by reference and is set to true if the content was retrieved successfully
$object_data = self::prepareObjectData($activity, $uid, $trust_source); $object_data = self::prepareObjectData($activity, $uid, $trust_source);
if (empty($object_data)) { if (empty($object_data)) {
@ -1282,18 +1260,18 @@ class ActivityPub
return $object_data; return $object_data;
} }
private static function fetchObject($object_url, $object = [], $trust_source = false) private static function fetchObject($object_id, $object = [], $trust_source = false)
{ {
if (!$trust_source || is_string($object)) { if (!$trust_source || is_string($object)) {
$data = self::fetchContent($object_url); $data = self::fetchContent($object_id);
if (empty($data)) { if (empty($data)) {
logger('Empty content for ' . $object_url . ', check if content is available locally.', LOGGER_DEBUG); logger('Empty content for ' . $object_id . ', check if content is available locally.', LOGGER_DEBUG);
$data = $object_url; $data = $object_id;
} else { } else {
logger('Fetched content for ' . $object_url, LOGGER_DEBUG); logger('Fetched content for ' . $object_id, LOGGER_DEBUG);
} }
} else { } else {
logger('Using original object for url ' . $object_url, LOGGER_DEBUG); logger('Using original object for url ' . $object_id, LOGGER_DEBUG);
$data = $object; $data = $object;
} }
@ -1303,29 +1281,20 @@ class ActivityPub
logger('Object with url ' . $data . ' was not found locally.', LOGGER_DEBUG); logger('Object with url ' . $data . ' was not found locally.', LOGGER_DEBUG);
return false; return false;
} }
logger('Using already stored item for url ' . $object_url, LOGGER_DEBUG); logger('Using already stored item for url ' . $object_id, LOGGER_DEBUG);
$data = self::CreateNote($item); $data = self::CreateNote($item);
} }
if (empty($data['type'])) { if (empty($data['type'])) {
logger('Empty type', LOGGER_DEBUG); logger('Empty type', LOGGER_DEBUG);
return false; return false;
} else {
$type = $data['type'];
logger('Type ' . $type, LOGGER_DEBUG);
} }
if (in_array($type, ['Note', 'Article', 'Video'])) { switch ($data['type']) {
$common = self::processCommonData($data);
}
switch ($type) {
case 'Note': case 'Note':
return array_merge($common, self::processNote($data));
case 'Article': case 'Article':
return array_merge($common, self::processArticle($data));
case 'Video': case 'Video':
return array_merge($common, self::processVideo($data)); return self::ProcessObject($data);
case 'Announce': case 'Announce':
if (empty($data['object'])) { if (empty($data['object'])) {
@ -1343,20 +1312,20 @@ class ActivityPub
} }
} }
private static function processCommonData(&$object) private static function ProcessObject(&$object)
{ {
if (empty($object['id'])) { if (empty($object['id'])) {
return false; return false;
} }
$object_data = []; $object_data = [];
$object_data['type'] = $object['type']; $object_data['object_type'] = $object['type'];
$object_data['uri'] = $object['id']; $object_data['id'] = $object['id'];
if (!empty($object['inReplyTo'])) { if (!empty($object['inReplyTo'])) {
$object_data['reply-to-uri'] = JsonLD::fetchElement($object, 'inReplyTo', 'id'); $object_data['reply-to-uri'] = JsonLD::fetchElement($object, 'inReplyTo', 'id');
} else { } else {
$object_data['reply-to-uri'] = $object_data['uri']; $object_data['reply-to-uri'] = $object_data['id'];
} }
$object_data['published'] = defaults($object, 'published', null); $object_data['published'] = defaults($object, 'published', null);
@ -1366,8 +1335,13 @@ class ActivityPub
$object_data['published'] = $object_data['updated']; $object_data['published'] = $object_data['updated'];
} }
$actor = JsonLD::fetchElement($object, 'attributedTo', 'id');
if (empty($actor)) {
$actor = defaults($object, 'actor', null);
}
$object_data['uuid'] = defaults($object, 'uuid', null); $object_data['uuid'] = defaults($object, 'uuid', null);
$object_data['owner'] = $object_data['author'] = JsonLD::fetchElement($object, 'attributedTo', 'id'); $object_data['owner'] = $object_data['author'] = $actor;
$object_data['context'] = defaults($object, 'context', null); $object_data['context'] = defaults($object, 'context', null);
$object_data['conversation'] = defaults($object, 'conversation', null); $object_data['conversation'] = defaults($object, 'conversation', null);
$object_data['sensitive'] = defaults($object, 'sensitive', null); $object_data['sensitive'] = defaults($object, 'sensitive', null);
@ -1383,18 +1357,15 @@ class ActivityPub
$object_data['alternate-url'] = JsonLD::fetchElement($object, 'url', 'href'); $object_data['alternate-url'] = JsonLD::fetchElement($object, 'url', 'href');
$object_data['receiver'] = self::getReceivers($object, $object_data['owner']); $object_data['receiver'] = self::getReceivers($object, $object_data['owner']);
// Common object data:
// Unhandled // Unhandled
// @context, type, actor, signature, mediaType, duration, replies, icon // @context, type, actor, signature, mediaType, duration, replies, icon
// Also missing: (Defined in the standard, but currently unused) // Also missing: (Defined in the standard, but currently unused)
// audience, preview, endTime, startTime, generator, image // audience, preview, endTime, startTime, generator, image
return $object_data; // Data in Notes:
}
private static function processNote($object)
{
$object_data = [];
// To-Do? // To-Do?
// emoji, atomUri, inReplyToAtomUri // emoji, atomUri, inReplyToAtomUri
@ -1403,19 +1374,7 @@ class ActivityPub
// contentMap, announcement_count, announcements, context_id, likes, like_count // contentMap, announcement_count, announcements, context_id, likes, like_count
// inReplyToStatusId, shares, quoteUrl, statusnetConversationId // inReplyToStatusId, shares, quoteUrl, statusnetConversationId
return $object_data; // Data in video:
}
private static function processArticle($object)
{
$object_data = [];
return $object_data;
}
private static function processVideo($object)
{
$object_data = [];
// To-Do? // To-Do?
// category, licence, language, commentsEnabled // category, licence, language, commentsEnabled
@ -1424,6 +1383,7 @@ class ActivityPub
// views, waitTranscoding, state, support, subtitleLanguage // views, waitTranscoding, state, support, subtitleLanguage
// likes, dislikes, shares, comments // likes, dislikes, shares, comments
return $object_data; return $object_data;
} }
@ -1448,11 +1408,6 @@ class ActivityPub
$tag_text .= ','; $tag_text .= ',';
} }
if (empty($tag['href'])) {
//$tag['href']
logger('Blubb!');
}
$tag_text .= substr($tag['name'], 0, 1) . '[url=' . $tag['href'] . ']' . substr($tag['name'], 1) . '[/url]'; $tag_text .= substr($tag['name'], 0, 1) . '[url=' . $tag['href'] . ']' . substr($tag['name'], 1) . '[/url]';
} }
} }
@ -1494,7 +1449,7 @@ class ActivityPub
$item['verb'] = ACTIVITY_POST; $item['verb'] = ACTIVITY_POST;
$item['parent-uri'] = $activity['reply-to-uri']; $item['parent-uri'] = $activity['reply-to-uri'];
if ($activity['reply-to-uri'] == $activity['uri']) { if ($activity['reply-to-uri'] == $activity['id']) {
$item['gravity'] = GRAVITY_PARENT; $item['gravity'] = GRAVITY_PARENT;
$item['object-type'] = ACTIVITY_OBJ_NOTE; $item['object-type'] = ACTIVITY_OBJ_NOTE;
} else { } else {
@ -1502,7 +1457,7 @@ class ActivityPub
$item['object-type'] = ACTIVITY_OBJ_COMMENT; $item['object-type'] = ACTIVITY_OBJ_COMMENT;
} }
if (($activity['uri'] != $activity['reply-to-uri']) && !Item::exists(['uri' => $activity['reply-to-uri']])) { if (($activity['id'] != $activity['reply-to-uri']) && !Item::exists(['uri' => $activity['reply-to-uri']])) {
logger('Parent ' . $activity['reply-to-uri'] . ' not found. Try to refetch it.'); logger('Parent ' . $activity['reply-to-uri'] . ' not found. Try to refetch it.');
self::fetchMissingActivity($activity['reply-to-uri'], $activity); self::fetchMissingActivity($activity['reply-to-uri'], $activity);
} }
@ -1545,7 +1500,7 @@ class ActivityPub
$item['private'] = !in_array(0, $activity['receiver']); $item['private'] = !in_array(0, $activity['receiver']);
$item['author-id'] = Contact::getIdForURL($activity['author'], 0, true); $item['author-id'] = Contact::getIdForURL($activity['author'], 0, true);
$item['owner-id'] = Contact::getIdForURL($activity['owner'], 0, true); $item['owner-id'] = Contact::getIdForURL($activity['owner'], 0, true);
$item['uri'] = $activity['uri']; $item['uri'] = $activity['id'];
$item['created'] = $activity['published']; $item['created'] = $activity['published'];
$item['edited'] = $activity['updated']; $item['edited'] = $activity['updated'];
$item['guid'] = $activity['uuid']; $item['guid'] = $activity['uuid'];
@ -1620,7 +1575,8 @@ class ActivityPub
private static function followUser($activity) private static function followUser($activity)
{ {
$uid = self::getUserOfObject($activity['object']); $actor = JsonLD::fetchElement($activity, 'object', 'id');
$uid = self::getUserOfObject($actor);
if (empty($uid)) { if (empty($uid)) {
return; return;
} }
@ -1663,7 +1619,8 @@ class ActivityPub
private static function acceptFollowUser($activity) private static function acceptFollowUser($activity)
{ {
$uid = self::getUserOfObject($activity['object']); $actor = JsonLD::fetchElement($activity, 'object', 'actor');
$uid = self::getUserOfObject($actor);
if (empty($uid)) { if (empty($uid)) {
return; return;
} }
@ -1710,7 +1667,8 @@ class ActivityPub
private static function undoFollowUser($activity) private static function undoFollowUser($activity)
{ {
$uid = self::getUserOfObject($activity['object']); $object = JsonLD::fetchElement($activity, 'object', 'object');
$uid = self::getUserOfObject($object);
if (empty($uid)) { if (empty($uid)) {
return; return;
} }

View file

@ -40,25 +40,10 @@ class JsonLD
return $data; return $data;
} }
private static function objectify($element)
{
if (is_array($element)) {
$keys = array_keys($element);
if (is_int(array_pop($keys))) {
return array_map('objectify', $element);
} else {
return (object)array_map('objectify', $element);
}
} else {
return $element;
}
}
public static function normalize($json) public static function normalize($json)
{ {
jsonld_set_document_loader('Friendica\Util\JsonLD::documentLoader'); jsonld_set_document_loader('Friendica\Util\JsonLD::documentLoader');
// $jsonobj = array_map('Friendica\Util\JsonLD::objectify', $json);
$jsonobj = json_decode(json_encode($json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); $jsonobj = json_decode(json_encode($json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
return jsonld_normalize($jsonobj, array('algorithm' => 'URDNA2015', 'format' => 'application/nquads')); return jsonld_normalize($jsonobj, array('algorithm' => 'URDNA2015', 'format' => 'application/nquads'));

View file

@ -82,25 +82,21 @@ class LDSignature
return array_merge($data, ['signature' => $options]); return array_merge($data, ['signature' => $options]);
} }
private static function signable_data($data) private static function signable_data($data)
{ {
unset($data['signature']); unset($data['signature']);
return $data; return $data;
} }
private static function signable_options($options) private static function signable_options($options)
{ {
$newopts = ['@context' => 'https://w3id.org/identity/v1']; $newopts = ['@context' => 'https://w3id.org/identity/v1'];
if (!empty($options)) {
foreach ($options as $k => $v) { unset($options['type']);
if (!in_array($k, ['type', 'id', 'signatureValue'])) { unset($options['id']);
$newopts[$k] = $v; unset($options['signatureValue']);
}
} return array_merge($newopts, $options);
}
return $newopts;
} }
private static function hash($obj) private static function hash($obj)