]> git.mxchange.org Git - friendica.git/commitdiff
Detect the object type
authorMichael <heluecht@pirati.ca>
Sun, 7 Oct 2018 20:36:15 +0000 (20:36 +0000)
committerMichael <heluecht@pirati.ca>
Sun, 7 Oct 2018 20:36:15 +0000 (20:36 +0000)
database.sql
src/Protocol/ActivityPub/Receiver.php

index 718855804214984dd43913b0a3bc571b2aff0752..a797c8df361b260e2f512a0bb2c7eb6120f34fcb 100644 (file)
@@ -1,6 +1,6 @@
 -- ------------------------------------------
 -- Friendica 2018.12-dev (The Tazmans Flax-lily)
--- DB_UPDATE_VERSION 1283
+-- DB_UPDATE_VERSION 1284
 -- ------------------------------------------
 
 
@@ -19,6 +19,32 @@ CREATE TABLE IF NOT EXISTS `addon` (
         UNIQUE INDEX `name` (`name`)
 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='registered addons';
 
+--
+-- TABLE apcontact
+--
+CREATE TABLE IF NOT EXISTS `apcontact` (
+       `url` varbinary(255) NOT NULL COMMENT 'URL of the contact',
+       `uuid` varchar(255) COMMENT '',
+       `type` varchar(20) NOT NULL COMMENT '',
+       `following` varchar(255) COMMENT '',
+       `followers` varchar(255) COMMENT '',
+       `inbox` varchar(255) NOT NULL COMMENT '',
+       `outbox` varchar(255) COMMENT '',
+       `sharedinbox` varchar(255) COMMENT '',
+       `nick` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+       `name` varchar(255) COMMENT '',
+       `about` text COMMENT '',
+       `photo` varchar(255) COMMENT '',
+       `addr` varchar(255) COMMENT '',
+       `alias` varchar(255) COMMENT '',
+       `pubkey` text COMMENT '',
+       `baseurl` varchar(255) COMMENT 'baseurl of the ap contact',
+       `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
+        PRIMARY KEY(`url`),
+        INDEX `addr` (`addr`(32)),
+        INDEX `url` (`followers`(190))
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='ActivityPub compatible contacts - used in the ActivityPub implementation';
+
 --
 -- TABLE attach
 --
@@ -212,7 +238,7 @@ CREATE TABLE IF NOT EXISTS `conversation` (
        `reply-to-uri` varbinary(255) NOT NULL DEFAULT '' COMMENT 'URI to which this item is a reply',
        `conversation-uri` varbinary(255) NOT NULL DEFAULT '' COMMENT 'GNU Social conversation URI',
        `conversation-href` varbinary(255) NOT NULL DEFAULT '' COMMENT 'GNU Social conversation link',
-       `protocol` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'The protocol of the item',
+       `protocol` tinyint unsigned NOT NULL DEFAULT 255 COMMENT 'The protocol of the item',
        `source` mediumtext COMMENT 'Original source',
        `received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Receiving date',
         PRIMARY KEY(`item-uri`),
index ac66aeb6ece98ab5d67b69250f96a8927e334371..1dac0bb827f0619c723824e9e002e70d8c0a07bc 100644 (file)
@@ -30,9 +30,6 @@ use Friendica\Protocol\ActivityPub;
  * - Remove
  * - Undo Block
  * - Undo Accept (Problem: This could invert a contact accept or an event accept)
- *
- * General:
- * - Possibly using the LD-JSON parser
  */
 class Receiver
 {
@@ -111,6 +108,44 @@ class Receiver
                self::processActivity($ldactivity, $body, $uid, $trust_source);
        }
 
+       /**
+        * Fetches the object type for a given object id
+        *
+        * @param array  $activity
+        * @param string $object_id Object ID of the the provided object
+        *
+        * @return string with object type
+        */
+       private static function fetchObjectType($activity, $object_id)
+       {
+
+               $object_type = JsonLD::fetchElement($activity['as:object'], '@type');
+               if (!empty($object_type)) {
+                       return $object_type;
+               }
+
+               if (Item::exists(['uri' => $object_id, 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT]])) {
+                       // We just assume "note" since it doesn't make a difference for the further processing
+                       return 'as:Note';
+               }
+
+               $profile = APContact::getByURL($object_id);
+               if (!empty($profile['type'])) {
+                       return 'as:' . $profile['type'];
+               }
+
+               $data = ActivityPub::fetchContent($object_id);
+               if (!empty($data)) {
+                       $object = JsonLD::compact($data);
+                       $type = JsonLD::fetchElement($object, '@type');
+                       if (!empty($type)) {
+                               return $type;
+                       }
+               }
+
+               return null;
+       }
+
        /**
         * Prepare the object array
         *
@@ -148,6 +183,8 @@ class Receiver
                        return [];
                }
 
+               $object_type = self::fetchObjectType($activity, $object_id);
+
                // Fetch the content only on activities where this matters
                if (in_array($type, ['as:Create', 'as:Announce'])) {
                        if ($type == 'as:Announce') {
@@ -179,6 +216,10 @@ class Receiver
 
                $object_data = self::addActivityFields($object_data, $activity);
 
+               if (empty($object_data['object_type'])) {
+                       $object_data['object_type'] = $object_type;
+               }
+
                $object_data['type'] = $type;
                $object_data['actor'] = $actor;
                $object_data['receiver'] = array_merge(defaults($object_data, 'receiver', []), $receivers);