<?php
/**
- * @copyright Copyright (C) 2010-2022, the Friendica project
+ * @copyright Copyright (C) 2010-2024, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
namespace Friendica\Module;
use Friendica\Core\Hook;
+use Friendica\Core\Protocol;
+use Friendica\Core\System;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\APContact;
-use Friendica\Model\Group;
+use Friendica\Model\Circle;
+use Friendica\Model\Item;
use Friendica\Model\Post;
use Friendica\Model\Tag;
use Friendica\Model\User;
use Friendica\Network\HTTPException;
-use Friendica\Protocol\ActivityPub;
/**
* Outputs the permission tooltip HTML content for the provided item, photo or event id.
throw new HTTPException\BadRequestException(DI::l10n()->t('Wrong type "%s", expected one of: %s', $type, implode(', ', $expectedTypes)));
}
- $condition = ['id' => $referenceId];
+ $condition = ['id' => $referenceId, 'uid' => [0, DI::userSession()->getLocalUserId()]];
if ($type == 'item') {
- $fields = ['uid', 'psid', 'private', 'uri-id'];
- $model = Post::selectFirst($fields, $condition);
+ $fields = ['uid', 'psid', 'private', 'uri-id', 'origin', 'network'];
+ $model = Post::selectFirst($fields, $condition, ['order' => ['uid' => true]]);
+
+ if ($model['origin'] || ($model['network'] != Protocol::ACTIVITYPUB)) {
+ $permissionSet = DI::permissionSet()->selectOneById($model['psid'], $model['uid']);
+ $model['allow_cid'] = $permissionSet->allow_cid;
+ $model['allow_gid'] = $permissionSet->allow_gid;
+ $model['deny_cid'] = $permissionSet->deny_cid;
+ $model['deny_gid'] = $permissionSet->deny_gid;
+ } else {
+ $model['allow_cid'] = [];
+ $model['allow_gid'] = [];
+ $model['deny_cid'] = [];
+ $model['deny_gid'] = [];
+ }
} else {
$fields = ['uid', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid'];
$model = DBA::selectFirst($type, $fields, $condition);
throw new HttpException\NotFoundException(DI::l10n()->t('Model not found'));
}
- if (isset($model['psid'])) {
- $permissionSet = DI::permissionSet()->selectOneById($model['psid'], $model['uid']);
- $model['allow_cid'] = $permissionSet->allow_cid;
- $model['allow_gid'] = $permissionSet->allow_gid;
- $model['deny_cid'] = $permissionSet->deny_cid;
- $model['deny_gid'] = $permissionSet->deny_gid;
- }
-
- // Kept for backwards compatiblity
+ // Kept for backwards compatibility
Hook::callAll('lockview_content', $model);
if ($type == 'item') {
$receivers = $this->fetchReceivers($model['uri-id']);
+ if (empty($receivers)) {
+ switch ($model['private']) {
+ case Item::PUBLIC:
+ $receivers = DI::l10n()->t('Public');
+ break;
+
+ case Item::UNLISTED:
+ $receivers = DI::l10n()->t('Unlisted');
+ break;
+
+ case Item::PRIVATE:
+ $receivers = DI::l10n()->t('Limited/Private');
+ break;
+ }
+ }
} else {
$receivers = '';
}
- if ($model['uid'] != local_user() ||
- empty($model['allow_cid'])
+ if (empty($model['allow_cid'])
&& empty($model['allow_gid'])
&& empty($model['deny_cid'])
&& empty($model['deny_gid'])
exit;
}
- $allowed_users = $model['allow_cid'];
- $allowed_groups = $model['allow_gid'];
- $deny_users = $model['deny_cid'];
- $deny_groups = $model['deny_gid'];
+ if (!empty($model['allow_cid']) || !empty($model['allow_gid']) || !empty($model['deny_cid']) || !empty($model['deny_gid'])) {
+ $receivers = $this->fetchReceiversFromACL($model);
+ }
+
+ $this->httpExit(DI::l10n()->t('Visible to:') . '<br />' . $receivers);
+ }
+
+ /**
+ * Fetch a list of receivers based on the ACL data
+ *
+ * @param array $model
+ * @return string
+ */
+ private function fetchReceiversFromACL(array $model)
+ {
+ $allowed_users = $model['allow_cid'];
+ $allowed_circles = $model['allow_gid'];
+ $deny_users = $model['deny_cid'];
+ $deny_circles = $model['deny_gid'];
- $o = DI::l10n()->t('Visible to:') . '<br />';
$l = [];
- if (count($allowed_groups)) {
- $key = array_search(Group::FOLLOWERS, $allowed_groups);
+ if (count($allowed_circles)) {
+ $key = array_search(Circle::FOLLOWERS, $allowed_circles);
if ($key !== false) {
$l[] = '<b>' . DI::l10n()->t('Followers') . '</b>';
- unset($allowed_groups[$key]);
+ unset($allowed_circles[$key]);
}
- $key = array_search(Group::MUTUALS, $allowed_groups);
+ $key = array_search(Circle::MUTUALS, $allowed_circles);
if ($key !== false) {
$l[] = '<b>' . DI::l10n()->t('Mutuals') . '</b>';
- unset($allowed_groups[$key]);
+ unset($allowed_circles[$key]);
}
- foreach (DI::dba()->selectToArray('group', ['name'], ['id' => $allowed_groups]) as $group) {
- $l[] = '<b>' . $group['name'] . '</b>';
+ foreach (DI::dba()->selectToArray('group', ['name'], ['id' => $allowed_circles]) as $circle) {
+ $l[] = '<b>' . $circle['name'] . '</b>';
}
}
$l[] = $contact['name'];
}
- if (count($deny_groups)) {
- $key = array_search(Group::FOLLOWERS, $deny_groups);
+ if (count($deny_circles)) {
+ $key = array_search(Circle::FOLLOWERS, $deny_circles);
if ($key !== false) {
$l[] = '<b><strike>' . DI::l10n()->t('Followers') . '</strike></b>';
- unset($deny_groups[$key]);
+ unset($deny_circles[$key]);
}
- $key = array_search(Group::MUTUALS, $deny_groups);
+ $key = array_search(Circle::MUTUALS, $deny_circles);
if ($key !== false) {
$l[] = '<b><strike>' . DI::l10n()->t('Mutuals') . '</strike></b>';
- unset($deny_groups[$key]);
+ unset($deny_circles[$key]);
}
- foreach (DI::dba()->selectToArray('group', ['name'], ['id' => $allowed_groups]) as $group) {
- $l[] = '<b><strike>' . $group['name'] . '</strike></b>';
+ foreach (DI::dba()->selectToArray('group', ['name'], ['id' => $allowed_circles]) as $circle) {
+ $l[] = '<b><strike>' . $circle['name'] . '</strike></b>';
}
}
$l[] = '<strike>' . $contact['name'] . '</strike>';
}
- if (!empty($l)) {
- echo $o . implode(', ', $l);
- } else {
- echo $o . $receivers;
- }
-
- exit();
+ return implode(', ', $l);
}
/**
* Fetch a list of receivers
*
* @param int $uriId
- * @return string
+ * @return string
*/
- private function fetchReceivers(int $uriId):string
+ private function fetchReceivers(int $uriId): string
{
$own_url = '';
- $uid = local_user();
+ $uid = DI::userSession()->getLocalUserId();
if ($uid) {
$owner = User::getOwnerDataById($uid);
if (!empty($owner['url'])) {
}
$receivers = [];
- foreach (Tag::getByURIId($uriId, [Tag::TO, Tag::CC, Tag::BCC]) as $receiver) {
+ foreach (Tag::getByURIId($uriId, [Tag::TO, Tag::CC, Tag::BCC, Tag::AUDIENCE, Tag::ATTRIBUTED]) as $receiver) {
// We only display BCC when it contains the current user
if (($receiver['type'] == Tag::BCC) && ($receiver['url'] != $own_url)) {
continue;
}
- if ($receiver['url'] == ActivityPub::PUBLIC_COLLECTION) {
- $receivers[$receiver['type']][] = DI::l10n()->t('Public');
- } else {
- $apcontact = DBA::selectFirst('apcontact', ['name'], ['followers' => $receiver['url']]);
- if (!empty($apcontact['name'])) {
- $receivers[$receiver['type']][] = DI::l10n()->t('Followers (%s)', $apcontact['name']);
- } elseif ($apcontact = APContact::getByURL($receiver['url'], false)) {
- $receivers[$receiver['type']][] = $apcontact['name'];
- } else {
+ switch (Tag::getTargetType($receiver['url'], false)) {
+ case Tag::PUBLIC_COLLECTION:
+ $receivers[$receiver['type']][] = DI::l10n()->t('Public');
+ break;
+ case Tag::GENERAL_COLLECTION:
+ $receivers[$receiver['type']][] = DI::l10n()->t('Collection (%s)', $receiver['name']);
+ break;
+ case Tag::FOLLOWER_COLLECTION:
+ $apcontact = DBA::selectFirst('apcontact', ['name'], ['followers' => $receiver['url']]);
+ $receivers[$receiver['type']][] = DI::l10n()->t('Followers (%s)', $apcontact['name'] ?? $receiver['name']);
+ break;
+ case Tag::ACCOUNT:
+ $apcontact = APContact::getByURL($receiver['url'], false);
+ $receivers[$receiver['type']][] = $apcontact['name'] ?? $receiver['name'];
+ break;
+ default:
$receivers[$receiver['type']][] = $receiver['name'];
- }
+ break;
}
}
case Tag::BCC:
$output .= DI::l10n()->t('<b>BCC:</b> %s<br>', implode(', ', $receiver));
break;
+ case Tag::AUDIENCE:
+ $output .= DI::l10n()->t('<b>Audience:</b> %s<br>', implode(', ', $receiver));
+ break;
+ case Tag::ATTRIBUTED:
+ $output .= DI::l10n()->t('<b>Attributed To:</b> %s<br>', implode(', ', $receiver));
+ break;
}
}