From 8983dcaa7783aea1f25bb78a1efb6defc84554f5 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 23 Sep 2017 14:48:27 +0000 Subject: [PATCH] Improvements for following/unfollowing of Diaspora and OStatus --- include/diaspora.php | 15 ++++++++------- include/follow.php | 14 +++++--------- mod/contacts.php | 11 ++++++++++- mod/unfollow.php | 2 +- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 63958f30bf..bc3541183d 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -2018,7 +2018,7 @@ class Diaspora { $a = get_app(); - if ($contact["rel"] == CONTACT_IS_FOLLOWER && in_array($importer["page-flags"], array(PAGE_FREELOVE))) { + if ($contact["rel"] == CONTACT_IS_SHARING) { dba::update('contact', array('rel' => CONTACT_IS_FRIEND, 'writable' => true), array('id' => $contact["id"], 'uid' => $importer["uid"])); } @@ -2129,8 +2129,8 @@ class Diaspora { // perhaps we were already sharing with this person. Now they're sharing with us. // That makes us friends. if ($contact) { - if ($following && $sharing) { - logger("Author ".$author." (Contact ".$contact["id"].") wants to have a bidirectional conection.", LOGGER_DEBUG); + if ($following) { + logger("Author ".$author." (Contact ".$contact["id"].") wants to follow us.", LOGGER_DEBUG); self::receive_request_make_friend($importer, $contact); // refetch the contact array @@ -2138,7 +2138,7 @@ class Diaspora { // If we are now friends, we are sending a share message. // Normally we needn't to do so, but the first message could have been vanished. - if (in_array($contact["rel"], array(CONTACT_IS_FRIEND, CONTACT_IS_FOLLOWER))) { + if (in_array($contact["rel"], array(CONTACT_IS_FRIEND))) { $u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer["uid"])); if ($u) { logger("Sending share message to author ".$author." - Contact: ".$contact["id"]." - User: ".$importer["uid"], LOGGER_DEBUG); @@ -2146,9 +2146,10 @@ class Diaspora { } } return true; - } else { /// @todo Handle all possible variations of adding and retracting of permissions - logger("Author ".$author." (Contact ".$contact["id"].") wants to change the relationship: Following: ".$following." - sharing: ".$sharing. "(By now unsupported)", LOGGER_DEBUG); - return false; + } else { + logger("Author ".$author." doesn't want to follow us anymore.", LOGGER_DEBUG); + lose_follower($importer, $contact); + return true; } } diff --git a/include/follow.php b/include/follow.php index 48e23bff62..cac713b12f 100644 --- a/include/follow.php +++ b/include/follow.php @@ -187,14 +187,10 @@ function new_contact($uid,$url,$interactive = false) { if (dbm::is_result($r)) { // update contact - if ($r[0]['rel'] == CONTACT_IS_FOLLOWER || ($network === NETWORK_DIASPORA && $r[0]['rel'] == CONTACT_IS_SHARING)) { - q("UPDATE `contact` SET `rel` = %d , `subhub` = %d, `readonly` = 0 WHERE `id` = %d AND `uid` = %d", - intval(CONTACT_IS_FRIEND), - intval($subhub), - intval($r[0]['id']), - intval($uid) - ); - } + $new_relation = (($r[0]['rel'] == CONTACT_IS_FOLLOWER) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING); + + $fields = array('rel' => $new_relation, 'subhub' => $subhub, 'readonly' => false); + dba::update('contact', $fields, array('id' => $r[0]['id'])); } else { // check service class limits @@ -222,7 +218,7 @@ function new_contact($uid,$url,$interactive = false) { return $result; } - $new_relation = ((in_array($ret['network'], array(NETWORK_MAIL, NETWORK_DIASPORA))) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING); + $new_relation = ((in_array($ret['network'], array(NETWORK_MAIL))) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING); // create contact record $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `name`, `nick`, `network`, `pubkey`, `rel`, `priority`, diff --git a/mod/contacts.php b/mod/contacts.php index 2539360552..eae4141bc9 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -348,7 +348,16 @@ function _contact_archive($contact_id, $orig_record) { function _contact_drop($contact_id, $orig_record) { $a = get_app(); - terminate_friendship($a->user,$a->contact,$orig_record); + $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` + WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", + intval($a->user['uid']) + ); + if (!dbm::is_result($r)) { + return; + } + + $self = ""; // Unused parameter + terminate_friendship($r[0], $self, $orig_record); contact_remove($orig_record['id']); } diff --git a/mod/unfollow.php b/mod/unfollow.php index d0baf87c44..8ee96a14c8 100644 --- a/mod/unfollow.php +++ b/mod/unfollow.php @@ -32,7 +32,7 @@ function unfollow_post(App $a) { if (!dbm::is_result($contact)) { notice(t("Contact wasn't found or can't be unfollowed.")); } else { - if (in_array($contact['network'], array(NETWORK_OSTATUS))) { + if (in_array($contact['network'], array(NETWORK_OSTATUS, NETWORK_DIASPORA))) { $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", intval($uid)