Hook data:
- **contact** (input): the remote contact (uid = local unfollowing user id) array.
-- **two_way** (input): wether to stop sharing with the remote contact as well.
- **result** (output): wether the unfollowing is successful or not.
### revoke_follow
throw new HTTPException\NotFoundException('Not following Contact');
}
- $dissolve = ($contact['rel'] == Contact::SHARING);
-
try {
- $result = Contact::terminateFriendship($owner, $contact, $dissolve);
+ $result = Contact::terminateFriendship($owner, $contact);
if ($result === null) {
Logger::notice(API_LOG_PREFIX . 'Not supported for {network}', ['module' => 'api', 'action' => 'friendships_destroy', 'network' => $contact['network']]);
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]);
+ Logger::error(API_LOG_PREFIX . $e->getMessage(), ['owner' => $owner, 'contact' => $contact]);
throw new HTTPException\InternalServerErrorException('Unable to unfollow this contact, please contact your administrator');
}
// NOTREACHED
}
- $dissolve = ($contact['rel'] == Contact::SHARING);
-
$notice_message = '';
$return_path = $base_return_path . '/' . $contact['id'];
try {
- $result = Contact::terminateFriendship($owner, $contact, $dissolve);
+ $result = Contact::terminateFriendship($owner, $contact);
if ($result === null) {
$notice_message = DI::l10n()->t('Unfollowing is currently not supported by this contact\'s network.');
$notice_message = DI::l10n()->t('Contact was successfully unfollowed');
}
} catch (Exception $e) {
- DI::logger()->error($e->getMessage(), ['owner' => $owner, 'contact' => $contact, 'dissolve' => $dissolve]);
+ DI::logger()->error($e->getMessage(), ['owner' => $owner, 'contact' => $contact]);
$notice_message = DI::l10n()->t('Unable to unfollow this contact, please contact your administrator');
}
*
* @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
+ public static function terminateFriendship(array $user, array $contact): bool
{
if (empty($contact['network'])) {
throw new \InvalidArgumentException('Missing network key in contact array');
} 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 hook for connector addons
$hook_data = [
'contact' => $contact,
- 'two_way' => $two_way,
'result' => null
];
Hook::callAll('unfollow', $hook_data);
* Revoke an incoming follow from the provided contact
*
* @param array $contact Private contact (uid != 0) array
+ * @return bool|null true if successful, false if not, null if no action was performed
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
* 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 array $contact Contact (uid != 0) 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
+ public static function terminateFriendship(array $user, array $contact): bool
{
- $result = Protocol::terminateFriendship($user, $contact, $two_way);
+ $result = Protocol::terminateFriendship($user, $contact);
- if ($two_way || in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) {
+ if ($contact['rel'] == Contact::SHARING || in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) {
self::remove($contact['id']);
} else {
self::update(['rel' => Contact::FOLLOWER], ['id' => $contact['id']]);
$count_actions = 0;
foreach ($orig_records as $orig_record) {
$cdata = Model\Contact::getPublicAndUserContactID($orig_record['id'], local_user());
- if (empty($cdata)) {
+ if (empty($cdata) || public_contact() === $cdata['public']) {
+ // No action available on your own contact
continue;
}
}
if (!empty($_POST['contacts_batch_block'])) {
- self::toggleBlockContact($cdata['public']);
+ self::toggleBlockContact($cdata['public'], local_user());
$count_actions++;
}
* Toggles the blocked status of a contact identified by id.
*
* @param int $contact_id Id of the contact with uid = 0
+ * @param int $owner_id Id of the user we want to block the contact for
* @throws \Exception
*/
- private static function toggleBlockContact(int $contact_id)
+ private static function toggleBlockContact(int $contact_id, int $owner_id)
{
- $blocked = !Model\Contact\User::isBlocked($contact_id, local_user());
- Model\Contact\User::setBlocked($contact_id, local_user(), $blocked);
+ $blocked = !Model\Contact\User::isBlocked($contact_id, $owner_id);
+ Model\Contact\User::setBlocked($contact_id, $owner_id, $blocked);
}
/**
throw new BadRequestException(DI::l10n()->t('You can\'t block yourself'));
}
- self::toggleBlockContact($cdata['public']);
+ self::toggleBlockContact($cdata['public'], local_user());
$blocked = Model\Contact\User::isBlocked($contact_id, local_user());
info(($blocked ? DI::l10n()->t('Contact has been blocked') : DI::l10n()->t('Contact has been unblocked')));