From e2dc36a691c4618589c08c5a2e743988863fd6e9 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 30 Jun 2021 05:40:11 +0000 Subject: [PATCH] AP: Support "discoverable" --- database.sql | 3 +- doc/database/db_apcontact.md | 55 ++++++++++++------------ src/Model/APContact.php | 2 + src/Protocol/ActivityPub.php | 8 +++- src/Protocol/ActivityPub/Transmitter.php | 5 ++- static/dbstructure.config.php | 3 +- 6 files changed, 44 insertions(+), 32 deletions(-) diff --git a/database.sql b/database.sql index 9e9427bdaa..b6dcb8ab7f 100644 --- a/database.sql +++ b/database.sql @@ -1,6 +1,6 @@ -- ------------------------------------------ -- Friendica 2021.06-rc (Siberian Iris) --- DB_UPDATE_VERSION 1423 +-- DB_UPDATE_VERSION 1424 -- ------------------------------------------ @@ -340,6 +340,7 @@ CREATE TABLE IF NOT EXISTS `apcontact` ( `outbox` varchar(255) COMMENT '', `sharedinbox` varchar(255) COMMENT '', `manually-approve` boolean COMMENT '', + `discoverable` boolean COMMENT 'Mastodon extension: true if profile is published in their directory', `nick` varchar(255) NOT NULL DEFAULT '' COMMENT '', `name` varchar(255) COMMENT '', `about` text COMMENT '', diff --git a/doc/database/db_apcontact.md b/doc/database/db_apcontact.md index 03a4acd421..ede71d1d0c 100644 --- a/doc/database/db_apcontact.md +++ b/doc/database/db_apcontact.md @@ -6,33 +6,34 @@ ActivityPub compatible contacts - used in the ActivityPub implementation Fields ------ -| Field | Description | Type | Null | Key | Default | Extra | -| ---------------- | ---------------------------- | -------------- | ---- | --- | ------------------- | ----- | -| url | URL of the contact | varbinary(255) | NO | PRI | NULL | | -| uuid | | varchar(255) | YES | | NULL | | -| type | | varchar(20) | NO | | NULL | | -| following | | varchar(255) | YES | | NULL | | -| followers | | varchar(255) | YES | | NULL | | -| inbox | | varchar(255) | NO | | NULL | | -| outbox | | varchar(255) | YES | | NULL | | -| sharedinbox | | varchar(255) | YES | | NULL | | -| manually-approve | | boolean | YES | | NULL | | -| nick | | varchar(255) | NO | | | | -| name | | varchar(255) | YES | | NULL | | -| about | | text | YES | | NULL | | -| photo | | varchar(255) | YES | | NULL | | -| header | Header picture | varchar(255) | YES | | NULL | | -| addr | | varchar(255) | YES | | NULL | | -| alias | | varchar(255) | YES | | NULL | | -| pubkey | | text | YES | | NULL | | -| subscribe | | varchar(255) | YES | | NULL | | -| baseurl | baseurl of the ap contact | varchar(255) | YES | | NULL | | -| gsid | Global Server ID | int unsigned | YES | | NULL | | -| generator | Name of the contact's system | varchar(255) | YES | | NULL | | -| following_count | Number of following contacts | int unsigned | YES | | 0 | | -| followers_count | Number of followers | int unsigned | YES | | 0 | | -| statuses_count | Number of posts | int unsigned | YES | | 0 | | -| updated | | datetime | NO | | 0001-01-01 00:00:00 | | +| Field | Description | Type | Null | Key | Default | Extra | +| ---------------- | ------------------------------------------------------------------- | -------------- | ---- | --- | ------------------- | ----- | +| url | URL of the contact | varbinary(255) | NO | PRI | NULL | | +| uuid | | varchar(255) | YES | | NULL | | +| type | | varchar(20) | NO | | NULL | | +| following | | varchar(255) | YES | | NULL | | +| followers | | varchar(255) | YES | | NULL | | +| inbox | | varchar(255) | NO | | NULL | | +| outbox | | varchar(255) | YES | | NULL | | +| sharedinbox | | varchar(255) | YES | | NULL | | +| manually-approve | | boolean | YES | | NULL | | +| discoverable | Mastodon extension: true if profile is published in their directory | boolean | YES | | NULL | | +| nick | | varchar(255) | NO | | | | +| name | | varchar(255) | YES | | NULL | | +| about | | text | YES | | NULL | | +| photo | | varchar(255) | YES | | NULL | | +| header | Header picture | varchar(255) | YES | | NULL | | +| addr | | varchar(255) | YES | | NULL | | +| alias | | varchar(255) | YES | | NULL | | +| pubkey | | text | YES | | NULL | | +| subscribe | | varchar(255) | YES | | NULL | | +| baseurl | baseurl of the ap contact | varchar(255) | YES | | NULL | | +| gsid | Global Server ID | int unsigned | YES | | NULL | | +| generator | Name of the contact's system | varchar(255) | YES | | NULL | | +| following_count | Number of following contacts | int unsigned | YES | | 0 | | +| followers_count | Number of followers | int unsigned | YES | | 0 | | +| statuses_count | Number of posts | int unsigned | YES | | 0 | | +| updated | | datetime | NO | | 0001-01-01 00:00:00 | | Indexes ------------ diff --git a/src/Model/APContact.php b/src/Model/APContact.php index bd6931c4cb..fd9026defb 100644 --- a/src/Model/APContact.php +++ b/src/Model/APContact.php @@ -284,6 +284,8 @@ class APContact } } + $apcontact['discoverable'] = JsonLD::fetchElement($compacted, 'toot:discoverable', '@value'); + // To-Do // Unhandled diff --git a/src/Protocol/ActivityPub.php b/src/Protocol/ActivityPub.php index 6f9d7cf248..134f69f4a6 100644 --- a/src/Protocol/ActivityPub.php +++ b/src/Protocol/ActivityPub.php @@ -65,9 +65,11 @@ class ActivityPub 'dfrn' => 'http://purl.org/macgirvin/dfrn/1.0/', 'diaspora' => 'https://diasporafoundation.org/ns/', 'litepub' => 'http://litepub.social/ns#', + 'toot' => 'http://joinmastodon.org/ns#', 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers', 'sensitive' => 'as:sensitive', 'Hashtag' => 'as:Hashtag', - 'directMessage' => 'litepub:directMessage']]; + 'directMessage' => 'litepub:directMessage', + 'discoverable' => 'toot:discoverable']]; const ACCOUNT_TYPES = ['Person', 'Organization', 'Service', 'Group', 'Application', 'Tombstone']; /** * Checks if the web request is done for the AP protocol @@ -166,6 +168,10 @@ class ActivityPub $profile['baseurl'] = $apcontact['baseurl']; $profile['gsid'] = $apcontact['gsid']; + if (!is_null($apcontact['discoverable'])) { + $profile['hide'] = !$apcontact['discoverable']; + } + // Remove all "null" fields foreach ($profile as $field => $content) { if (is_null($content)) { diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index 27658c84fa..9b02ff0b97 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -325,7 +325,7 @@ class Transmitter return []; } - $fields = ['locality', 'region', 'country-name']; + $fields = ['locality', 'region', 'country-name', 'net-publish']; $profile = DBA::selectFirst('profile', $fields, ['uid' => $uid]); if (!DBA::isResult($profile)) { return []; @@ -340,7 +340,7 @@ class Transmitter $contact = User::getSystemAccount(); $user = ['guid' => '', 'nickname' => $contact['nick'], 'pubkey' => $contact['pubkey'], 'account-type' => $contact['contact-type'], 'page-flags' => User::PAGE_FLAGS_NORMAL]; - $profile = ['locality' => '', 'region' => '', 'country-name' => '']; + $profile = ['locality' => '', 'region' => '', 'country-name' => '', 'net-publish' => false]; } $data = ['@context' => ActivityPub::CONTEXT]; @@ -375,6 +375,7 @@ class Transmitter $data['url'] = $contact['url']; $data['manuallyApprovesFollowers'] = in_array($user['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP]); + $data['discoverable'] = $profile['net-publish']; $data['publicKey'] = ['id' => $contact['url'] . '#main-key', 'owner' => $contact['url'], 'publicKeyPem' => $user['pubkey']]; diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 53e341507b..be939b1a17 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -55,7 +55,7 @@ use Friendica\Database\DBA; if (!defined('DB_UPDATE_VERSION')) { - define('DB_UPDATE_VERSION', 1423); + define('DB_UPDATE_VERSION', 1424); } return [ @@ -401,6 +401,7 @@ return [ "outbox" => ["type" => "varchar(255)", "comment" => ""], "sharedinbox" => ["type" => "varchar(255)", "comment" => ""], "manually-approve" => ["type" => "boolean", "comment" => ""], + "discoverable" => ["type" => "boolean", "comment" => "Mastodon extension: true if profile is published in their directory"], "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "name" => ["type" => "varchar(255)", "comment" => ""], "about" => ["type" => "text", "comment" => ""],