diff --git a/doc/Addons.md b/doc/Addons.md index 89c3c3d99a..ec82452d54 100644 --- a/doc/Addons.md +++ b/doc/Addons.md @@ -510,7 +510,6 @@ Called when unfollowing a remote contact on a non-native network (like Twitter) 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 diff --git a/include/api.php b/include/api.php index fe87799cc8..af9fe7736b 100644 --- a/include/api.php +++ b/include/api.php @@ -3826,10 +3826,8 @@ function api_friendships_destroy($type) 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']]); @@ -3840,7 +3838,7 @@ function api_friendships_destroy($type) 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'); } diff --git a/mod/unfollow.php b/mod/unfollow.php index a307c4d6e6..2dc9180dc9 100644 --- a/mod/unfollow.php +++ b/mod/unfollow.php @@ -137,13 +137,11 @@ function unfollow_process(string $url) // 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.'); @@ -157,7 +155,7 @@ function unfollow_process(string $url) $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'); } diff --git a/src/Core/Protocol.php b/src/Core/Protocol.php index bce6bc699c..66c74ccc91 100644 --- a/src/Core/Protocol.php +++ b/src/Core/Protocol.php @@ -207,12 +207,11 @@ class Protocol * * @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'); @@ -243,17 +242,12 @@ class Protocol } 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); @@ -265,6 +259,7 @@ class Protocol * 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 */ diff --git a/src/Model/Contact.php b/src/Model/Contact.php index bc8a6cbe7b..bfbeb90024 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -830,17 +830,17 @@ class Contact * 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']]); diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 3b253b85c1..4aebc4c93a 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -69,7 +69,8 @@ class Contact extends BaseModule $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; } @@ -79,7 +80,7 @@ class Contact extends BaseModule } if (!empty($_POST['contacts_batch_block'])) { - self::toggleBlockContact($cdata['public']); + self::toggleBlockContact($cdata['public'], local_user()); $count_actions++; } @@ -204,12 +205,13 @@ class Contact extends BaseModule * 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); } /** @@ -373,7 +375,7 @@ class Contact extends BaseModule 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')));