]> git.mxchange.org Git - friendica.git/commitdiff
DFRN: The relationship between contacts can now be changed afterwards
authorMichael <heluecht@pirati.ca>
Fri, 16 Mar 2018 06:43:10 +0000 (06:43 +0000)
committerMichael <heluecht@pirati.ca>
Fri, 16 Mar 2018 06:43:10 +0000 (06:43 +0000)
mod/contacts.php
mod/follow.php
mod/unfollow.php
src/Model/Contact.php

index 09090e541a502e5254c726f2ca070421051d1b72..0b57dbff18b893588cddb1437d5a7e88e273c375 100644 (file)
@@ -581,7 +581,7 @@ function contacts_content(App $a)
 
                $follow = '';
                $follow_text = '';
-               if (in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS])) {
+               if (in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS, NETWORK_DFRN])) {
                        if ($contact['rel'] == CONTACT_IS_FOLLOWER) {
                                $follow = System::baseUrl(true) . "/follow?url=" . urlencode($contact["url"]);
                                $follow_text = L10n::t("Connect/Follow");
index bb9bc0eb3b3ca80aefabcd2b58b3578146c1aa96..1dc20d16d114089eff2f665f8108b2b20e966607 100644 (file)
@@ -9,6 +9,7 @@ use Friendica\Core\System;
 use Friendica\Model\Contact;
 use Friendica\Model\Profile;
 use Friendica\Network\Probe;
+use Friendica\Database\DBM;
 
 function follow_post(App $a) {
 
@@ -60,19 +61,20 @@ function follow_content(App $a) {
 
        $submit = L10n::t('Submit Request');
 
-       // There is a current issue. It seems as if you can't start following a Friendica that is following you
-       // With Diaspora this works - but Friendica is special, it seems ...
-       $r = q("SELECT `url` FROM `contact` WHERE `uid` = %d AND ((`rel` != %d) OR (`network` = '%s')) AND
+       // Don't try to add a pending contact
+       $r = q("SELECT `pending` FROM `contact` WHERE `uid` = %d AND ((`rel` != %d) OR (`network` = '%s')) AND
                (`nurl` = '%s' OR `alias` = '%s' OR `alias` = '%s') AND
                `network` != '%s' LIMIT 1",
                intval(local_user()), dbesc(CONTACT_IS_FOLLOWER), dbesc(NETWORK_DFRN), dbesc(normalise_link($url)),
                dbesc(normalise_link($url)), dbesc($url), dbesc(NETWORK_STATUSNET));
 
        if ($r) {
-               notice(L10n::t('You already added this contact.').EOL);
-               $submit = "";
-               //goaway($_SESSION['return_url']);
-               // NOTREACHED
+               if ($r[0]['pending']) {
+                       notice(L10n::t('You already added this contact.').EOL);
+                       $submit = "";
+                       //goaway($_SESSION['return_url']);
+                       // NOTREACHED
+               }
        }
 
        $ret = Probe::uri($url);
@@ -102,7 +104,7 @@ function follow_content(App $a) {
                $ret["url"] = $ret["addr"];
        }
 
-       if ($ret['network'] === NETWORK_DFRN) {
+       if (($ret['network'] === NETWORK_DFRN) && !DBM::is_result($r)) {
                $request = $ret["request"];
                $tpl = get_markup_template('dfrn_request.tpl');
        } else {
index 8caf94245f33776f58710e46a221e7e970c0a0fc..a26557a9a2157339a9ca70a0e95eb4a5747ca067 100644 (file)
@@ -33,7 +33,7 @@ function unfollow_post(App $a)
        if (!DBM::is_result($contact)) {
                notice(L10n::t("Contact wasn't found or can't be unfollowed."));
        } else {
-               if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DIASPORA])) {
+               if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DIASPORA, NETWORK_DFRN])) {
                        $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)
@@ -75,7 +75,7 @@ function unfollow_content(App $a)
                // NOTREACHED
        }
 
-       if (!in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS])) {
+       if (!in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS, NETWORK_DFRN])) {
                notice(L10n::t("Unfollowing is currently not supported by your network.").EOL);
                $submit = "";
                // NOTREACHED
index fc27b0c41099aa606e757fe5cf4ba595b11137fc..f05335cbaac64c0b529f535dd7a04aff5c20123c 100644 (file)
@@ -173,20 +173,20 @@ class Contact extends BaseObject
         */
        public static function terminateFriendship(array $user, array $contact)
        {
-               if ($contact['network'] === NETWORK_OSTATUS) {
+               if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DFRN])) {
                        // create an unfollow slap
                        $item = [];
                        $item['verb'] = NAMESPACE_OSTATUS . "/unfollow";
                        $item['follow'] = $contact["url"];
                        $slap = OStatus::salmon($item, $user);
 
-                       if ((x($contact, 'notify')) && (strlen($contact['notify']))) {
+                       if (!empty($contact['notify'])) {
                                Salmon::slapper($user, $contact['notify'], $slap);
                        }
-               } elseif ($contact['network'] === NETWORK_DIASPORA) {
+               } elseif ($contact['network'] == NETWORK_DIASPORA) {
                        Diaspora::sendUnshare($user, $contact);
-               } elseif ($contact['network'] === NETWORK_DFRN) {
-                       DFRN::deliver($user, $contact, 'placeholder', 1);
+               //} elseif ($contact['network'] === NETWORK_DFRN) {
+               //      DFRN::deliver($user, $contact, 'placeholder', 1);
                }
        }
 
