diff --git a/README.md b/README.md index cbd801b5d1..e66f3969e6 100644 --- a/README.md +++ b/README.md @@ -17,29 +17,29 @@ Have a look at the [installation documentation](doc/Install.md) for further info ### Friendica Screenshots -| ![Frio theme in mobile browser](images/screenshots/friendica-frio-mobile-profile-1.png?raw=true "Frio theme in mobile browser") ![Frio theme in mobile browser](images/screenshots/friendica-frio-mobile-profile-2.png?raw=true "Frio theme in mobile browser") -|:--:| -|*Frio theme, mobile browser. Timeline and composer view.*| -|![Frio theme in desktop browser](images/screenshots/friendica-frio-green-profile-1.png?raw=true "Frio theme in desktop browser") -|*Frio theme, desktop browser. Timeline view, contact info popped up, control menu open.*| -|![Frio theme in desktop browser](images/screenshots/friendica-frio-green-profile-2.png?raw=true "Frio theme in desktop browser") -|*Frio theme, desktop browser. Menu open for controlling individual posts.*| -|![Frio theme in desktop browser](images/screenshots/friendica-frio-red-profile-3.png?raw=true "Frio theme in desktop browser") -|*Frio theme, desktop browser. Profile view, notification menu open.*| -|![Frio theme in desktop browser](images/screenshots/friendica-frio-red-profile-2.png?raw=true "Frio theme in desktop browser") -|*Number of new posts, in total and by group.*| -|![Frio theme in desktop browser](images/screenshots/friendica-frio-red-profile-1.png?raw=true "Frio theme in desktop browser") -|*Calender with popup of event.*| -|![Frio theme default colour in standard browser on tablet](images/screenshots/friendica-frio-default-profile-1.png?raw=true "Frio theme default colour in standard browser on tablet") -|*Notifications menu and private messages counter, standard browser on tablet.*| -|![Frio theme in desktop browser](images/screenshots/friendica-frio-brown-profile-2.png?raw=true "Frio theme in desktop browser") -|*Number of visible contacts, standard browser.*| -|![Frio theme in desktop browser](images/screenshots/friendica-frio-brown-profile-1.png?raw=true "Frio theme in desktop browser") -|*Network posts chronologically ordered, standard browser.*| -|![Vier theme in desktop browser](images/screenshots/friendica-vier-profile.png?raw=true "Vier theme in desktop browser") -|*Vier theme, desktop browser. Public timeline view.*| -|![Vier theme in desktop browser](images/screenshots/friendica-vier-community.png?raw=true "Vier theme in desktop browser") -|*Vier theme, desktop browser. Community post displayed.*| +| ![Frio theme in mobile browser](images/screenshots/friendica-frio-mobile-profile-1.png?raw=true "Frio theme in mobile browser") ![Frio theme in mobile browser](images/screenshots/friendica-frio-mobile-profile-2.png?raw=true "Frio theme in mobile browser") | +|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| *Frio theme, mobile browser. Timeline and composer view.* | +| ![Frio theme in desktop browser](images/screenshots/friendica-frio-green-profile-1.png?raw=true "Frio theme in desktop browser") | +| *Frio theme, desktop browser. Timeline view, contact info popped up, control menu open.* | +| ![Frio theme in desktop browser](images/screenshots/friendica-frio-green-profile-2.png?raw=true "Frio theme in desktop browser") | +| *Frio theme, desktop browser. Menu open for controlling individual posts.* | +| ![Frio theme in desktop browser](images/screenshots/friendica-frio-red-profile-3.png?raw=true "Frio theme in desktop browser") | +| *Frio theme, desktop browser. Profile view, notification menu open.* | +| ![Frio theme in desktop browser](images/screenshots/friendica-frio-red-profile-2.png?raw=true "Frio theme in desktop browser") | +| *Number of new posts, in total and by circle.* | +| ![Frio theme in desktop browser](images/screenshots/friendica-frio-red-profile-1.png?raw=true "Frio theme in desktop browser") | +| *Calendar with popup of event.* | +| ![Frio theme default colour in standard browser on tablet](images/screenshots/friendica-frio-default-profile-1.png?raw=true "Frio theme default colour in standard browser on tablet") | +| *Notifications menu and private messages counter, standard browser on tablet.* | +| ![Frio theme in desktop browser](images/screenshots/friendica-frio-brown-profile-2.png?raw=true "Frio theme in desktop browser") | +| *Number of visible contacts, standard browser.* | +| ![Frio theme in desktop browser](images/screenshots/friendica-frio-brown-profile-1.png?raw=true "Frio theme in desktop browser") | +| *Network posts chronologically ordered, standard browser.* | +| ![Vier theme in desktop browser](images/screenshots/friendica-vier-profile.png?raw=true "Vier theme in desktop browser") | +| *Vier theme, desktop browser. Public timeline view.* | +| ![Vier theme in desktop browser](images/screenshots/friendica-vier-community.png?raw=true "Vier theme in desktop browser") | +| *Vier theme, desktop browser. Community post displayed.* | ## Endorsements diff --git a/database.sql b/database.sql index 4e674d63f4..f618960339 100644 --- a/database.sql +++ b/database.sql @@ -252,9 +252,9 @@ CREATE TABLE IF NOT EXISTS `permissionset` ( `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID', `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner id of this permission set', `allow_cid` mediumtext COMMENT 'Access Control - list of allowed contact.id \'<19><78>\'', - `allow_gid` mediumtext COMMENT 'Access Control - list of allowed groups', + `allow_gid` mediumtext COMMENT 'Access Control - list of allowed circles', `deny_cid` mediumtext COMMENT 'Access Control - list of denied contact.id', - `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups', + `deny_gid` mediumtext COMMENT 'Access Control - list of denied circles', PRIMARY KEY(`id`), INDEX `uid_allow_cid_allow_gid_deny_cid_deny_gid` (`uid`,`allow_cid`(50),`allow_gid`(30),`deny_cid`(50),`deny_gid`(30)), FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE @@ -457,9 +457,9 @@ CREATE TABLE IF NOT EXISTS `attach` ( `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'creation time', `edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'last edit time', `allow_cid` mediumtext COMMENT 'Access Control - list of allowed contact.id \'<19><78>', - `allow_gid` mediumtext COMMENT 'Access Control - list of allowed groups', + `allow_gid` mediumtext COMMENT 'Access Control - list of allowed circles', `deny_cid` mediumtext COMMENT 'Access Control - list of denied contact.id', - `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups', + `deny_gid` mediumtext COMMENT 'Access Control - list of denied circles', `backend-class` tinytext COMMENT 'Storage backend class', `backend-ref` text COMMENT 'Storage backend data reference', PRIMARY KEY(`id`), @@ -662,9 +662,9 @@ CREATE TABLE IF NOT EXISTS `event` ( `nofinish` boolean NOT NULL DEFAULT '0' COMMENT 'if event does have no end this is 1', `ignore` boolean NOT NULL DEFAULT '0' COMMENT '0 or 1', `allow_cid` mediumtext COMMENT 'Access Control - list of allowed contact.id \'<19><78>\'', - `allow_gid` mediumtext COMMENT 'Access Control - list of allowed groups', + `allow_gid` mediumtext COMMENT 'Access Control - list of allowed circles', `deny_cid` mediumtext COMMENT 'Access Control - list of denied contact.id', - `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups', + `deny_gid` mediumtext COMMENT 'Access Control - list of denied circles', PRIMARY KEY(`id`), INDEX `uid_start` (`uid`,`start`), INDEX `cid` (`cid`), @@ -716,29 +716,29 @@ CREATE TABLE IF NOT EXISTS `group` ( `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID', `uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner User id', `visible` boolean NOT NULL DEFAULT '0' COMMENT '1 indicates the member list is not private', - `deleted` boolean NOT NULL DEFAULT '0' COMMENT '1 indicates the group has been deleted', + `deleted` boolean NOT NULL DEFAULT '0' COMMENT '1 indicates the circle has been deleted', `cid` int unsigned COMMENT 'Contact id of forum. When this field is filled then the members are synced automatically.', - `name` varchar(255) NOT NULL DEFAULT '' COMMENT 'human readable name of group', + `name` varchar(255) NOT NULL DEFAULT '' COMMENT 'human readable name of circle', PRIMARY KEY(`id`), INDEX `uid` (`uid`), INDEX `cid` (`cid`), FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE, FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE -) DEFAULT COLLATE utf8mb4_general_ci COMMENT='privacy groups, group info'; +) DEFAULT COLLATE utf8mb4_general_ci COMMENT='privacy circles, circle info'; -- -- TABLE group_member -- CREATE TABLE IF NOT EXISTS `group_member` ( `id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID', - `gid` int unsigned NOT NULL DEFAULT 0 COMMENT 'groups.id of the associated group', - `contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'contact.id of the member assigned to the associated group', + `gid` int unsigned NOT NULL DEFAULT 0 COMMENT 'group.id of the associated circle', + `contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'contact.id of the member assigned to the associated circle', PRIMARY KEY(`id`), INDEX `contactid` (`contact-id`), UNIQUE INDEX `gid_contactid` (`gid`,`contact-id`), FOREIGN KEY (`gid`) REFERENCES `group` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE, FOREIGN KEY (`contact-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE -) DEFAULT COLLATE utf8mb4_general_ci COMMENT='privacy groups, member info'; +) DEFAULT COLLATE utf8mb4_general_ci COMMENT='privacy circles, member info'; -- -- TABLE gserver-tag @@ -1114,9 +1114,9 @@ CREATE TABLE IF NOT EXISTS `photo` ( `scale` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '', `profile` boolean NOT NULL DEFAULT '0' COMMENT '', `allow_cid` mediumtext COMMENT 'Access Control - list of allowed contact.id \'<19><78>\'', - `allow_gid` mediumtext COMMENT 'Access Control - list of allowed groups', + `allow_gid` mediumtext COMMENT 'Access Control - list of allowed circles', `deny_cid` mediumtext COMMENT 'Access Control - list of denied contact.id', - `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups', + `deny_gid` mediumtext COMMENT 'Access Control - list of denied circles', `accessible` boolean NOT NULL DEFAULT '0' COMMENT 'Make photo publicly accessible, ignoring permissions', `backend-class` tinytext COMMENT 'Storage backend class', `backend-ref` text COMMENT 'Storage backend data reference', diff --git a/doc/API-Entities.md b/doc/API-Entities.md index 213b2494f1..de3eac9b9a 100644 --- a/doc/API-Entities.md +++ b/doc/API-Entities.md @@ -454,7 +454,7 @@ Ex: Wed May 23 06:01:13 +0000 2007
allow_gid
deny_gid
friendica_owner
allow_gid
deny_gid
You can use BBCodes in the field values.
Reorder by dragging the field title.
Empty the label field to remove a custom field.
-Non-public fields can only be seen by the selected Friendica contacts or the Friendica contacts in the selected groups.
", +Non-public fields can only be seen by the selected Friendica contacts or the Friendica contacts in the selected circles.
", 'profile/' . $profile['nickname'] . '/profile' ), '$custom_fields' => $custom_fields, @@ -284,9 +284,9 @@ class Index extends BaseSettings $permissionSet = DI::permissionSet()->selectOrCreate(DI::permissionSetFactory()->createFromString( $uid, DI::aclFormatter()->toString($profileFieldInputs['new']['contact_allow'] ?? ''), - DI::aclFormatter()->toString($profileFieldInputs['new']['group_allow'] ?? ''), + DI::aclFormatter()->toString($profileFieldInputs['new']['circle_allow'] ?? ''), DI::aclFormatter()->toString($profileFieldInputs['new']['contact_deny'] ?? ''), - DI::aclFormatter()->toString($profileFieldInputs['new']['group_deny'] ?? '') + DI::aclFormatter()->toString($profileFieldInputs['new']['circle_deny'] ?? '') )); $profileFields->append(DI::profileFieldFactory()->createFromValues( @@ -305,9 +305,9 @@ class Index extends BaseSettings $permissionSet = DI::permissionSet()->selectOrCreate(DI::permissionSetFactory()->createFromString( $uid, DI::aclFormatter()->toString($profileFieldInput['contact_allow'] ?? ''), - DI::aclFormatter()->toString($profileFieldInput['group_allow'] ?? ''), + DI::aclFormatter()->toString($profileFieldInput['circle_allow'] ?? ''), DI::aclFormatter()->toString($profileFieldInput['contact_deny'] ?? ''), - DI::aclFormatter()->toString($profileFieldInput['group_deny'] ?? '') + DI::aclFormatter()->toString($profileFieldInput['circle_deny'] ?? '') )); $profileFields->append(DI::profileFieldFactory()->createFromValues( diff --git a/src/Module/Settings/UserExport.php b/src/Module/Settings/UserExport.php index 1eecea3f99..7ff08d97b7 100644 --- a/src/Module/Settings/UserExport.php +++ b/src/Module/Settings/UserExport.php @@ -263,12 +263,12 @@ class UserExport extends BaseSettings sprintf("SELECT * FROM `pconfig` WHERE uid = %d", $user_id) ); - $group = $this->exportMultiRow( + $circle = $this->exportMultiRow( sprintf("SELECT * FROM `group` WHERE uid = %d", $user_id) ); - $group_member = $this->exportMultiRow( - sprintf("SELECT `group_member`.`gid`, `group_member`.`contact-id` FROM `group_member` INNER JOIN `group` ON `group`.`id` = `group_member`.`gid` WHERE `group`.`uid` = %d", $user_id) + $circle_member = $this->exportMultiRow( + sprintf("SELECT `circle_member`.`gid`, `circle_member`.`contact-id` FROM `group_member` AS `circle_member` INNER JOIN `group` AS `circle` ON `circle`.`id` = `circle_member`.`gid` WHERE `circle`.`uid` = %d", $user_id) ); $output = [ @@ -281,8 +281,8 @@ class UserExport extends BaseSettings 'profile_fields' => $profile_fields, 'photo' => $photo, 'pconfig' => $pconfig, - 'group' => $group, - 'group_member' => $group_member, + 'circle' => $circle, + 'circle_member' => $circle_member, ]; echo json_encode($output, JSON_PARTIAL_OUTPUT_ON_ERROR); diff --git a/src/Module/Update/Profile.php b/src/Module/Update/Profile.php index 53406e195f..bdbe573204 100644 --- a/src/Module/Update/Profile.php +++ b/src/Module/Update/Profile.php @@ -63,7 +63,7 @@ class Profile extends BaseModule System::htmlUpdateExit($o); } - // Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups + // Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched their circles $sql_extra = Item::getPermissionsSQLByUserId($a->getProfileOwner()); $last_updated_array = DI::session()->get('last_updated', []); diff --git a/src/Module/User/Import.php b/src/Module/User/Import.php index 48dc0660f2..33db88da9a 100644 --- a/src/Module/User/Import.php +++ b/src/Module/User/Import.php @@ -231,6 +231,10 @@ class Import extends \Friendica\BaseModule return; } + // Backward compatibility + $account['circle'] = $account['circle'] ?? $account['group']; + $account['circle_member'] = $account['circle_member'] ?? $account['group_member']; + $oldBaseUrl = $account['baseurl']; $newBaseUrl = (string)$this->baseUrl; @@ -312,35 +316,35 @@ class Import extends \Friendica\BaseModule $this->systemMessages->addNotice($this->tt('%d contact not imported', '%d contacts not imported', $errorCount)); } - array_walk($account['group'], function (&$group) use ($newUid) { - $group['uid'] = $newUid; - if ($this->dbImportAssoc('group', $group) === false) { - $this->logger->warning('Error inserting group', ['name' => $group['name'], 'error' => $this->database->errorMessage()]); + array_walk($account['circle'], function (&$circle) use ($newUid) { + $circle['uid'] = $newUid; + if ($this->dbImportAssoc('group', $circle) === false) { + $this->logger->warning('Error inserting circle', ['name' => $circle['name'], 'error' => $this->database->errorMessage()]); } else { - $group['newid'] = $this->lastInsertId(); + $circle['newid'] = $this->lastInsertId(); } }); - foreach ($account['group_member'] as $group_member) { + foreach ($account['circle_member'] as $circle_member) { $import = 0; - foreach ($account['group'] as $group) { - if ($group['id'] == $group_member['gid'] && isset($group['newid'])) { - $group_member['gid'] = $group['newid']; + foreach ($account['circle'] as $circle) { + if ($circle['id'] == $circle_member['gid'] && isset($circle['newid'])) { + $circle_member['gid'] = $circle['newid']; $import++; break; } } foreach ($account['contact'] as $contact) { - if ($contact['id'] == $group_member['contact-id'] && isset($contact['newid'])) { - $group_member['contact-id'] = $contact['newid']; + if ($contact['id'] == $circle_member['contact-id'] && isset($contact['newid'])) { + $circle_member['contact-id'] = $contact['newid']; $import++; break; } } - if ($import == 2 && $this->dbImportAssoc('group_member', $group_member) === false) { - $this->logger->warning('Error inserting group member', ['gid' => $group_member['id'], 'error' => $this->database->errorMessage()]); + if ($import == 2 && $this->dbImportAssoc('group_member', $circle_member) === false) { + $this->logger->warning('Error inserting circle member', ['gid' => $circle_member['id'], 'error' => $this->database->errorMessage()]); } } diff --git a/src/Module/Welcome.php b/src/Module/Welcome.php index f93a7bd23f..ad35f31e89 100644 --- a/src/Module/Welcome.php +++ b/src/Module/Welcome.php @@ -73,9 +73,9 @@ class Welcome extends BaseModule '$finding_link' => DI::l10n()->t('Finding New People'), '$finding_txt' => DI::l10n()->t('On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours.'), - '$groups' => DI::l10n()->t('Groups'), - '$group_contact_link' => DI::l10n()->t('Group Your Contacts'), - '$group_contact_txt' => DI::l10n()->t('Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page.'), + '$circles' => DI::l10n()->t('Circles'), + '$circle_contact_link' => DI::l10n()->t('Add Your Contacts To Circle'), + '$circle_contact_txt' => DI::l10n()->t('Once you have made some friends, organize them into private conversation circles from the sidebar of your Contacts page and then you can interact with each circle privately on your Network page.'), '$newuser_private' => $newuser_private, '$private_link' => DI::l10n()->t('Why Aren\'t My Posts Public?'), '$private_txt' => DI::l10n()->t('Friendica respects your privacy. By default, your posts will only show up to people you\'ve added as friends. For more information, see the help section from the link above.'), diff --git a/src/Object/Api/Friendica/Group.php b/src/Object/Api/Friendica/Circle.php similarity index 77% rename from src/Object/Api/Friendica/Group.php rename to src/Object/Api/Friendica/Circle.php index ce75f9eec1..5ff1a32cce 100644 --- a/src/Object/Api/Friendica/Group.php +++ b/src/Object/Api/Friendica/Circle.php @@ -23,12 +23,7 @@ namespace Friendica\Object\Api\Friendica; use Friendica\BaseDataTransferObject; -/** - * Class Group - * - * - */ -class Group extends BaseDataTransferObject +class Circle extends BaseDataTransferObject { /** @var string */ protected $name; @@ -42,18 +37,16 @@ class Group extends BaseDataTransferObject protected $mode; /** - * Creates an Group entity array - * - * @param array $group + * @param array $circle Circle row array * @param array $user * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public function __construct(array $group, array $user) + public function __construct(array $circle, array $user) { - $this->name = $group['name']; - $this->id = $group['id']; - $this->id_str = (string)$group['id']; + $this->name = $circle['name']; + $this->id = $circle['id']; + $this->id_str = (string)$circle['id']; $this->user = $user; - $this->mode = $group['visible'] ? 'public' : 'private'; + $this->mode = $circle['visible'] ? 'public' : 'private'; } } diff --git a/src/Protocol/ActivityPub/ClientToServer.php b/src/Protocol/ActivityPub/ClientToServer.php index ee162382b8..2b52d17b76 100644 --- a/src/Protocol/ActivityPub/ClientToServer.php +++ b/src/Protocol/ActivityPub/ClientToServer.php @@ -28,7 +28,7 @@ use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\APContact; use Friendica\Model\Contact; -use Friendica\Model\Group; +use Friendica\Model\Circle; use Friendica\Model\Item; use Friendica\Model\Post; use Friendica\Model\User; @@ -284,7 +284,7 @@ class ClientToServer $item['private'] = Item::UNLISTED; } elseif (!empty($object_data['target'][Receiver::TARGET_FOLLOWER])) { $item['allow_cid'] = ''; - $item['allow_gid'] = '<' . Group::FOLLOWERS . '>'; + $item['allow_gid'] = '<' . Circle::FOLLOWERS . '>'; $item['deny_cid'] = ''; $item['deny_gid'] = ''; $item['private'] = Item::PRIVATE; diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index db4196abc4..cf2485186a 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -1098,7 +1098,7 @@ class Receiver if (!empty($actor)) { $profile = APContact::getByURL($actor); $followers = $profile['followers'] ?? ''; - $is_forum = ($actor['type'] ?? '') == 'Group'; + $is_forum = ($profile['type'] ?? '') == 'Group'; if ($push) { Contact::updateByUrlIfNeeded($actor); } diff --git a/src/Security/PermissionSet/Repository/PermissionSet.php b/src/Security/PermissionSet/Repository/PermissionSet.php index 76cd446c14..58cf6e42f5 100644 --- a/src/Security/PermissionSet/Repository/PermissionSet.php +++ b/src/Security/PermissionSet/Repository/PermissionSet.php @@ -25,7 +25,7 @@ use Exception; use Friendica\BaseRepository; use Friendica\Database\Database; use Friendica\Model\Contact; -use Friendica\Model\Group; +use Friendica\Model\Circle; use Friendica\Network\HTTPException\NotFoundException; use Friendica\Security\PermissionSet\Exception\PermissionSetNotFoundException; use Friendica\Security\PermissionSet\Exception\PermissionSetPersistenceException; @@ -140,29 +140,29 @@ class PermissionSet extends BaseRepository $user_contact_str = ''; } - $groups = []; + $circle_ids = []; if (!empty($user_contact_str) && $this->db->exists('contact', [ 'id' => $cid, 'uid' => $uid, 'blocked' => false ])) { - $groups = Group::getIdsByContactId($cid); + $circle_ids = Circle::getIdsByContactId($cid); } - $group_str = '<<>>'; // should be impossible to match - foreach ($groups as $group_id) { - $group_str .= '|<' . preg_quote($group_id) . '>'; + $circle_str = '<<>>'; // should be impossible to match + foreach ($circle_ids as $circle_id) { + $circle_str .= '|<' . preg_quote($circle_id) . '>'; } if (!empty($user_contact_str)) { $condition = ["`uid` = ? AND (NOT (LOCATE(?, `deny_cid`) OR LOCATE(?, `deny_cid`) OR deny_gid REGEXP ?) AND (LOCATE(?, allow_cid) OR LOCATE(?, allow_cid) OR allow_gid REGEXP ? OR (allow_cid = '' AND allow_gid = '')))", - $uid, $user_contact_str, $public_contact_str, $group_str, - $user_contact_str, $public_contact_str, $group_str]; + $uid, $user_contact_str, $public_contact_str, $circle_str, + $user_contact_str, $public_contact_str, $circle_str]; } else { $condition = ["`uid` = ? AND (NOT (LOCATE(?, `deny_cid`) OR deny_gid REGEXP ?) AND (LOCATE(?, allow_cid) OR allow_gid REGEXP ? OR (allow_cid = '' AND allow_gid = '')))", - $uid, $public_contact_str, $group_str, $public_contact_str, $group_str]; + $uid, $public_contact_str, $circle_str, $public_contact_str, $circle_str]; } return $this->select($condition); diff --git a/src/Security/Security.php b/src/Security/Security.php index bc1d98ac16..0774491d02 100644 --- a/src/Security/Security.php +++ b/src/Security/Security.php @@ -24,7 +24,7 @@ namespace Friendica\Security; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Contact; -use Friendica\Model\Group; +use Friendica\Model\Circle; use Friendica\Model\User; /** @@ -117,17 +117,13 @@ class Security if ($local_user && $local_user == $owner_id) { $sql = ''; /* - * Authenticated visitor. Load the groups the visitor belongs to. + * Authenticated visitor. Load the circles the visitor belongs to. */ } elseif ($remote_contact) { - $gs = '<<>>'; // should be impossible to match + $circleIds = '<<>>'; // should be impossible to match - $groups = Group::getIdsByContactId($remote_contact); - - if (is_array($groups)) { - foreach ($groups as $g) { - $gs .= '|<' . intval($g) . '>'; - } + foreach (Circle::getIdsByContactId($remote_contact) as $circleId) { + $circleIds .= '|<' . intval($circleId) . '>'; } $sql = sprintf( @@ -135,9 +131,9 @@ class Security AND (allow_cid REGEXP '<%d>' OR allow_gid REGEXP '%s' OR (allow_cid = '' AND allow_gid = ''))" . $acc_sql . ") ", intval($remote_contact), - DBA::escape($gs), + DBA::escape($circleIds), intval($remote_contact), - DBA::escape($gs) + DBA::escape($circleIds) ); } return $sql; diff --git a/src/Util/ACLFormatter.php b/src/Util/ACLFormatter.php index 0351b27a64..f7a0894e1c 100644 --- a/src/Util/ACLFormatter.php +++ b/src/Util/ACLFormatter.php @@ -21,7 +21,7 @@ namespace Friendica\Util; -use Friendica\Model\Group; +use Friendica\Model\Circle; /** * Util class for ACL formatting @@ -29,7 +29,7 @@ use Friendica\Model\Group; final class ACLFormatter { /** - * Turn user/group ACLs stored as angle bracketed text into arrays + * Turn user/circle ACLs stored as angle bracketed text into arrays * * @param string|null $acl_string A angle-bracketed list of IDs * @@ -44,7 +44,7 @@ final class ACLFormatter // turn string array of angle-bracketed elements into numeric array // e.g. "<1><2><3>" => array(1,2,3); - preg_match_all('/<(' . Group::FOLLOWERS . '|'. Group::MUTUALS . '|[0-9]+)>/', $acl_string, $matches, PREG_PATTERN_ORDER); + preg_match_all('/<(' . Circle::FOLLOWERS . '|'. Circle::MUTUALS . '|[0-9]+)>/', $acl_string, $matches, PREG_PATTERN_ORDER); return $matches[1]; } @@ -86,7 +86,7 @@ final class ACLFormatter if (intval($item)) { $item = '<' . intval($item) . '>'; // The item is a allowed ACL character - } elseif (in_array($item, [Group::FOLLOWERS, Group::MUTUALS])) { + } elseif (in_array($item, [Circle::FOLLOWERS, Circle::MUTUALS])) { $item = '<' . $item . '>'; // The item is already a ACL string } elseif (preg_match('/<\d+?>/', $item)) { diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index 7c78896f39..6eb653dec1 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -29,7 +29,7 @@ use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Contact; use Friendica\Model\Conversation; -use Friendica\Model\Group; +use Friendica\Model\Circle; use Friendica\Model\GServer; use Friendica\Model\Item; use Friendica\Model\Post; @@ -340,9 +340,9 @@ class Notifier $aclFormatter = DI::aclFormatter(); $allow_people = $aclFormatter->expand($parent['allow_cid']); - $allow_groups = Group::expand($uid, $aclFormatter->expand($parent['allow_gid']),true); + $allow_circles = Circle::expand($uid, $aclFormatter->expand($parent['allow_gid']),true); $deny_people = $aclFormatter->expand($parent['deny_cid']); - $deny_groups = Group::expand($uid, $aclFormatter->expand($parent['deny_gid'])); + $deny_circles = Circle::expand($uid, $aclFormatter->expand($parent['deny_gid'])); foreach ($items as $item) { $recipients[] = $item['contact-id']; @@ -363,8 +363,8 @@ class Notifier Logger::notice('Deliver', ['target' => $target_id, 'guid' => $target_item['guid'], 'recipients' => $url_recipients]); } - $recipients = array_unique(array_merge($recipients, $allow_people, $allow_groups)); - $deny = array_unique(array_merge($deny_people, $deny_groups)); + $recipients = array_unique(array_merge($recipients, $allow_people, $allow_circles)); + $deny = array_unique(array_merge($deny_people, $deny_circles)); $recipients = array_diff($recipients, $deny); // If this is a public message and pubmail is set on the parent, include all your email contacts @@ -797,7 +797,7 @@ class Notifier foreach (Tag::getByURIId($target_item['uri-id'], [Tag::MENTION, Tag::EXCLUSIVE_MENTION]) as $tag) { $target_contact = Contact::getByURL(Strings::normaliseLink($tag['url']), null, [], $uid); if ($target_contact && $target_contact['contact-type'] == Contact::TYPE_COMMUNITY && $target_contact['manually-approve']) { - Group::updateMembersForForum($target_contact['id']); + Circle::updateMembersForForum($target_contact['id']); } } @@ -822,7 +822,7 @@ class Notifier } Logger::info('Remote item will be distributed', ['id' => $target_item['id'], 'url' => $target_item['uri'], 'verb' => $target_item['verb']]); - $check_signature = ($target_item['gravity'] == Item::GRAVITY_ACTIVITY); + $check_signature = ($target_item['gravity'] == Item::GRAVITY_ACTIVITY); } else { Logger::info('Remote activity will not be distributed', ['id' => $target_item['id'], 'url' => $target_item['uri'], 'verb' => $target_item['verb']]); return ['count' => 0, 'contacts' => []]; diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index ffb66d9701..4c4e3cdbe7 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -311,9 +311,9 @@ return [ "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"], "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "Owner id of this permission set"], "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"], - "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"], + "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed circles"], "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"], - "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"], + "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied circles"], ], "indexes" => [ "PRIMARY" => ["id"], @@ -513,9 +513,9 @@ return [ "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "creation time"], "edited" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "last edit time"], "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>"], - "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"], + "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed circles"], "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"], - "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"], + "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied circles"], "backend-class" => ["type" => "tinytext", "comment" => "Storage backend class"], "backend-ref" => ["type" => "text", "comment" => "Storage backend data reference"], ], @@ -715,9 +715,9 @@ return [ "nofinish" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "if event does have no end this is 1"], "ignore" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "0 or 1"], "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"], - "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"], + "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed circles"], "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"], - "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"], + "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied circles"], ], "indexes" => [ "PRIMARY" => ["id"], @@ -760,14 +760,14 @@ return [ ] ], "group" => [ - "comment" => "privacy groups, group info", + "comment" => "privacy circles, circle info", "fields" => [ "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"], "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "Owner User id"], "visible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the member list is not private"], - "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the group has been deleted"], + "deleted" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "1 indicates the circle has been deleted"], "cid" => ["type" => "int unsigned", "foreign" => ["contact" => "id"], "comment" => "Contact id of forum. When this field is filled then the members are synced automatically."], - "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "human readable name of group"], + "name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "human readable name of circle"], ], "indexes" => [ "PRIMARY" => ["id"], @@ -776,11 +776,11 @@ return [ ] ], "group_member" => [ - "comment" => "privacy groups, member info", + "comment" => "privacy circles, member info", "fields" => [ "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"], - "gid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["group" => "id"], "comment" => "groups.id of the associated group"], - "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id"], "comment" => "contact.id of the member assigned to the associated group"], + "gid" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["group" => "id"], "comment" => "group.id of the associated circle"], + "contact-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "foreign" => ["contact" => "id"], "comment" => "contact.id of the member assigned to the associated circle"], ], "indexes" => [ "PRIMARY" => ["id"], @@ -1150,9 +1150,9 @@ return [ "scale" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => ""], "profile" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], "allow_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed contact.id '<19><78>'"], - "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"], + "allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed circles"], "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"], - "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"], + "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied circles"], "accessible" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => "Make photo publicly accessible, ignoring permissions"], "backend-class" => ["type" => "tinytext", "comment" => "Storage backend class"], "backend-ref" => ["type" => "text", "comment" => "Storage backend data reference"], diff --git a/static/defaults.config.php b/static/defaults.config.php index d0b8262ac7..6a0a619a35 100644 --- a/static/defaults.config.php +++ b/static/defaults.config.php @@ -310,10 +310,10 @@ return [ // Number of "free" searches when system => permit_crawling is enabled. 'free_crawls' => 10, - // groupedit_image_limit (Integer) - // Number of contacts at which the group editor should switch from display the profile pictures of the contacts to only display the names. + // circle_edit_image_limit (Integer) + // Number of contacts at which the circle editor should switch from display the profile pictures of the contacts to only display the names. // This can alternatively be set on a per-account basis in the pconfig table. - 'groupedit_image_limit' => 400, + 'circle_edit_image_limit' => 400, // gserver_update_limit (Integer) // How many servers should be checked at a time? diff --git a/static/routes.config.php b/static/routes.config.php index 0ff13224c6..8b4b1a9674 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -89,12 +89,20 @@ $apiRoutes = [ '/direct_messages_setseen[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\DirectMessages\Setseen::class, [ R::POST]], '/direct_messages_search[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\DirectMessages\Search ::class, [R::GET ]], '/events[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Index::class, [R::GET ]], - '/event_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Create::class, [ R::POST]], - '/event_delete[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Delete::class, [ R::POST]], - '/group_show[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Show::class, [R::GET ]], - '/group_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Create::class, [ R::POST]], - '/group_delete[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Delete::class, [ R::POST]], - '/group_update[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Group\Update::class, [ R::POST]], + '/event_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Create::class, [ R::POST]], + '/event_delete[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Events\Delete::class, [ R::POST]], + '/circle_show[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Circle\Show::class, [R::GET ]], + '/circle_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Circle\Create::class, [ R::POST]], + '/circle_delete[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Circle\Delete::class, [ R::POST]], + '/circle_update[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Circle\Update::class, [ R::POST]], + + // Backward compatibility + // @deprecated + '/group_show[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Circle\Show::class, [R::GET ]], + '/group_create[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Circle\Create::class, [ R::POST]], + '/group_delete[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Circle\Delete::class, [ R::POST]], + '/group_update[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Circle\Update::class, [ R::POST]], + '/profile/show[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Profile\Show::class, [R::GET ]], '/photoalbums[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Photoalbum\Index::class, [R::GET ]], '/photoalbum[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Photoalbum\Show::class, [R::GET ]], @@ -446,14 +454,14 @@ return [ '/fsuggest/{contact:\d+}' => [Module\FriendSuggest::class, [R::GET, R::POST]], - '/group' => [ - '[/]' => [Module\Group::class, [R::GET, R::POST]], - '/{group:\d+}' => [Module\Group::class, [R::GET, R::POST]], - '/none' => [Module\Group::class, [R::GET, R::POST]], - '/new' => [Module\Group::class, [R::GET, R::POST]], - '/drop/{group:\d+}' => [Module\Group::class, [R::GET, R::POST]], - '/{group:\d+}/{contact:\d+}' => [Module\Group::class, [R::GET, R::POST]], - '/{group:\d+}/{command:add|remove}/{contact:\d+}' => [Module\Group::class, [R::GET, R::POST]], + '/circle' => [ + '[/]' => [Module\Circle::class, [R::GET, R::POST]], + '/{circle:\d+}' => [Module\Circle::class, [R::GET, R::POST]], + '/none' => [Module\Circle::class, [R::GET, R::POST]], + '/new' => [Module\Circle::class, [R::GET, R::POST]], + '/drop/{circle:\d+}' => [Module\Circle::class, [R::GET, R::POST]], + '/{circle:\d+}/{contact:\d+}' => [Module\Circle::class, [R::GET, R::POST]], + '/{circle:\d+}/{command:add|remove}/{contact:\d+}' => [Module\Circle::class, [R::GET, R::POST]], ], '/hashtag' => [Module\Hashtag::class, [R::GET]], '/help[/{doc:.+}]' => [Module\Help::class, [R::GET]], @@ -511,7 +519,7 @@ return [ '/newmember' => [Module\Welcome::class, [R::GET]], '/nodeinfo/1.0' => [Module\NodeInfo110::class, [R::GET]], '/nodeinfo/2.0' => [Module\NodeInfo120::class, [R::GET]], - '/nogroup' => [Module\Group::class, [R::GET]], + '/nocircle' => [Module\Circle::class, [R::GET]], '/noscrape' => [ '/{nick}' => [Module\NoScrape::class, [R::GET]], @@ -660,7 +668,7 @@ return [ '[/]' => [Module\Conversation\Network::class, [R::GET]], '/archive/{from:\d\d\d\d-\d\d-\d\d}[/{to:\d\d\d\d-\d\d-\d\d}]' => [Module\Conversation\Network::class, [R::GET]], '/forum/{contact_id:\d+}' => [Module\Conversation\Network::class, [R::GET]], - '/group/{group_id:\d+}' => [Module\Conversation\Network::class, [R::GET]], + '/circle/{circle_id:\d+}' => [Module\Conversation\Network::class, [R::GET]], ], '/randprof' => [Module\RandomProfile::class, [R::GET]], @@ -680,7 +688,7 @@ return [ '[/]' => [Module\Update\Network::class, [R::GET]], '/archive/{from:\d\d\d\d-\d\d-\d\d}[/{to:\d\d\d\d-\d\d-\d\d}]' => [Module\Update\Network::class, [R::GET]], '/forum/{contact_id:\d+}' => [Module\Update\Network::class, [R::GET]], - '/group/{group_id:\d+}' => [Module\Update\Network::class, [R::GET]], + '/circle/{circle_id:\d+}' => [Module\Update\Network::class, [R::GET]], ], '/update_profile' => [Module\Update\Profile::class, [R::GET]], diff --git a/static/settings.config.php b/static/settings.config.php index e17fa04424..47d1a51500 100644 --- a/static/settings.config.php +++ b/static/settings.config.php @@ -114,9 +114,9 @@ return [ // Default value comprises classic role names from RFC 2142. 'forbidden_nicknames' => 'info, marketing, sales, support, abuse, noc, security, postmaster, hostmaster, usenet, news, webmaster, www, uucp, ftp, root, sysop', - // compute_group_counts (Boolean) - // Compute contact group level when counting unseen network posts. - 'compute_group_counts' => true, + // compute_circle_counts (Boolean) + // Compute contact circle level when counting unseen network posts. + 'compute_circle_counts' => true, // jpeg_quality (Integer) // Sets the ImageMagick quality level for JPEG images. Values ranges from 50 (awful) to 100 (near perfect). diff --git a/tests/src/Util/ACLFormatterTest.php b/tests/src/Util/ACLFormatterTest.php index afbf435d85..93e1767dc5 100644 --- a/tests/src/Util/ACLFormatterTest.php +++ b/tests/src/Util/ACLFormatterTest.php @@ -21,7 +21,7 @@ namespace Friendica\Test\src\Util; -use Friendica\Model\Group; +use Friendica\Model\Circle; use Friendica\Util\ACLFormatter; use PHPUnit\Framework\TestCase; @@ -56,8 +56,8 @@ class ACLFormatterTest extends TestCase { return [ 'normal' => [ - 'input' => '<1><2><3><' . Group::FOLLOWERS . '><' . Group::MUTUALS . '>', - 'assert' => ['1', '2', '3', Group::FOLLOWERS, Group::MUTUALS], + 'input' => '<1><2><3><' . Circle::FOLLOWERS . '><' . Circle::MUTUALS . '>', + 'assert' => ['1', '2', '3', Circle::FOLLOWERS, Circle::MUTUALS], ], 'nigNumber' => [ 'input' => '<1><' . PHP_INT_MAX . '><15>', @@ -128,12 +128,12 @@ class ACLFormatterTest extends TestCase $aclFormatter = new ACLFormatter(); $allow_people = $aclFormatter->expand(); - $allow_groups = $aclFormatter->expand(); + $allow_circles = $aclFormatter->expand(); self::assertEmpty($aclFormatter->expand(null)); self::assertEmpty($aclFormatter->expand()); - $recipients = array_unique(array_merge($allow_people, $allow_groups)); + $recipients = array_unique(array_merge($allow_people, $allow_circles)); self::assertEmpty($recipients); } @@ -165,13 +165,13 @@ class ACLFormatterTest extends TestCase 'input' => ["<40195>"], 'assert' => "<40195>", ], - Group::FOLLOWERS => [ - 'input' => [Group::FOLLOWERS, 1], - 'assert' => '<' . Group::FOLLOWERS . '><1>', + Circle::FOLLOWERS => [ + 'input' => [Circle::FOLLOWERS, 1], + 'assert' => '<' . Circle::FOLLOWERS . '><1>', ], - Group::MUTUALS => [ - 'input' => [Group::MUTUALS, 1], - 'assert' => '<' . Group::MUTUALS . '><1>', + Circle::MUTUALS => [ + 'input' => [Circle::MUTUALS, 1], + 'assert' => '<' . Circle::MUTUALS . '><1>', ], 'wrong-angle-brackets' => [ 'input' => ["Reorder by dragging the field title.
\n" "\t\t\t\tEmpty the label field to remove a custom field.
\n" "\t\t\t\tNon-public fields can only be seen by the selected Friendica " -"contacts or the Friendica contacts in the selected groups.
" +"contacts or the Friendica contacts in the selected circles." msgstr "" #: src/Module/Settings/Profile/Photo/Crop.php:107 @@ -10580,22 +10580,22 @@ msgstr "" msgid "User '%s' already exists on this server!" msgstr "" -#: src/Module/User/Import.php:263 +#: src/Module/User/Import.php:267 msgid "User creation error" msgstr "" -#: src/Module/User/Import.php:312 +#: src/Module/User/Import.php:316 #, php-format msgid "%d contact not imported" msgid_plural "%d contacts not imported" msgstr[0] "" msgstr[1] "" -#: src/Module/User/Import.php:361 +#: src/Module/User/Import.php:365 msgid "User profile creation error" msgstr "" -#: src/Module/User/Import.php:412 +#: src/Module/User/Import.php:416 msgid "Done. You can now login with your username and password" msgstr "" @@ -10729,14 +10729,14 @@ msgid "" msgstr "" #: src/Module/Welcome.php:77 -msgid "Group Your Contacts" +msgid "Add Your Contacts To Circle" msgstr "" #: src/Module/Welcome.php:78 msgid "" "Once you have made some friends, organize them into private conversation " -"groups from the sidebar of your Contacts page and then you can interact with " -"each group privately on your Network page." +"circles from the sidebar of your Contacts page and then you can interact " +"with each circle privately on your Network page." msgstr "" #: src/Module/Welcome.php:80 diff --git a/view/templates/acl/full_selector.tpl b/view/templates/acl/full_selector.tpl index a2329614eb..fe8c856f15 100644 --- a/view/templates/acl/full_selector.tpl +++ b/view/templates/acl/full_selector.tpl @@ -41,9 +41,9 @@ {{$custom_title}}