Add user meta-groups for followers and mutual contacts

- Both Group::expand and Item::enumeratePermissions now have a user id parameter to expand meta-groups
This commit is contained in:
Hypolite Petovan 2019-07-14 21:48:35 -04:00
parent c6a806b9e1
commit 0579252362
7 changed files with 89 additions and 31 deletions

View file

@ -16,9 +16,25 @@ use Friendica\Database\DBA;
*/
class Group extends BaseObject
{
const FOLLOWERS = '~';
const MUTUALS = '&';
public static function getByUserId($uid, $includesDeleted = false)
{
$DB = self::getApp()->getDatabase();
$conditions = ['uid' => $uid];
if (!$includesDeleted) {
$conditions['deleted'] = false;
}
$groupsStmt = $DB->select('group', [], $conditions);
return $DB->toArray($groupsStmt);
}
/**
*
*
* @param int $group_id
* @return bool
* @throws \Exception
@ -300,20 +316,43 @@ class Group extends BaseObject
/**
* @brief Returns the combined list of contact ids from a group id list
*
* @param int $uid
* @param array $group_ids
* @param boolean $check_dead
* @return array
* @throws \Exception
*/
public static function expand($group_ids, $check_dead = false)
public static function expand($uid, array $group_ids, $check_dead = false)
{
if (!is_array($group_ids) || !count($group_ids)) {
return [];
}
$stmt = DBA::select('group_member', ['contact-id'], ['gid' => $group_ids]);
$return = [];
$key = array_search(self::FOLLOWERS, $group_ids);
if ($key !== false) {
$followersStmt = Contact::select(['id'], ['uid' => $uid, 'rel' => [Contact::FOLLOWER, Contact::FRIEND]]);
while($follower = DBA::fetch($followersStmt)) {
$return[] = $follower['id'];
}
unset($group_ids[$key]);
}
$key = array_search(self::MUTUALS, $group_ids);
if ($key !== false) {
$mutualsStmt = Contact::select(['id'], ['uid' => $uid, 'rel' => [Contact::FRIEND]]);
while($mutual = DBA::fetch($mutualsStmt)) {
$return[] = $mutual['id'];
}
unset($group_ids[$key]);
}
$stmt = DBA::select('group_member', ['contact-id'], ['gid' => $group_ids]);
while($group_member = DBA::fetch($stmt)) {
$return[] = $group_member['contact-id'];
}
@ -332,7 +371,7 @@ class Group extends BaseObject
* @param int $gid An optional pre-selected group
* @param string $label An optional label of the list
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \Exception
*/
public static function displayGroupSelection($uid, $gid = 0, $label = '')
{
@ -377,7 +416,7 @@ class Group extends BaseObject
* @param string $group_id
* @param int $cid
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \Exception
*/
public static function sidebarWidget($every = 'contact', $each = 'group', $editmode = 'standard', $group_id = '', $cid = 0)
{

View file

@ -2799,12 +2799,12 @@ class Item extends BaseObject
*/
if (self::hasPermissions($photo)) {
if ($cid) {
$recips = self::enumeratePermissions($photo);
$recips = self::enumeratePermissions($uid, $photo);
if (in_array($cid, $recips)) {
$replace = true;
}
} elseif ($item) {
if (self::samePermissions($item, $photo)) {
if (self::samePermissions($uid, $item, $photo)) {
$replace = true;
}
}
@ -2854,7 +2854,7 @@ class Item extends BaseObject
!empty($obj['deny_cid']) || !empty($obj['deny_gid']);
}
private static function samePermissions($obj1, $obj2)
private static function samePermissions($uid, $obj1, $obj2)
{
// first part is easy. Check that these are exactly the same.
if (($obj1['allow_cid'] == $obj2['allow_cid'])
@ -2865,8 +2865,8 @@ class Item extends BaseObject
}
// This is harder. Parse all the permissions and compare the resulting set.
$recipients1 = self::enumeratePermissions($obj1);
$recipients2 = self::enumeratePermissions($obj2);
$recipients1 = self::enumeratePermissions($uid, $obj1);
$recipients2 = self::enumeratePermissions($uid, $obj2);
sort($recipients1);
sort($recipients2);
@ -2875,12 +2875,12 @@ class Item extends BaseObject
}
// returns an array of contact-ids that are allowed to see this object
public static function enumeratePermissions($obj)
public static function enumeratePermissions($uid, array $obj)
{
$allow_people = expand_acl($obj['allow_cid']);
$allow_groups = Group::expand(expand_acl($obj['allow_gid']));
$allow_groups = Group::expand($uid, expand_acl($obj['allow_gid']));
$deny_people = expand_acl($obj['deny_cid']);
$deny_groups = Group::expand(expand_acl($obj['deny_gid']));
$deny_groups = Group::expand($uid, expand_acl($obj['deny_gid']));
$recipients = array_unique(array_merge($allow_people, $allow_groups));
$deny = array_unique(array_merge($deny_people, $deny_groups));
$recipients = array_diff($recipients, $deny);