From a4b0ab90b1ac32f7cdb875387f511c980dbed9ce Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 10 Sep 2021 13:05:16 +0000 Subject: [PATCH 01/20] Insert a `user-contact` for every contact --- database.sql | 9 ++++--- doc/database/db_user-contact.md | 25 +++++++++++--------- src/Model/Contact.php | 34 +++++++++++++------------- src/Model/Contact/User.php | 42 +++++++++++++++++++++++++++++++++ src/Model/User.php | 6 ++--- src/Worker/ExpirePosts.php | 1 + static/dbstructure.config.php | 4 +++- 7 files changed, 87 insertions(+), 34 deletions(-) diff --git a/database.sql b/database.sql index eff8f83fa..dd04a0e35 100644 --- a/database.sql +++ b/database.sql @@ -1,6 +1,6 @@ -- ------------------------------------------ --- Friendica 2021.09-dev (Siberian Iris) --- DB_UPDATE_VERSION 1434 +-- Friendica 2021.09-rc (Siberian Iris) +-- DB_UPDATE_VERSION 1435 -- ------------------------------------------ @@ -1512,13 +1512,16 @@ CREATE TABLE IF NOT EXISTS `userd` ( CREATE TABLE IF NOT EXISTS `user-contact` ( `cid` int unsigned NOT NULL DEFAULT 0 COMMENT 'Contact id of the linked public contact', `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'User id', + `uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the contact url', `blocked` boolean COMMENT 'Contact is completely blocked for this user', `ignored` boolean COMMENT 'Posts from this contact are ignored', `collapsed` boolean COMMENT 'Posts from this contact are collapsed', PRIMARY KEY(`uid`,`cid`), INDEX `cid` (`cid`), + UNIQUE INDEX `uri-id_uid` (`uri-id`,`uid`), FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, - FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE + 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 ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='User specific public contact data'; -- diff --git a/doc/database/db_user-contact.md b/doc/database/db_user-contact.md index 35d140cff..467ee86d9 100644 --- a/doc/database/db_user-contact.md +++ b/doc/database/db_user-contact.md @@ -6,21 +6,23 @@ User specific public contact data Fields ------ -| Field | Description | Type | Null | Key | Default | Extra | -| --------- | ------------------------------------------- | ------------------ | ---- | --- | ------- | ----- | -| cid | Contact id of the linked public contact | int unsigned | NO | PRI | 0 | | -| uid | User id | mediumint unsigned | NO | PRI | 0 | | -| blocked | Contact is completely blocked for this user | boolean | YES | | NULL | | -| ignored | Posts from this contact are ignored | boolean | YES | | NULL | | -| collapsed | Posts from this contact are collapsed | boolean | YES | | NULL | | +| Field | Description | Type | Null | Key | Default | Extra | +| --------- | ------------------------------------------------------------ | ------------------ | ---- | --- | ------- | ----- | +| cid | Contact id of the linked public contact | int unsigned | NO | PRI | 0 | | +| uid | User id | mediumint unsigned | NO | PRI | 0 | | +| uri-id | Id of the item-uri table entry that contains the contact url | int unsigned | YES | | NULL | | +| blocked | Contact is completely blocked for this user | boolean | YES | | NULL | | +| ignored | Posts from this contact are ignored | boolean | YES | | NULL | | +| collapsed | Posts from this contact are collapsed | boolean | YES | | NULL | | Indexes ------------ -| Name | Fields | -| ------- | -------- | -| PRIMARY | uid, cid | -| cid | cid | +| Name | Fields | +| ---------- | ------------------- | +| PRIMARY | uid, cid | +| cid | cid | +| uri-id_uid | UNIQUE, uri-id, uid | Foreign Keys ------------ @@ -29,5 +31,6 @@ Foreign Keys |-------|--------------|--------------| | cid | [contact](help/database/db_contact) | id | | uid | [user](help/database/db_user) | uid | +| uri-id | [item-uri](help/database/db_item-uri) | id | Return to [database documentation](help/database) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 93e745456..2cc1c091e 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -175,7 +175,7 @@ class Contact * @param array $fields field array * @param int $duplicate_mode Do an update on a duplicate entry * - * @return boolean was the insert successful? + * @return int id of the created contact * @throws \Exception */ public static function insert(array $fields, int $duplicate_mode = Database::INSERT_DEFAULT) @@ -190,17 +190,22 @@ class Contact $fields['created'] = DateTimeFormat::utcNow(); } - $ret = DBA::insert('contact', $fields, $duplicate_mode); - $contact = DBA::selectFirst('contact', ['nurl', 'uid'], ['id' => DBA::lastInsertId()]); + DBA::insert('contact', $fields, $duplicate_mode); + $contact = DBA::selectFirst('contact', [], ['id' => DBA::lastInsertId()]); if (!DBA::isResult($contact)) { // Shouldn't happen - return $ret; + Logger::warning('Created contact could not be found', ['fields' => $fields]); + return 0; } - // Search for duplicated contacts and get rid of them - self::removeDuplicates($contact['nurl'], $contact['uid']); + Contact\User::insertForContactArray($contact); - return $ret; + // Search for duplicated contacts and get rid of them + if (!$contact['self']) { + self::removeDuplicates($contact['nurl'], $contact['uid']); + } + + return $contact['id']; } /** @@ -650,7 +655,7 @@ class Contact // Only create the entry if it doesn't exist yet if (!DBA::exists('contact', ['uid' => $uid, 'self' => true])) { - $return = DBA::insert('contact', $contact); + $return = (bool)self::insert($contact); } // Create the public contact @@ -659,7 +664,7 @@ class Contact $contact['uid'] = 0; $contact['prvkey'] = null; - DBA::insert('contact', $contact, Database::INSERT_IGNORE); + self::insert($contact, Database::INSERT_IGNORE); } return $return; @@ -1209,8 +1214,7 @@ class Contact $contact_id = $contact['id']; Logger::notice('Contact had been created (shortly) before', ['id' => $contact_id, 'url' => $url, 'uid' => $uid]); } else { - DBA::insert('contact', $fields); - $contact_id = DBA::lastInsertId(); + $contact_id = self::insert($fields); if ($contact_id) { Logger::info('Contact inserted', ['id' => $contact_id, 'url' => $url, 'uid' => $uid]); } @@ -1991,7 +1995,7 @@ class Contact */ public static function removeDuplicates(string $nurl, int $uid) { - $condition = ['nurl' => $nurl, 'uid' => $uid, 'deleted' => false, 'network' => Protocol::FEDERATED]; + $condition = ['nurl' => $nurl, 'uid' => $uid, 'self' => false, 'deleted' => false, 'network' => Protocol::FEDERATED]; $count = DBA::count('contact', $condition); if ($count <= 1) { return false; @@ -2355,7 +2359,7 @@ class Contact $probed = false; $ret = $arr['contact']; } else { - $probed = true; + $probed = true; $ret = Probe::uri($url, $network, $uid); } @@ -2684,7 +2688,7 @@ class Contact } // create contact record - DBA::insert('contact', [ + $contact_id = self::insert([ 'uid' => $importer['uid'], 'created' => DateTimeFormat::utcNow(), 'url' => $url, @@ -2699,8 +2703,6 @@ class Contact 'writable' => 1, ]); - $contact_id = DBA::lastInsertId(); - // Ensure to always have the correct network type, independent from the connection request method self::updateFromProbe($contact_id); diff --git a/src/Model/Contact/User.php b/src/Model/Contact/User.php index 26fd96303..0283fae72 100644 --- a/src/Model/Contact/User.php +++ b/src/Model/Contact/User.php @@ -21,14 +21,56 @@ namespace Friendica\Model\Contact; +use Friendica\Core\Logger; +use Friendica\Core\System; +use Friendica\Database\Database; use Friendica\Database\DBA; use Friendica\Model\Contact; +use Friendica\Model\ItemURI; /** * This class provides information about user related contacts based on the "user-contact" table. */ class User { + /** + * Insert a user-contact for a given contact array + * + * @param array $contact + * @return void + */ + public static function insertForContactArray(array $contact) + { + if (!isset($contact['uid']) || (empty($contact['uri-id']) && empty($contact['url']))) { + Logger::info('Missing contact details', ['contact' => $contact, 'callstack' => System::callstack(20)]); + return false; + } + + if (empty($contact['uri-id'])) { + $contact['uri-id'] = ItemURI::getIdByURI($contact['url']); + } + + $pcontact = Contact::selectFirst(['id'], ['uri-id' => $contact['uri-id'], 'uid' => 0]); + if (!DBA::isResult($pcontact)) { + Logger::info('Public contact for user not found', ['uri-id' => $contact['uri-id'], 'uid' => $contact['uid'], 'cid' => $pcontact['id']]); + return false; + } + + $fields = [ + 'cid' => $pcontact['id'], + 'uid' => $contact['uid'], + 'uri-id' => $contact['uri-id'], + 'blocked' => $contact['blocked'] ?? false, + 'ignored' => $contact['readonly'] ?? false, + ]; + + $ret = DBA::insert('user-contact', $fields, Database::INSERT_IGNORE); + + Logger::info('Inserted user contact', ['uid' => $contact['uid'], 'cid' => $pcontact['id'], 'uri-id' => $contact['uri-id'], 'ret' => $ret]); + + return $ret; + } + /** * Block contact id for user id * diff --git a/src/Model/User.php b/src/Model/User.php index 4f63b3819..b2282fc18 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -234,7 +234,7 @@ class User $system['closeness'] = 0; $system['baseurl'] = DI::baseUrl(); $system['gsid'] = GServer::getID($system['baseurl']); - DBA::insert('contact', $system); + Contact::insert($system); } /** @@ -1585,8 +1585,8 @@ class User /** * Check if the given user id has delegations or is delegated * - * @param int $uid - * @return bool + * @param int $uid + * @return bool */ public static function hasIdentities(int $uid):bool { diff --git a/src/Worker/ExpirePosts.php b/src/Worker/ExpirePosts.php index bd1addf11..8d7b8c6ee 100644 --- a/src/Worker/ExpirePosts.php +++ b/src/Worker/ExpirePosts.php @@ -184,6 +184,7 @@ class ExpirePosts AND NOT EXISTS(SELECT `external-id` FROM `post-user` WHERE `external-id` = `item-uri`.`id`) AND NOT EXISTS(SELECT `uri-id` FROM `mail` WHERE `uri-id` = `item-uri`.`id`) AND NOT EXISTS(SELECT `uri-id` FROM `event` WHERE `uri-id` = `item-uri`.`id`) + AND NOT EXISTS(SELECT `uri-id` FROM `user-contact` WHERE `uri-id` = `item-uri`.`id`) AND NOT EXISTS(SELECT `uri-id` FROM `contact` WHERE `uri-id` = `item-uri`.`id`) AND NOT EXISTS(SELECT `uri-id` FROM `apcontact` WHERE `uri-id` = `item-uri`.`id`) AND NOT EXISTS(SELECT `uri-id` FROM `fcontact` WHERE `uri-id` = `item-uri`.`id`) diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 6f455d14e..fd6c4c798 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', 1434); + define('DB_UPDATE_VERSION', 1435); } return [ @@ -1531,6 +1531,7 @@ return [ "fields" => [ "cid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "primary" => "1", "foreign" => ["contact" => "id"], "comment" => "Contact id of the linked public contact"], "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "primary" => "1", "foreign" => ["user" => "uid"], "comment" => "User id"], + "uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the contact url"], "blocked" => ["type" => "boolean", "comment" => "Contact is completely blocked for this user"], "ignored" => ["type" => "boolean", "comment" => "Posts from this contact are ignored"], "collapsed" => ["type" => "boolean", "comment" => "Posts from this contact are collapsed"] @@ -1538,6 +1539,7 @@ return [ "indexes" => [ "PRIMARY" => ["uid", "cid"], "cid" => ["cid"], + "uri-id_uid" => ["UNIQUE", "uri-id", "uid"], ] ], "worker-ipc" => [ From 9c14eb0c6b2c1144263177d9f4d2d81b0cab297e Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 10 Sep 2021 18:21:19 +0000 Subject: [PATCH 02/20] Use centralized function to update contact entries --- include/api.php | 10 ++-- mod/pubsub.php | 2 +- mod/unfollow.php | 2 +- src/Console/ArchiveContact.php | 3 +- src/Console/GlobalCommunitySilence.php | 2 +- src/Model/Contact.php | 65 ++++++++++++++--------- src/Model/Contact/Relation.php | 4 +- src/Model/Introduction.php | 4 +- src/Model/Item.php | 6 +-- src/Module/Api/Mastodon/Accounts/Note.php | 2 +- src/Module/Contact.php | 4 +- src/Protocol/ActivityPub/Processor.php | 6 +-- src/Protocol/ActivityPub/Transmitter.php | 4 +- src/Protocol/DFRN.php | 22 ++++---- src/Protocol/Diaspora.php | 4 +- src/Protocol/Feed.php | 2 +- src/Protocol/OStatus.php | 4 +- src/Protocol/Relay.php | 2 +- src/Worker/OnePoll.php | 12 ++--- src/Worker/RemoveUnusedAvatars.php | 2 +- 20 files changed, 90 insertions(+), 72 deletions(-) diff --git a/include/api.php b/include/api.php index e0cac831e..7758a5eaf 100644 --- a/include/api.php +++ b/include/api.php @@ -3848,7 +3848,7 @@ function api_friendships_destroy($type) if ($dissolve) { Contact::remove($contact['id']); } else { - DBA::update('contact', ['rel' => Contact::FOLLOWER], ['id' => $contact['id']]); + Contact::update(['rel' => Contact::FOLLOWER], ['id' => $contact['id']]); } // "uid" and "self" are only needed for some internal stuff, so remove it from here @@ -4504,14 +4504,14 @@ function api_account_update_profile($type) if (!empty($_POST['name'])) { DBA::update('profile', ['name' => $_POST['name']], ['uid' => $local_user]); DBA::update('user', ['username' => $_POST['name']], ['uid' => $local_user]); - DBA::update('contact', ['name' => $_POST['name']], ['uid' => $local_user, 'self' => 1]); - DBA::update('contact', ['name' => $_POST['name']], ['id' => $api_user['id']]); + Contact::update(['name' => $_POST['name']], ['uid' => $local_user, 'self' => 1]); + Contact::update(['name' => $_POST['name']], ['id' => $api_user['id']]); } if (isset($_POST['description'])) { DBA::update('profile', ['about' => $_POST['description']], ['uid' => $local_user]); - DBA::update('contact', ['about' => $_POST['description']], ['uid' => $local_user, 'self' => 1]); - DBA::update('contact', ['about' => $_POST['description']], ['id' => $api_user['id']]); + Contact::update(['about' => $_POST['description']], ['uid' => $local_user, 'self' => 1]); + Contact::update(['about' => $_POST['description']], ['id' => $api_user['id']]); } Profile::publishUpdate($local_user); diff --git a/mod/pubsub.php b/mod/pubsub.php index 9b73ff85e..1dfbd0b3d 100644 --- a/mod/pubsub.php +++ b/mod/pubsub.php @@ -96,7 +96,7 @@ function pubsub_init(App $a) } if (!empty($hub_mode)) { - DBA::update('contact', ['subhub' => $subscribe], ['id' => $contact['id']]); + Contact::update(['subhub' => $subscribe], ['id' => $contact['id']]); Logger::log($hub_mode . ' success for contact ' . $contact_id . '.'); } hub_return(true, $hub_challenge); diff --git a/mod/unfollow.php b/mod/unfollow.php index de1cb6cf7..f1117674d 100644 --- a/mod/unfollow.php +++ b/mod/unfollow.php @@ -149,7 +149,7 @@ function unfollow_process(string $url) Contact::remove($contact['id']); $return_path = $base_return_path; } else { - DBA::update('contact', ['rel' => Contact::FOLLOWER], ['id' => $contact['id']]); + Contact::update(['rel' => Contact::FOLLOWER], ['id' => $contact['id']]); $return_path = $base_return_path . '/' . $contact['id']; } diff --git a/src/Console/ArchiveContact.php b/src/Console/ArchiveContact.php index 24251bcce..e3ccc4811 100644 --- a/src/Console/ArchiveContact.php +++ b/src/Console/ArchiveContact.php @@ -24,6 +24,7 @@ namespace Friendica\Console; use Friendica\App; use Friendica\Database\Database; use Friendica\DI; +use Friendica\Model\Contact; use Friendica\Util\Strings; use RuntimeException; @@ -104,7 +105,7 @@ HELP; if (!$this->dba->exists('contact', ['nurl' => $nurl, 'archive' => false])) { throw new RuntimeException(DI::l10n()->t('Could not find any unarchived contact entry for this URL (%s)', $nurl)); } - if ($this->dba->update('contact', ['archive' => true], ['nurl' => $nurl])) { + if (Contact::update(['archive' => true], ['nurl' => $nurl])) { $this->out($this->l10n->t('The contact entries have been archived')); } else { throw new RuntimeException('The contact archival failed.'); diff --git a/src/Console/GlobalCommunitySilence.php b/src/Console/GlobalCommunitySilence.php index d74892b34..2e65109e8 100644 --- a/src/Console/GlobalCommunitySilence.php +++ b/src/Console/GlobalCommunitySilence.php @@ -98,7 +98,7 @@ HELP; $contact_id = Contact::getIdForURL($this->getArgument(0)); if ($contact_id) { - $this->dba->update('contact', ['hidden' => true], ['id' => $contact_id]); + Contact::update(['hidden' => true], ['id' => $contact_id]); $this->out('The account has been successfully silenced from the global community page.'); } else { throw new RuntimeException('Could not find any public contact entry for this URL (' . $this->getArgument(0) . ')'); diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 2cc1c091e..8c8462593 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -208,6 +208,23 @@ class Contact return $contact['id']; } + /** + * Updates rows in the contact table + * + * @param array $fields contains the fields that are updated + * @param array $condition condition array with the key values + * @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate, false = don't update identical fields) + * + * @return boolean was the update successfull? + * @throws \Exception + */ + public static function update(array $fields, array $condition, $old_fields = []) + { + $ret = DBA::update('contact', $fields, $condition, $old_fields); + // @todo Apply changes to the "user-contact" table on dedicated fields + return $ret; + } + /** * @param integer $id Contact ID * @param array $fields Array of selected fields, empty for all @@ -765,12 +782,12 @@ class Contact $fields['name-date'] = DateTimeFormat::utcNow(); } $fields['updated'] = DateTimeFormat::utcNow(); - DBA::update('contact', $fields, ['id' => $self['id']]); + self::update($fields, ['id' => $self['id']]); // Update the public contact as well $fields['prvkey'] = null; $fields['self'] = false; - DBA::update('contact', $fields, ['uid' => 0, 'nurl' => $self['nurl']]); + self::update($fields, ['uid' => 0, 'nurl' => $self['nurl']]); // Update the profile $fields = ['photo' => DI::baseUrl() . '/photo/profile/' .$uid . '.' . $file_suffix, @@ -797,7 +814,7 @@ class Contact } // Archive the contact - DBA::update('contact', ['archive' => true, 'network' => Protocol::PHANTOM, 'deleted' => true], ['id' => $id]); + self::update(['archive' => true, 'network' => Protocol::PHANTOM, 'deleted' => true], ['id' => $id]); // Delete it in the background Worker::add(PRIORITY_MEDIUM, 'RemoveContact', $id); @@ -883,8 +900,8 @@ class Contact } if ($contact['term-date'] <= DBA::NULL_DATETIME) { - DBA::update('contact', ['term-date' => DateTimeFormat::utcNow()], ['id' => $contact['id']]); - DBA::update('contact', ['term-date' => DateTimeFormat::utcNow()], ['`nurl` = ? AND `term-date` <= ? AND NOT `self`', Strings::normaliseLink($contact['url']), DBA::NULL_DATETIME]); + self::update(['term-date' => DateTimeFormat::utcNow()], ['id' => $contact['id']]); + self::update(['term-date' => DateTimeFormat::utcNow()], ['`nurl` = ? AND `term-date` <= ? AND NOT `self`', Strings::normaliseLink($contact['url']), DBA::NULL_DATETIME]); } else { /* @todo * We really should send a notification to the owner after 2-3 weeks @@ -901,8 +918,8 @@ class Contact * delete, though if the owner tries to unarchive them we'll start * the whole process over again. */ - DBA::update('contact', ['archive' => true], ['id' => $contact['id']]); - DBA::update('contact', ['archive' => true], ['nurl' => Strings::normaliseLink($contact['url']), 'self' => false]); + self::update(['archive' => true], ['id' => $contact['id']]); + self::update(['archive' => true], ['nurl' => Strings::normaliseLink($contact['url']), 'self' => false]); } } } @@ -923,7 +940,7 @@ class Contact $fields = ['failed' => false, 'term-date' => DBA::NULL_DATETIME, 'archive' => false]; $condition = ['uid' => 0, 'network' => Protocol::FEDERATED, 'batch' => $contact['batch'], 'contact-type' => self::TYPE_RELAY]; if (!DBA::exists('contact', array_merge($condition, $fields))) { - DBA::update('contact', $fields, $condition); + self::update($fields, $condition); } } @@ -947,8 +964,8 @@ class Contact // It's a miracle. Our dead contact has inexplicably come back to life. $fields = ['failed' => false, 'term-date' => DBA::NULL_DATETIME, 'archive' => false]; - DBA::update('contact', $fields, ['id' => $contact['id']]); - DBA::update('contact', $fields, ['nurl' => Strings::normaliseLink($contact['url']), 'self' => false]); + self::update($fields, ['id' => $contact['id']]); + self::update($fields, ['nurl' => Strings::normaliseLink($contact['url']), 'self' => false]); } /** @@ -1496,7 +1513,7 @@ class Contact */ public static function block($cid, $reason = null) { - $return = DBA::update('contact', ['blocked' => true, 'block_reason' => $reason], ['id' => $cid]); + $return = self::update(['blocked' => true, 'block_reason' => $reason], ['id' => $cid]); return $return; } @@ -1510,7 +1527,7 @@ class Contact */ public static function unblock($cid) { - $return = DBA::update('contact', ['blocked' => false, 'block_reason' => null], ['id' => $cid]); + $return = self::update(['blocked' => false, 'block_reason' => null], ['id' => $cid]); return $return; } @@ -1809,7 +1826,7 @@ class Contact // Only update the cached photo links of public contacts when they already are cached if (($uid == 0) && !$force && empty($contact['thumb']) && empty($contact['micro']) && !$create_cache) { if ($contact['avatar'] != $avatar) { - DBA::update('contact', ['avatar' => $avatar], ['id' => $cid]); + self::update(['avatar' => $avatar], ['id' => $cid]); Logger::info('Only update the avatar', ['id' => $cid, 'avatar' => $avatar, 'contact' => $contact]); } return; @@ -1906,7 +1923,7 @@ class Contact $cids[] = $cid; $uids[] = $uid; Logger::info('Updating cached contact avatars', ['cid' => $cids, 'uid' => $uids, 'fields' => $fields]); - DBA::update('contact', $fields, ['id' => $cids]); + self::update($fields, ['id' => $cids]); } public static function deleteContactByUrl(string $url) @@ -1933,7 +1950,7 @@ class Contact */ private static function updateContact(int $id, int $uid, string $old_url, string $new_url, array $fields) { - if (!DBA::update('contact', $fields, ['id' => $id])) { + if (!self::update($fields, ['id' => $id])) { Logger::info('Couldn\'t update contact.', ['id' => $id, 'fields' => $fields]); return; } @@ -1966,7 +1983,7 @@ class Contact $condition = ['self' => false, 'nurl' => Strings::normaliseLink($old_url)]; $condition['network'] = [Protocol::DFRN, Protocol::DIASPORA, Protocol::ACTIVITYPUB]; - DBA::update('contact', $fields, $condition); + self::update($fields, $condition); // We mustn't set the update fields for OStatus contacts since they are updated in OnePoll $condition['network'] = Protocol::OSTATUS; @@ -1982,7 +1999,7 @@ class Contact return; } - DBA::update('contact', $fields, $condition); + self::update($fields, $condition); } /** @@ -2256,7 +2273,7 @@ class Contact } } if (!empty($fields)) { - DBA::update('contact', $fields, ['id' => $id, 'self' => false]); + self::update($fields, ['id' => $id, 'self' => false]); Logger::info('Updating local contact', ['id' => $id]); } } @@ -2434,7 +2451,7 @@ class Contact $new_relation = (($contact['rel'] == self::FOLLOWER) ? self::FRIEND : self::SHARING); $fields = ['rel' => $new_relation, 'subhub' => $subhub, 'readonly' => false]; - DBA::update('contact', $fields, ['id' => $contact['id']]); + self::update($fields, ['id' => $contact['id']]); } else { $new_relation = (in_array($protocol, [Protocol::MAIL]) ? self::FRIEND : self::SHARING); @@ -2567,7 +2584,7 @@ class Contact $fields = ['url' => $contact['url'], 'request' => $contact['request'], 'notify' => $contact['notify'], 'poll' => $contact['poll'], 'confirm' => $contact['confirm'], 'poco' => $contact['poco']]; - DBA::update('contact', $fields, ['id' => $contact['id']]); + self::update($fields, ['id' => $contact['id']]); } return $contact; @@ -2670,7 +2687,7 @@ class Contact if (($contact['rel'] == self::SHARING) || ($sharing && $contact['rel'] == self::FOLLOWER)) { - DBA::update('contact', ['rel' => self::FRIEND, 'writable' => true, 'pending' => false], + self::update(['rel' => self::FRIEND, 'writable' => true, 'pending' => false], ['id' => $contact['id'], 'uid' => $importer['uid']]); } @@ -2750,7 +2767,7 @@ class Contact $fields['rel'] = self::FRIEND; } - DBA::update('contact', $fields, $condition); + self::update($fields, $condition); return true; } @@ -2762,7 +2779,7 @@ class Contact public static function removeFollower($importer, $contact) { if (($contact['rel'] == self::FRIEND) || ($contact['rel'] == self::SHARING)) { - DBA::update('contact', ['rel' => self::SHARING], ['id' => $contact['id']]); + self::update(['rel' => self::SHARING], ['id' => $contact['id']]); } else { self::remove($contact['id']); } @@ -2771,7 +2788,7 @@ class Contact public static function removeSharer($importer, $contact) { if (($contact['rel'] == self::FRIEND) || ($contact['rel'] == self::FOLLOWER)) { - DBA::update('contact', ['rel' => self::FOLLOWER], ['id' => $contact['id']]); + self::update(['rel' => self::FOLLOWER], ['id' => $contact['id']]); } else { self::remove($contact['id']); } diff --git a/src/Model/Contact/Relation.php b/src/Model/Contact/Relation.php index b9d38790d..565d076a7 100644 --- a/src/Model/Contact/Relation.php +++ b/src/Model/Contact/Relation.php @@ -114,7 +114,7 @@ class Relation } if (empty($followers) && empty($followings)) { - DBA::update('contact', ['last-discovery' => DateTimeFormat::utcNow()], ['id' => $contact['id']]); + Contact::update(['last-discovery' => DateTimeFormat::utcNow()], ['id' => $contact['id']]); Logger::info('The contact does not offer discoverable data', ['id' => $contact['id'], 'url' => $url, 'network' => $contact['network']]); return; } @@ -162,7 +162,7 @@ class Relation DBA::delete('contact-relation', ['cid' => $target, 'follows' => false, 'last-interaction' => DBA::NULL_DATETIME]); } - DBA::update('contact', ['last-discovery' => DateTimeFormat::utcNow()], ['id' => $target]); + Contact::update(['last-discovery' => DateTimeFormat::utcNow()], ['id' => $target]); Logger::info('Contacts discovery finished', ['id' => $target, 'url' => $url, 'follower' => $follower_counter, 'following' => $following_counter]); return; } diff --git a/src/Model/Introduction.php b/src/Model/Introduction.php index 849cad78b..aa7189121 100644 --- a/src/Model/Introduction.php +++ b/src/Model/Introduction.php @@ -110,7 +110,7 @@ class Introduction extends BaseModel 'hidden' => $hidden ?? $contact['hidden'], 'rel' => $newRelation, ]; - $this->dba->update('contact', $fields, ['id' => $contact['id']]); + Contact::update($fields, ['id' => $contact['id']]); array_merge($contact, $fields); @@ -159,7 +159,7 @@ class Introduction extends BaseModel if ($this->dba->exists('contact', $condition)) { Contact::remove($this->{'contact-id'}); } else { - $this->dba->update('contact', ['pending' => false], ['id' => $this->{'contact-id'}]); + Contact::update(['pending' => false], ['id' => $this->{'contact-id'}]); } } diff --git a/src/Model/Item.php b/src/Model/Item.php index 5cc72b058..7406bb290 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -1753,15 +1753,15 @@ class Item } else { $condition = ['id' => $arr['contact-id'], 'self' => false]; } - DBA::update('contact', ['failed' => false, 'success_update' => $arr['received'], 'last-item' => $arr['received']], $condition); + Contact::update(['failed' => false, 'success_update' => $arr['received'], 'last-item' => $arr['received']], $condition); } // Now do the same for the system wide contacts with uid=0 if ($arr['private'] != self::PRIVATE) { - DBA::update('contact', ['failed' => false, 'success_update' => $arr['received'], 'last-item' => $arr['received']], + Contact::update(['failed' => false, 'success_update' => $arr['received'], 'last-item' => $arr['received']], ['id' => $arr['owner-id']]); if ($arr['owner-id'] != $arr['author-id']) { - DBA::update('contact', ['failed' => false, 'success_update' => $arr['received'], 'last-item' => $arr['received']], + Contact::update(['failed' => false, 'success_update' => $arr['received'], 'last-item' => $arr['received']], ['id' => $arr['author-id']]); } } diff --git a/src/Module/Api/Mastodon/Accounts/Note.php b/src/Module/Api/Mastodon/Accounts/Note.php index bb5778a0f..e63192202 100644 --- a/src/Module/Api/Mastodon/Accounts/Note.php +++ b/src/Module/Api/Mastodon/Accounts/Note.php @@ -50,7 +50,7 @@ class Note extends BaseApi DI::mstdnError()->RecordNotFound(); } - DBA::update('contact', ['info' => $request['comment']], ['id' => $cdata['user']]); + Contact::update(['info' => $request['comment']], ['id' => $cdata['user']]); System::jsonExit(DI::mstdnRelationship()->createFromContactId($parameters['id'], $uid)->toArray()); } diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 6f32356a3..dac706c2f 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -139,7 +139,7 @@ class Contact extends BaseModule $info = Strings::escapeHtml(trim($_POST['info'] ?? '')); - $r = DBA::update('contact', [ + $r = Model\Contact::update([ 'priority' => $priority, 'info' => $info, 'hidden' => $hidden, @@ -175,7 +175,7 @@ class Contact extends BaseModule $result = Model\Contact::createFromProbeForUser($contact['uid'], $contact['url'], $contact['network']); if ($result['success']) { - DBA::update('contact', ['subhub' => 1], ['id' => $contact_id]); + Model\Contact::update(['subhub' => 1], ['id' => $contact_id]); } // pull feed and consume it, which should subscribe to the hub. diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 47a530035..414c71921 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -912,7 +912,7 @@ class Processor $cid = Contact::getIdForURL($activity['actor'], $uid); if (!empty($cid)) { self::switchContact($cid); - DBA::update('contact', ['hub-verify' => $activity['id'], 'protocol' => Protocol::ACTIVITYPUB], ['id' => $cid]); + Contact::update(['hub-verify' => $activity['id'], 'protocol' => Protocol::ACTIVITYPUB], ['id' => $cid]); } $item = ['author-id' => Contact::getIdForURL($activity['actor']), @@ -932,7 +932,7 @@ class Processor } if (empty($contact)) { - DBA::update('contact', ['hub-verify' => $activity['id'], 'protocol' => Protocol::ACTIVITYPUB], ['id' => $cid]); + Contact::update(['hub-verify' => $activity['id'], 'protocol' => Protocol::ACTIVITYPUB], ['id' => $cid]); } Logger::notice('Follow user ' . $uid . ' from contact ' . $cid . ' with id ' . $activity['id']); @@ -1011,7 +1011,7 @@ class Processor } $condition = ['id' => $cid]; - DBA::update('contact', $fields, $condition); + Contact::update($fields, $condition); Logger::info('Accept contact request', ['contact' => $cid, 'user' => $uid]); } diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index bd43eea04..daed50d0b 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -115,7 +115,7 @@ class Transmitter $activity_id = ActivityPub\Transmitter::activityIDFromContact($contact['id']); $success = ActivityPub\Transmitter::sendActivity('Follow', $url, 0, $activity_id); if ($success) { - DBA::update('contact', ['rel' => Contact::FRIEND], ['id' => $contact['id']]); + Contact::update(['rel' => Contact::FRIEND], ['id' => $contact['id']]); } return $success; @@ -137,7 +137,7 @@ class Transmitter $success = self::sendContactUndo($url, $contact['id'], 0); if ($success || $force) { - DBA::update('contact', ['rel' => Contact::NOTHING], ['id' => $contact['id']]); + Contact::update(['rel' => Contact::NOTHING], ['id' => $contact['id']]); } return $success; diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 4ccd259f2..44518e15c 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -1215,12 +1215,12 @@ class DFRN 'xmpp' => $contact['xmpp'], 'name-date' => DateTimeFormat::utc($contact['name-date']), 'unsearchable' => $contact['hidden'], 'uri-date' => DateTimeFormat::utc($contact['uri-date'])]; - DBA::update('contact', $fields, ['id' => $contact['id'], 'network' => $contact['network']], $contact_old); + Contact::update($fields, ['id' => $contact['id'], 'network' => $contact['network']], $contact_old); // Update the public contact. Don't set the "hidden" value, this is used differently for public contacts unset($fields['hidden']); $condition = ['uid' => 0, 'nurl' => Strings::normaliseLink($contact_old['url'])]; - DBA::update('contact', $fields, $condition, true); + Contact::update($fields, $condition, true); Contact::updateAvatar($contact['id'], $author['avatar']); @@ -1400,7 +1400,7 @@ class DFRN 'poll' => $relocate["poll"], 'site-pubkey' => $relocate["sitepubkey"]]; $condition = ["(`id` = ?) OR (`nurl` = ?)", $importer["id"], Strings::normaliseLink($old["url"])]; - DBA::update('contact', $fields, $condition); + Contact::update($fields, $condition); Contact::updateAvatar($importer["id"], $relocate["avatar"], true); @@ -2200,36 +2200,36 @@ class DFRN $accounttype = intval(XML::getFirstNodeValue($xpath, "/atom:feed/dfrn:account_type/text()")); if ($accounttype != $importer["contact-type"]) { - DBA::update('contact', ['contact-type' => $accounttype], ['id' => $importer['id']]); + Contact::update(['contact-type' => $accounttype], ['id' => $importer['id']]); // Updating the public contact as well - DBA::update('contact', ['contact-type' => $accounttype], ['uid' => 0, 'nurl' => $importer['nurl']]); + Contact::update(['contact-type' => $accounttype], ['uid' => 0, 'nurl' => $importer['nurl']]); } // A forum contact can either have set "forum" or "prv" - but not both if ($accounttype == User::ACCOUNT_TYPE_COMMUNITY) { // It's a forum, so either set the public or private forum flag $condition = ['(`forum` != ? OR `prv` != ?) AND `id` = ?', $forum, !$forum, $importer['id']]; - DBA::update('contact', ['forum' => $forum, 'prv' => !$forum], $condition); + Contact::update(['forum' => $forum, 'prv' => !$forum], $condition); // Updating the public contact as well $condition = ['(`forum` != ? OR `prv` != ?) AND `uid` = 0 AND `nurl` = ?', $forum, !$forum, $importer['nurl']]; - DBA::update('contact', ['forum' => $forum, 'prv' => !$forum], $condition); + Contact::update(['forum' => $forum, 'prv' => !$forum], $condition); } else { // It's not a forum, so remove the flags $condition = ['(`forum` OR `prv`) AND `id` = ?', $importer['id']]; - DBA::update('contact', ['forum' => false, 'prv' => false], $condition); + Contact::update(['forum' => false, 'prv' => false], $condition); // Updating the public contact as well $condition = ['(`forum` OR `prv`) AND `uid` = 0 AND `nurl` = ?', $importer['nurl']]; - DBA::update('contact', ['forum' => false, 'prv' => false], $condition); + Contact::update(['forum' => false, 'prv' => false], $condition); } } elseif ($forum != $importer["forum"]) { // Deprecated since 3.5.1 $condition = ['`forum` != ? AND `id` = ?', $forum, $importer["id"]]; - DBA::update('contact', ['forum' => $forum], $condition); + Contact::update(['forum' => $forum], $condition); // Updating the public contact as well $condition = ['`forum` != ? AND `uid` = 0 AND `nurl` = ?', $forum, $importer['nurl']]; - DBA::update('contact', ['forum' => $forum], $condition); + Contact::update(['forum' => $forum], $condition); } diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 48d7a3371..8fadf5ed4 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -1367,7 +1367,7 @@ class Diaspora 'notify' => $data['notify'], 'poll' => $data['poll'], 'network' => $data['network']]; - DBA::update('contact', $fields, ['addr' => $old_handle]); + Contact::update($fields, ['addr' => $old_handle]); Logger::log('Contacts are updated.'); @@ -2129,7 +2129,7 @@ class Diaspora $fields['bd'] = $birthday; } - DBA::update('contact', $fields, ['id' => $contact['id']]); + Contact::update($fields, ['id' => $contact['id']]); Logger::log("Profile of contact ".$contact["id"]." stored for user ".$importer["uid"], Logger::DEBUG); diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php index 07fa04518..8c0d1f96f 100644 --- a/src/Protocol/Feed.php +++ b/src/Protocol/Feed.php @@ -732,7 +732,7 @@ class Feed if ($contact['rating'] != $priority) { Logger::notice('Adjusting priority', ['old' => $contact['rating'], 'new' => $priority, 'id' => $contact['id'], 'uid' => $contact['uid'], 'url' => $contact['url']]); - DBA::update('contact', ['rating' => $priority], ['id' => $contact['id']]); + Contact::update(['rating' => $priority], ['id' => $contact['id']]); } } diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index 2404db2df..b0b9bd7d0 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -209,7 +209,7 @@ class OStatus $contact['name-date'] = DateTimeFormat::utcNow(); - DBA::update('contact', $contact, ['id' => $contact["id"]], $current); + Contact::update($contact, ['id' => $contact["id"]], $current); if (!empty($author["author-avatar"]) && ($author["author-avatar"] != $current['avatar'])) { Logger::log("Update profile picture for contact ".$contact["id"], Logger::DEBUG); @@ -230,7 +230,7 @@ class OStatus 'about' => $contact["about"], 'location' => $contact["location"], 'success_update' => DateTimeFormat::utcNow(), 'last-update' => DateTimeFormat::utcNow()]; - DBA::update('contact', $fields, ['id' => $cid], $old_contact); + Contact::update($fields, ['id' => $cid], $old_contact); // Update the avatar if (!empty($author["author-avatar"])) { diff --git a/src/Protocol/Relay.php b/src/Protocol/Relay.php index f89dc3999..b604f5ab3 100644 --- a/src/Protocol/Relay.php +++ b/src/Protocol/Relay.php @@ -166,7 +166,7 @@ class Relay $fields['updated'] = DateTimeFormat::utcNow(); Logger::info('Update relay contact', ['server' => $gserver['url'], 'id' => $old['id'], 'fields' => $fields]); - DBA::update('contact', $fields, ['id' => $old['id']], $old); + Contact::update($fields, ['id' => $old['id']], $old); } else { $default = ['created' => DateTimeFormat::utcNow(), 'name' => 'relay', 'nick' => 'relay', 'url' => $gserver['url'], diff --git a/src/Worker/OnePoll.php b/src/Worker/OnePoll.php index e1f0f6108..99d5054ca 100644 --- a/src/Worker/OnePoll.php +++ b/src/Worker/OnePoll.php @@ -82,7 +82,7 @@ class OnePoll Logger::warning('No self contact for user', ['uid' => $importer_uid]); // set the last-update so we don't keep polling - DBA::update('contact', ['last-update' => $updated], ['id' => $contact['id']]); + Contact::update(['last-update' => $updated], ['id' => $contact['id']]); return; } @@ -122,16 +122,16 @@ class OnePoll { if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL, Protocol::OSTATUS])) { // Update the user's contact - DBA::update('contact', $fields, ['id' => $contact['id']]); + Contact::update($fields, ['id' => $contact['id']]); // Update the public contact - DBA::update('contact', $fields, ['uid' => 0, 'nurl' => $contact['nurl']]); + Contact::update($fields, ['uid' => 0, 'nurl' => $contact['nurl']]); // Update the rest of the contacts that aren't polled - DBA::update('contact', $fields, ['rel' => Contact::FOLLOWER, 'nurl' => $contact['nurl']]); + Contact::update($fields, ['rel' => Contact::FOLLOWER, 'nurl' => $contact['nurl']]); } else { // Update all contacts - DBA::update('contact', $fields, ['nurl' => $contact['nurl']]); + Contact::update($fields, ['nurl' => $contact['nurl']]); } } @@ -456,7 +456,7 @@ class OnePoll Logger::info('Hub subscription start', ['mode' => $hubmode, 'name' => $contact['name'], 'hub' => $url, 'endpoint' => $push_url, 'verifier' => $verify_token]); if (!strlen($contact['hub-verify']) || ($contact['hub-verify'] != $verify_token)) { - DBA::update('contact', ['hub-verify' => $verify_token], ['id' => $contact['id']]); + Contact::update(['hub-verify' => $verify_token], ['id' => $contact['id']]); } $postResult = DI::httpClient()->post($url, $params); diff --git a/src/Worker/RemoveUnusedAvatars.php b/src/Worker/RemoveUnusedAvatars.php index 58670c873..7fdbeb7ec 100644 --- a/src/Worker/RemoveUnusedAvatars.php +++ b/src/Worker/RemoveUnusedAvatars.php @@ -44,7 +44,7 @@ class RemoveUnusedAvatars $count = 0; $contacts = DBA::select('contact', ['id'], $condition); while ($contact = DBA::fetch($contacts)) { - DBA::update('contact', ['photo' => '', 'thumb' => '', 'micro' => ''], ['id' => $contact['id']]); + Contact::update(['photo' => '', 'thumb' => '', 'micro' => ''], ['id' => $contact['id']]); Photo::delete(['contact-id' => $contact['id'], 'album' => Photo::CONTACT_PHOTOS]); if ((++$count % 1000) == 0) { if (!Worker::isInMaintenanceWindow()) { From 2486c8031bad0217b71e5adcacd2edb31642f5ef Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 10 Sep 2021 20:22:24 +0000 Subject: [PATCH 03/20] update for user-contact is added --- src/Model/Contact.php | 5 ++++- src/Model/Contact/User.php | 40 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 8c8462593..25c40a1d3 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -221,7 +221,10 @@ class Contact public static function update(array $fields, array $condition, $old_fields = []) { $ret = DBA::update('contact', $fields, $condition, $old_fields); - // @todo Apply changes to the "user-contact" table on dedicated fields + + // Apply changes to the "user-contact" table on dedicated fields + Contact\User::UpdateByContactUpdate($fields, $condition); + return $ret; } diff --git a/src/Model/Contact/User.php b/src/Model/Contact/User.php index 0283fae72..e46af5191 100644 --- a/src/Model/Contact/User.php +++ b/src/Model/Contact/User.php @@ -21,12 +21,15 @@ namespace Friendica\Model\Contact; +use Exception; use Friendica\Core\Logger; use Friendica\Core\System; use Friendica\Database\Database; use Friendica\Database\DBA; +use Friendica\Database\DBStructure; use Friendica\Model\Contact; use Friendica\Model\ItemURI; +use PDOException; /** * This class provides information about user related contacts based on the "user-contact" table. @@ -71,6 +74,43 @@ class User return $ret; } + /** + * Apply changes from contact update data to user-contact table + * + * @param array $fields + * @param array $condition + * @return void + * @throws PDOException + * @throws Exception + */ + public static function UpdateByContactUpdate(array $fields, array $condition) + { + DBA::transaction(); + + unset($fields['uid']); + unset($fields['cid']); + unset($fields['uri-id']); + + if (isset($fields['readonly'])) { + $fields['ignored'] = $fields['readonly']; + } + + $update_fields = DBStructure::getFieldsForTable('user-contact', $fields); + if (!empty($update_fields)) { + $contacts = DBA::select('contact', ['uri-id', 'uid'], $condition); + while ($row = DBA::fetch($contacts)) { + if (empty($row['uri-id'])) { + continue; + } + $ret = DBA::update('user-contact', $update_fields, ['uri-id' => $row['uri-id'], 'uid' => $row['uid']]); + Logger::info('Updated user contact', ['uid' => $row['uid'], 'uri-id' => $row['uri-id'], 'ret' => $ret]); + } + + DBA::close($contacts); + } + DBA::commit(); + } + /** * Block contact id for user id * From b170dd765d411eff599fb908c4b05982c9460220 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 10 Sep 2021 20:53:10 +0000 Subject: [PATCH 04/20] Insert and update some more fields --- database.sql | 5 +++++ doc/database/db_user-contact.md | 21 +++++++++++++-------- src/Model/Contact/User.php | 18 +++++++++++------- static/dbstructure.config.php | 7 ++++++- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/database.sql b/database.sql index dd04a0e35..adbd5046a 100644 --- a/database.sql +++ b/database.sql @@ -1516,6 +1516,11 @@ CREATE TABLE IF NOT EXISTS `user-contact` ( `blocked` boolean COMMENT 'Contact is completely blocked for this user', `ignored` boolean COMMENT 'Posts from this contact are ignored', `collapsed` boolean COMMENT 'Posts from this contact are collapsed', + `rel` tinyint unsigned COMMENT 'The kind of the relation between the user and the contact', + `info` mediumtext COMMENT '', + `notify_new_posts` boolean COMMENT '', + `fetch_further_information` tinyint unsigned COMMENT '', + `ffi_keyword_denylist` text COMMENT '', PRIMARY KEY(`uid`,`cid`), INDEX `cid` (`cid`), UNIQUE INDEX `uri-id_uid` (`uri-id`,`uid`), diff --git a/doc/database/db_user-contact.md b/doc/database/db_user-contact.md index 467ee86d9..aa74516f1 100644 --- a/doc/database/db_user-contact.md +++ b/doc/database/db_user-contact.md @@ -6,14 +6,19 @@ User specific public contact data Fields ------ -| Field | Description | Type | Null | Key | Default | Extra | -| --------- | ------------------------------------------------------------ | ------------------ | ---- | --- | ------- | ----- | -| cid | Contact id of the linked public contact | int unsigned | NO | PRI | 0 | | -| uid | User id | mediumint unsigned | NO | PRI | 0 | | -| uri-id | Id of the item-uri table entry that contains the contact url | int unsigned | YES | | NULL | | -| blocked | Contact is completely blocked for this user | boolean | YES | | NULL | | -| ignored | Posts from this contact are ignored | boolean | YES | | NULL | | -| collapsed | Posts from this contact are collapsed | boolean | YES | | NULL | | +| Field | Description | Type | Null | Key | Default | Extra | +| ------------------------- | ------------------------------------------------------------ | ------------------ | ---- | --- | ------- | ----- | +| cid | Contact id of the linked public contact | int unsigned | NO | PRI | 0 | | +| uid | User id | mediumint unsigned | NO | PRI | 0 | | +| uri-id | Id of the item-uri table entry that contains the contact url | int unsigned | YES | | NULL | | +| blocked | Contact is completely blocked for this user | boolean | YES | | NULL | | +| ignored | Posts from this contact are ignored | boolean | YES | | NULL | | +| collapsed | Posts from this contact are collapsed | boolean | YES | | NULL | | +| rel | The kind of the relation between the user and the contact | tinyint unsigned | YES | | NULL | | +| info | | mediumtext | YES | | NULL | | +| notify_new_posts | | boolean | YES | | NULL | | +| fetch_further_information | | tinyint unsigned | YES | | NULL | | +| ffi_keyword_denylist | | text | YES | | NULL | | Indexes ------------ diff --git a/src/Model/Contact/User.php b/src/Model/Contact/User.php index e46af5191..bf6fa8a94 100644 --- a/src/Model/Contact/User.php +++ b/src/Model/Contact/User.php @@ -22,6 +22,7 @@ namespace Friendica\Model\Contact; use Exception; +use Friendica\Collection\Api\Mastodon\Fields; use Friendica\Core\Logger; use Friendica\Core\System; use Friendica\Database\Database; @@ -59,13 +60,16 @@ class User return false; } - $fields = [ - 'cid' => $pcontact['id'], - 'uid' => $contact['uid'], - 'uri-id' => $contact['uri-id'], - 'blocked' => $contact['blocked'] ?? false, - 'ignored' => $contact['readonly'] ?? false, - ]; + $fields = $contact; + + if (isset($fields['readonly'])) { + $fields['ignored'] = $fields['readonly']; + } + + $fields = DBStructure::getFieldsForTable('user-contact', $fields); + $fields['cid'] = $pcontact['id']; + $fields['uid'] = $contact['uid']; + $fields['uri-id'] = $contact['uri-id']; $ret = DBA::insert('user-contact', $fields, Database::INSERT_IGNORE); diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index fd6c4c798..b501ea4df 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -1534,7 +1534,12 @@ return [ "uri-id" => ["type" => "int unsigned", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the contact url"], "blocked" => ["type" => "boolean", "comment" => "Contact is completely blocked for this user"], "ignored" => ["type" => "boolean", "comment" => "Posts from this contact are ignored"], - "collapsed" => ["type" => "boolean", "comment" => "Posts from this contact are collapsed"] + "collapsed" => ["type" => "boolean", "comment" => "Posts from this contact are collapsed"], + "rel" => ["type" => "tinyint unsigned", "comment" => "The kind of the relation between the user and the contact"], + "info" => ["type" => "mediumtext", "comment" => ""], + "notify_new_posts" => ["type" => "boolean", "comment" => ""], + "fetch_further_information" => ["type" => "tinyint unsigned", "comment" => ""], + "ffi_keyword_denylist" => ["type" => "text", "comment" => ""], ], "indexes" => [ "PRIMARY" => ["uid", "cid"], From f33a98578d317887ebc1c4c6e077fef948604094 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 10 Sep 2021 23:59:33 +0000 Subject: [PATCH 05/20] Capitalization --- src/Model/Contact.php | 2 +- src/Model/Contact/User.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 25c40a1d3..1eb133986 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -223,7 +223,7 @@ class Contact $ret = DBA::update('contact', $fields, $condition, $old_fields); // Apply changes to the "user-contact" table on dedicated fields - Contact\User::UpdateByContactUpdate($fields, $condition); + Contact\User::updateByContactUpdate($fields, $condition); return $ret; } diff --git a/src/Model/Contact/User.php b/src/Model/Contact/User.php index bf6fa8a94..184b10991 100644 --- a/src/Model/Contact/User.php +++ b/src/Model/Contact/User.php @@ -87,7 +87,7 @@ class User * @throws PDOException * @throws Exception */ - public static function UpdateByContactUpdate(array $fields, array $condition) + public static function updateByContactUpdate(array $fields, array $condition) { DBA::transaction(); From 5113987031065c97634eb7375e8f0cbb0b63a94b Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 11 Sep 2021 07:59:46 +0000 Subject: [PATCH 06/20] Added update function to add user-contact entry --- src/Model/Contact/User.php | 2 +- update.php | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Model/Contact/User.php b/src/Model/Contact/User.php index 184b10991..a23cd3a55 100644 --- a/src/Model/Contact/User.php +++ b/src/Model/Contact/User.php @@ -56,7 +56,7 @@ class User $pcontact = Contact::selectFirst(['id'], ['uri-id' => $contact['uri-id'], 'uid' => 0]); if (!DBA::isResult($pcontact)) { - Logger::info('Public contact for user not found', ['uri-id' => $contact['uri-id'], 'uid' => $contact['uid'], 'cid' => $pcontact['id']]); + Logger::info('Public contact for user not found', ['uri-id' => $contact['uri-id'], 'uid' => $contact['uid']]); return false; } diff --git a/update.php b/update.php index 536610a00..49287cd0b 100644 --- a/update.php +++ b/update.php @@ -998,3 +998,11 @@ function update_1434() return Update::SUCCESS; } + +function update_1435() +{ + $contacts = DBA::select('contact', [], ["`uid` != ?", 0]); + while ($contact = DBA::fetch($contacts)) { + Contact\User::insertForContactArray($contact); + } +} \ No newline at end of file From 10cb52bc00c90d872ff753eb1e75bca6a8d5bd1b Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 11 Sep 2021 12:43:46 +0000 Subject: [PATCH 07/20] Only add user contacts, alternate way to fetch public contact id --- src/Model/Contact/User.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Model/Contact/User.php b/src/Model/Contact/User.php index a23cd3a55..7542130d9 100644 --- a/src/Model/Contact/User.php +++ b/src/Model/Contact/User.php @@ -45,7 +45,12 @@ class User */ public static function insertForContactArray(array $contact) { - if (!isset($contact['uid']) || (empty($contact['uri-id']) && empty($contact['url']))) { + if (empty($contact['uid'])) { + // We don't create entries for the public user - by now + return false; + } + + if (empty($contact['uri-id']) && empty($contact['url'])) { Logger::info('Missing contact details', ['contact' => $contact, 'callstack' => System::callstack(20)]); return false; } @@ -55,7 +60,9 @@ class User } $pcontact = Contact::selectFirst(['id'], ['uri-id' => $contact['uri-id'], 'uid' => 0]); - if (!DBA::isResult($pcontact)) { + if (!empty($contact['uri-id']) && DBA::isResult($pcontact)) { + $pcid = $pcontact['id']; + } elseif (empty($contact['url']) || !($pcid = Contact::getIdForURL($contact['url']))) { Logger::info('Public contact for user not found', ['uri-id' => $contact['uri-id'], 'uid' => $contact['uid']]); return false; } @@ -67,13 +74,13 @@ class User } $fields = DBStructure::getFieldsForTable('user-contact', $fields); - $fields['cid'] = $pcontact['id']; + $fields['cid'] = $pcid; $fields['uid'] = $contact['uid']; $fields['uri-id'] = $contact['uri-id']; - $ret = DBA::insert('user-contact', $fields, Database::INSERT_IGNORE); + $ret = DBA::insert('user-contact', $fields, Database::INSERT_UPDATE); - Logger::info('Inserted user contact', ['uid' => $contact['uid'], 'cid' => $pcontact['id'], 'uri-id' => $contact['uri-id'], 'ret' => $ret]); + Logger::info('Inserted user contact', ['uid' => $contact['uid'], 'cid' => $pcid, 'uri-id' => $contact['uri-id'], 'ret' => $ret]); return $ret; } @@ -103,7 +110,7 @@ class User if (!empty($update_fields)) { $contacts = DBA::select('contact', ['uri-id', 'uid'], $condition); while ($row = DBA::fetch($contacts)) { - if (empty($row['uri-id'])) { + if (empty($row['uri-id']) || empty($contact['uid'])) { continue; } $ret = DBA::update('user-contact', $update_fields, ['uri-id' => $row['uri-id'], 'uid' => $row['uid']]); From 1e123ace12103212ce7e6d2617e04983ffce8640 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 11 Sep 2021 13:00:12 +0000 Subject: [PATCH 08/20] Only fetch, not probe --- src/Model/Contact/User.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Model/Contact/User.php b/src/Model/Contact/User.php index 7542130d9..3fe626a6d 100644 --- a/src/Model/Contact/User.php +++ b/src/Model/Contact/User.php @@ -62,7 +62,7 @@ class User $pcontact = Contact::selectFirst(['id'], ['uri-id' => $contact['uri-id'], 'uid' => 0]); if (!empty($contact['uri-id']) && DBA::isResult($pcontact)) { $pcid = $pcontact['id']; - } elseif (empty($contact['url']) || !($pcid = Contact::getIdForURL($contact['url']))) { + } elseif (empty($contact['url']) || !($pcid = Contact::getIdForURL($contact['url'], 0, false))) { Logger::info('Public contact for user not found', ['uri-id' => $contact['uri-id'], 'uid' => $contact['uid']]); return false; } From eeec6aaeb9b9e18b28c61eba62ce10f83ac78f93 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 11 Sep 2021 13:02:36 +0000 Subject: [PATCH 09/20] Removed unused "use" --- src/Model/Contact/User.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Model/Contact/User.php b/src/Model/Contact/User.php index 3fe626a6d..52904925f 100644 --- a/src/Model/Contact/User.php +++ b/src/Model/Contact/User.php @@ -22,7 +22,6 @@ namespace Friendica\Model\Contact; use Exception; -use Friendica\Collection\Api\Mastodon\Fields; use Friendica\Core\Logger; use Friendica\Core\System; use Friendica\Database\Database; From 3eea4b11304278f1b6eb1292102d2c9ab7fcb311 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 12 Sep 2021 19:04:27 +0000 Subject: [PATCH 10/20] Use "rel" for "self" instead of using a separate field --- src/Model/Contact.php | 1 + src/Model/Contact/User.php | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 1eb133986..e7a6b529d 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -133,6 +133,7 @@ class Contact const FOLLOWER = 1; const SHARING = 2; const FRIEND = 3; + const SELF = 4; /** * @} */ diff --git a/src/Model/Contact/User.php b/src/Model/Contact/User.php index 52904925f..85399951c 100644 --- a/src/Model/Contact/User.php +++ b/src/Model/Contact/User.php @@ -72,6 +72,10 @@ class User $fields['ignored'] = $fields['readonly']; } + if (!empty($fields['self'])) { + $fields['rel'] = Contact::SELF; + } + $fields = DBStructure::getFieldsForTable('user-contact', $fields); $fields['cid'] = $pcid; $fields['uid'] = $contact['uid']; @@ -105,6 +109,10 @@ class User $fields['ignored'] = $fields['readonly']; } + if (!empty($fields['self'])) { + $fields['rel'] = Contact::SELF; + } + $update_fields = DBStructure::getFieldsForTable('user-contact', $fields); if (!empty($update_fields)) { $contacts = DBA::select('contact', ['uri-id', 'uid'], $condition); From 0a01f0443e82e906d9cf3a8015cf7ea0d64c56ec Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 12 Sep 2021 20:50:03 +0000 Subject: [PATCH 11/20] Deprecated fields --- database.sql | 10 +++++++--- doc/database/db_contact.md | 4 ++-- doc/database/db_user-contact.md | 5 +++++ static/dbstructure.config.php | 9 +++++++-- static/dbview.config.php | 1 - 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/database.sql b/database.sql index adbd5046a..7e2a336ae 100644 --- a/database.sql +++ b/database.sql @@ -153,7 +153,7 @@ CREATE TABLE IF NOT EXISTS `contact` ( `poco` varchar(255) COMMENT '', `aes_allow` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', `ret-aes` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', - `usehub` boolean NOT NULL DEFAULT '0' COMMENT '', + `usehub` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', `subhub` boolean NOT NULL DEFAULT '0' COMMENT '', `hub-verify` varchar(255) NOT NULL DEFAULT '' COMMENT '', `last-update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last try to update the contact info', @@ -185,7 +185,7 @@ CREATE TABLE IF NOT EXISTS `contact` ( `baseurl` varchar(255) DEFAULT '' COMMENT 'baseurl of the contact', `gsid` int unsigned COMMENT 'Global Server ID', `reason` text COMMENT '', - `closeness` tinyint unsigned NOT NULL DEFAULT 99 COMMENT '', + `closeness` tinyint unsigned NOT NULL DEFAULT 99 COMMENT 'Deprecated', `info` mediumtext COMMENT '', `profile-id` int unsigned COMMENT 'Deprecated', `bdyear` varchar(4) NOT NULL DEFAULT '' COMMENT '', @@ -1516,11 +1516,16 @@ CREATE TABLE IF NOT EXISTS `user-contact` ( `blocked` boolean COMMENT 'Contact is completely blocked for this user', `ignored` boolean COMMENT 'Posts from this contact are ignored', `collapsed` boolean COMMENT 'Posts from this contact are collapsed', + `pending` boolean COMMENT '', `rel` tinyint unsigned COMMENT 'The kind of the relation between the user and the contact', `info` mediumtext COMMENT '', `notify_new_posts` boolean COMMENT '', + `remote_self` boolean COMMENT '', `fetch_further_information` tinyint unsigned COMMENT '', `ffi_keyword_denylist` text COMMENT '', + `subhub` boolean COMMENT '', + `hub-verify` varchar(255) COMMENT '', + `protocol` char(4) COMMENT 'Protocol of the contact', PRIMARY KEY(`uid`,`cid`), INDEX `cid` (`cid`), UNIQUE INDEX `uri-id_uid` (`uri-id`,`uid`), @@ -2255,7 +2260,6 @@ CREATE VIEW `owner-view` AS SELECT `contact`.`poll` AS `poll`, `contact`.`confirm` AS `confirm`, `contact`.`poco` AS `poco`, - `contact`.`usehub` AS `usehub`, `contact`.`subhub` AS `subhub`, `contact`.`hub-verify` AS `hub-verify`, `contact`.`last-update` AS `last-update`, diff --git a/doc/database/db_contact.md b/doc/database/db_contact.md index 8eeac17ea..ab4e016db 100644 --- a/doc/database/db_contact.md +++ b/doc/database/db_contact.md @@ -51,7 +51,7 @@ Fields | poco | | varchar(255) | YES | | NULL | | | aes_allow | Deprecated | boolean | NO | | 0 | | | ret-aes | Deprecated | boolean | NO | | 0 | | -| usehub | | boolean | NO | | 0 | | +| usehub | Deprecated | 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 | | @@ -83,7 +83,7 @@ Fields | 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 | | +| closeness | Deprecated | tinyint unsigned | NO | | 99 | | | info | | mediumtext | YES | | NULL | | | profile-id | Deprecated | int unsigned | YES | | NULL | | | bdyear | | varchar(4) | NO | | | | diff --git a/doc/database/db_user-contact.md b/doc/database/db_user-contact.md index aa74516f1..6726ac710 100644 --- a/doc/database/db_user-contact.md +++ b/doc/database/db_user-contact.md @@ -14,11 +14,16 @@ Fields | blocked | Contact is completely blocked for this user | boolean | YES | | NULL | | | ignored | Posts from this contact are ignored | boolean | YES | | NULL | | | collapsed | Posts from this contact are collapsed | boolean | YES | | NULL | | +| pending | | boolean | YES | | NULL | | | rel | The kind of the relation between the user and the contact | tinyint unsigned | YES | | NULL | | | info | | mediumtext | YES | | NULL | | | notify_new_posts | | boolean | YES | | NULL | | +| remote_self | | boolean | YES | | NULL | | | fetch_further_information | | tinyint unsigned | YES | | NULL | | | ffi_keyword_denylist | | text | YES | | NULL | | +| subhub | | boolean | YES | | NULL | | +| hub-verify | | varchar(255) | YES | | NULL | | +| protocol | Protocol of the contact | char(4) | YES | | NULL | | Indexes ------------ diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index b501ea4df..16143607f 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -211,7 +211,7 @@ return [ "poco" => ["type" => "varchar(255)", "comment" => ""], "aes_allow" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], "ret-aes" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], - "usehub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], + "usehub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], "subhub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "hub-verify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "last-update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last try to update the contact info"], @@ -243,7 +243,7 @@ return [ "baseurl" => ["type" => "varchar(255)", "default" => "", "comment" => "baseurl of the contact"], "gsid" => ["type" => "int unsigned", "foreign" => ["gserver" => "id", "on delete" => "restrict"], "comment" => "Global Server ID"], "reason" => ["type" => "text", "comment" => ""], - "closeness" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "99", "comment" => ""], + "closeness" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "99", "comment" => "Deprecated"], "info" => ["type" => "mediumtext", "comment" => ""], "profile-id" => ["type" => "int unsigned", "comment" => "Deprecated"], "bdyear" => ["type" => "varchar(4)", "not null" => "1", "default" => "", "comment" => ""], @@ -1535,11 +1535,16 @@ return [ "blocked" => ["type" => "boolean", "comment" => "Contact is completely blocked for this user"], "ignored" => ["type" => "boolean", "comment" => "Posts from this contact are ignored"], "collapsed" => ["type" => "boolean", "comment" => "Posts from this contact are collapsed"], + "pending" => ["type" => "boolean", "comment" => ""], "rel" => ["type" => "tinyint unsigned", "comment" => "The kind of the relation between the user and the contact"], "info" => ["type" => "mediumtext", "comment" => ""], "notify_new_posts" => ["type" => "boolean", "comment" => ""], + "remote_self" => ["type" => "boolean", "comment" => ""], "fetch_further_information" => ["type" => "tinyint unsigned", "comment" => ""], "ffi_keyword_denylist" => ["type" => "text", "comment" => ""], + "subhub" => ["type" => "boolean", "comment" => ""], + "hub-verify" => ["type" => "varchar(255)", "comment" => ""], + "protocol" => ["type" => "char(4)", "comment" => "Protocol of the contact"], ], "indexes" => [ "PRIMARY" => ["uid", "cid"], diff --git a/static/dbview.config.php b/static/dbview.config.php index c9acd55ba..b64bbb255 100644 --- a/static/dbview.config.php +++ b/static/dbview.config.php @@ -733,7 +733,6 @@ "poll" => ["contact", "poll"], "confirm" => ["contact", "confirm"], "poco" => ["contact", "poco"], - "usehub" => ["contact", "usehub"], "subhub" => ["contact", "subhub"], "hub-verify" => ["contact", "hub-verify"], "last-update" => ["contact", "last-update"], From 7c2913488cbe2f7c476525208002307f101bb7d3 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 12 Sep 2021 21:02:29 +0000 Subject: [PATCH 12/20] Remove deprecated fields --- database.sql | 3 --- static/dbview.config.php | 3 --- 2 files changed, 6 deletions(-) diff --git a/database.sql b/database.sql index 7e2a336ae..cbdbe2266 100644 --- a/database.sql +++ b/database.sql @@ -2238,7 +2238,6 @@ CREATE VIEW `owner-view` AS SELECT `contact`.`location` AS `location`, `contact`.`about` AS `about`, `contact`.`keywords` AS `keywords`, - `contact`.`gender` AS `gender`, `contact`.`xmpp` AS `xmpp`, `contact`.`matrix` AS `matrix`, `contact`.`attag` AS `attag`, @@ -2288,9 +2287,7 @@ CREATE VIEW `owner-view` AS SELECT `contact`.`sensitive` AS `sensitive`, `contact`.`baseurl` AS `baseurl`, `contact`.`reason` AS `reason`, - `contact`.`closeness` AS `closeness`, `contact`.`info` AS `info`, - `contact`.`profile-id` AS `profile-id`, `contact`.`bdyear` AS `bdyear`, `contact`.`bd` AS `bd`, `contact`.`notify_new_posts` AS `notify_new_posts`, diff --git a/static/dbview.config.php b/static/dbview.config.php index b64bbb255..6e353718d 100644 --- a/static/dbview.config.php +++ b/static/dbview.config.php @@ -711,7 +711,6 @@ "location" => ["contact", "location"], "about" => ["contact", "about"], "keywords" => ["contact", "keywords"], - "gender" => ["contact", "gender"], "xmpp" => ["contact", "xmpp"], "matrix" => ["contact", "matrix"], "attag" => ["contact", "attag"], @@ -761,9 +760,7 @@ "sensitive" => ["contact", "sensitive"], "baseurl" => ["contact", "baseurl"], "reason" => ["contact", "reason"], - "closeness" => ["contact", "closeness"], "info" => ["contact", "info"], - "profile-id" => ["contact", "profile-id"], "bdyear" => ["contact", "bdyear"], "bd" => ["contact", "bd"], "notify_new_posts" => ["contact", "notify_new_posts"], From 84666a314a9f277d40a6ac35196125f019a93ed7 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 13 Sep 2021 08:22:11 +0000 Subject: [PATCH 13/20] Rearranged fields --- database.sql | 82 ++++++++-------- doc/database/db_contact.md | 170 +++++++++++++++++----------------- static/dbstructure.config.php | 81 ++++++++-------- static/dbview.config.php | 4 +- 4 files changed, 170 insertions(+), 167 deletions(-) diff --git a/database.sql b/database.sql index cbdbe2266..02b01e25c 100644 --- a/database.sql +++ b/database.sql @@ -114,29 +114,16 @@ CREATE TABLE IF NOT EXISTS `contact` ( `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner User id', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '', `updated` datetime DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of last contact update', - `self` boolean NOT NULL DEFAULT '0' COMMENT '1 if the contact is the user him/her self', - `remote_self` boolean NOT NULL DEFAULT '0' COMMENT '', - `rel` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'The kind of the relation between the user and the contact', - `duplex` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', `network` char(4) NOT NULL DEFAULT '' COMMENT 'Network of the contact', - `protocol` char(4) NOT NULL DEFAULT '' COMMENT 'Protocol of the contact', `name` varchar(255) NOT NULL DEFAULT '' COMMENT 'Name that this contact is known by', `nick` varchar(255) NOT NULL DEFAULT '' COMMENT 'Nick- and user name of the contact', `location` varchar(255) DEFAULT '' COMMENT '', `about` text COMMENT '', `keywords` text COMMENT 'public keywords (interests) of the contact', - `gender` varchar(32) NOT NULL DEFAULT '' COMMENT 'Deprecated', `xmpp` varchar(255) NOT NULL DEFAULT '' COMMENT 'XMPP address', `matrix` varchar(255) NOT NULL DEFAULT '' COMMENT 'Matrix address', - `attag` varchar(255) NOT NULL DEFAULT '' COMMENT '', `avatar` varchar(255) NOT NULL DEFAULT '' COMMENT '', - `photo` varchar(255) DEFAULT '' COMMENT 'Link to the profile photo of the contact', - `thumb` varchar(255) DEFAULT '' COMMENT 'Link to the profile photo (thumb size)', - `micro` varchar(255) DEFAULT '' COMMENT 'Link to the profile photo (micro size)', `header` varchar(255) COMMENT 'Header picture', - `site-pubkey` text COMMENT 'Deprecated', - `issued-id` varchar(255) NOT NULL DEFAULT '' COMMENT 'Deprecated', - `dfrn-id` varchar(255) NOT NULL DEFAULT '' COMMENT 'Deprecated', `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', @@ -145,54 +132,67 @@ CREATE TABLE IF NOT EXISTS `contact` ( `pubkey` text COMMENT 'RSA public key 4096 bit', `prvkey` text COMMENT 'RSA private key 4096 bit', `batch` varchar(255) NOT NULL DEFAULT '' COMMENT '', - `request` varchar(255) COMMENT '', `notify` varchar(255) COMMENT '', `poll` varchar(255) COMMENT '', - `confirm` varchar(255) COMMENT '', `subscribe` varchar(255) COMMENT '', - `poco` varchar(255) COMMENT '', - `aes_allow` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', - `ret-aes` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', - `usehub` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', - `subhub` boolean NOT NULL DEFAULT '0' COMMENT '', - `hub-verify` varchar(255) NOT NULL DEFAULT '' COMMENT '', `last-update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last try to update the contact info', `success_update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last successful contact update', `failure_update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last failed update', `failed` boolean COMMENT 'Connection failed', - `name-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '', - `uri-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '', - `avatar-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '', `term-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '', `last-item` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'date of the last post', `last-discovery` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'date of the last follower discovery', - `priority` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '', `blocked` boolean NOT NULL DEFAULT '1' COMMENT 'Node-wide block status', `block_reason` text COMMENT 'Node-wide block reason', `readonly` boolean NOT NULL DEFAULT '0' COMMENT 'posts of the contact are readonly', - `writable` boolean NOT NULL DEFAULT '0' COMMENT '', - `forum` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a forum', - `prv` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a private group', - `contact-type` tinyint NOT NULL DEFAULT 0 COMMENT '', - `manually-approve` boolean COMMENT '', - `hidden` boolean NOT NULL DEFAULT '0' COMMENT '', + `contact-type` tinyint NOT NULL DEFAULT 0 COMMENT 'Person, organisation, news, community, relay', + `manually-approve` boolean COMMENT 'Contact requests have to be approved manually', `archive` boolean NOT NULL DEFAULT '0' COMMENT '', - `pending` boolean NOT NULL DEFAULT '1' COMMENT '', - `deleted` boolean NOT NULL DEFAULT '0' COMMENT 'Contact has been deleted', - `rating` tinyint NOT NULL DEFAULT 0 COMMENT '', `unsearchable` boolean NOT NULL DEFAULT '0' COMMENT 'Contact prefers to not be searchable', `sensitive` boolean NOT NULL DEFAULT '0' COMMENT 'Contact posts sensitive content', `baseurl` varchar(255) DEFAULT '' COMMENT 'baseurl of the contact', `gsid` int unsigned COMMENT 'Global Server ID', - `reason` text COMMENT '', - `closeness` tinyint unsigned NOT NULL DEFAULT 99 COMMENT 'Deprecated', - `info` mediumtext COMMENT '', - `profile-id` int unsigned COMMENT 'Deprecated', - `bdyear` varchar(4) NOT NULL DEFAULT '' COMMENT '', `bd` date NOT NULL DEFAULT '0001-01-01' COMMENT '', + `reason` text COMMENT '', + `self` boolean NOT NULL DEFAULT '0' COMMENT '1 if the contact is the user him/her self', + `remote_self` boolean NOT NULL DEFAULT '0' COMMENT '', + `rel` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'The kind of the relation between the user and the contact', + `protocol` char(4) NOT NULL DEFAULT '' COMMENT 'Protocol of the contact', + `subhub` boolean NOT NULL DEFAULT '0' COMMENT '', + `hub-verify` varchar(255) NOT NULL DEFAULT '' COMMENT '', + `rating` tinyint NOT NULL DEFAULT 0 COMMENT 'Automatically detected feed poll frequency', + `priority` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Feed poll priority', + `attag` varchar(255) NOT NULL DEFAULT '' COMMENT '', + `hidden` boolean NOT NULL DEFAULT '0' COMMENT '', + `pending` boolean NOT NULL DEFAULT '1' COMMENT 'Contact request is pending', + `deleted` boolean NOT NULL DEFAULT '0' COMMENT 'Contact has been deleted', + `info` mediumtext COMMENT '', `notify_new_posts` boolean NOT NULL DEFAULT '0' COMMENT '', `fetch_further_information` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '', `ffi_keyword_denylist` text COMMENT '', + `photo` varchar(255) DEFAULT '' COMMENT 'Link to the profile photo of the contact', + `thumb` varchar(255) DEFAULT '' COMMENT 'Link to the profile photo (thumb size)', + `micro` varchar(255) DEFAULT '' COMMENT 'Link to the profile photo (micro size)', + `name-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '', + `uri-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '', + `avatar-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '', + `request` varchar(255) COMMENT '', + `confirm` varchar(255) COMMENT '', + `poco` varchar(255) COMMENT '', + `writable` boolean NOT NULL DEFAULT '0' COMMENT '', + `forum` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a forum. Deprecated, use \'contact-type\' = \'community\' and \'manually-approve\' = false instead', + `prv` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a private group. Deprecated, use \'contact-type\' = \'community\' and \'manually-approve\' = true instead', + `bdyear` varchar(4) NOT NULL DEFAULT '' COMMENT '', + `site-pubkey` text COMMENT 'Deprecated', + `gender` varchar(32) NOT NULL DEFAULT '' COMMENT 'Deprecated', + `duplex` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', + `issued-id` varchar(255) NOT NULL DEFAULT '' COMMENT 'Deprecated', + `dfrn-id` varchar(255) NOT NULL DEFAULT '' COMMENT 'Deprecated', + `aes_allow` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', + `ret-aes` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', + `usehub` boolean NOT NULL DEFAULT '0' COMMENT 'Deprecated', + `closeness` tinyint unsigned NOT NULL DEFAULT 99 COMMENT 'Deprecated', + `profile-id` int unsigned COMMENT 'Deprecated', PRIMARY KEY(`id`), INDEX `uid_name` (`uid`,`name`(190)), INDEX `self_uid` (`self`,`uid`), @@ -2461,7 +2461,7 @@ CREATE VIEW `account-user-view` AS SELECT `contact`.`network` AS `network`, `ucontact`.`protocol` AS `protocol`, `contact`.`location` AS `location`, - `contact`.`attag` AS `attag`, + `ucontact`.`attag` AS `attag`, `contact`.`pubkey` AS `pubkey`, `contact`.`prvkey` AS `prvkey`, `contact`.`subscribe` AS `subscribe`, @@ -2477,7 +2477,7 @@ CREATE VIEW `account-user-view` AS SELECT `contact`.`sensitive` AS `sensitive`, `contact`.`baseurl` AS `baseurl`, `contact`.`gsid` AS `gsid`, - `contact`.`info` AS `info`, + `ucontact`.`info` AS `info`, `contact`.`bdyear` AS `bdyear`, `contact`.`bd` AS `bd`, `contact`.`poco` AS `poco`, diff --git a/doc/database/db_contact.md b/doc/database/db_contact.md index ab4e016db..ae1221758 100644 --- a/doc/database/db_contact.md +++ b/doc/database/db_contact.md @@ -6,91 +6,91 @@ 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 | Deprecated | 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 | XMPP address | varchar(255) | NO | | | | -| matrix | Matrix address | 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 | Deprecated | text | YES | | NULL | | -| issued-id | Deprecated | varchar(255) | NO | | | | -| dfrn-id | Deprecated | 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 | Deprecated | boolean | NO | | 0 | | -| ret-aes | Deprecated | boolean | NO | | 0 | | -| usehub | Deprecated | 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 | Deprecated | 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 | | +| network | Network 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 | | +| xmpp | XMPP address | varchar(255) | NO | | | | +| matrix | Matrix address | varchar(255) | NO | | | | +| avatar | | varchar(255) | NO | | | | +| header | Header picture | varchar(255) | YES | | NULL | | +| 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 | | | | +| notify | | varchar(255) | YES | | NULL | | +| poll | | varchar(255) | YES | | NULL | | +| subscribe | | varchar(255) | YES | | NULL | | +| 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 | | +| 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 | | +| 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 | | +| contact-type | Person, organisation, news, community, relay | tinyint | NO | | 0 | | +| manually-approve | Contact requests have to be approved manually | boolean | YES | | NULL | | +| archive | | boolean | 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 | | +| bd | | date | NO | | 0001-01-01 | | +| reason | | text | YES | | NULL | | +| 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 | | +| protocol | Protocol of the contact | char(4) | NO | | | | +| subhub | | boolean | NO | | 0 | | +| hub-verify | | varchar(255) | NO | | | | +| rating | Automatically detected feed poll frequency | tinyint | NO | | 0 | | +| priority | Feed poll priority | tinyint unsigned | NO | | 0 | | +| attag | | varchar(255) | NO | | | | +| hidden | | boolean | NO | | 0 | | +| pending | Contact request is pending | boolean | NO | | 1 | | +| deleted | Contact has been deleted | boolean | NO | | 0 | | +| info | | mediumtext | YES | | NULL | | +| notify_new_posts | | boolean | NO | | 0 | | +| fetch_further_information | | tinyint unsigned | NO | | 0 | | +| ffi_keyword_denylist | | text | YES | | NULL | | +| 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 | | | | +| 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 | | +| request | | varchar(255) | YES | | NULL | | +| confirm | | varchar(255) | YES | | NULL | | +| poco | | varchar(255) | YES | | NULL | | +| writable | | boolean | NO | | 0 | | +| forum | contact is a forum. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = false instead | boolean | NO | | 0 | | +| prv | contact is a private group. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = true instead | boolean | NO | | 0 | | +| bdyear | | varchar(4) | NO | | | | +| site-pubkey | Deprecated | text | YES | | NULL | | +| gender | Deprecated | varchar(32) | NO | | | | +| duplex | Deprecated | boolean | NO | | 0 | | +| issued-id | Deprecated | varchar(255) | NO | | | | +| dfrn-id | Deprecated | varchar(255) | NO | | | | +| aes_allow | Deprecated | boolean | NO | | 0 | | +| ret-aes | Deprecated | boolean | NO | | 0 | | +| usehub | Deprecated | boolean | NO | | 0 | | +| closeness | Deprecated | tinyint unsigned | NO | | 99 | | +| profile-id | Deprecated | int unsigned | YES | | NULL | | Indexes ------------ diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 16143607f..b94df41ce 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -172,29 +172,16 @@ return [ "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "Owner User id"], "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], "updated" => ["type" => "datetime", "default" => DBA::NULL_DATETIME, "comment" => "Date of last contact update"], - "self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 if the contact is the user him/her self"], - "remote_self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], - "rel" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "The kind of the relation between the user and the contact"], - "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Network of the contact"], - "protocol" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Protocol of the contact"], "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name that this contact is known by"], "nick" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Nick- and user name of the contact"], "location" => ["type" => "varchar(255)", "default" => "", "comment" => ""], "about" => ["type" => "text", "comment" => ""], "keywords" => ["type" => "text", "comment" => "public keywords (interests) of the contact"], - "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Deprecated"], "xmpp" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "XMPP address"], "matrix" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Matrix address"], - "attag" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "avatar" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], - "photo" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo of the contact"], - "thumb" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (thumb size)"], - "micro" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (micro size)"], "header" => ["type" => "varchar(255)", "comment" => "Header picture"], - "site-pubkey" => ["type" => "text", "comment" => "Deprecated"], - "issued-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Deprecated"], - "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Deprecated"], "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"], @@ -203,54 +190,70 @@ return [ "pubkey" => ["type" => "text", "comment" => "RSA public key 4096 bit"], "prvkey" => ["type" => "text", "comment" => "RSA private key 4096 bit"], "batch" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], - "request" => ["type" => "varchar(255)", "comment" => ""], "notify" => ["type" => "varchar(255)", "comment" => ""], "poll" => ["type" => "varchar(255)", "comment" => ""], - "confirm" => ["type" => "varchar(255)", "comment" => ""], "subscribe" => ["type" => "varchar(255)", "comment" => ""], - "poco" => ["type" => "varchar(255)", "comment" => ""], - "aes_allow" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], - "ret-aes" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], - "usehub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], - "subhub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], - "hub-verify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "last-update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last try to update the contact info"], "success_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last successful contact update"], "failure_update" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Date of the last failed update"], "failed" => ["type" => "boolean", "comment" => "Connection failed"], - "name-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], - "uri-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], - "avatar-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], "term-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], "last-item" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "date of the last post"], "last-discovery" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "date of the last follower discovery"], - "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""], "blocked" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "Node-wide block status"], "block_reason" => ["type" => "text", "comment" => "Node-wide block reason"], "readonly" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "posts of the contact are readonly"], - "writable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], - "forum" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a forum"], - "prv" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a private group"], - "contact-type" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""], - "manually-approve" => ["type" => "boolean", "comment" => ""], - "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], + "contact-type" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => "Person, organisation, news, community, relay"], + "manually-approve" => ["type" => "boolean", "comment" => "Contact requests have to be approved manually"], "archive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], - "pending" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => ""], - "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact has been deleted"], - "rating" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => ""], "unsearchable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact prefers to not be searchable"], "sensitive" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact posts sensitive content"], "baseurl" => ["type" => "varchar(255)", "default" => "", "comment" => "baseurl of the contact"], "gsid" => ["type" => "int unsigned", "foreign" => ["gserver" => "id", "on delete" => "restrict"], "comment" => "Global Server ID"], - "reason" => ["type" => "text", "comment" => ""], - "closeness" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "99", "comment" => "Deprecated"], - "info" => ["type" => "mediumtext", "comment" => ""], - "profile-id" => ["type" => "int unsigned", "comment" => "Deprecated"], - "bdyear" => ["type" => "varchar(4)", "not null" => "1", "default" => "", "comment" => ""], "bd" => ["type" => "date", "not null" => "1", "default" => DBA::NULL_DATE, "comment" => ""], + // User depending fields + "reason" => ["type" => "text", "comment" => ""], + "self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 if the contact is the user him/her self"], + "remote_self" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], + "rel" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "The kind of the relation between the user and the contact"], + "protocol" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => "Protocol of the contact"], + "subhub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], + "hub-verify" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], + "rating" => ["type" => "tinyint", "not null" => "1", "default" => "0", "comment" => "Automatically detected feed poll frequency"], + "priority" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Feed poll priority"], + "attag" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], + "hidden" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], + "pending" => ["type" => "boolean", "not null" => "1", "default" => "1", "comment" => "Contact request is pending"], + "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Contact has been deleted"], + "info" => ["type" => "mediumtext", "comment" => ""], "notify_new_posts" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "fetch_further_information" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""], "ffi_keyword_denylist" => ["type" => "text", "comment" => ""], + // Deprecated, but still in use + "photo" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo of the contact"], + "thumb" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (thumb size)"], + "micro" => ["type" => "varchar(255)", "default" => "", "comment" => "Link to the profile photo (micro size)"], + "name-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], + "uri-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], + "avatar-date" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], + "request" => ["type" => "varchar(255)", "comment" => ""], + "confirm" => ["type" => "varchar(255)", "comment" => ""], + "poco" => ["type" => "varchar(255)", "comment" => ""], + "writable" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], + "forum" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a forum. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = false instead"], + "prv" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "contact is a private group. Deprecated, use 'contact-type' = 'community' and 'manually-approve' = true instead"], + "bdyear" => ["type" => "varchar(4)", "not null" => "1", "default" => "", "comment" => ""], + // Deprecated fields that aren't in use anymore + "site-pubkey" => ["type" => "text", "comment" => "Deprecated"], + "gender" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => "Deprecated"], + "duplex" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], + "issued-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Deprecated"], + "dfrn-id" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Deprecated"], + "aes_allow" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], + "ret-aes" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], + "usehub" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Deprecated"], + "closeness" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "99", "comment" => "Deprecated"], + "profile-id" => ["type" => "int unsigned", "comment" => "Deprecated"], ], "indexes" => [ "PRIMARY" => ["id"], diff --git a/static/dbview.config.php b/static/dbview.config.php index 6e353718d..5b3e8b582 100644 --- a/static/dbview.config.php +++ b/static/dbview.config.php @@ -930,7 +930,7 @@ "network" => ["contact", "network"], "protocol" => ["ucontact", "protocol"], "location" => ["contact", "location"], - "attag" => ["contact", "attag"], + "attag" => ["ucontact", "attag"], "pubkey" => ["contact", "pubkey"], "prvkey" => ["contact", "prvkey"], "subscribe" => ["contact", "subscribe"], @@ -946,7 +946,7 @@ "sensitive" => ["contact", "sensitive"], "baseurl" => ["contact", "baseurl"], "gsid" => ["contact", "gsid"], - "info" => ["contact", "info"], + "info" => ["ucontact", "info"], "bdyear" => ["contact", "bdyear"], "bd" => ["contact", "bd"], "poco" => ["contact", "poco"], From 2926282f8d84b088d810e15a5ea593d6f86cbdad Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 13 Sep 2021 14:20:20 +0000 Subject: [PATCH 14/20] More fields added to "user-contact" --- database.sql | 2 ++ doc/database/db_user-contact.md | 2 ++ src/Model/Contact/User.php | 49 +++++++++++++++++---------------- static/dbstructure.config.php | 2 ++ 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/database.sql b/database.sql index 02b01e25c..ed66cbb8a 100644 --- a/database.sql +++ b/database.sql @@ -1526,6 +1526,8 @@ CREATE TABLE IF NOT EXISTS `user-contact` ( `subhub` boolean COMMENT '', `hub-verify` varchar(255) COMMENT '', `protocol` char(4) COMMENT 'Protocol of the contact', + `rating` tinyint COMMENT 'Automatically detected feed poll frequency', + `priority` tinyint unsigned COMMENT 'Feed poll priority', PRIMARY KEY(`uid`,`cid`), INDEX `cid` (`cid`), UNIQUE INDEX `uri-id_uid` (`uri-id`,`uid`), diff --git a/doc/database/db_user-contact.md b/doc/database/db_user-contact.md index 6726ac710..5dab0c4bd 100644 --- a/doc/database/db_user-contact.md +++ b/doc/database/db_user-contact.md @@ -24,6 +24,8 @@ Fields | subhub | | boolean | YES | | NULL | | | hub-verify | | varchar(255) | YES | | NULL | | | protocol | Protocol of the contact | char(4) | YES | | NULL | | +| rating | Automatically detected feed poll frequency | tinyint | YES | | NULL | | +| priority | Feed poll priority | tinyint unsigned | YES | | NULL | | Indexes ------------ diff --git a/src/Model/Contact/User.php b/src/Model/Contact/User.php index 85399951c..eb0b5af09 100644 --- a/src/Model/Contact/User.php +++ b/src/Model/Contact/User.php @@ -66,17 +66,7 @@ class User return false; } - $fields = $contact; - - if (isset($fields['readonly'])) { - $fields['ignored'] = $fields['readonly']; - } - - if (!empty($fields['self'])) { - $fields['rel'] = Contact::SELF; - } - - $fields = DBStructure::getFieldsForTable('user-contact', $fields); + $fields = self::preparedFields($contact); $fields['cid'] = $pcid; $fields['uid'] = $contact['uid']; $fields['uri-id'] = $contact['uri-id']; @@ -101,19 +91,7 @@ class User { DBA::transaction(); - unset($fields['uid']); - unset($fields['cid']); - unset($fields['uri-id']); - - if (isset($fields['readonly'])) { - $fields['ignored'] = $fields['readonly']; - } - - if (!empty($fields['self'])) { - $fields['rel'] = Contact::SELF; - } - - $update_fields = DBStructure::getFieldsForTable('user-contact', $fields); + $update_fields = self::preparedFields($fields); if (!empty($update_fields)) { $contacts = DBA::select('contact', ['uri-id', 'uid'], $condition); while ($row = DBA::fetch($contacts)) { @@ -129,6 +107,29 @@ class User DBA::commit(); } + /** + * Prepare field data for update/insert + * + * @param array $fields + * @return array prepared fields + */ + private static function preparedFields(array $fields): array + { + unset($fields['uid']); + unset($fields['cid']); + unset($fields['uri-id']); + + if (isset($fields['readonly'])) { + $fields['ignored'] = $fields['readonly']; + } + + if (!empty($fields['self'])) { + $fields['rel'] = Contact::SELF; + } + + return DBStructure::getFieldsForTable('user-contact', $fields); + } + /** * Block contact id for user id * diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index b94df41ce..ef97c54f6 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -1548,6 +1548,8 @@ return [ "subhub" => ["type" => "boolean", "comment" => ""], "hub-verify" => ["type" => "varchar(255)", "comment" => ""], "protocol" => ["type" => "char(4)", "comment" => "Protocol of the contact"], + "rating" => ["type" => "tinyint", "comment" => "Automatically detected feed poll frequency"], + "priority" => ["type" => "tinyint unsigned", "comment" => "Feed poll priority"], ], "indexes" => [ "PRIMARY" => ["uid", "cid"], From e77b5d4569eded5d1f6c44ab39b42e346ec05727 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 Sep 2021 18:43:19 +0000 Subject: [PATCH 15/20] Updated messages.po --- view/lang/C/messages.po | 1024 +++++++++++++++++++-------------------- 1 file changed, 512 insertions(+), 512 deletions(-) diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 953ead8bf..5db27c6bb 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 2021.09-rc\n" +"Project-Id-Version: 2021.12-dev\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-10 00:27+0000\n" +"POT-Creation-Date: 2021-09-25 18:43+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,8 +38,8 @@ msgid "Monthly posting limit of %d post reached. The post was rejected." msgstr "" #: include/api.php:4437 mod/photos.php:89 mod/photos.php:198 mod/photos.php:626 -#: mod/photos.php:1034 mod/photos.php:1051 mod/photos.php:1597 -#: src/Model/User.php:1118 src/Model/User.php:1126 src/Model/User.php:1134 +#: mod/photos.php:1035 mod/photos.php:1052 mod/photos.php:1599 +#: src/Model/User.php:1169 src/Model/User.php:1177 src/Model/User.php:1185 #: src/Module/Settings/Profile/Photo/Crop.php:101 #: src/Module/Settings/Profile/Photo/Crop.php:117 #: src/Module/Settings/Profile/Photo/Crop.php:133 @@ -49,455 +49,455 @@ msgstr "" msgid "Profile Photos" msgstr "" -#: include/conversation.php:109 +#: include/conversation.php:110 #, php-format msgid "%1$s poked %2$s" msgstr "" -#: include/conversation.php:142 src/Model/Item.php:2609 +#: include/conversation.php:143 src/Model/Item.php:2622 msgid "event" msgstr "" -#: include/conversation.php:145 include/conversation.php:154 mod/tagger.php:90 +#: include/conversation.php:146 include/conversation.php:155 mod/tagger.php:90 msgid "status" msgstr "" -#: include/conversation.php:150 mod/tagger.php:90 src/Model/Item.php:2611 +#: include/conversation.php:151 mod/tagger.php:90 src/Model/Item.php:2624 msgid "photo" msgstr "" -#: include/conversation.php:164 mod/tagger.php:123 +#: include/conversation.php:165 mod/tagger.php:123 #, php-format msgid "%1$s tagged %2$s's %3$s with %4$s" msgstr "" -#: include/conversation.php:467 mod/photos.php:1459 src/Object/Post.php:226 +#: include/conversation.php:476 mod/photos.php:1461 src/Object/Post.php:227 msgid "Select" msgstr "" -#: include/conversation.php:468 mod/photos.php:1460 mod/settings.php:573 +#: include/conversation.php:477 mod/photos.php:1462 mod/settings.php:573 #: src/Module/Admin/Users/Active.php:139 src/Module/Admin/Users/Blocked.php:140 -#: src/Module/Admin/Users/Index.php:153 src/Module/Contact.php:849 -#: src/Module/Contact.php:1132 +#: src/Module/Admin/Users/Index.php:153 src/Module/Contact.php:865 +#: src/Module/Contact.php:1150 msgid "Delete" msgstr "" -#: include/conversation.php:503 src/Object/Post.php:453 src/Object/Post.php:454 +#: include/conversation.php:512 src/Object/Post.php:454 src/Object/Post.php:455 #, php-format msgid "View %s's profile @ %s" msgstr "" -#: include/conversation.php:516 src/Object/Post.php:441 +#: include/conversation.php:525 src/Object/Post.php:442 msgid "Categories:" msgstr "" -#: include/conversation.php:517 src/Object/Post.php:442 +#: include/conversation.php:526 src/Object/Post.php:443 msgid "Filed under:" msgstr "" -#: include/conversation.php:524 src/Object/Post.php:467 +#: include/conversation.php:533 src/Object/Post.php:468 #, php-format msgid "%s from %s" msgstr "" -#: include/conversation.php:539 +#: include/conversation.php:548 msgid "View in context" msgstr "" -#: include/conversation.php:541 include/conversation.php:1146 +#: include/conversation.php:550 include/conversation.php:1155 #: mod/editpost.php:107 mod/message.php:203 mod/message.php:368 -#: mod/photos.php:1524 mod/wallmessage.php:155 src/Module/Item/Compose.php:165 -#: src/Object/Post.php:501 +#: mod/photos.php:1526 mod/wallmessage.php:155 src/Module/Item/Compose.php:165 +#: src/Object/Post.php:502 msgid "Please wait" msgstr "" -#: include/conversation.php:605 +#: include/conversation.php:614 msgid "remove" msgstr "" -#: include/conversation.php:609 +#: include/conversation.php:618 msgid "Delete Selected Items" msgstr "" -#: include/conversation.php:647 include/conversation.php:650 -#: include/conversation.php:653 include/conversation.php:656 +#: include/conversation.php:656 include/conversation.php:659 +#: include/conversation.php:662 include/conversation.php:665 #, php-format msgid "You had been addressed (%s)." msgstr "" -#: include/conversation.php:659 +#: include/conversation.php:668 #, php-format msgid "You are following %s." msgstr "" -#: include/conversation.php:662 +#: include/conversation.php:671 msgid "Tagged" msgstr "" -#: include/conversation.php:675 include/conversation.php:1013 -#: include/conversation.php:1051 +#: include/conversation.php:684 include/conversation.php:1022 +#: include/conversation.php:1060 #, php-format msgid "%s reshared this." msgstr "" -#: include/conversation.php:677 +#: include/conversation.php:686 msgid "Reshared" msgstr "" -#: include/conversation.php:677 +#: include/conversation.php:686 #, php-format msgid "Reshared by %s <%s>" msgstr "" -#: include/conversation.php:680 +#: include/conversation.php:689 #, php-format msgid "%s is participating in this thread." msgstr "" -#: include/conversation.php:683 +#: include/conversation.php:692 msgid "Stored" msgstr "" -#: include/conversation.php:686 +#: include/conversation.php:695 msgid "Global" msgstr "" -#: include/conversation.php:689 +#: include/conversation.php:698 msgid "Relayed" msgstr "" -#: include/conversation.php:689 +#: include/conversation.php:698 #, php-format msgid "Relayed by %s <%s>" msgstr "" -#: include/conversation.php:692 +#: include/conversation.php:701 msgid "Fetched" msgstr "" -#: include/conversation.php:692 +#: include/conversation.php:701 #, php-format msgid "Fetched because of %s <%s>" msgstr "" -#: include/conversation.php:844 view/theme/frio/theme.php:323 +#: include/conversation.php:853 view/theme/frio/theme.php:323 msgid "Follow Thread" msgstr "" -#: include/conversation.php:845 src/Model/Contact.php:1050 +#: include/conversation.php:854 src/Model/Contact.php:1076 msgid "View Status" msgstr "" -#: include/conversation.php:846 include/conversation.php:868 -#: src/Model/Contact.php:976 src/Model/Contact.php:1042 -#: src/Model/Contact.php:1051 src/Module/Directory.php:160 +#: include/conversation.php:855 include/conversation.php:877 +#: src/Model/Contact.php:1002 src/Model/Contact.php:1068 +#: src/Model/Contact.php:1077 src/Module/Directory.php:160 #: src/Module/Settings/Profile/Index.php:223 msgid "View Profile" msgstr "" -#: include/conversation.php:847 src/Model/Contact.php:1052 +#: include/conversation.php:856 src/Model/Contact.php:1078 msgid "View Photos" msgstr "" -#: include/conversation.php:848 src/Model/Contact.php:1043 -#: src/Model/Contact.php:1053 +#: include/conversation.php:857 src/Model/Contact.php:1069 +#: src/Model/Contact.php:1079 msgid "Network Posts" msgstr "" -#: include/conversation.php:849 src/Model/Contact.php:1044 -#: src/Model/Contact.php:1054 +#: include/conversation.php:858 src/Model/Contact.php:1070 +#: src/Model/Contact.php:1080 msgid "View Contact" msgstr "" -#: include/conversation.php:850 src/Model/Contact.php:1056 +#: include/conversation.php:859 src/Model/Contact.php:1082 msgid "Send PM" msgstr "" -#: include/conversation.php:851 src/Module/Admin/Blocklist/Contact.php:84 +#: include/conversation.php:860 src/Module/Admin/Blocklist/Contact.php:84 #: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154 -#: src/Module/Contact.php:587 src/Module/Contact.php:847 -#: src/Module/Contact.php:1115 +#: src/Module/Contact.php:602 src/Module/Contact.php:863 +#: src/Module/Contact.php:1133 msgid "Block" msgstr "" -#: include/conversation.php:852 src/Module/Contact.php:588 -#: src/Module/Contact.php:848 src/Module/Contact.php:1123 +#: include/conversation.php:861 src/Module/Contact.php:603 +#: src/Module/Contact.php:864 src/Module/Contact.php:1141 #: src/Module/Notifications/Introductions.php:113 #: src/Module/Notifications/Introductions.php:185 #: src/Module/Notifications/Notification.php:59 msgid "Ignore" msgstr "" -#: include/conversation.php:856 src/Object/Post.php:428 +#: include/conversation.php:865 src/Object/Post.php:429 msgid "Languages" msgstr "" -#: include/conversation.php:860 src/Model/Contact.php:1057 +#: include/conversation.php:869 src/Model/Contact.php:1083 msgid "Poke" msgstr "" -#: include/conversation.php:865 mod/follow.php:138 src/Content/Widget.php:76 -#: src/Model/Contact.php:1045 src/Model/Contact.php:1058 +#: include/conversation.php:874 mod/follow.php:138 src/Content/Widget.php:76 +#: src/Model/Contact.php:1071 src/Model/Contact.php:1084 #: view/theme/vier/theme.php:172 msgid "Connect/Follow" msgstr "" -#: include/conversation.php:998 +#: include/conversation.php:1007 #, php-format msgid "%s likes this." msgstr "" -#: include/conversation.php:1001 +#: include/conversation.php:1010 #, php-format msgid "%s doesn't like this." msgstr "" -#: include/conversation.php:1004 +#: include/conversation.php:1013 #, php-format msgid "%s attends." msgstr "" -#: include/conversation.php:1007 +#: include/conversation.php:1016 #, php-format msgid "%s doesn't attend." msgstr "" -#: include/conversation.php:1010 +#: include/conversation.php:1019 #, php-format msgid "%s attends maybe." msgstr "" -#: include/conversation.php:1019 +#: include/conversation.php:1028 msgid "and" msgstr "" -#: include/conversation.php:1022 -#, php-format -msgid "and %d other people" -msgstr "" - -#: include/conversation.php:1030 -#, php-format -msgid "%2$d people like this" -msgstr "" - #: include/conversation.php:1031 #, php-format -msgid "%s like this." -msgstr "" - -#: include/conversation.php:1034 -#, php-format -msgid "%2$d people don't like this" -msgstr "" - -#: include/conversation.php:1035 -#, php-format -msgid "%s don't like this." -msgstr "" - -#: include/conversation.php:1038 -#, php-format -msgid "%2$d people attend" +msgid "and %d other people" msgstr "" #: include/conversation.php:1039 #, php-format -msgid "%s attend." +msgid "%2$d people like this" msgstr "" -#: include/conversation.php:1042 +#: include/conversation.php:1040 #, php-format -msgid "%2$d people don't attend" +msgid "%s like this." msgstr "" #: include/conversation.php:1043 #, php-format -msgid "%s don't attend." +msgid "%2$d people don't like this" msgstr "" -#: include/conversation.php:1046 +#: include/conversation.php:1044 #, php-format -msgid "%2$d people attend maybe" +msgid "%s don't like this." msgstr "" #: include/conversation.php:1047 #, php-format +msgid "%2$d people attend" +msgstr "" + +#: include/conversation.php:1048 +#, php-format +msgid "%s attend." +msgstr "" + +#: include/conversation.php:1051 +#, php-format +msgid "%2$d people don't attend" +msgstr "" + +#: include/conversation.php:1052 +#, php-format +msgid "%s don't attend." +msgstr "" + +#: include/conversation.php:1055 +#, php-format +msgid "%2$d people attend maybe" +msgstr "" + +#: include/conversation.php:1056 +#, php-format msgid "%s attend maybe." msgstr "" -#: include/conversation.php:1050 +#: include/conversation.php:1059 #, php-format msgid "%2$d people reshared this" msgstr "" -#: include/conversation.php:1098 +#: include/conversation.php:1107 msgid "Visible to everybody" msgstr "" -#: include/conversation.php:1099 src/Module/Item/Compose.php:159 -#: src/Object/Post.php:972 +#: include/conversation.php:1108 src/Module/Item/Compose.php:159 +#: src/Object/Post.php:973 msgid "Please enter a image/video/audio/webpage URL:" msgstr "" -#: include/conversation.php:1100 +#: include/conversation.php:1109 msgid "Tag term:" msgstr "" -#: include/conversation.php:1101 src/Module/Filer/SaveTag.php:68 +#: include/conversation.php:1110 src/Module/Filer/SaveTag.php:68 msgid "Save to Folder:" msgstr "" -#: include/conversation.php:1102 +#: include/conversation.php:1111 msgid "Where are you right now?" msgstr "" -#: include/conversation.php:1103 +#: include/conversation.php:1112 msgid "Delete item(s)?" msgstr "" -#: include/conversation.php:1113 +#: include/conversation.php:1122 msgid "New Post" msgstr "" -#: include/conversation.php:1116 +#: include/conversation.php:1125 msgid "Share" msgstr "" -#: include/conversation.php:1117 mod/editpost.php:92 mod/photos.php:1373 -#: src/Module/Contact/Poke.php:157 src/Object/Post.php:963 +#: include/conversation.php:1126 mod/editpost.php:92 mod/photos.php:1375 +#: src/Module/Contact/Poke.php:157 src/Object/Post.php:964 msgid "Loading..." msgstr "" -#: include/conversation.php:1118 mod/editpost.php:93 mod/message.php:201 +#: include/conversation.php:1127 mod/editpost.php:93 mod/message.php:201 #: mod/message.php:365 mod/wallmessage.php:153 msgid "Upload photo" msgstr "" -#: include/conversation.php:1119 mod/editpost.php:94 +#: include/conversation.php:1128 mod/editpost.php:94 msgid "upload photo" msgstr "" -#: include/conversation.php:1120 mod/editpost.php:95 +#: include/conversation.php:1129 mod/editpost.php:95 msgid "Attach file" msgstr "" -#: include/conversation.php:1121 mod/editpost.php:96 +#: include/conversation.php:1130 mod/editpost.php:96 msgid "attach file" msgstr "" -#: include/conversation.php:1122 src/Module/Item/Compose.php:151 -#: src/Object/Post.php:964 +#: include/conversation.php:1131 src/Module/Item/Compose.php:151 +#: src/Object/Post.php:965 msgid "Bold" msgstr "" -#: include/conversation.php:1123 src/Module/Item/Compose.php:152 -#: src/Object/Post.php:965 +#: include/conversation.php:1132 src/Module/Item/Compose.php:152 +#: src/Object/Post.php:966 msgid "Italic" msgstr "" -#: include/conversation.php:1124 src/Module/Item/Compose.php:153 -#: src/Object/Post.php:966 +#: include/conversation.php:1133 src/Module/Item/Compose.php:153 +#: src/Object/Post.php:967 msgid "Underline" msgstr "" -#: include/conversation.php:1125 src/Module/Item/Compose.php:154 -#: src/Object/Post.php:967 +#: include/conversation.php:1134 src/Module/Item/Compose.php:154 +#: src/Object/Post.php:968 msgid "Quote" msgstr "" -#: include/conversation.php:1126 src/Module/Item/Compose.php:155 -#: src/Object/Post.php:968 +#: include/conversation.php:1135 src/Module/Item/Compose.php:155 +#: src/Object/Post.php:969 msgid "Code" msgstr "" -#: include/conversation.php:1127 src/Module/Item/Compose.php:156 -#: src/Object/Post.php:969 +#: include/conversation.php:1136 src/Module/Item/Compose.php:156 +#: src/Object/Post.php:970 msgid "Image" msgstr "" -#: include/conversation.php:1128 src/Module/Item/Compose.php:157 -#: src/Object/Post.php:970 +#: include/conversation.php:1137 src/Module/Item/Compose.php:157 +#: src/Object/Post.php:971 msgid "Link" msgstr "" -#: include/conversation.php:1129 src/Module/Item/Compose.php:158 -#: src/Object/Post.php:971 +#: include/conversation.php:1138 src/Module/Item/Compose.php:158 +#: src/Object/Post.php:972 msgid "Link or Media" msgstr "" -#: include/conversation.php:1130 +#: include/conversation.php:1139 msgid "Video" msgstr "" -#: include/conversation.php:1131 mod/editpost.php:103 +#: include/conversation.php:1140 mod/editpost.php:103 #: src/Module/Item/Compose.php:161 msgid "Set your location" msgstr "" -#: include/conversation.php:1132 mod/editpost.php:104 +#: include/conversation.php:1141 mod/editpost.php:104 msgid "set location" msgstr "" -#: include/conversation.php:1133 mod/editpost.php:105 +#: include/conversation.php:1142 mod/editpost.php:105 msgid "Clear browser location" msgstr "" -#: include/conversation.php:1134 mod/editpost.php:106 +#: include/conversation.php:1143 mod/editpost.php:106 msgid "clear location" msgstr "" -#: include/conversation.php:1136 mod/editpost.php:120 +#: include/conversation.php:1145 mod/editpost.php:120 #: src/Module/Item/Compose.php:166 msgid "Set title" msgstr "" -#: include/conversation.php:1138 mod/editpost.php:122 +#: include/conversation.php:1147 mod/editpost.php:122 #: src/Module/Item/Compose.php:167 msgid "Categories (comma-separated list)" msgstr "" -#: include/conversation.php:1143 src/Module/Item/Compose.php:172 +#: include/conversation.php:1152 src/Module/Item/Compose.php:172 msgid "Scheduled at" msgstr "" -#: include/conversation.php:1147 mod/editpost.php:108 +#: include/conversation.php:1156 mod/editpost.php:108 msgid "Permission settings" msgstr "" -#: include/conversation.php:1148 mod/editpost.php:136 mod/events.php:583 -#: mod/photos.php:965 mod/photos.php:1326 +#: include/conversation.php:1157 mod/editpost.php:136 mod/events.php:583 +#: mod/photos.php:965 mod/photos.php:1328 msgid "Permissions" msgstr "" -#: include/conversation.php:1157 mod/editpost.php:117 +#: include/conversation.php:1166 mod/editpost.php:117 msgid "Public post" msgstr "" -#: include/conversation.php:1161 mod/editpost.php:128 mod/events.php:578 -#: mod/photos.php:1372 mod/photos.php:1428 mod/photos.php:1502 -#: src/Module/Item/Compose.php:160 src/Object/Post.php:973 +#: include/conversation.php:1170 mod/editpost.php:128 mod/events.php:578 +#: mod/photos.php:1374 mod/photos.php:1430 mod/photos.php:1504 +#: src/Module/Item/Compose.php:160 src/Object/Post.php:974 msgid "Preview" msgstr "" -#: include/conversation.php:1164 mod/editpost.php:130 mod/fbrowser.php:105 -#: mod/fbrowser.php:134 mod/follow.php:144 mod/photos.php:1028 -#: mod/photos.php:1134 mod/tagrm.php:37 mod/tagrm.php:129 mod/unfollow.php:97 -#: src/Module/Contact.php:422 src/Module/RemoteFollow.php:116 +#: include/conversation.php:1173 mod/editpost.php:130 mod/fbrowser.php:105 +#: mod/fbrowser.php:134 mod/follow.php:144 mod/photos.php:1029 +#: mod/photos.php:1136 mod/tagrm.php:37 mod/tagrm.php:129 mod/unfollow.php:97 +#: src/Module/Contact.php:443 src/Module/RemoteFollow.php:116 msgid "Cancel" msgstr "" -#: include/conversation.php:1171 mod/editpost.php:134 +#: include/conversation.php:1180 mod/editpost.php:134 #: src/Content/Widget/VCard.php:107 src/Model/Profile.php:459 msgid "Message" msgstr "" -#: include/conversation.php:1172 mod/editpost.php:135 +#: include/conversation.php:1181 mod/editpost.php:135 #: src/Module/Settings/TwoFactor/Trusted.php:101 msgid "Browser" msgstr "" -#: include/conversation.php:1174 mod/editpost.php:138 +#: include/conversation.php:1183 mod/editpost.php:138 msgid "Open Compose page" msgstr "" @@ -763,16 +763,16 @@ msgstr "" #: mod/wallmessage.php:96 mod/wallmessage.php:120 src/Module/Attach.php:55 #: src/Module/BaseApi.php:79 src/Module/BaseApi.php:88 #: src/Module/BaseApi.php:97 src/Module/BaseApi.php:106 -#: src/Module/BaseNotifications.php:88 src/Module/Contact.php:346 -#: src/Module/Contact/Advanced.php:44 src/Module/Delegation.php:119 +#: src/Module/BaseNotifications.php:88 src/Module/Contact.php:356 +#: src/Module/Contact/Advanced.php:44 src/Module/Delegation.php:118 #: src/Module/FollowConfirm.php:16 src/Module/FriendSuggest.php:44 #: src/Module/Group.php:45 src/Module/Group.php:90 src/Module/Invite.php:41 #: src/Module/Invite.php:130 src/Module/Notifications/Notification.php:47 #: src/Module/Notifications/Notification.php:76 #: src/Module/Profile/Common.php:56 src/Module/Profile/Contacts.php:56 #: src/Module/Profile/Schedule.php:39 src/Module/Profile/Schedule.php:56 -#: src/Module/Register.php:62 src/Module/Register.php:75 -#: src/Module/Register.php:193 src/Module/Register.php:232 +#: src/Module/Register.php:64 src/Module/Register.php:77 +#: src/Module/Register.php:195 src/Module/Register.php:234 #: src/Module/Search/Directory.php:38 src/Module/Settings/Delegation.php:42 #: src/Module/Settings/Delegation.php:70 src/Module/Settings/Display.php:43 #: src/Module/Settings/Display.php:121 @@ -799,7 +799,7 @@ msgstr "" #: src/Model/Profile.php:228 src/Module/HCard.php:52 #: src/Module/Profile/Common.php:41 src/Module/Profile/Common.php:52 #: src/Module/Profile/Contacts.php:40 src/Module/Profile/Contacts.php:50 -#: src/Module/Profile/Status.php:58 src/Module/Register.php:254 +#: src/Module/Profile/Status.php:58 src/Module/Register.php:256 #: src/Module/RemoteFollow.php:49 msgid "User not found." msgstr "" @@ -967,7 +967,7 @@ msgstr "" #: src/Module/Install.php:268 src/Module/Install.php:273 #: src/Module/Install.php:279 src/Module/Install.php:284 #: src/Module/Install.php:298 src/Module/Install.php:313 -#: src/Module/Install.php:340 src/Module/Register.php:135 +#: src/Module/Install.php:340 src/Module/Register.php:137 #: src/Module/Security/TwoFactor/Verify.php:100 #: src/Module/Settings/TwoFactor/Index.php:133 #: src/Module/Settings/TwoFactor/Verify.php:141 @@ -993,7 +993,7 @@ msgstr "" #: mod/events.php:568 src/Content/Widget/VCard.php:98 src/Model/Event.php:86 #: src/Model/Event.php:113 src/Model/Event.php:483 src/Model/Event.php:969 -#: src/Model/Profile.php:367 src/Module/Contact.php:608 +#: src/Model/Profile.php:367 src/Module/Contact.php:623 #: src/Module/Directory.php:150 src/Module/Notifications/Introductions.php:166 #: src/Module/Profile/Profile.php:194 msgid "Location:" @@ -1008,18 +1008,18 @@ msgid "Share this event" msgstr "" #: mod/events.php:580 mod/message.php:204 mod/message.php:367 -#: mod/photos.php:947 mod/photos.php:1045 mod/photos.php:1330 -#: mod/photos.php:1371 mod/photos.php:1427 mod/photos.php:1501 -#: src/Module/Admin/Item/Source.php:65 src/Module/Contact.php:566 +#: mod/photos.php:947 mod/photos.php:1046 mod/photos.php:1332 +#: mod/photos.php:1373 mod/photos.php:1429 mod/photos.php:1503 +#: src/Module/Admin/Item/Source.php:65 src/Module/Contact.php:581 #: src/Module/Contact/Advanced.php:133 src/Module/Contact/Poke.php:158 #: src/Module/Debug/ActivityPubConversion.php:141 #: src/Module/Debug/Babel.php:313 src/Module/Debug/Localtime.php:64 #: src/Module/Debug/Probe.php:56 src/Module/Debug/WebFinger.php:53 -#: src/Module/Delegation.php:153 src/Module/FriendSuggest.php:129 +#: src/Module/Delegation.php:147 src/Module/FriendSuggest.php:129 #: src/Module/Install.php:245 src/Module/Install.php:287 #: src/Module/Install.php:324 src/Module/Invite.php:177 #: src/Module/Item/Compose.php:150 src/Module/Profile/Profile.php:247 -#: src/Module/Settings/Profile/Index.php:220 src/Object/Post.php:962 +#: src/Module/Settings/Profile/Index.php:220 src/Object/Post.php:963 #: view/theme/duepuntozero/config.php:69 view/theme/frio/config.php:160 #: view/theme/quattro/config.php:71 view/theme/vier/config.php:119 msgid "Submit" @@ -1029,7 +1029,7 @@ msgstr "" msgid "Basic" msgstr "" -#: mod/events.php:582 src/Module/Admin/Site.php:505 src/Module/Contact.php:916 +#: mod/events.php:582 src/Module/Admin/Site.php:505 src/Module/Contact.php:932 #: src/Module/Profile/Profile.php:249 msgid "Advanced" msgstr "" @@ -1081,13 +1081,13 @@ msgid "Your Identity Address:" msgstr "" #: mod/follow.php:141 mod/unfollow.php:100 -#: src/Module/Admin/Blocklist/Contact.php:100 src/Module/Contact.php:604 +#: src/Module/Admin/Blocklist/Contact.php:100 src/Module/Contact.php:619 #: src/Module/Notifications/Introductions.php:108 #: src/Module/Notifications/Introductions.php:177 msgid "Profile URL" msgstr "" -#: mod/follow.php:142 src/Module/Contact.php:616 +#: mod/follow.php:142 src/Module/Contact.php:631 #: src/Module/Notifications/Introductions.php:170 #: src/Module/Profile/Profile.php:207 msgid "Tags:" @@ -1103,7 +1103,7 @@ msgid "Add a personal note:" msgstr "" #: mod/follow.php:163 mod/unfollow.php:109 src/Module/BaseProfile.php:59 -#: src/Module/Contact.php:894 +#: src/Module/Contact.php:910 msgid "Status Messages and Posts" msgstr "" @@ -1462,11 +1462,11 @@ msgstr "" msgid "Photo Albums" msgstr "" -#: mod/photos.php:112 mod/photos.php:1626 +#: mod/photos.php:112 mod/photos.php:1628 msgid "Recent Photos" msgstr "" -#: mod/photos.php:114 mod/photos.php:1096 mod/photos.php:1628 +#: mod/photos.php:114 mod/photos.php:1097 mod/photos.php:1630 msgid "Upload New Photos" msgstr "" @@ -1549,7 +1549,7 @@ msgstr "" msgid "Upload Photos" msgstr "" -#: mod/photos.php:961 mod/photos.php:1041 +#: mod/photos.php:961 mod/photos.php:1042 msgid "New album name: " msgstr "" @@ -1565,138 +1565,138 @@ msgstr "" msgid "Do you really want to delete this photo album and all its photos?" msgstr "" -#: mod/photos.php:1025 mod/photos.php:1046 +#: mod/photos.php:1025 mod/photos.php:1047 msgid "Delete Album" msgstr "" -#: mod/photos.php:1052 +#: mod/photos.php:1053 msgid "Edit Album" msgstr "" -#: mod/photos.php:1053 +#: mod/photos.php:1054 msgid "Drop Album" msgstr "" -#: mod/photos.php:1058 +#: mod/photos.php:1059 msgid "Show Newest First" msgstr "" -#: mod/photos.php:1060 +#: mod/photos.php:1061 msgid "Show Oldest First" msgstr "" -#: mod/photos.php:1081 mod/photos.php:1611 +#: mod/photos.php:1082 mod/photos.php:1613 msgid "View Photo" msgstr "" -#: mod/photos.php:1118 +#: mod/photos.php:1119 msgid "Permission denied. Access to this item may be restricted." msgstr "" -#: mod/photos.php:1120 +#: mod/photos.php:1121 msgid "Photo not available" msgstr "" -#: mod/photos.php:1130 +#: mod/photos.php:1131 msgid "Do you really want to delete this photo?" msgstr "" -#: mod/photos.php:1131 mod/photos.php:1331 +#: mod/photos.php:1132 mod/photos.php:1333 msgid "Delete Photo" msgstr "" -#: mod/photos.php:1222 +#: mod/photos.php:1224 msgid "View photo" msgstr "" -#: mod/photos.php:1224 +#: mod/photos.php:1226 msgid "Edit photo" msgstr "" -#: mod/photos.php:1225 +#: mod/photos.php:1227 msgid "Delete photo" msgstr "" -#: mod/photos.php:1226 +#: mod/photos.php:1228 msgid "Use as profile photo" msgstr "" -#: mod/photos.php:1233 +#: mod/photos.php:1235 msgid "Private Photo" msgstr "" -#: mod/photos.php:1239 +#: mod/photos.php:1241 msgid "View Full Size" msgstr "" -#: mod/photos.php:1299 +#: mod/photos.php:1301 msgid "Tags: " msgstr "" -#: mod/photos.php:1302 +#: mod/photos.php:1304 msgid "[Select tags to remove]" msgstr "" -#: mod/photos.php:1317 +#: mod/photos.php:1319 msgid "New album name" msgstr "" -#: mod/photos.php:1318 +#: mod/photos.php:1320 msgid "Caption" msgstr "" -#: mod/photos.php:1319 +#: mod/photos.php:1321 msgid "Add a Tag" msgstr "" -#: mod/photos.php:1319 +#: mod/photos.php:1321 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" msgstr "" -#: mod/photos.php:1320 +#: mod/photos.php:1322 msgid "Do not rotate" msgstr "" -#: mod/photos.php:1321 +#: mod/photos.php:1323 msgid "Rotate CW (right)" msgstr "" -#: mod/photos.php:1322 +#: mod/photos.php:1324 msgid "Rotate CCW (left)" msgstr "" -#: mod/photos.php:1368 mod/photos.php:1424 mod/photos.php:1498 -#: src/Module/Contact.php:1046 src/Module/Item/Compose.php:148 -#: src/Object/Post.php:959 +#: mod/photos.php:1370 mod/photos.php:1426 mod/photos.php:1500 +#: src/Module/Contact.php:1062 src/Module/Item/Compose.php:148 +#: src/Object/Post.php:960 msgid "This is you" msgstr "" -#: mod/photos.php:1370 mod/photos.php:1426 mod/photos.php:1500 -#: src/Object/Post.php:495 src/Object/Post.php:961 +#: mod/photos.php:1372 mod/photos.php:1428 mod/photos.php:1502 +#: src/Object/Post.php:496 src/Object/Post.php:962 msgid "Comment" msgstr "" -#: mod/photos.php:1521 src/Object/Post.php:348 +#: mod/photos.php:1523 src/Object/Post.php:349 msgid "Like" msgstr "" -#: mod/photos.php:1522 src/Object/Post.php:348 +#: mod/photos.php:1524 src/Object/Post.php:349 msgid "I like this (toggle)" msgstr "" -#: mod/photos.php:1523 src/Object/Post.php:349 +#: mod/photos.php:1525 src/Object/Post.php:350 msgid "Dislike" msgstr "" -#: mod/photos.php:1525 src/Object/Post.php:349 +#: mod/photos.php:1527 src/Object/Post.php:350 msgid "I don't like this (toggle)" msgstr "" -#: mod/photos.php:1547 +#: mod/photos.php:1549 msgid "Map" msgstr "" -#: mod/photos.php:1617 mod/videos.php:243 +#: mod/photos.php:1619 mod/videos.php:243 msgid "View Album" msgstr "" @@ -2177,7 +2177,7 @@ msgstr "" msgid "Password Settings" msgstr "" -#: mod/settings.php:719 src/Module/Register.php:149 +#: mod/settings.php:719 src/Module/Register.php:151 msgid "New Password:" msgstr "" @@ -2187,7 +2187,7 @@ msgid "" "spaces, accentuated letters and colon (:)." msgstr "" -#: mod/settings.php:720 src/Module/Register.php:150 +#: mod/settings.php:720 src/Module/Register.php:152 msgid "Confirm:" msgstr "" @@ -2562,13 +2562,13 @@ msgstr "" msgid "User imports on closed servers can only be done by an administrator." msgstr "" -#: mod/uimport.php:54 src/Module/Register.php:84 +#: mod/uimport.php:54 src/Module/Register.php:86 msgid "" "This site has exceeded the number of allowed daily account registrations. " "Please try again tomorrow." msgstr "" -#: mod/uimport.php:61 src/Module/Register.php:160 +#: mod/uimport.php:61 src/Module/Register.php:162 msgid "Import" msgstr "" @@ -2678,7 +2678,7 @@ msgid "" "your site allow private mail from unknown senders." msgstr "" -#: src/App.php:452 +#: src/App.php:453 msgid "No system theme config value set." msgstr "" @@ -2720,16 +2720,16 @@ msgid "All contacts" msgstr "" #: src/BaseModule.php:212 src/Content/Widget.php:238 src/Core/ACL.php:195 -#: src/Module/Contact.php:816 src/Module/PermissionTooltip.php:77 +#: src/Module/Contact.php:831 src/Module/PermissionTooltip.php:77 #: src/Module/PermissionTooltip.php:99 msgid "Followers" msgstr "" -#: src/BaseModule.php:217 src/Content/Widget.php:239 src/Module/Contact.php:817 +#: src/BaseModule.php:217 src/Content/Widget.php:239 src/Module/Contact.php:832 msgid "Following" msgstr "" -#: src/BaseModule.php:222 src/Content/Widget.php:240 src/Module/Contact.php:818 +#: src/BaseModule.php:222 src/Content/Widget.php:240 src/Module/Contact.php:833 msgid "Mutual friends" msgstr "" @@ -2749,12 +2749,12 @@ msgstr "" msgid "Addon already disabled" msgstr "" -#: src/Console/ArchiveContact.php:105 +#: src/Console/ArchiveContact.php:106 #, php-format msgid "Could not find any unarchived contact entry for this URL (%s)" msgstr "" -#: src/Console/ArchiveContact.php:108 +#: src/Console/ArchiveContact.php:109 msgid "The contact entries have been archived" msgstr "" @@ -3086,7 +3086,7 @@ msgid "Sign in" msgstr "" #: src/Content/Nav.php:190 src/Module/BaseProfile.php:56 -#: src/Module/Contact.php:619 src/Module/Contact.php:883 +#: src/Module/Contact.php:634 src/Module/Contact.php:899 #: src/Module/Settings/TwoFactor/Index.php:112 view/theme/frio/theme.php:226 msgid "Status" msgstr "" @@ -3097,8 +3097,8 @@ msgid "Your posts and conversations" msgstr "" #: src/Content/Nav.php:191 src/Module/BaseProfile.php:48 -#: src/Module/BaseSettings.php:57 src/Module/Contact.php:621 -#: src/Module/Contact.php:899 src/Module/Profile/Profile.php:241 +#: src/Module/BaseSettings.php:57 src/Module/Contact.php:636 +#: src/Module/Contact.php:915 src/Module/Profile/Profile.php:241 #: src/Module/Welcome.php:57 view/theme/frio/theme.php:227 msgid "Profile" msgstr "" @@ -3135,7 +3135,7 @@ msgstr "" msgid "Home" msgstr "" -#: src/Content/Nav.php:216 src/Module/Register.php:155 +#: src/Content/Nav.php:216 src/Module/Register.php:157 #: src/Module/Security/Login.php:106 msgid "Register" msgstr "" @@ -3184,8 +3184,8 @@ msgstr "" #: src/Content/Nav.php:235 src/Content/Nav.php:294 #: src/Content/Text/HTML.php:902 src/Module/BaseProfile.php:126 -#: src/Module/BaseProfile.php:129 src/Module/Contact.php:819 -#: src/Module/Contact.php:906 view/theme/frio/theme.php:237 +#: src/Module/BaseProfile.php:129 src/Module/Contact.php:834 +#: src/Module/Contact.php:922 view/theme/frio/theme.php:237 msgid "Contacts" msgstr "" @@ -3219,7 +3219,7 @@ msgid "Information about this friendica instance" msgstr "" #: src/Content/Nav.php:266 src/Module/Admin/Tos.php:59 -#: src/Module/BaseAdmin.php:96 src/Module/Register.php:163 +#: src/Module/BaseAdmin.php:96 src/Module/Register.php:165 #: src/Module/Tos.php:84 msgid "Terms of Service" msgstr "" @@ -3331,39 +3331,39 @@ msgstr "" msgid "last" msgstr "" -#: src/Content/Text/BBCode.php:980 src/Content/Text/BBCode.php:1768 -#: src/Content/Text/BBCode.php:1769 +#: src/Content/Text/BBCode.php:985 src/Content/Text/BBCode.php:1773 +#: src/Content/Text/BBCode.php:1774 msgid "Image/photo" msgstr "" -#: src/Content/Text/BBCode.php:1153 +#: src/Content/Text/BBCode.php:1158 #, php-format msgid "" "%2$s %3$s" msgstr "" -#: src/Content/Text/BBCode.php:1178 src/Model/Item.php:3139 -#: src/Model/Item.php:3145 src/Model/Item.php:3146 +#: src/Content/Text/BBCode.php:1183 src/Model/Item.php:3152 +#: src/Model/Item.php:3158 src/Model/Item.php:3159 msgid "Link to source" msgstr "" -#: src/Content/Text/BBCode.php:1686 src/Content/Text/HTML.php:943 +#: src/Content/Text/BBCode.php:1691 src/Content/Text/HTML.php:943 msgid "Click to open/close" msgstr "" -#: src/Content/Text/BBCode.php:1717 +#: src/Content/Text/BBCode.php:1722 msgid "$1 wrote:" msgstr "" -#: src/Content/Text/BBCode.php:1773 src/Content/Text/BBCode.php:1774 +#: src/Content/Text/BBCode.php:1778 src/Content/Text/BBCode.php:1779 msgid "Encrypted content" msgstr "" -#: src/Content/Text/BBCode.php:1990 +#: src/Content/Text/BBCode.php:1995 msgid "Invalid source protocol" msgstr "" -#: src/Content/Text/BBCode.php:2005 +#: src/Content/Text/BBCode.php:2010 msgid "Invalid link protocol" msgstr "" @@ -3415,7 +3415,7 @@ msgstr "" msgid "Examples: Robert Morgenstein, Fishing" msgstr "" -#: src/Content/Widget.php:78 src/Module/Contact.php:840 +#: src/Content/Widget.php:78 src/Module/Contact.php:855 #: src/Module/Directory.php:99 view/theme/vier/theme.php:174 msgid "Find" msgstr "" @@ -3442,7 +3442,7 @@ msgid "Local Directory" msgstr "" #: src/Content/Widget.php:214 src/Model/Group.php:535 -#: src/Module/Contact.php:803 src/Module/Welcome.php:76 +#: src/Module/Contact.php:818 src/Module/Welcome.php:76 msgid "Groups" msgstr "" @@ -3454,7 +3454,7 @@ msgstr "" msgid "Relationships" msgstr "" -#: src/Content/Widget.php:247 src/Module/Contact.php:755 +#: src/Content/Widget.php:247 src/Module/Contact.php:770 #: src/Module/Group.php:292 msgid "All Contacts" msgstr "" @@ -3498,7 +3498,7 @@ msgstr "" msgid "Organisations" msgstr "" -#: src/Content/Widget.php:529 src/Model/Contact.php:1474 +#: src/Content/Widget.php:529 src/Model/Contact.php:1499 msgid "News" msgstr "" @@ -3518,18 +3518,18 @@ msgstr "" msgid "Export calendar as csv" msgstr "" -#: src/Content/Widget/ContactBlock.php:73 +#: src/Content/Widget/ContactBlock.php:79 msgid "No contacts" msgstr "" -#: src/Content/Widget/ContactBlock.php:105 +#: src/Content/Widget/ContactBlock.php:108 #, php-format msgid "%d Contact" msgid_plural "%d Contacts" msgstr[0] "" msgstr[1] "" -#: src/Content/Widget/ContactBlock.php:124 +#: src/Content/Widget/ContactBlock.php:125 msgid "View Contacts" msgstr "" @@ -3553,12 +3553,12 @@ msgid "More Trending Tags" msgstr "" #: src/Content/Widget/VCard.php:96 src/Model/Profile.php:372 -#: src/Module/Contact.php:610 src/Module/Profile/Profile.php:176 +#: src/Module/Contact.php:625 src/Module/Profile/Profile.php:176 msgid "XMPP:" msgstr "" #: src/Content/Widget/VCard.php:97 src/Model/Profile.php:373 -#: src/Module/Contact.php:612 src/Module/Profile/Profile.php:180 +#: src/Module/Contact.php:627 src/Module/Profile/Profile.php:180 msgid "Matrix:" msgstr "" @@ -4362,85 +4362,85 @@ msgstr "" msgid "Legacy module file not found: %s" msgstr "" -#: src/Model/Contact.php:1046 src/Model/Contact.php:1059 +#: src/Model/Contact.php:1072 src/Model/Contact.php:1085 msgid "UnFollow" msgstr "" -#: src/Model/Contact.php:1055 +#: src/Model/Contact.php:1081 msgid "Drop Contact" msgstr "" -#: src/Model/Contact.php:1065 src/Module/Admin/Users/Pending.php:107 +#: src/Model/Contact.php:1091 src/Module/Admin/Users/Pending.php:107 #: src/Module/Notifications/Introductions.php:111 #: src/Module/Notifications/Introductions.php:183 msgid "Approve" msgstr "" -#: src/Model/Contact.php:1470 +#: src/Model/Contact.php:1495 msgid "Organisation" msgstr "" -#: src/Model/Contact.php:1478 +#: src/Model/Contact.php:1503 msgid "Forum" msgstr "" -#: src/Model/Contact.php:2334 +#: src/Model/Contact.php:2359 msgid "Disallowed profile URL." msgstr "" -#: src/Model/Contact.php:2339 src/Module/Friendica.php:81 +#: src/Model/Contact.php:2364 src/Module/Friendica.php:81 msgid "Blocked domain" msgstr "" -#: src/Model/Contact.php:2344 +#: src/Model/Contact.php:2369 msgid "Connect URL missing." msgstr "" -#: src/Model/Contact.php:2353 +#: src/Model/Contact.php:2378 msgid "" "The contact could not be added. Please check the relevant network " "credentials in your Settings -> Social Networks page." msgstr "" -#: src/Model/Contact.php:2390 +#: src/Model/Contact.php:2415 msgid "The profile address specified does not provide adequate information." msgstr "" -#: src/Model/Contact.php:2392 +#: src/Model/Contact.php:2417 msgid "No compatible communication protocols or feeds were discovered." msgstr "" -#: src/Model/Contact.php:2395 +#: src/Model/Contact.php:2420 msgid "An author or name was not found." msgstr "" -#: src/Model/Contact.php:2398 +#: src/Model/Contact.php:2423 msgid "No browser URL could be matched to this address." msgstr "" -#: src/Model/Contact.php:2401 +#: src/Model/Contact.php:2426 msgid "" "Unable to match @-style Identity Address with a known protocol or email " "contact." msgstr "" -#: src/Model/Contact.php:2402 +#: src/Model/Contact.php:2427 msgid "Use mailto: in front of address to force email check." msgstr "" -#: src/Model/Contact.php:2408 +#: src/Model/Contact.php:2433 msgid "" "The profile address specified belongs to a network which has been disabled " "on this site." msgstr "" -#: src/Model/Contact.php:2413 +#: src/Model/Contact.php:2438 msgid "" "Limited profile. This person will be unable to receive direct/personal " "notifications from you." msgstr "" -#: src/Model/Contact.php:2472 +#: src/Model/Contact.php:2497 msgid "Unable to retrieve contact information." msgstr "" @@ -4557,33 +4557,33 @@ msgstr "" msgid "Edit groups" msgstr "" -#: src/Model/Item.php:1663 +#: src/Model/Item.php:1676 #, php-format msgid "Detected languages in this post:\\n%s" msgstr "" -#: src/Model/Item.php:2613 +#: src/Model/Item.php:2626 msgid "activity" msgstr "" -#: src/Model/Item.php:2615 +#: src/Model/Item.php:2628 msgid "comment" msgstr "" -#: src/Model/Item.php:2618 +#: src/Model/Item.php:2631 msgid "post" msgstr "" -#: src/Model/Item.php:2755 +#: src/Model/Item.php:2768 #, php-format msgid "Content warning: %s" msgstr "" -#: src/Model/Item.php:3104 +#: src/Model/Item.php:3117 msgid "bytes" msgstr "" -#: src/Model/Item.php:3133 src/Model/Item.php:3134 +#: src/Model/Item.php:3146 src/Model/Item.php:3147 msgid "View on separate page" msgstr "" @@ -4710,7 +4710,7 @@ msgstr "" msgid "Homepage:" msgstr "" -#: src/Model/Profile.php:371 src/Module/Contact.php:614 +#: src/Model/Profile.php:371 src/Module/Contact.php:629 #: src/Module/Notifications/Introductions.php:168 msgid "About:" msgstr "" @@ -4770,7 +4770,7 @@ msgstr "" msgid "Enter a valid existing folder" msgstr "" -#: src/Model/User.php:208 src/Model/User.php:1004 +#: src/Model/User.php:208 src/Model/User.php:1055 msgid "SERIOUS ERROR: Generation of security keys failed." msgstr "" @@ -4801,107 +4801,107 @@ msgid "" "The password can't contain accentuated letters, white spaces or colons (:)" msgstr "" -#: src/Model/User.php:884 +#: src/Model/User.php:935 msgid "Passwords do not match. Password unchanged." msgstr "" -#: src/Model/User.php:891 +#: src/Model/User.php:942 msgid "An invitation is required." msgstr "" -#: src/Model/User.php:895 +#: src/Model/User.php:946 msgid "Invitation could not be verified." msgstr "" -#: src/Model/User.php:903 +#: src/Model/User.php:954 msgid "Invalid OpenID url" msgstr "" -#: src/Model/User.php:916 src/Security/Authentication.php:223 +#: src/Model/User.php:967 src/Security/Authentication.php:223 msgid "" "We encountered a problem while logging in with the OpenID you provided. " "Please check the correct spelling of the ID." msgstr "" -#: src/Model/User.php:916 src/Security/Authentication.php:223 +#: src/Model/User.php:967 src/Security/Authentication.php:223 msgid "The error message was:" msgstr "" -#: src/Model/User.php:922 +#: src/Model/User.php:973 msgid "Please enter the required information." msgstr "" -#: src/Model/User.php:936 +#: src/Model/User.php:987 #, php-format msgid "" "system.username_min_length (%s) and system.username_max_length (%s) are " "excluding each other, swapping values." msgstr "" -#: src/Model/User.php:943 +#: src/Model/User.php:994 #, php-format msgid "Username should be at least %s character." msgid_plural "Username should be at least %s characters." msgstr[0] "" msgstr[1] "" -#: src/Model/User.php:947 +#: src/Model/User.php:998 #, php-format msgid "Username should be at most %s character." msgid_plural "Username should be at most %s characters." msgstr[0] "" msgstr[1] "" -#: src/Model/User.php:955 +#: src/Model/User.php:1006 msgid "That doesn't appear to be your full (First Last) name." msgstr "" -#: src/Model/User.php:960 +#: src/Model/User.php:1011 msgid "Your email domain is not among those allowed on this site." msgstr "" -#: src/Model/User.php:964 +#: src/Model/User.php:1015 msgid "Not a valid email address." msgstr "" -#: src/Model/User.php:967 +#: src/Model/User.php:1018 msgid "The nickname was blocked from registration by the nodes admin." msgstr "" -#: src/Model/User.php:971 src/Model/User.php:979 +#: src/Model/User.php:1022 src/Model/User.php:1030 msgid "Cannot use that email." msgstr "" -#: src/Model/User.php:986 +#: src/Model/User.php:1037 msgid "Your nickname can only contain a-z, 0-9 and _." msgstr "" -#: src/Model/User.php:994 src/Model/User.php:1051 +#: src/Model/User.php:1045 src/Model/User.php:1102 msgid "Nickname is already registered. Please choose another." msgstr "" -#: src/Model/User.php:1038 src/Model/User.php:1042 +#: src/Model/User.php:1089 src/Model/User.php:1093 msgid "An error occurred during registration. Please try again." msgstr "" -#: src/Model/User.php:1065 +#: src/Model/User.php:1116 msgid "An error occurred creating your default profile. Please try again." msgstr "" -#: src/Model/User.php:1072 +#: src/Model/User.php:1123 msgid "An error occurred creating your self contact. Please try again." msgstr "" -#: src/Model/User.php:1077 +#: src/Model/User.php:1128 msgid "Friends" msgstr "" -#: src/Model/User.php:1081 +#: src/Model/User.php:1132 msgid "" "An error occurred creating your default contact group. Please try again." msgstr "" -#: src/Model/User.php:1310 +#: src/Model/User.php:1361 #, php-format msgid "" "\n" @@ -4909,7 +4909,7 @@ msgid "" "\t\t\tthe administrator of %2$s has set up an account for you." msgstr "" -#: src/Model/User.php:1313 +#: src/Model/User.php:1364 #, php-format msgid "" "\n" @@ -4946,12 +4946,12 @@ msgid "" "\t\tThank you and welcome to %4$s." msgstr "" -#: src/Model/User.php:1346 src/Model/User.php:1453 +#: src/Model/User.php:1397 src/Model/User.php:1504 #, php-format msgid "Registration details for %s" msgstr "" -#: src/Model/User.php:1366 +#: src/Model/User.php:1417 #, php-format msgid "" "\n" @@ -4967,12 +4967,12 @@ msgid "" "\t\t" msgstr "" -#: src/Model/User.php:1385 +#: src/Model/User.php:1436 #, php-format msgid "Registration at %s" msgstr "" -#: src/Model/User.php:1409 +#: src/Model/User.php:1460 #, php-format msgid "" "\n" @@ -4981,7 +4981,7 @@ msgid "" "\t\t\t" msgstr "" -#: src/Model/User.php:1417 +#: src/Model/User.php:1468 #, php-format msgid "" "\n" @@ -5050,7 +5050,7 @@ msgstr "" #: src/Module/Admin/Item/Delete.php:65 src/Module/Admin/Logs/Settings.php:80 #: src/Module/Admin/Logs/View.php:84 src/Module/Admin/Queue.php:72 #: src/Module/Admin/Site.php:497 src/Module/Admin/Storage.php:131 -#: src/Module/Admin/Summary.php:232 src/Module/Admin/Themes/Details.php:90 +#: src/Module/Admin/Summary.php:233 src/Module/Admin/Themes/Details.php:90 #: src/Module/Admin/Themes/Index.php:111 src/Module/Admin/Tos.php:58 #: src/Module/Admin/Users/Active.php:136 src/Module/Admin/Users/Blocked.php:137 #: src/Module/Admin/Users/Create.php:61 src/Module/Admin/Users/Deleted.php:85 @@ -5111,8 +5111,8 @@ msgstr "" msgid "List of active accounts" msgstr "" -#: src/Module/Admin/BaseUsers.php:66 src/Module/Contact.php:763 -#: src/Module/Contact.php:823 +#: src/Module/Admin/BaseUsers.php:66 src/Module/Contact.php:778 +#: src/Module/Contact.php:838 msgid "Pending" msgstr "" @@ -5120,8 +5120,8 @@ msgstr "" msgid "List of pending registrations" msgstr "" -#: src/Module/Admin/BaseUsers.php:74 src/Module/Contact.php:771 -#: src/Module/Contact.php:824 +#: src/Module/Admin/BaseUsers.php:74 src/Module/Contact.php:786 +#: src/Module/Contact.php:839 msgid "Blocked" msgstr "" @@ -5178,8 +5178,8 @@ msgstr "" #: src/Module/Admin/Blocklist/Contact.php:85 #: src/Module/Admin/Users/Blocked.php:142 src/Module/Admin/Users/Index.php:156 -#: src/Module/Contact.php:587 src/Module/Contact.php:847 -#: src/Module/Contact.php:1115 +#: src/Module/Contact.php:602 src/Module/Contact.php:863 +#: src/Module/Contact.php:1133 msgid "Unblock" msgstr "" @@ -5696,7 +5696,7 @@ msgstr "" msgid "Republish users to directory" msgstr "" -#: src/Module/Admin/Site.php:502 src/Module/Register.php:139 +#: src/Module/Admin/Site.php:502 src/Module/Register.php:141 msgid "Registration" msgstr "" @@ -6464,7 +6464,7 @@ msgid "" "received." msgstr "" -#: src/Module/Admin/Site.php:609 src/Module/Contact.php:516 +#: src/Module/Admin/Site.php:609 src/Module/Contact.php:531 #: src/Module/Settings/TwoFactor/Index.php:118 msgid "Disabled" msgstr "" @@ -6553,12 +6553,12 @@ msgstr "" msgid "Database (legacy)" msgstr "" -#: src/Module/Admin/Summary.php:53 +#: src/Module/Admin/Summary.php:54 #, php-format msgid "Template engine (%s) error: %s" msgstr "" -#: src/Module/Admin/Summary.php:57 +#: src/Module/Admin/Summary.php:58 #, php-format msgid "" "Your DB still runs with MyISAM tables. You should change the engine type to " @@ -6569,7 +6569,7 @@ msgid "" "automatic conversion.
" msgstr "" -#: src/Module/Admin/Summary.php:62 +#: src/Module/Admin/Summary.php:63 #, php-format msgid "" "Your DB still runs with InnoDB tables in the Antelope file format. You " @@ -6580,7 +6580,7 @@ msgid "" "installation for an automatic conversion.
" msgstr "" -#: src/Module/Admin/Summary.php:72 +#: src/Module/Admin/Summary.php:73 #, php-format msgid "" "Your table_definition_cache is too low (%d). This can lead to the database " @@ -6588,39 +6588,39 @@ msgid "" "to %d. See here for more information.
" msgstr "" -#: src/Module/Admin/Summary.php:82 +#: src/Module/Admin/Summary.php:83 #, php-format msgid "" "There is a new version of Friendica available for download. Your current " "version is %1$s, upstream version is %2$s" msgstr "" -#: src/Module/Admin/Summary.php:91 +#: src/Module/Admin/Summary.php:92 msgid "" "The database update failed. Please run \"php bin/console.php dbstructure " "update\" from the command line and have a look at the errors that might " "appear." msgstr "" -#: src/Module/Admin/Summary.php:95 +#: src/Module/Admin/Summary.php:96 msgid "" "The last update failed. Please run \"php bin/console.php dbstructure update" "\" from the command line and have a look at the errors that might appear. " "(Some of the errors are possibly inside the logfile.)" msgstr "" -#: src/Module/Admin/Summary.php:100 +#: src/Module/Admin/Summary.php:101 msgid "The worker was never executed. Please check your database structure!" msgstr "" -#: src/Module/Admin/Summary.php:102 +#: src/Module/Admin/Summary.php:103 #, php-format msgid "" "The last worker execution was on %s UTC. This is older than one hour. Please " "check your crontab settings." msgstr "" -#: src/Module/Admin/Summary.php:107 +#: src/Module/Admin/Summary.php:108 #, php-format msgid "" "Friendica's configuration now is stored in config/local.config.php, please " @@ -6629,7 +6629,7 @@ msgid "" "with the transition." msgstr "" -#: src/Module/Admin/Summary.php:111 +#: src/Module/Admin/Summary.php:112 #, php-format msgid "" "Friendica's configuration now is stored in config/local.config.php, please " @@ -6638,7 +6638,7 @@ msgid "" "with the transition." msgstr "" -#: src/Module/Admin/Summary.php:117 +#: src/Module/Admin/Summary.php:118 #, php-format msgid "" "%s is not reachable on your system. This is a severe " @@ -6646,86 +6646,86 @@ msgid "" "href=\"%s\">the installation page for help." msgstr "" -#: src/Module/Admin/Summary.php:135 +#: src/Module/Admin/Summary.php:136 #, php-format msgid "The logfile '%s' is not usable. No logging possible (error: '%s')" msgstr "" -#: src/Module/Admin/Summary.php:149 +#: src/Module/Admin/Summary.php:150 #, php-format msgid "The debug logfile '%s' is not usable. No logging possible (error: '%s')" msgstr "" -#: src/Module/Admin/Summary.php:165 +#: src/Module/Admin/Summary.php:166 #, php-format msgid "" "Friendica's system.basepath was updated from '%s' to '%s'. Please remove the " "system.basepath from your db to avoid differences." msgstr "" -#: src/Module/Admin/Summary.php:173 +#: src/Module/Admin/Summary.php:174 #, php-format msgid "" "Friendica's current system.basepath '%s' is wrong and the config file '%s' " "isn't used." msgstr "" -#: src/Module/Admin/Summary.php:181 +#: src/Module/Admin/Summary.php:182 #, php-format msgid "" "Friendica's current system.basepath '%s' is not equal to the config file " "'%s'. Please fix your configuration." msgstr "" -#: src/Module/Admin/Summary.php:188 +#: src/Module/Admin/Summary.php:189 msgid "Normal Account" msgstr "" -#: src/Module/Admin/Summary.php:189 +#: src/Module/Admin/Summary.php:190 msgid "Automatic Follower Account" msgstr "" -#: src/Module/Admin/Summary.php:190 +#: src/Module/Admin/Summary.php:191 msgid "Public Forum Account" msgstr "" -#: src/Module/Admin/Summary.php:191 +#: src/Module/Admin/Summary.php:192 msgid "Automatic Friend Account" msgstr "" -#: src/Module/Admin/Summary.php:192 +#: src/Module/Admin/Summary.php:193 msgid "Blog Account" msgstr "" -#: src/Module/Admin/Summary.php:193 +#: src/Module/Admin/Summary.php:194 msgid "Private Forum Account" msgstr "" -#: src/Module/Admin/Summary.php:213 +#: src/Module/Admin/Summary.php:214 msgid "Message queues" msgstr "" -#: src/Module/Admin/Summary.php:219 +#: src/Module/Admin/Summary.php:220 msgid "Server Settings" msgstr "" -#: src/Module/Admin/Summary.php:233 src/Repository/ProfileField.php:285 +#: src/Module/Admin/Summary.php:234 src/Repository/ProfileField.php:285 msgid "Summary" msgstr "" -#: src/Module/Admin/Summary.php:235 +#: src/Module/Admin/Summary.php:236 msgid "Registered users" msgstr "" -#: src/Module/Admin/Summary.php:237 +#: src/Module/Admin/Summary.php:238 msgid "Pending registrations" msgstr "" -#: src/Module/Admin/Summary.php:238 +#: src/Module/Admin/Summary.php:239 msgid "Version" msgstr "" -#: src/Module/Admin/Summary.php:242 +#: src/Module/Admin/Summary.php:243 msgid "Active addons" msgstr "" @@ -7035,8 +7035,8 @@ msgstr "" msgid "Posts from %s can't be unshared" msgstr "" -#: src/Module/Api/Twitter/ContactEndpoint.php:63 src/Module/Contact.php:361 -#: src/Module/Contact.php:366 +#: src/Module/Api/Twitter/ContactEndpoint.php:63 src/Module/Contact.php:371 +#: src/Module/Contact.php:386 msgid "Contact not found" msgstr "" @@ -7157,7 +7157,7 @@ msgstr "" msgid "Too Many Requests" msgstr "" -#: src/Module/BaseProfile.php:51 src/Module/Contact.php:902 +#: src/Module/BaseProfile.php:51 src/Module/Contact.php:918 msgid "Profile Details" msgstr "" @@ -7224,365 +7224,365 @@ msgstr "" msgid "The post was created" msgstr "" -#: src/Module/Contact.php:93 +#: src/Module/Contact.php:97 #, php-format msgid "%d contact edited." msgid_plural "%d contacts edited." msgstr[0] "" msgstr[1] "" -#: src/Module/Contact.php:118 +#: src/Module/Contact.php:122 msgid "Could not access contact record." msgstr "" -#: src/Module/Contact.php:154 +#: src/Module/Contact.php:158 msgid "Failed to update contact record." msgstr "" -#: src/Module/Contact.php:383 +#: src/Module/Contact.php:403 msgid "You can't block yourself" msgstr "" -#: src/Module/Contact.php:389 +#: src/Module/Contact.php:409 msgid "Contact has been blocked" msgstr "" -#: src/Module/Contact.php:389 +#: src/Module/Contact.php:409 msgid "Contact has been unblocked" msgstr "" -#: src/Module/Contact.php:397 +#: src/Module/Contact.php:417 msgid "You can't ignore yourself" msgstr "" -#: src/Module/Contact.php:403 +#: src/Module/Contact.php:423 msgid "Contact has been ignored" msgstr "" -#: src/Module/Contact.php:403 +#: src/Module/Contact.php:423 msgid "Contact has been unignored" msgstr "" -#: src/Module/Contact.php:415 +#: src/Module/Contact.php:435 msgid "Drop contact" msgstr "" -#: src/Module/Contact.php:418 src/Module/Contact.php:843 +#: src/Module/Contact.php:438 src/Module/Contact.php:859 msgid "Do you really want to delete this contact?" msgstr "" -#: src/Module/Contact.php:419 src/Module/Notifications/Introductions.php:123 -#: src/Module/OAuth/Acknowledge.php:47 src/Module/Register.php:115 +#: src/Module/Contact.php:439 src/Module/Notifications/Introductions.php:123 +#: src/Module/OAuth/Acknowledge.php:47 src/Module/Register.php:117 msgid "Yes" msgstr "" -#: src/Module/Contact.php:431 +#: src/Module/Contact.php:452 msgid "Contact has been removed." msgstr "" -#: src/Module/Contact.php:458 +#: src/Module/Contact.php:473 #, php-format msgid "You are mutual friends with %s" msgstr "" -#: src/Module/Contact.php:462 +#: src/Module/Contact.php:477 #, php-format msgid "You are sharing with %s" msgstr "" -#: src/Module/Contact.php:466 +#: src/Module/Contact.php:481 #, php-format msgid "%s is sharing with you" msgstr "" -#: src/Module/Contact.php:490 +#: src/Module/Contact.php:505 msgid "Private communications are not available for this contact." msgstr "" -#: src/Module/Contact.php:492 +#: src/Module/Contact.php:507 msgid "Never" msgstr "" -#: src/Module/Contact.php:495 +#: src/Module/Contact.php:510 msgid "(Update was not successful)" msgstr "" -#: src/Module/Contact.php:495 +#: src/Module/Contact.php:510 msgid "(Update was successful)" msgstr "" -#: src/Module/Contact.php:497 src/Module/Contact.php:1086 +#: src/Module/Contact.php:512 src/Module/Contact.php:1104 msgid "Suggest friends" msgstr "" -#: src/Module/Contact.php:501 +#: src/Module/Contact.php:516 #, php-format msgid "Network type: %s" msgstr "" -#: src/Module/Contact.php:506 +#: src/Module/Contact.php:521 msgid "Communications lost with this contact!" msgstr "" -#: src/Module/Contact.php:512 +#: src/Module/Contact.php:527 msgid "Fetch further information for feeds" msgstr "" -#: src/Module/Contact.php:514 +#: src/Module/Contact.php:529 msgid "" "Fetch information like preview pictures, title and teaser from the feed " "item. You can activate this if the feed doesn't contain much text. Keywords " "are taken from the meta header in the feed item and are posted as hash tags." msgstr "" -#: src/Module/Contact.php:517 +#: src/Module/Contact.php:532 msgid "Fetch information" msgstr "" -#: src/Module/Contact.php:518 +#: src/Module/Contact.php:533 msgid "Fetch keywords" msgstr "" -#: src/Module/Contact.php:519 +#: src/Module/Contact.php:534 msgid "Fetch information and keywords" msgstr "" -#: src/Module/Contact.php:531 src/Module/Contact.php:535 -#: src/Module/Contact.php:538 src/Module/Contact.php:542 +#: src/Module/Contact.php:546 src/Module/Contact.php:550 +#: src/Module/Contact.php:553 src/Module/Contact.php:557 msgid "No mirroring" msgstr "" -#: src/Module/Contact.php:532 +#: src/Module/Contact.php:547 msgid "Mirror as forwarded posting" msgstr "" -#: src/Module/Contact.php:533 src/Module/Contact.php:539 -#: src/Module/Contact.php:543 +#: src/Module/Contact.php:548 src/Module/Contact.php:554 +#: src/Module/Contact.php:558 msgid "Mirror as my own posting" msgstr "" -#: src/Module/Contact.php:536 src/Module/Contact.php:540 +#: src/Module/Contact.php:551 src/Module/Contact.php:555 msgid "Native reshare" msgstr "" -#: src/Module/Contact.php:555 +#: src/Module/Contact.php:570 msgid "Contact Information / Notes" msgstr "" -#: src/Module/Contact.php:556 +#: src/Module/Contact.php:571 msgid "Contact Settings" msgstr "" -#: src/Module/Contact.php:564 +#: src/Module/Contact.php:579 msgid "Contact" msgstr "" -#: src/Module/Contact.php:568 +#: src/Module/Contact.php:583 msgid "Their personal note" msgstr "" -#: src/Module/Contact.php:570 +#: src/Module/Contact.php:585 msgid "Edit contact notes" msgstr "" -#: src/Module/Contact.php:573 src/Module/Contact.php:1054 +#: src/Module/Contact.php:588 src/Module/Contact.php:1070 #, php-format msgid "Visit %s's profile [%s]" msgstr "" -#: src/Module/Contact.php:574 +#: src/Module/Contact.php:589 msgid "Block/Unblock contact" msgstr "" -#: src/Module/Contact.php:575 +#: src/Module/Contact.php:590 msgid "Ignore contact" msgstr "" -#: src/Module/Contact.php:576 +#: src/Module/Contact.php:591 msgid "View conversations" msgstr "" -#: src/Module/Contact.php:581 +#: src/Module/Contact.php:596 msgid "Last update:" msgstr "" -#: src/Module/Contact.php:583 +#: src/Module/Contact.php:598 msgid "Update public posts" msgstr "" -#: src/Module/Contact.php:585 src/Module/Contact.php:1096 +#: src/Module/Contact.php:600 src/Module/Contact.php:1114 msgid "Update now" msgstr "" -#: src/Module/Contact.php:588 src/Module/Contact.php:848 -#: src/Module/Contact.php:1123 +#: src/Module/Contact.php:603 src/Module/Contact.php:864 +#: src/Module/Contact.php:1141 msgid "Unignore" msgstr "" -#: src/Module/Contact.php:592 +#: src/Module/Contact.php:607 msgid "Currently blocked" msgstr "" -#: src/Module/Contact.php:593 +#: src/Module/Contact.php:608 msgid "Currently ignored" msgstr "" -#: src/Module/Contact.php:594 +#: src/Module/Contact.php:609 msgid "Currently archived" msgstr "" -#: src/Module/Contact.php:595 +#: src/Module/Contact.php:610 msgid "Awaiting connection acknowledge" msgstr "" -#: src/Module/Contact.php:596 src/Module/Notifications/Introductions.php:171 +#: src/Module/Contact.php:611 src/Module/Notifications/Introductions.php:171 msgid "Hide this contact from others" msgstr "" -#: src/Module/Contact.php:596 +#: src/Module/Contact.php:611 msgid "" "Replies/likes to your public posts may still be visible" msgstr "" -#: src/Module/Contact.php:597 +#: src/Module/Contact.php:612 msgid "Notification for new posts" msgstr "" -#: src/Module/Contact.php:597 +#: src/Module/Contact.php:612 msgid "Send a notification of every new post of this contact" msgstr "" -#: src/Module/Contact.php:599 +#: src/Module/Contact.php:614 msgid "Keyword Deny List" msgstr "" -#: src/Module/Contact.php:599 +#: src/Module/Contact.php:614 msgid "" "Comma separated list of keywords that should not be converted to hashtags, " "when \"Fetch information and keywords\" is selected" msgstr "" -#: src/Module/Contact.php:617 src/Module/Settings/TwoFactor/Index.php:132 +#: src/Module/Contact.php:632 src/Module/Settings/TwoFactor/Index.php:132 msgid "Actions" msgstr "" -#: src/Module/Contact.php:624 +#: src/Module/Contact.php:639 msgid "Mirror postings from this contact" msgstr "" -#: src/Module/Contact.php:626 +#: src/Module/Contact.php:641 msgid "" "Mark this contact as remote_self, this will cause friendica to repost new " "entries from this contact." msgstr "" -#: src/Module/Contact.php:758 +#: src/Module/Contact.php:773 msgid "Show all contacts" msgstr "" -#: src/Module/Contact.php:766 +#: src/Module/Contact.php:781 msgid "Only show pending contacts" msgstr "" -#: src/Module/Contact.php:774 +#: src/Module/Contact.php:789 msgid "Only show blocked contacts" msgstr "" -#: src/Module/Contact.php:779 src/Module/Contact.php:826 -#: src/Object/Post.php:308 +#: src/Module/Contact.php:794 src/Module/Contact.php:841 +#: src/Object/Post.php:309 msgid "Ignored" msgstr "" -#: src/Module/Contact.php:782 +#: src/Module/Contact.php:797 msgid "Only show ignored contacts" msgstr "" -#: src/Module/Contact.php:787 src/Module/Contact.php:827 +#: src/Module/Contact.php:802 src/Module/Contact.php:842 msgid "Archived" msgstr "" -#: src/Module/Contact.php:790 +#: src/Module/Contact.php:805 msgid "Only show archived contacts" msgstr "" -#: src/Module/Contact.php:795 src/Module/Contact.php:825 +#: src/Module/Contact.php:810 src/Module/Contact.php:840 msgid "Hidden" msgstr "" -#: src/Module/Contact.php:798 +#: src/Module/Contact.php:813 msgid "Only show hidden contacts" msgstr "" -#: src/Module/Contact.php:806 +#: src/Module/Contact.php:821 msgid "Organize your contact groups" msgstr "" -#: src/Module/Contact.php:838 +#: src/Module/Contact.php:853 msgid "Search your contacts" msgstr "" -#: src/Module/Contact.php:839 src/Module/Search/Index.php:194 +#: src/Module/Contact.php:854 src/Module/Search/Index.php:194 #, php-format msgid "Results for: %s" msgstr "" -#: src/Module/Contact.php:846 +#: src/Module/Contact.php:862 msgid "Update" msgstr "" -#: src/Module/Contact.php:851 +#: src/Module/Contact.php:867 msgid "Batch Actions" msgstr "" -#: src/Module/Contact.php:886 +#: src/Module/Contact.php:902 msgid "Conversations started by this contact" msgstr "" -#: src/Module/Contact.php:891 +#: src/Module/Contact.php:907 msgid "Posts and Comments" msgstr "" -#: src/Module/Contact.php:909 +#: src/Module/Contact.php:925 msgid "View all known contacts" msgstr "" -#: src/Module/Contact.php:919 +#: src/Module/Contact.php:935 msgid "Advanced Contact Settings" msgstr "" -#: src/Module/Contact.php:1013 +#: src/Module/Contact.php:1029 msgid "Mutual Friendship" msgstr "" -#: src/Module/Contact.php:1017 +#: src/Module/Contact.php:1033 msgid "is a fan of yours" msgstr "" -#: src/Module/Contact.php:1021 +#: src/Module/Contact.php:1037 msgid "you are a fan of" msgstr "" -#: src/Module/Contact.php:1039 +#: src/Module/Contact.php:1055 msgid "Pending outgoing contact request" msgstr "" -#: src/Module/Contact.php:1041 +#: src/Module/Contact.php:1057 msgid "Pending incoming contact request" msgstr "" -#: src/Module/Contact.php:1106 +#: src/Module/Contact.php:1124 msgid "Refetch contact data" msgstr "" -#: src/Module/Contact.php:1117 +#: src/Module/Contact.php:1135 msgid "Toggle Blocked status" msgstr "" -#: src/Module/Contact.php:1125 +#: src/Module/Contact.php:1143 msgid "Toggle Ignored status" msgstr "" -#: src/Module/Contact.php:1134 +#: src/Module/Contact.php:1152 msgid "Delete contact" msgstr "" @@ -7806,7 +7806,7 @@ msgstr "" msgid "Posts that mention or involve you" msgstr "" -#: src/Module/Conversation/Network.php:258 src/Object/Post.php:320 +#: src/Module/Conversation/Network.php:258 src/Object/Post.php:321 msgid "Starred" msgstr "" @@ -8083,21 +8083,21 @@ msgstr "" msgid "Lookup address:" msgstr "" -#: src/Module/Delegation.php:148 +#: src/Module/Delegation.php:142 msgid "Switch between your accounts" msgstr "" -#: src/Module/Delegation.php:149 +#: src/Module/Delegation.php:143 msgid "Manage your accounts" msgstr "" -#: src/Module/Delegation.php:150 +#: src/Module/Delegation.php:144 msgid "" "Toggle between different identities or community/group pages which share " "your account details or which you have been granted \"manage\" permissions" msgstr "" -#: src/Module/Delegation.php:151 +#: src/Module/Delegation.php:145 msgid "Select an identity to manage: " msgstr "" @@ -8629,7 +8629,7 @@ msgid "Claims to be known to you: " msgstr "" #: src/Module/Notifications/Introductions.php:123 -#: src/Module/OAuth/Acknowledge.php:48 src/Module/Register.php:116 +#: src/Module/OAuth/Acknowledge.php:48 src/Module/Register.php:118 msgid "No" msgstr "" @@ -8845,137 +8845,137 @@ msgstr "" msgid "Remove post" msgstr "" -#: src/Module/Register.php:69 +#: src/Module/Register.php:71 msgid "Only parent users can create additional accounts." msgstr "" -#: src/Module/Register.php:101 +#: src/Module/Register.php:103 msgid "" "You may (optionally) fill in this form via OpenID by supplying your OpenID " "and clicking \"Register\"." msgstr "" -#: src/Module/Register.php:102 +#: src/Module/Register.php:104 msgid "" "If you are not familiar with OpenID, please leave that field blank and fill " "in the rest of the items." msgstr "" -#: src/Module/Register.php:103 +#: src/Module/Register.php:105 msgid "Your OpenID (optional): " msgstr "" -#: src/Module/Register.php:112 +#: src/Module/Register.php:114 msgid "Include your profile in member directory?" msgstr "" -#: src/Module/Register.php:135 +#: src/Module/Register.php:137 msgid "Note for the admin" msgstr "" -#: src/Module/Register.php:135 +#: src/Module/Register.php:137 msgid "Leave a message for the admin, why you want to join this node" msgstr "" -#: src/Module/Register.php:136 +#: src/Module/Register.php:138 msgid "Membership on this site is by invitation only." msgstr "" -#: src/Module/Register.php:137 +#: src/Module/Register.php:139 msgid "Your invitation code: " msgstr "" -#: src/Module/Register.php:145 +#: src/Module/Register.php:147 msgid "Your Full Name (e.g. Joe Smith, real or real-looking): " msgstr "" -#: src/Module/Register.php:146 +#: src/Module/Register.php:148 msgid "" "Your Email Address: (Initial information will be send there, so this has to " "be an existing address.)" msgstr "" -#: src/Module/Register.php:147 +#: src/Module/Register.php:149 msgid "Please repeat your e-mail address:" msgstr "" -#: src/Module/Register.php:149 +#: src/Module/Register.php:151 msgid "Leave empty for an auto generated password." msgstr "" -#: src/Module/Register.php:151 +#: src/Module/Register.php:153 #, php-format msgid "" "Choose a profile nickname. This must begin with a text character. Your " "profile address on this site will then be \"nickname@%s\"." msgstr "" -#: src/Module/Register.php:152 +#: src/Module/Register.php:154 msgid "Choose a nickname: " msgstr "" -#: src/Module/Register.php:161 +#: src/Module/Register.php:163 msgid "Import your profile to this friendica instance" msgstr "" -#: src/Module/Register.php:168 +#: src/Module/Register.php:170 msgid "Note: This node explicitly contains adult content" msgstr "" -#: src/Module/Register.php:170 src/Module/Settings/Delegation.php:155 +#: src/Module/Register.php:172 src/Module/Settings/Delegation.php:155 msgid "Parent Password:" msgstr "" -#: src/Module/Register.php:170 src/Module/Settings/Delegation.php:155 +#: src/Module/Register.php:172 src/Module/Settings/Delegation.php:155 msgid "" "Please enter the password of the parent account to legitimize your request." msgstr "" -#: src/Module/Register.php:199 +#: src/Module/Register.php:201 msgid "Password doesn't match." msgstr "" -#: src/Module/Register.php:205 +#: src/Module/Register.php:207 msgid "Please enter your password." msgstr "" -#: src/Module/Register.php:247 +#: src/Module/Register.php:249 msgid "You have entered too much information." msgstr "" -#: src/Module/Register.php:270 +#: src/Module/Register.php:272 msgid "Please enter the identical mail address in the second field." msgstr "" -#: src/Module/Register.php:297 +#: src/Module/Register.php:299 msgid "The additional account was created." msgstr "" -#: src/Module/Register.php:322 +#: src/Module/Register.php:324 msgid "" "Registration successful. Please check your email for further instructions." msgstr "" -#: src/Module/Register.php:326 +#: src/Module/Register.php:328 #, php-format msgid "" "Failed to send email message. Here your accout details:
login: %s
" "password: %s

You can change your password after login." msgstr "" -#: src/Module/Register.php:332 +#: src/Module/Register.php:334 msgid "Registration successful." msgstr "" -#: src/Module/Register.php:337 src/Module/Register.php:344 +#: src/Module/Register.php:339 src/Module/Register.php:346 msgid "Your registration can not be processed." msgstr "" -#: src/Module/Register.php:343 +#: src/Module/Register.php:345 msgid "You have to leave a request note for the admin." msgstr "" -#: src/Module/Register.php:389 +#: src/Module/Register.php:391 msgid "Your registration is pending approval by the site owner." msgstr "" @@ -10176,197 +10176,197 @@ msgstr "" msgid "%s posted an update." msgstr "" -#: src/Object/Post.php:148 +#: src/Object/Post.php:149 msgid "This entry was edited" msgstr "" -#: src/Object/Post.php:176 +#: src/Object/Post.php:177 msgid "Private Message" msgstr "" -#: src/Object/Post.php:192 src/Object/Post.php:194 +#: src/Object/Post.php:193 src/Object/Post.php:195 msgid "Edit" msgstr "" -#: src/Object/Post.php:214 +#: src/Object/Post.php:215 msgid "Pinned item" msgstr "" -#: src/Object/Post.php:218 +#: src/Object/Post.php:219 msgid "Delete globally" msgstr "" -#: src/Object/Post.php:218 +#: src/Object/Post.php:219 msgid "Remove locally" msgstr "" -#: src/Object/Post.php:234 +#: src/Object/Post.php:235 #, php-format msgid "Block %s" msgstr "" -#: src/Object/Post.php:239 +#: src/Object/Post.php:240 msgid "Save to folder" msgstr "" -#: src/Object/Post.php:273 +#: src/Object/Post.php:274 msgid "I will attend" msgstr "" -#: src/Object/Post.php:273 +#: src/Object/Post.php:274 msgid "I will not attend" msgstr "" -#: src/Object/Post.php:273 +#: src/Object/Post.php:274 msgid "I might attend" msgstr "" -#: src/Object/Post.php:303 +#: src/Object/Post.php:304 msgid "Ignore thread" msgstr "" -#: src/Object/Post.php:304 +#: src/Object/Post.php:305 msgid "Unignore thread" msgstr "" -#: src/Object/Post.php:305 +#: src/Object/Post.php:306 msgid "Toggle ignore status" msgstr "" -#: src/Object/Post.php:315 +#: src/Object/Post.php:316 msgid "Add star" msgstr "" -#: src/Object/Post.php:316 +#: src/Object/Post.php:317 msgid "Remove star" msgstr "" -#: src/Object/Post.php:317 +#: src/Object/Post.php:318 msgid "Toggle star status" msgstr "" -#: src/Object/Post.php:328 +#: src/Object/Post.php:329 msgid "Pin" msgstr "" -#: src/Object/Post.php:329 +#: src/Object/Post.php:330 msgid "Unpin" msgstr "" -#: src/Object/Post.php:330 +#: src/Object/Post.php:331 msgid "Toggle pin status" msgstr "" -#: src/Object/Post.php:333 +#: src/Object/Post.php:334 msgid "Pinned" msgstr "" -#: src/Object/Post.php:338 +#: src/Object/Post.php:339 msgid "Add tag" msgstr "" -#: src/Object/Post.php:351 +#: src/Object/Post.php:352 msgid "Quote share this" msgstr "" -#: src/Object/Post.php:351 +#: src/Object/Post.php:352 msgid "Quote Share" msgstr "" -#: src/Object/Post.php:354 +#: src/Object/Post.php:355 msgid "Reshare this" msgstr "" -#: src/Object/Post.php:354 +#: src/Object/Post.php:355 msgid "Reshare" msgstr "" -#: src/Object/Post.php:355 +#: src/Object/Post.php:356 msgid "Cancel your Reshare" msgstr "" -#: src/Object/Post.php:355 +#: src/Object/Post.php:356 msgid "Unshare" msgstr "" -#: src/Object/Post.php:400 +#: src/Object/Post.php:401 #, php-format msgid "%s (Received %s)" msgstr "" -#: src/Object/Post.php:405 +#: src/Object/Post.php:406 msgid "Comment this item on your system" msgstr "" -#: src/Object/Post.php:405 +#: src/Object/Post.php:406 msgid "Remote comment" msgstr "" -#: src/Object/Post.php:421 +#: src/Object/Post.php:422 msgid "Pushed" msgstr "" -#: src/Object/Post.php:421 +#: src/Object/Post.php:422 msgid "Pulled" msgstr "" -#: src/Object/Post.php:455 +#: src/Object/Post.php:456 msgid "to" msgstr "" -#: src/Object/Post.php:456 +#: src/Object/Post.php:457 msgid "via" msgstr "" -#: src/Object/Post.php:457 +#: src/Object/Post.php:458 msgid "Wall-to-Wall" msgstr "" -#: src/Object/Post.php:458 +#: src/Object/Post.php:459 msgid "via Wall-To-Wall:" msgstr "" -#: src/Object/Post.php:496 +#: src/Object/Post.php:497 #, php-format msgid "Reply to %s" msgstr "" -#: src/Object/Post.php:499 +#: src/Object/Post.php:500 msgid "More" msgstr "" -#: src/Object/Post.php:517 +#: src/Object/Post.php:518 msgid "Notifier task is pending" msgstr "" -#: src/Object/Post.php:518 +#: src/Object/Post.php:519 msgid "Delivery to remote servers is pending" msgstr "" -#: src/Object/Post.php:519 +#: src/Object/Post.php:520 msgid "Delivery to remote servers is underway" msgstr "" -#: src/Object/Post.php:520 +#: src/Object/Post.php:521 msgid "Delivery to remote servers is mostly done" msgstr "" -#: src/Object/Post.php:521 +#: src/Object/Post.php:522 msgid "Delivery to remote servers is done" msgstr "" -#: src/Object/Post.php:541 +#: src/Object/Post.php:542 #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "" msgstr[1] "" -#: src/Object/Post.php:542 +#: src/Object/Post.php:543 msgid "Show more" msgstr "" -#: src/Object/Post.php:543 +#: src/Object/Post.php:544 msgid "Show fewer" msgstr "" From 30c3740f67b84121cc29af7bf99e8091dd5d46b6 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Fri, 1 Oct 2021 17:19:16 +0200 Subject: [PATCH 16/20] Fix `run_xgettext.sh` code and make it work on osx - run script thru `shellcheck` and fix code - replace `readlink -f` with a function which works on osx too - set flags to stop on errors --- bin/run_xgettext.sh | 57 ++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/bin/run_xgettext.sh b/bin/run_xgettext.sh index 5392e0e15..933682da5 100755 --- a/bin/run_xgettext.sh +++ b/bin/run_xgettext.sh @@ -1,9 +1,20 @@ #!/bin/bash -FULLPATH=$(dirname $(readlink -f "$0")) +set -eo pipefail -if [ "$1" == "--help" -o "$1" == "-h" ] +function resolve { + if [ "$(uname)" == "Darwin" ] + then + realpath "$1" + else + readlink -f "$1" + fi +} + +FULLPATH=$(dirname "$(resolve "$0")") + +if [ "$1" == "--help" ] || [ "$1" == "-h" ] then - echo "$(basename $(readlink -f "$0")) [options]" + echo "$(basename "$(resolve "$0")") [options]" echo echo "-a | --addon extract strings from addon 'name'" echo "-s | --single single addon mode: extract string from current folder" @@ -12,15 +23,15 @@ fi MODE='default' ADDONNAME= -if [ "$1" == "--addon" -o "$1" == "-a" ] +if [ "$1" == "--addon" ] || [ "$1" == "-a" ] then MODE='addon' - if [ -z $2 ]; then echo -e "ERROR: missing addon name\n\nrun_xgettext.sh -a "; exit 1; fi + if [ -z "$2" ]; then echo -e "ERROR: missing addon name\n\nrun_xgettext.sh -a "; exit 1; fi ADDONNAME=$2 if [ ! -d "$FULLPATH/../addon/$ADDONNAME" ]; then echo "ERROR: addon '$ADDONNAME' not found"; exit 2; fi fi -if [ "$1" == "--single" -o "$1" == "-s" ] +if [ "$1" == "--single" ] || [ "$1" == "-s" ] then MODE='single' fi @@ -36,7 +47,7 @@ case "$MODE" in ;; 'single') FULLPATH=$PWD - ADDONNAME=$(basename $FULLPATH) + ADDONNAME=$(basename "$FULLPATH") mkdir -p "$FULLPATH/lang/C" OUTFILE="$FULLPATH/lang/C/messages.po" FINDSTARTDIR="." @@ -61,6 +72,7 @@ KEYWORDS="-k -kt -ktt:1,2" echo "Extract strings to $OUTFILE.." rm "$OUTFILE"; touch "$OUTFILE" +# shellcheck disable=SC2086 # FINDOPTS is meant to be splitted find_result=$(find "$FINDSTARTDIR" $FINDOPTS -name "*.php" -type f | LC_ALL=C sort --stable) total_files=$(wc -l <<< "${find_result}") @@ -74,38 +86,39 @@ do # On Windows, find still outputs the name of pruned folders if [ ! -d "$file" ] then + # shellcheck disable=SC2086 # KEYWORDS is meant to be splitted xgettext $KEYWORDS -j -o "$OUTFILE" --from-code=UTF-8 "$file" || exit 1 - sed -i "s/CHARSET/UTF-8/g" "$OUTFILE" + sed -i.bkp "s/CHARSET/UTF-8/g" "$OUTFILE" fi done echo -ne "\n" echo "Interpolate metadata.." -sed -i "s/^\"Plural-Forms.*$//g" "$OUTFILE" +sed -i.bkp "s/^\"Plural-Forms.*$//g" "$OUTFILE" case "$MODE" in 'addon'|'single') - sed -i "s/SOME DESCRIPTIVE TITLE./ADDON $ADDONNAME/g" "$OUTFILE" - sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER//g" "$OUTFILE" - sed -i "s/FIRST AUTHOR , YEAR.//g" "$OUTFILE" - sed -i "s/PACKAGE VERSION//g" "$OUTFILE" - sed -i "s/PACKAGE/Friendica $ADDONNAME addon/g" "$OUTFILE" + sed -i.bkp "s/SOME DESCRIPTIVE TITLE./ADDON $ADDONNAME/g" "$OUTFILE" + sed -i.bkp "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER//g" "$OUTFILE" + sed -i.bkp "s/FIRST AUTHOR , YEAR.//g" "$OUTFILE" + sed -i.bkp "s/PACKAGE VERSION//g" "$OUTFILE" + sed -i.bkp "s/PACKAGE/Friendica $ADDONNAME addon/g" "$OUTFILE" ;; 'default') - sed -i "s/SOME DESCRIPTIVE TITLE./FRIENDICA Distributed Social Network/g" "$OUTFILE" - sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/2010-$(date +%Y), the Friendica project/g" "$OUTFILE" - sed -i "s/FIRST AUTHOR , YEAR./Mike Macgirvin, 2010/g" "$OUTFILE" - sed -i "s/PACKAGE VERSION/$F9KVERSION/g" "$OUTFILE" - sed -i "s/PACKAGE/Friendica/g" "$OUTFILE" + sed -i.bkp "s/SOME DESCRIPTIVE TITLE./FRIENDICA Distributed Social Network/g" "$OUTFILE" + sed -i.bkp "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/2010-$(date +%Y), the Friendica project/g" "$OUTFILE" + sed -i.bkp "s/FIRST AUTHOR , YEAR./Mike Macgirvin, 2010/g" "$OUTFILE" + sed -i.bkp "s/PACKAGE VERSION/$F9KVERSION/g" "$OUTFILE" + sed -i.bkp "s/PACKAGE/Friendica/g" "$OUTFILE" ;; esac -if [ "" != "$1" -a "$MODE" == "default" ] +if [ "" != "$1" ] && [ "$MODE" == "default" ] then - UPDATEFILE="$(readlink -f ${FULLPATH}/$1)" + UPDATEFILE="$(resolve "${FULLPATH}/$1")" echo "Merging new strings to $UPDATEFILE.." - msgmerge -U $OUTFILE $UPDATEFILE + msgmerge -U "$OUTFILE" "$UPDATEFILE" fi echo "Done." From e938dc1fef281710d2bedc99c770346336ee26bf Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 2 Oct 2021 11:59:03 +0000 Subject: [PATCH 17/20] Updated "database.sql" --- database.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database.sql b/database.sql index ed66cbb8a..3e7e65e72 100644 --- a/database.sql +++ b/database.sql @@ -1,5 +1,5 @@ -- ------------------------------------------ --- Friendica 2021.09-rc (Siberian Iris) +-- Friendica 2021.12-dev (Siberian Iris) -- DB_UPDATE_VERSION 1435 -- ------------------------------------------ From 797391e1d830113a3c7116b223d8f0e201435d69 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 26 Sep 2021 10:30:44 -0400 Subject: [PATCH 18/20] Rework contact termination to separate protocol-level and contact-level - Mail and Feed contacts are now removed automatically on relationship termination - Added logging and notice messages for different results --- doc/Addons.md | 3 +- include/api.php | 67 +++++++++++++++++++++-------------------- mod/unfollow.php | 45 ++++++++++++++++----------- src/Console/Contact.php | 24 +++++++++++++-- src/Core/Protocol.php | 65 +++++++++++++++++++++++++++++++++++++++ src/Model/Contact.php | 55 ++++++++------------------------- src/Worker/Notifier.php | 2 +- 7 files changed, 162 insertions(+), 99 deletions(-) diff --git a/doc/Addons.md b/doc/Addons.md index 10949c2c4..df3907940 100644 --- a/doc/Addons.md +++ b/doc/Addons.md @@ -494,7 +494,8 @@ Called when unfollowing a remote contact on a non-native network (like Twitter) Hook data: - **contact** (input): the remote contact (uid = local unfollowing user id) array. -- **dissolve** (input): whether to stop sharing with the remote contact as well. +- **two_way** (input): wether to stop sharing with the remote contact as well. +- **result** (output): wether the unfollowing is successful or not. ## Complete list of hook callbacks diff --git a/include/api.php b/include/api.php index 7656f5029..fe87799cc 100644 --- a/include/api.php +++ b/include/api.php @@ -3778,11 +3778,11 @@ api_register_func('api/direct_messages/destroy', 'api_direct_messages_destroy', * * @param string $type Known types are 'atom', 'rss', 'xml' and 'json' * @return string|array - * @throws BadRequestException - * @throws ForbiddenException - * @throws ImagickException - * @throws InternalServerErrorException - * @throws NotFoundException + * @throws HTTPException\BadRequestException + * @throws HTTPException\ExpectationFailedException + * @throws HTTPException\ForbiddenException + * @throws HTTPException\InternalServerErrorException + * @throws HTTPException\NotFoundException * @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/post-friendships-destroy.html */ function api_friendships_destroy($type) @@ -3790,25 +3790,31 @@ function api_friendships_destroy($type) $uid = api_user(); if ($uid === false) { - throw new ForbiddenException(); + throw new HTTPException\ForbiddenException(); + } + + $owner = User::getOwnerDataById($uid); + if (!$owner) { + Logger::notice(API_LOG_PREFIX . 'No owner {uid} found', ['module' => 'api', 'action' => 'friendships_destroy', 'uid' => $uid]); + throw new HTTPException\NotFoundException('Error Processing Request'); } $contact_id = $_REQUEST['user_id'] ?? 0; if (empty($contact_id)) { Logger::notice(API_LOG_PREFIX . 'No user_id specified', ['module' => 'api', 'action' => 'friendships_destroy']); - throw new BadRequestException("no user_id specified"); + throw new HTTPException\BadRequestException('no user_id specified'); } // Get Contact by given id $contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => 0, 'self' => false]); if(!DBA::isResult($contact)) { - Logger::notice(API_LOG_PREFIX . 'No contact found for ID {contact}', ['module' => 'api', 'action' => 'friendships_destroy', 'contact' => $contact_id]); - throw new NotFoundException("no contact found to given ID"); + Logger::notice(API_LOG_PREFIX . 'No public contact found for ID {contact}', ['module' => 'api', 'action' => 'friendships_destroy', 'contact' => $contact_id]); + throw new HTTPException\NotFoundException('no contact found to given ID'); } - $url = $contact["url"]; + $url = $contact['url']; $condition = ["`uid` = ? AND (`rel` = ? OR `rel` = ?) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)", $uid, Contact::SHARING, Contact::FRIEND, Strings::normaliseLink($url), @@ -3817,40 +3823,35 @@ function api_friendships_destroy($type) if (!DBA::isResult($contact)) { Logger::notice(API_LOG_PREFIX . 'Not following contact', ['module' => 'api', 'action' => 'friendships_destroy']); - throw new NotFoundException("Not following Contact"); - } - - if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { - Logger::notice(API_LOG_PREFIX . 'Not supported for {network}', ['module' => 'api', 'action' => 'friendships_destroy', 'network' => $contact['network']]); - throw new ExpectationFailedException("Not supported"); + throw new HTTPException\NotFoundException('Not following Contact'); } $dissolve = ($contact['rel'] == Contact::SHARING); - $owner = User::getOwnerDataById($uid); - if ($owner) { - Contact::terminateFriendship($owner, $contact, $dissolve); - } - else { - Logger::notice(API_LOG_PREFIX . 'No owner {uid} found', ['module' => 'api', 'action' => 'friendships_destroy', 'uid' => $uid]); - throw new NotFoundException("Error Processing Request"); - } + try { + $result = Contact::terminateFriendship($owner, $contact, $dissolve); - // Sharing-only contacts get deleted as there no relationship any more - if ($dissolve) { - Contact::remove($contact['id']); - } else { - Contact::update(['rel' => Contact::FOLLOWER], ['id' => $contact['id']]); + if ($result === null) { + Logger::notice(API_LOG_PREFIX . 'Not supported for {network}', ['module' => 'api', 'action' => 'friendships_destroy', 'network' => $contact['network']]); + throw new HTTPException\ExpectationFailedException('Unfollowing is currently not supported by this contact\'s network.'); + } + + if ($result === false) { + throw new HTTPException\ServiceUnavailableException('Unable to unfollow this contact, please retry in a few minutes or contact your administrator.'); + } + } catch (Exception $e) { + Logger::error(API_LOG_PREFIX . $e->getMessage(), ['owner' => $owner, 'contact' => $contact, 'dissolve' => $dissolve]); + throw new HTTPException\InternalServerErrorException('Unable to unfollow this contact, please contact your administrator'); } // "uid" and "self" are only needed for some internal stuff, so remove it from here - unset($contact["uid"]); - unset($contact["self"]); + unset($contact['uid']); + unset($contact['self']); // Set screen_name since Twidere requests it - $contact["screen_name"] = $contact["nick"]; + $contact['screen_name'] = $contact['nick']; - return api_format_data("friendships-destroy", $type, ['user' => $contact]); + return api_format_data('friendships-destroy', $type, ['user' => $contact]); } api_register_func('api/friendships/destroy', 'api_friendships_destroy', true, API_METHOD_POST); diff --git a/mod/unfollow.php b/mod/unfollow.php index 2f9264088..a307c4d6e 100644 --- a/mod/unfollow.php +++ b/mod/unfollow.php @@ -120,6 +120,12 @@ function unfollow_process(string $url) $uid = local_user(); + $owner = User::getOwnerDataById($uid); + if (!$owner) { + \Friendica\Module\Security\Logout::init(); + // NOTREACHED + } + $condition = ["`uid` = ? AND (`rel` = ? OR `rel` = ?) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)", $uid, Contact::SHARING, Contact::FRIEND, Strings::normaliseLink($url), Strings::normaliseLink($url), $url]; @@ -131,27 +137,30 @@ function unfollow_process(string $url) // NOTREACHED } - if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { - notice(DI::l10n()->t('Unfollowing is currently not supported by your network.')); - DI::baseUrl()->redirect($base_return_path . '/' . $contact['id']); - // NOTREACHED - } - $dissolve = ($contact['rel'] == Contact::SHARING); - $owner = User::getOwnerDataById($uid); - if ($owner) { - Contact::terminateFriendship($owner, $contact, $dissolve); - } - - // Sharing-only contacts get deleted as there no relationship anymore - if ($dissolve) { - Contact::remove($contact['id']); - $return_path = $base_return_path; - } else { - Contact::update(['rel' => Contact::FOLLOWER], ['id' => $contact['id']]); - $return_path = $base_return_path . '/' . $contact['id']; + $notice_message = ''; + $return_path = $base_return_path . '/' . $contact['id']; + + try { + $result = Contact::terminateFriendship($owner, $contact, $dissolve); + + if ($result === null) { + $notice_message = DI::l10n()->t('Unfollowing is currently not supported by this contact\'s network.'); + } + + if ($result === false) { + $notice_message = DI::l10n()->t('Unable to unfollow this contact, please retry in a few minutes or contact your administrator.'); + } + + if ($result === true) { + $notice_message = DI::l10n()->t('Contact was successfully unfollowed'); + } + } catch (Exception $e) { + DI::logger()->error($e->getMessage(), ['owner' => $owner, 'contact' => $contact, 'dissolve' => $dissolve]); + $notice_message = DI::l10n()->t('Unable to unfollow this contact, please contact your administrator'); } + notice($notice_message); DI::baseUrl()->redirect($return_path); } diff --git a/src/Console/Contact.php b/src/Console/Contact.php index 9dfcf1392..cbfd4b6c6 100644 --- a/src/Console/Contact.php +++ b/src/Console/Contact.php @@ -23,6 +23,7 @@ namespace Friendica\Console; use Console_Table; use Friendica\App; +use Friendica\DI; use Friendica\Model\Contact as ContactModel; use Friendica\Model\User as UserModel; use Friendica\Network\Probe; @@ -177,11 +178,12 @@ HELP; } /** - * Sends an unfriend message. Does not remove the contact + * Sends an unfriend message. * * @return bool True, if the command was successful + * @throws \Exception */ - private function terminateContact() + private function terminateContact(): bool { $cid = $this->getArgument(1); if (empty($cid)) { @@ -199,7 +201,23 @@ HELP; $user = UserModel::getById($contact['uid']); - $result = ContactModel::terminateFriendship($user, $contact); + try { + $result = ContactModel::terminateFriendship($user, $contact); + if ($result === null) { + throw new RuntimeException('Unfollowing is currently not supported by this contact\'s network.'); + } + + if ($result === false) { + throw new RuntimeException('Unable to unfollow this contact, please retry in a few minutes or check the logs.'); + } + + $this->out('Contact was successfully unfollowed'); + + return true; + } catch (\Exception $e) { + DI::logger()->error($e->getMessage(), ['owner' => $user, 'contact' => $contact]); + throw new RuntimeException('Unable to unfollow this contact, please check the log'); + } } /** diff --git a/src/Core/Protocol.php b/src/Core/Protocol.php index b0bf72aeb..7972bf4a3 100644 --- a/src/Core/Protocol.php +++ b/src/Core/Protocol.php @@ -22,6 +22,12 @@ namespace Friendica\Core; use Friendica\DI; +use Friendica\Network\HTTPException; +use Friendica\Protocol\Activity; +use Friendica\Protocol\ActivityPub; +use Friendica\Protocol\Diaspora; +use Friendica\Protocol\OStatus; +use Friendica\Protocol\Salmon; /** * Manage compatibility with federated networks @@ -157,4 +163,63 @@ class Protocol { return $display_name . ' (' . self::getAddrFromProfileUrl($profile_url) . ')'; } + + /** + * Sends an unfriend message. Does not remove the contact + * + * @param array $user User unfriending + * @param array $contact Contact unfriended + * @param boolean $two_way Revoke eventual inbound follow as well + * @return bool|null true if successful, false if not, null if no action was performed + * @throws HTTPException\InternalServerErrorException + * @throws \ImagickException + */ + public static function terminateFriendship(array $user, array $contact, bool $two_way = false): bool + { + if (empty($contact['network'])) { + throw new \InvalidArgumentException('Missing network key in contact array'); + } + + $protocol = $contact['network']; + if (($protocol == Protocol::DFRN) && !empty($contact['protocol'])) { + $protocol = $contact['protocol']; + } + + if (in_array($protocol, [Protocol::OSTATUS, Protocol::DFRN])) { + // create an unfollow slap + $item = []; + $item['verb'] = Activity::O_UNFOLLOW; + $item['gravity'] = GRAVITY_ACTIVITY; + $item['follow'] = $contact['url']; + $item['body'] = ''; + $item['title'] = ''; + $item['guid'] = ''; + $item['uri-id'] = 0; + $slap = OStatus::salmon($item, $user); + + if (empty($contact['notify'])) { + throw new \InvalidArgumentException('Missing expected "notify" key in OStatus/DFRN contact'); + } + + return Salmon::slapper($user, $contact['notify'], $slap) === 0; + } elseif ($protocol == Protocol::DIASPORA) { + return Diaspora::sendUnshare($user, $contact) > 0; + } elseif ($protocol == Protocol::ACTIVITYPUB) { + if ($two_way) { + ActivityPub\Transmitter::sendContactReject($contact['url'], $contact['hub-verify'], $user['uid']); + } + + return ActivityPub\Transmitter::sendContactUndo($contact['url'], $contact['id'], $user['uid']); + } + + // Catch-all addon hook + $hook_data = [ + 'contact' => $contact, + 'two_way' => $two_way, + 'result' => null + ]; + Hook::callAll('unfollow', $hook_data); + + return $hook_data['result']; + } } diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 18e498b97..5bb0608fd 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -809,7 +809,6 @@ class Contact * Marks a contact for removal * * @param int $id contact id - * @return null * @throws HTTPException\InternalServerErrorException */ public static function remove($id) @@ -828,56 +827,26 @@ class Contact } /** - * Sends an unfriend message. Does not remove the contact + * Sends an unfriend message. Removes the contact for two-way unfriending or sharing only protocols (feed an mail) * - * @param array $user User unfriending - * @param array $contact Contact unfriended - * @param boolean $dissolve Remove the contact on the remote side - * @return void + * @param array $user User unfriending + * @param array $contact Contact unfriended + * @param boolean $two_way Revoke eventual inbound follow as well + * @return bool|null true if successful, false if not, null if no action was performed * @throws HTTPException\InternalServerErrorException * @throws \ImagickException */ - public static function terminateFriendship(array $user, array $contact, $dissolve = false) + public static function terminateFriendship(array $user, array $contact, bool $two_way = false): bool { - if (empty($contact['network'])) { - return; - } + $result = Protocol::terminateFriendship($user, $contact, $two_way); - $protocol = $contact['network']; - if (($protocol == Protocol::DFRN) && !empty($contact['protocol'])) { - $protocol = $contact['protocol']; - } - - if (in_array($protocol, [Protocol::OSTATUS, Protocol::DFRN])) { - // create an unfollow slap - $item = []; - $item['verb'] = Activity::O_UNFOLLOW; - $item['gravity'] = GRAVITY_ACTIVITY; - $item['follow'] = $contact["url"]; - $item['body'] = ''; - $item['title'] = ''; - $item['guid'] = ''; - $item['uri-id'] = 0; - $slap = OStatus::salmon($item, $user); - - if (!empty($contact['notify'])) { - Salmon::slapper($user, $contact['notify'], $slap); - } - } elseif ($protocol == Protocol::DIASPORA) { - Diaspora::sendUnshare($user, $contact); - } elseif ($protocol == Protocol::ACTIVITYPUB) { - ActivityPub\Transmitter::sendContactUndo($contact['url'], $contact['id'], $user['uid']); - - if ($dissolve) { - ActivityPub\Transmitter::sendContactReject($contact['url'], $contact['hub-verify'], $user['uid']); - } + if ($two_way || in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) { + self::remove($contact['id']); } else { - $hook_data = [ - 'contact' => $contact, - 'dissolve' => $dissolve, - ]; - Hook::callAll('unfollow', $hook_data); + self::update(['rel' => Contact::FOLLOWER], ['id' => $contact['id']]); } + + return $result; } /** diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index 390dc932c..d69419eb1 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -703,7 +703,7 @@ class Notifier } while($contact = DBA::fetch($contacts_stmt)) { - Contact::terminateFriendship($owner, $contact, true); + Protocol::terminateFriendship($owner, $contact, true); } DBA::close($contacts_stmt); From b34034cef6589fe90995dfc311fc9702153e8bbe Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 26 Sep 2021 17:49:51 -0400 Subject: [PATCH 19/20] Updated main translation file after adding strings --- view/lang/C/messages.po | 86 +++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 34 deletions(-) diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 46d072b32..db44dde0c 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 2021.12-dev\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-02 11:56+0000\n" +"POT-Creation-Date: 2021-10-02 08:34-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -37,7 +37,7 @@ msgstr[1] "" msgid "Monthly posting limit of %d post reached. The post was rejected." msgstr "" -#: include/api.php:4429 mod/photos.php:89 mod/photos.php:198 mod/photos.php:626 +#: include/api.php:4430 mod/photos.php:89 mod/photos.php:198 mod/photos.php:626 #: mod/photos.php:1035 mod/photos.php:1052 mod/photos.php:1599 #: src/Model/User.php:1169 src/Model/User.php:1177 src/Model/User.php:1185 #: src/Module/Settings/Profile/Photo/Crop.php:101 @@ -718,7 +718,7 @@ msgid "OStatus support is disabled. Contact can't be added." msgstr "" #: mod/follow.php:138 src/Content/Item.php:463 src/Content/Widget.php:76 -#: src/Model/Contact.php:1077 src/Model/Contact.php:1090 +#: src/Model/Contact.php:1046 src/Model/Contact.php:1059 #: view/theme/vier/theme.php:172 msgid "Connect/Follow" msgstr "" @@ -2278,11 +2278,11 @@ msgid "" "select \"Export account\"" msgstr "" -#: mod/unfollow.php:65 mod/unfollow.php:129 +#: mod/unfollow.php:65 mod/unfollow.php:135 msgid "You aren't following this contact." msgstr "" -#: mod/unfollow.php:71 mod/unfollow.php:135 +#: mod/unfollow.php:71 msgid "Unfollowing is currently not supported by your network." msgstr "" @@ -2290,6 +2290,24 @@ msgstr "" msgid "Disconnect/Unfollow" msgstr "" +#: mod/unfollow.php:149 +msgid "Unfollowing is currently not supported by this contact's network." +msgstr "" + +#: mod/unfollow.php:153 +msgid "" +"Unable to unfollow this contact, please retry in a few minutes or contact " +"your administrator." +msgstr "" + +#: mod/unfollow.php:157 +msgid "Contact was successfully unfollowed" +msgstr "" + +#: mod/unfollow.php:161 +msgid "Unable to unfollow this contact, please contact your administrator" +msgstr "" + #: mod/videos.php:120 msgid "No videos selected" msgstr "" @@ -3002,31 +3020,31 @@ msgstr "" msgid "Follow Thread" msgstr "" -#: src/Content/Item.php:443 src/Model/Contact.php:1082 +#: src/Content/Item.php:443 src/Model/Contact.php:1051 msgid "View Status" msgstr "" -#: src/Content/Item.php:444 src/Content/Item.php:466 src/Model/Contact.php:1008 -#: src/Model/Contact.php:1074 src/Model/Contact.php:1083 +#: src/Content/Item.php:444 src/Content/Item.php:466 src/Model/Contact.php:977 +#: src/Model/Contact.php:1043 src/Model/Contact.php:1052 #: src/Module/Directory.php:160 src/Module/Settings/Profile/Index.php:223 msgid "View Profile" msgstr "" -#: src/Content/Item.php:445 src/Model/Contact.php:1084 +#: src/Content/Item.php:445 src/Model/Contact.php:1053 msgid "View Photos" msgstr "" -#: src/Content/Item.php:446 src/Model/Contact.php:1075 -#: src/Model/Contact.php:1085 +#: src/Content/Item.php:446 src/Model/Contact.php:1044 +#: src/Model/Contact.php:1054 msgid "Network Posts" msgstr "" -#: src/Content/Item.php:447 src/Model/Contact.php:1076 -#: src/Model/Contact.php:1086 +#: src/Content/Item.php:447 src/Model/Contact.php:1045 +#: src/Model/Contact.php:1055 msgid "View Contact" msgstr "" -#: src/Content/Item.php:448 src/Model/Contact.php:1088 +#: src/Content/Item.php:448 src/Model/Contact.php:1057 msgid "Send PM" msgstr "" @@ -3049,7 +3067,7 @@ msgstr "" msgid "Languages" msgstr "" -#: src/Content/Item.php:458 src/Model/Contact.php:1089 +#: src/Content/Item.php:458 src/Model/Contact.php:1058 msgid "Poke" msgstr "" @@ -3499,7 +3517,7 @@ msgstr "" msgid "Organisations" msgstr "" -#: src/Content/Widget.php:529 src/Model/Contact.php:1505 +#: src/Content/Widget.php:529 src/Model/Contact.php:1474 msgid "News" msgstr "" @@ -4363,85 +4381,85 @@ msgstr "" msgid "Legacy module file not found: %s" msgstr "" -#: src/Model/Contact.php:1078 src/Model/Contact.php:1091 +#: src/Model/Contact.php:1047 src/Model/Contact.php:1060 msgid "UnFollow" msgstr "" -#: src/Model/Contact.php:1087 +#: src/Model/Contact.php:1056 msgid "Drop Contact" msgstr "" -#: src/Model/Contact.php:1097 src/Module/Admin/Users/Pending.php:107 +#: src/Model/Contact.php:1066 src/Module/Admin/Users/Pending.php:107 #: src/Module/Notifications/Introductions.php:111 #: src/Module/Notifications/Introductions.php:183 msgid "Approve" msgstr "" -#: src/Model/Contact.php:1501 +#: src/Model/Contact.php:1470 msgid "Organisation" msgstr "" -#: src/Model/Contact.php:1509 +#: src/Model/Contact.php:1478 msgid "Forum" msgstr "" -#: src/Model/Contact.php:2365 +#: src/Model/Contact.php:2334 msgid "Disallowed profile URL." msgstr "" -#: src/Model/Contact.php:2370 src/Module/Friendica.php:81 +#: src/Model/Contact.php:2339 src/Module/Friendica.php:81 msgid "Blocked domain" msgstr "" -#: src/Model/Contact.php:2375 +#: src/Model/Contact.php:2344 msgid "Connect URL missing." msgstr "" -#: src/Model/Contact.php:2384 +#: src/Model/Contact.php:2353 msgid "" "The contact could not be added. Please check the relevant network " "credentials in your Settings -> Social Networks page." msgstr "" -#: src/Model/Contact.php:2421 +#: src/Model/Contact.php:2390 msgid "The profile address specified does not provide adequate information." msgstr "" -#: src/Model/Contact.php:2423 +#: src/Model/Contact.php:2392 msgid "No compatible communication protocols or feeds were discovered." msgstr "" -#: src/Model/Contact.php:2426 +#: src/Model/Contact.php:2395 msgid "An author or name was not found." msgstr "" -#: src/Model/Contact.php:2429 +#: src/Model/Contact.php:2398 msgid "No browser URL could be matched to this address." msgstr "" -#: src/Model/Contact.php:2432 +#: src/Model/Contact.php:2401 msgid "" "Unable to match @-style Identity Address with a known protocol or email " "contact." msgstr "" -#: src/Model/Contact.php:2433 +#: src/Model/Contact.php:2402 msgid "Use mailto: in front of address to force email check." msgstr "" -#: src/Model/Contact.php:2439 +#: src/Model/Contact.php:2408 msgid "" "The profile address specified belongs to a network which has been disabled " "on this site." msgstr "" -#: src/Model/Contact.php:2444 +#: src/Model/Contact.php:2413 msgid "" "Limited profile. This person will be unable to receive direct/personal " "notifications from you." msgstr "" -#: src/Model/Contact.php:2503 +#: src/Model/Contact.php:2472 msgid "Unable to retrieve contact information." msgstr "" From f5d73cb89a8aad4b3f70c78eb15f1828e5073f0a Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Sat, 2 Oct 2021 14:45:25 +0200 Subject: [PATCH 20/20] Fix comments, remove sed bkp files, fix bash compatiblity --- bin/run_xgettext.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bin/run_xgettext.sh b/bin/run_xgettext.sh index 933682da5..427325e02 100755 --- a/bin/run_xgettext.sh +++ b/bin/run_xgettext.sh @@ -36,7 +36,6 @@ then MODE='single' fi - case "$MODE" in 'addon') cd "$FULLPATH/../addon/$ADDONNAME" @@ -72,24 +71,25 @@ KEYWORDS="-k -kt -ktt:1,2" echo "Extract strings to $OUTFILE.." rm "$OUTFILE"; touch "$OUTFILE" -# shellcheck disable=SC2086 # FINDOPTS is meant to be splitted +# shellcheck disable=SC2086 # $FINDOPTS is meant to be split find_result=$(find "$FINDSTARTDIR" $FINDOPTS -name "*.php" -type f | LC_ALL=C sort --stable) total_files=$(wc -l <<< "${find_result}") +count=1 for file in $find_result do - ((count++)) echo -ne " \r" echo -ne "Reading file $count/$total_files..." # On Windows, find still outputs the name of pruned folders if [ ! -d "$file" ] then - # shellcheck disable=SC2086 # KEYWORDS is meant to be splitted + # shellcheck disable=SC2086 # $KEYWORDS is meant to be split xgettext $KEYWORDS -j -o "$OUTFILE" --from-code=UTF-8 "$file" || exit 1 sed -i.bkp "s/CHARSET/UTF-8/g" "$OUTFILE" fi + (( count++ )) done echo -ne "\n" @@ -121,4 +121,6 @@ then msgmerge -U "$OUTFILE" "$UPDATEFILE" fi +[ -f "$OUTFILE.bkp" ] && rm "$OUTFILE.bkp" + echo "Done."