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:
parent
c6a806b9e1
commit
0579252362
|
@ -4,11 +4,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Friendica\App;
|
use Friendica\App;
|
||||||
use Friendica\Content\Smilies;
|
|
||||||
use Friendica\Content\Text\BBCode;
|
use Friendica\Content\Text\BBCode;
|
||||||
use Friendica\Core\Protocol;
|
use Friendica\Core\Protocol;
|
||||||
use Friendica\Model\Contact;
|
use Friendica\Model\Contact;
|
||||||
use Friendica\Model\FileTag;
|
use Friendica\Model\FileTag;
|
||||||
|
use Friendica\Model\Group;
|
||||||
use Friendica\Util\Strings;
|
use Friendica\Util\Strings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -20,18 +20,9 @@ use Friendica\Util\Strings;
|
||||||
function expand_acl($s) {
|
function expand_acl($s) {
|
||||||
// turn string array of angle-bracketed elements into numeric array
|
// turn string array of angle-bracketed elements into numeric array
|
||||||
// e.g. "<1><2><3>" => array(1,2,3);
|
// e.g. "<1><2><3>" => array(1,2,3);
|
||||||
$ret = [];
|
preg_match_all('/<(' . Group::FOLLOWERS . '|'. Group::MUTUALS . '|[0-9]+)>/', $s, $matches, PREG_PATTERN_ORDER);
|
||||||
|
|
||||||
if (strlen($s)) {
|
return $matches[1];
|
||||||
$t = str_replace('<', '', $s);
|
|
||||||
$a = explode('>', $t);
|
|
||||||
foreach ($a as $aa) {
|
|
||||||
if (intval($aa)) {
|
|
||||||
$ret[] = intval($aa);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,6 +33,8 @@ function expand_acl($s) {
|
||||||
function sanitise_acl(&$item) {
|
function sanitise_acl(&$item) {
|
||||||
if (intval($item)) {
|
if (intval($item)) {
|
||||||
$item = '<' . intval(Strings::escapeTags(trim($item))) . '>';
|
$item = '<' . intval(Strings::escapeTags(trim($item))) . '>';
|
||||||
|
} elseif (in_array($item, [Group::FOLLOWERS, Group::MUTUALS])) {
|
||||||
|
$item = '<' . $item . '>';
|
||||||
} else {
|
} else {
|
||||||
unset($item);
|
unset($item);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ use Friendica\App;
|
||||||
use Friendica\Core\Hook;
|
use Friendica\Core\Hook;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
|
use Friendica\Model\Group;
|
||||||
use Friendica\Model\Item;
|
use Friendica\Model\Item;
|
||||||
|
|
||||||
function lockview_content(App $a)
|
function lockview_content(App $a)
|
||||||
|
@ -67,6 +68,19 @@ function lockview_content(App $a)
|
||||||
$l = [];
|
$l = [];
|
||||||
|
|
||||||
if (count($allowed_groups)) {
|
if (count($allowed_groups)) {
|
||||||
|
$key = array_search(Group::FOLLOWERS, $allowed_groups);
|
||||||
|
if ($key !== false) {
|
||||||
|
$l[] = '<b>' . L10n::t('Followers') . '</b>';
|
||||||
|
unset($allowed_groups[$key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = array_search(Group::MUTUALS, $allowed_groups);
|
||||||
|
if ($key !== false) {
|
||||||
|
$l[] = '<b>' . L10n::t('Mutuals') . '</b>';
|
||||||
|
unset($allowed_groups[$key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$r = q("SELECT `name` FROM `group` WHERE `id` IN ( %s )",
|
$r = q("SELECT `name` FROM `group` WHERE `id` IN ( %s )",
|
||||||
DBA::escape(implode(', ', $allowed_groups))
|
DBA::escape(implode(', ', $allowed_groups))
|
||||||
);
|
);
|
||||||
|
@ -89,6 +103,18 @@ function lockview_content(App $a)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count($deny_groups)) {
|
if (count($deny_groups)) {
|
||||||
|
$key = array_search(Group::FOLLOWERS, $deny_groups);
|
||||||
|
if ($key !== false) {
|
||||||
|
$l[] = '<b><strike>' . L10n::t('Followers') . '</strike></b>';
|
||||||
|
unset($deny_groups[$key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = array_search(Group::MUTUALS, $deny_groups);
|
||||||
|
if ($key !== false) {
|
||||||
|
$l[] = '<b><strike>' . L10n::t('Mutuals') . '</strike></b>';
|
||||||
|
unset($deny_groups[$key]);
|
||||||
|
}
|
||||||
|
|
||||||
$r = q("SELECT `name` FROM `group` WHERE `id` IN ( %s )",
|
$r = q("SELECT `name` FROM `group` WHERE `id` IN ( %s )",
|
||||||
DBA::escape(implode(', ', $deny_groups))
|
DBA::escape(implode(', ', $deny_groups))
|
||||||
);
|
);
|
||||||
|
|
|
@ -643,7 +643,7 @@ function networkThreadedView(App $a, $update, $parent)
|
||||||
// NOTREACHED
|
// NOTREACHED
|
||||||
}
|
}
|
||||||
|
|
||||||
$contacts = Group::expand([$gid]);
|
$contacts = Group::expand(local_user(), [$gid]);
|
||||||
|
|
||||||
if ((is_array($contacts)) && count($contacts)) {
|
if ((is_array($contacts)) && count($contacts)) {
|
||||||
$contact_str_self = '';
|
$contact_str_self = '';
|
||||||
|
|
|
@ -16,9 +16,25 @@ use Friendica\Database\DBA;
|
||||||
*/
|
*/
|
||||||
class Group extends BaseObject
|
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
|
* @param int $group_id
|
||||||
* @return bool
|
* @return bool
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
|
@ -300,20 +316,43 @@ class Group extends BaseObject
|
||||||
/**
|
/**
|
||||||
* @brief Returns the combined list of contact ids from a group id list
|
* @brief Returns the combined list of contact ids from a group id list
|
||||||
*
|
*
|
||||||
|
* @param int $uid
|
||||||
* @param array $group_ids
|
* @param array $group_ids
|
||||||
* @param boolean $check_dead
|
* @param boolean $check_dead
|
||||||
* @return array
|
* @return array
|
||||||
* @throws \Exception
|
* @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)) {
|
if (!is_array($group_ids) || !count($group_ids)) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
$stmt = DBA::select('group_member', ['contact-id'], ['gid' => $group_ids]);
|
|
||||||
|
|
||||||
$return = [];
|
$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)) {
|
while($group_member = DBA::fetch($stmt)) {
|
||||||
$return[] = $group_member['contact-id'];
|
$return[] = $group_member['contact-id'];
|
||||||
}
|
}
|
||||||
|
@ -332,7 +371,7 @@ class Group extends BaseObject
|
||||||
* @param int $gid An optional pre-selected group
|
* @param int $gid An optional pre-selected group
|
||||||
* @param string $label An optional label of the list
|
* @param string $label An optional label of the list
|
||||||
* @return string
|
* @return string
|
||||||
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public static function displayGroupSelection($uid, $gid = 0, $label = '')
|
public static function displayGroupSelection($uid, $gid = 0, $label = '')
|
||||||
{
|
{
|
||||||
|
@ -377,7 +416,7 @@ class Group extends BaseObject
|
||||||
* @param string $group_id
|
* @param string $group_id
|
||||||
* @param int $cid
|
* @param int $cid
|
||||||
* @return string
|
* @return string
|
||||||
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public static function sidebarWidget($every = 'contact', $each = 'group', $editmode = 'standard', $group_id = '', $cid = 0)
|
public static function sidebarWidget($every = 'contact', $each = 'group', $editmode = 'standard', $group_id = '', $cid = 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2799,12 +2799,12 @@ class Item extends BaseObject
|
||||||
*/
|
*/
|
||||||
if (self::hasPermissions($photo)) {
|
if (self::hasPermissions($photo)) {
|
||||||
if ($cid) {
|
if ($cid) {
|
||||||
$recips = self::enumeratePermissions($photo);
|
$recips = self::enumeratePermissions($uid, $photo);
|
||||||
if (in_array($cid, $recips)) {
|
if (in_array($cid, $recips)) {
|
||||||
$replace = true;
|
$replace = true;
|
||||||
}
|
}
|
||||||
} elseif ($item) {
|
} elseif ($item) {
|
||||||
if (self::samePermissions($item, $photo)) {
|
if (self::samePermissions($uid, $item, $photo)) {
|
||||||
$replace = true;
|
$replace = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2854,7 +2854,7 @@ class Item extends BaseObject
|
||||||
!empty($obj['deny_cid']) || !empty($obj['deny_gid']);
|
!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.
|
// first part is easy. Check that these are exactly the same.
|
||||||
if (($obj1['allow_cid'] == $obj2['allow_cid'])
|
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.
|
// This is harder. Parse all the permissions and compare the resulting set.
|
||||||
$recipients1 = self::enumeratePermissions($obj1);
|
$recipients1 = self::enumeratePermissions($uid, $obj1);
|
||||||
$recipients2 = self::enumeratePermissions($obj2);
|
$recipients2 = self::enumeratePermissions($uid, $obj2);
|
||||||
sort($recipients1);
|
sort($recipients1);
|
||||||
sort($recipients2);
|
sort($recipients2);
|
||||||
|
|
||||||
|
@ -2875,12 +2875,12 @@ class Item extends BaseObject
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns an array of contact-ids that are allowed to see this object
|
// 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_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_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));
|
$recipients = array_unique(array_merge($allow_people, $allow_groups));
|
||||||
$deny = array_unique(array_merge($deny_people, $deny_groups));
|
$deny = array_unique(array_merge($deny_people, $deny_groups));
|
||||||
$recipients = array_diff($recipients, $deny);
|
$recipients = array_diff($recipients, $deny);
|
||||||
|
|
|
@ -386,7 +386,7 @@ class Transmitter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$receiver_list = Item::enumeratePermissions($item);
|
$receiver_list = Item::enumeratePermissions($item['uid'], $item);
|
||||||
|
|
||||||
foreach ($terms as $term) {
|
foreach ($terms as $term) {
|
||||||
$cid = Contact::getIdForURL($term['url'], $item['uid']);
|
$cid = Contact::getIdForURL($term['url'], $item['uid']);
|
||||||
|
|
|
@ -271,9 +271,9 @@ class Notifier
|
||||||
}
|
}
|
||||||
|
|
||||||
$allow_people = expand_acl($parent['allow_cid']);
|
$allow_people = expand_acl($parent['allow_cid']);
|
||||||
$allow_groups = Group::expand(expand_acl($parent['allow_gid']),true);
|
$allow_groups = Group::expand($uid, expand_acl($parent['allow_gid']),true);
|
||||||
$deny_people = expand_acl($parent['deny_cid']);
|
$deny_people = expand_acl($parent['deny_cid']);
|
||||||
$deny_groups = Group::expand(expand_acl($parent['deny_gid']));
|
$deny_groups = Group::expand($uid, expand_acl($parent['deny_gid']));
|
||||||
|
|
||||||
// if our parent is a public forum (forum_mode == 1), uplink to the origional author causing
|
// if our parent is a public forum (forum_mode == 1), uplink to the origional author causing
|
||||||
// a delivery fork. private groups (forum_mode == 2) do not uplink
|
// a delivery fork. private groups (forum_mode == 2) do not uplink
|
||||||
|
|
Loading…
Reference in New Issue
Block a user