From 901c3f4855cf241566d90f5b69245d9d3ee27a2c Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 8 Jul 2021 18:59:58 +0000 Subject: [PATCH] we now have got an uri-id field for the contact table --- database.sql | 3 + doc/database/db_contact.md | 169 ++++++++++++++-------------- src/Model/Contact.php | 11 +- src/Object/Api/Mastodon/Account.php | 2 +- static/dbstructure.config.php | 4 +- 5 files changed, 102 insertions(+), 87 deletions(-) diff --git a/database.sql b/database.sql index 160d59aae1..352f1d44ae 100644 --- a/database.sql +++ b/database.sql @@ -126,6 +126,7 @@ CREATE TABLE IF NOT EXISTS `contact` ( `dfrn-id` varchar(255) NOT NULL DEFAULT '' COMMENT '', `url` varchar(255) NOT NULL DEFAULT '' COMMENT '', `nurl` varchar(255) NOT NULL DEFAULT '' COMMENT '', + `uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the contact url', `addr` varchar(255) NOT NULL DEFAULT '' COMMENT '', `alias` varchar(255) NOT NULL DEFAULT '' COMMENT '', `pubkey` text COMMENT 'RSA public key 4096 bit', @@ -202,7 +203,9 @@ CREATE TABLE IF NOT EXISTS `contact` ( INDEX `uid_self_contact-type` (`uid`,`self`,`contact-type`), INDEX `self_network_uid` (`self`,`network`,`uid`), INDEX `gsid` (`gsid`), + INDEX `uri-id` (`uri-id`), FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE, + FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, FOREIGN KEY (`gsid`) REFERENCES `gserver` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='contact table'; diff --git a/doc/database/db_contact.md b/doc/database/db_contact.md index 23a3b533af..5a97c6e4dd 100644 --- a/doc/database/db_contact.md +++ b/doc/database/db_contact.md @@ -6,89 +6,90 @@ contact table Fields ------ -| Field | Description | Type | Null | Key | Default | Extra | -| ------------------------- | --------------------------------------------------------- | ------------------ | ---- | --- | ------------------- | -------------- | -| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment | -| uid | Owner User id | mediumint unsigned | NO | | 0 | | -| created | | datetime | NO | | 0001-01-01 00:00:00 | | -| updated | Date of last contact update | datetime | YES | | 0001-01-01 00:00:00 | | -| self | 1 if the contact is the user him/her self | boolean | NO | | 0 | | -| remote_self | | boolean | NO | | 0 | | -| rel | The kind of the relation between the user and the contact | tinyint unsigned | NO | | 0 | | -| duplex | | boolean | NO | | 0 | | -| network | Network of the contact | char(4) | NO | | | | -| protocol | Protocol of the contact | char(4) | NO | | | | -| name | Name that this contact is known by | varchar(255) | NO | | | | -| nick | Nick- and user name of the contact | varchar(255) | NO | | | | -| location | | varchar(255) | YES | | | | -| about | | text | YES | | NULL | | -| keywords | public keywords (interests) of the contact | text | YES | | NULL | | -| gender | Deprecated | varchar(32) | NO | | | | -| xmpp | | varchar(255) | NO | | | | -| attag | | varchar(255) | NO | | | | -| avatar | | varchar(255) | NO | | | | -| photo | Link to the profile photo of the contact | varchar(255) | YES | | | | -| thumb | Link to the profile photo (thumb size) | varchar(255) | YES | | | | -| micro | Link to the profile photo (micro size) | varchar(255) | YES | | | | -| header | Header picture | varchar(255) | YES | | NULL | | -| site-pubkey | | text | YES | | NULL | | -| issued-id | | varchar(255) | NO | | | | -| dfrn-id | | varchar(255) | NO | | | | -| url | | varchar(255) | NO | | | | -| nurl | | varchar(255) | NO | | | | -| addr | | varchar(255) | NO | | | | -| alias | | varchar(255) | NO | | | | -| pubkey | RSA public key 4096 bit | text | YES | | NULL | | -| prvkey | RSA private key 4096 bit | text | YES | | NULL | | -| batch | | varchar(255) | NO | | | | -| request | | varchar(255) | YES | | NULL | | -| notify | | varchar(255) | YES | | NULL | | -| poll | | varchar(255) | YES | | NULL | | -| confirm | | varchar(255) | YES | | NULL | | -| subscribe | | varchar(255) | YES | | NULL | | -| poco | | varchar(255) | YES | | NULL | | -| aes_allow | | boolean | NO | | 0 | | -| ret-aes | | boolean | NO | | 0 | | -| usehub | | boolean | NO | | 0 | | -| subhub | | boolean | NO | | 0 | | -| hub-verify | | varchar(255) | NO | | | | -| last-update | Date of the last try to update the contact info | datetime | NO | | 0001-01-01 00:00:00 | | -| success_update | Date of the last successful contact update | datetime | NO | | 0001-01-01 00:00:00 | | -| failure_update | Date of the last failed update | datetime | NO | | 0001-01-01 00:00:00 | | -| failed | Connection failed | boolean | YES | | NULL | | -| name-date | | datetime | NO | | 0001-01-01 00:00:00 | | -| uri-date | | datetime | NO | | 0001-01-01 00:00:00 | | -| avatar-date | | datetime | NO | | 0001-01-01 00:00:00 | | -| term-date | | datetime | NO | | 0001-01-01 00:00:00 | | -| last-item | date of the last post | datetime | NO | | 0001-01-01 00:00:00 | | -| last-discovery | date of the last follower discovery | datetime | NO | | 0001-01-01 00:00:00 | | -| priority | | tinyint unsigned | NO | | 0 | | -| blocked | Node-wide block status | boolean | NO | | 1 | | -| block_reason | Node-wide block reason | text | YES | | NULL | | -| readonly | posts of the contact are readonly | boolean | NO | | 0 | | -| writable | | boolean | NO | | 0 | | -| forum | contact is a forum | boolean | NO | | 0 | | -| prv | contact is a private group | boolean | NO | | 0 | | -| contact-type | | tinyint | NO | | 0 | | -| manually-approve | | boolean | YES | | NULL | | -| hidden | | boolean | NO | | 0 | | -| archive | | boolean | NO | | 0 | | -| pending | | boolean | NO | | 1 | | -| deleted | Contact has been deleted | boolean | NO | | 0 | | -| rating | | tinyint | NO | | 0 | | -| unsearchable | Contact prefers to not be searchable | boolean | NO | | 0 | | -| sensitive | Contact posts sensitive content | boolean | NO | | 0 | | -| baseurl | baseurl of the contact | varchar(255) | YES | | | | -| gsid | Global Server ID | int unsigned | YES | | NULL | | -| reason | | text | YES | | NULL | | -| closeness | | tinyint unsigned | NO | | 99 | | -| info | | mediumtext | YES | | NULL | | -| profile-id | Deprecated | int unsigned | YES | | NULL | | -| bdyear | | varchar(4) | NO | | | | -| bd | | date | NO | | 0001-01-01 | | -| notify_new_posts | | boolean | NO | | 0 | | -| fetch_further_information | | tinyint unsigned | NO | | 0 | | -| ffi_keyword_denylist | | text | YES | | NULL | | +| Field | Description | Type | Null | Key | Default | Extra | +| ------------------------- | ------------------------------------------------------------ | ------------------ | ---- | --- | ------------------- | -------------- | +| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment | +| uid | Owner User id | mediumint unsigned | NO | | 0 | | +| created | | datetime | NO | | 0001-01-01 00:00:00 | | +| updated | Date of last contact update | datetime | YES | | 0001-01-01 00:00:00 | | +| self | 1 if the contact is the user him/her self | boolean | NO | | 0 | | +| remote_self | | boolean | NO | | 0 | | +| rel | The kind of the relation between the user and the contact | tinyint unsigned | NO | | 0 | | +| duplex | | boolean | NO | | 0 | | +| network | Network of the contact | char(4) | NO | | | | +| protocol | Protocol of the contact | char(4) | NO | | | | +| name | Name that this contact is known by | varchar(255) | NO | | | | +| nick | Nick- and user name of the contact | varchar(255) | NO | | | | +| location | | varchar(255) | YES | | | | +| about | | text | YES | | NULL | | +| keywords | public keywords (interests) of the contact | text | YES | | NULL | | +| gender | Deprecated | varchar(32) | NO | | | | +| xmpp | | varchar(255) | NO | | | | +| attag | | varchar(255) | NO | | | | +| avatar | | varchar(255) | NO | | | | +| photo | Link to the profile photo of the contact | varchar(255) | YES | | | | +| thumb | Link to the profile photo (thumb size) | varchar(255) | YES | | | | +| micro | Link to the profile photo (micro size) | varchar(255) | YES | | | | +| header | Header picture | varchar(255) | YES | | NULL | | +| site-pubkey | | text | YES | | NULL | | +| issued-id | | varchar(255) | NO | | | | +| dfrn-id | | varchar(255) | NO | | | | +| url | | varchar(255) | NO | | | | +| nurl | | varchar(255) | NO | | | | +| uri-id | Id of the item-uri table entry that contains the contact url | int unsigned | YES | | NULL | | +| addr | | varchar(255) | NO | | | | +| alias | | varchar(255) | NO | | | | +| pubkey | RSA public key 4096 bit | text | YES | | NULL | | +| prvkey | RSA private key 4096 bit | text | YES | | NULL | | +| batch | | varchar(255) | NO | | | | +| request | | varchar(255) | YES | | NULL | | +| notify | | varchar(255) | YES | | NULL | | +| poll | | varchar(255) | YES | | NULL | | +| confirm | | varchar(255) | YES | | NULL | | +| subscribe | | varchar(255) | YES | | NULL | | +| poco | | varchar(255) | YES | | NULL | | +| aes_allow | | boolean | NO | | 0 | | +| ret-aes | | boolean | NO | | 0 | | +| usehub | | boolean | NO | | 0 | | +| subhub | | boolean | NO | | 0 | | +| hub-verify | | varchar(255) | NO | | | | +| last-update | Date of the last try to update the contact info | datetime | NO | | 0001-01-01 00:00:00 | | +| success_update | Date of the last successful contact update | datetime | NO | | 0001-01-01 00:00:00 | | +| failure_update | Date of the last failed update | datetime | NO | | 0001-01-01 00:00:00 | | +| failed | Connection failed | boolean | YES | | NULL | | +| name-date | | datetime | NO | | 0001-01-01 00:00:00 | | +| uri-date | | datetime | NO | | 0001-01-01 00:00:00 | | +| avatar-date | | datetime | NO | | 0001-01-01 00:00:00 | | +| term-date | | datetime | NO | | 0001-01-01 00:00:00 | | +| last-item | date of the last post | datetime | NO | | 0001-01-01 00:00:00 | | +| last-discovery | date of the last follower discovery | datetime | NO | | 0001-01-01 00:00:00 | | +| priority | | tinyint unsigned | NO | | 0 | | +| blocked | Node-wide block status | boolean | NO | | 1 | | +| block_reason | Node-wide block reason | text | YES | | NULL | | +| readonly | posts of the contact are readonly | boolean | NO | | 0 | | +| writable | | boolean | NO | | 0 | | +| forum | contact is a forum | boolean | NO | | 0 | | +| prv | contact is a private group | boolean | NO | | 0 | | +| contact-type | | tinyint | NO | | 0 | | +| manually-approve | | boolean | YES | | NULL | | +| hidden | | boolean | NO | | 0 | | +| archive | | boolean | NO | | 0 | | +| pending | | boolean | NO | | 1 | | +| deleted | Contact has been deleted | boolean | NO | | 0 | | +| rating | | tinyint | NO | | 0 | | +| unsearchable | Contact prefers to not be searchable | boolean | NO | | 0 | | +| sensitive | Contact posts sensitive content | boolean | NO | | 0 | | +| baseurl | baseurl of the contact | varchar(255) | YES | | | | +| gsid | Global Server ID | int unsigned | YES | | NULL | | +| reason | | text | YES | | NULL | | +| closeness | | tinyint unsigned | NO | | 99 | | +| info | | mediumtext | YES | | NULL | | +| profile-id | Deprecated | int unsigned | YES | | NULL | | +| bdyear | | varchar(4) | NO | | | | +| bd | | date | NO | | 0001-01-01 | | +| notify_new_posts | | boolean | NO | | 0 | | +| fetch_further_information | | tinyint unsigned | NO | | 0 | | +| ffi_keyword_denylist | | text | YES | | NULL | | Indexes ------------ @@ -118,6 +119,7 @@ Indexes | uid_self_contact-type | uid, self, contact-type | | self_network_uid | self, network, uid | | gsid | gsid | +| uri-id | uri-id | Foreign Keys ------------ @@ -125,6 +127,7 @@ Foreign Keys | Field | Target Table | Target Field | |-------|--------------|--------------| | uid | [user](help/database/db_user) | uid | +| uri-id | [item-uri](help/database/db_item-uri) | id | | gsid | [gserver](help/database/db_gserver) | id | Return to [database documentation](help/database) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 92f3a48bf5..094146dff2 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -185,6 +185,12 @@ class Contact $fields['gsid'] = GServer::getID($fields['baseurl'], true); } + if (!empty($fields['url']) && !empty($fields['guid'])) { + $fields['uri-id'] = ItemURI::insert(['uri' => $fields['url'], 'guid' => $fields['guid']]); + } elseif (!empty($fields['url'])) { + $fields['uri-id'] = ItemURI::getIdByURI($fields['url']); + } + if (empty($fields['created'])) { $fields['created'] = DateTimeFormat::utcNow(); } @@ -2144,9 +2150,10 @@ class Contact return true; } - $ret['nurl'] = Strings::normaliseLink($ret['url']); + $ret['nurl'] = Strings::normaliseLink($ret['url']); + $ret['uri-id'] = ItemURI::getIdByURI($ret['url']); $ret['updated'] = $updated; - $ret['failed'] = false; + $ret['failed'] = false; // Only fill the pubkey if it had been empty before. We have to prevent identity theft. if (empty($pubkey) && !empty($new_pubkey)) { diff --git a/src/Object/Api/Mastodon/Account.php b/src/Object/Api/Mastodon/Account.php index d2053647a5..9307375752 100644 --- a/src/Object/Api/Mastodon/Account.php +++ b/src/Object/Api/Mastodon/Account.php @@ -111,7 +111,7 @@ class Account extends BaseDataTransferObject $created = $userContactCreated < $publicContactCreated && ($userContactCreated != DBA::NULL_DATETIME) ? $userContactCreated : $publicContactCreated; $this->created_at = DateTimeFormat::utc($created, DateTimeFormat::JSON); - $this->note = BBCode::convert($publicContact['about'], false); + $this->note = BBCode::convertForItem($publicContact['uri-id'] ?? 0, $publicContact['about'], BBCode::API); $this->url = $publicContact['url']; $this->avatar = Contact::getAvatarUrlForId($userContact['id'] ?? 0 ?: $publicContact['id'], Proxy::SIZE_SMALL, $userContact['updated'] ?? '' ?: $publicContact['updated']); $this->avatar_static = $this->avatar; diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 7821774e75..5a569b002c 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -183,6 +183,7 @@ return [ "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "url" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "nurl" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], + "uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the contact url"], "addr" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "alias" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"], @@ -260,7 +261,8 @@ return [ "uid_contact-type" => ["uid", "contact-type"], "uid_self_contact-type" => ["uid", "self", "contact-type"], "self_network_uid" => ["self", "network", "uid"], - "gsid" => ["gsid"] + "gsid" => ["gsid"], + "uri-id" => ["uri-id"], ] ], "item-uri" => [