@@ -1168,7 +1168,26 @@ class Contact extends BaseObject
                        return result;
                }
 
-               if ($ret['network'] === NETWORK_DFRN) {
+               // check if we already have a contact
+               // the poll url is more reliable than the profile url, as we may have
+               // indirect links or webfinger links
+
+               $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `poll` IN ('%s', '%s') AND `network` = '%s' AND NOT `pending` LIMIT 1",
+                       intval($uid),
+                       dbesc($ret['poll']),
+                       dbesc(normalise_link($ret['poll'])),
+                       dbesc($ret['network'])
+               );
+
+               if (!DBM::is_result($r)) {
+                       $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` = '%s' AND NOT `pending` LIMIT 1",
+                               intval($uid),
+                               dbesc(normalise_link($url)),
+                               dbesc($ret['network'])
+                       );
+               }
+
+               if (($ret['network'] === NETWORK_DFRN) && !DBM::is_result($r)) {
                        if ($interactive) {
                                if (strlen($a->path)) {
                                        $myaddr = bin2hex(System::baseUrl() . '/profile/' . $a->user['nickname']);
@@ -1180,7 +1199,7 @@ class Contact extends BaseObject
 
                                // NOTREACHED
                        }
-               } elseif (Config::get('system', 'dfrn_only')) {
+               } elseif (Config::get('system', 'dfrn_only') && ($ret['network'] != NETWORK_DFRN)) {
                        $result['message'] = L10n::t('This site is not configured to allow communications with other networks.') . EOL;
                        $result['message'] != L10n::t('No compatible communication protocols or feeds were discovered.') . EOL;
                        return $result;
@@ -1230,25 +1249,6 @@ class Contact extends BaseObject
                        $writeable = 1;
                }
 
-               // check if we already have a contact
-               // the poll url is more reliable than the profile url, as we may have
-               // indirect links or webfinger links
-
-               $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `poll` IN ('%s', '%s') AND `network` = '%s' LIMIT 1",
-                       intval($uid),
-                       dbesc($ret['poll']),
-                       dbesc(normalise_link($ret['poll'])),
-                       dbesc($ret['network'])
-               );
-
-               if (!DBM::is_result($r)) {
-                       $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` = '%s' LIMIT 1",
-                               intval($uid),
-                               dbesc(normalise_link($url)),
-                               dbesc($ret['network'])
-                       );
-               }
-
                if (DBM::is_result($r)) {
                        // update contact
                        $new_relation = (($r[0]['rel'] == CONTACT_IS_FOLLOWER) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING);
@@ -1309,16 +1309,16 @@ class Contact extends BaseObject
                );
 
                if (DBM::is_result($r)) {
-                       if (($contact['network'] == NETWORK_OSTATUS) && (strlen($contact['notify']))) {
+                       if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DFRN])) {
                                // create a follow slap
                                $item = [];
                                $item['verb'] = ACTIVITY_FOLLOW;
                                $item['follow'] = $contact["url"];
                                $slap = OStatus::salmon($item, $r[0]);
-                               Salmon::slapper($r[0], $contact['notify'], $slap);
-                       }
-
-                       if ($contact['network'] == NETWORK_DIASPORA) {
+                               if (!empty($contact['notify'])) {
+                                       Salmon::slapper($r[0], $contact['notify'], $slap);
+                               }
+                       } elseif ($contact['network'] == NETWORK_DIASPORA) {
                                $ret = Diaspora::sendShare($a->user, $contact);
                                logger('share returns: ' . $ret);
                        }