]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #4961 from annando/direct-dfrn
authorHypolite Petovan <mrpetovan@gmail.com>
Mon, 30 Apr 2018 18:06:35 +0000 (14:06 -0400)
committerGitHub <noreply@github.com>
Mon, 30 Apr 2018 18:06:35 +0000 (14:06 -0400)
Direct Relay is now working with DFRN as well

mod/_well_known.php
mod/dfrn_notify.php
src/Network/Probe.php
src/Protocol/DFRN.php
src/Protocol/Diaspora.php
src/Protocol/PortableContact.php
src/Worker/Delivery.php

index c5bee3fdad4b49280b6f9543353fbe5a5524df50..782dc7a1b145973eb2a1b061701f89c37ac17d80 100644 (file)
@@ -70,9 +70,11 @@ function wk_social_relay()
        }
 
        $relay = [
-               "subscribe" => $subscribe,
-               "scope" => $scope,
-               "tags" => $taglist
+               'subscribe' => $subscribe,
+               'scope' => $scope,
+               'tags' => $taglist,
+               'protocols' => ['diaspora' => System::baseUrl() . '/receive/public',
+                       'dfrn' => System::baseUrl() . '/dfrn_notify']
        ];
 
        header('Content-type: application/json; charset=utf-8');
index e2f0336db6e5e267c0f06016f03e3318c2857773..10a0a792a7715ce31630d4e26801eca260396a13 100644 (file)
@@ -208,7 +208,7 @@ function dfrn_dispatch_public($postdata)
        $contact = Contact::getDetailsByAddr($msg['author'], 0);
        if (!$contact) {
                logger('Contact not found for address ' . $msg['author']);
-               System::xmlExit(3, 'Contact not found');
+               System::xmlExit(3, 'Contact ' . $msg['author'] . ' not found');
        }
 
        // We now have some contact, so we fetch it
@@ -222,7 +222,7 @@ function dfrn_dispatch_public($postdata)
        // This should never fail
        if (!DBM::is_result($importer)) {
                logger('Contact not found for address ' . $msg['author']);
-               System::xmlExit(3, 'Contact not found');
+               System::xmlExit(3, 'Contact ' . $msg['author'] . ' not found');
        }
 
        logger('Importing post from ' . $msg['author'] . ' with the public envelope.', LOGGER_DEBUG);
@@ -246,7 +246,7 @@ function dfrn_dispatch_private($user, $postdata)
                $cid = Contact::getIdForURL($msg['author']);
                if (!$cid) {
                        logger('Contact not found for address ' . $msg['author']);
-                       System::xmlExit(3, 'Contact not found');
+                       System::xmlExit(3, 'Contact ' . $msg['author'] . ' not found');
                }
        }
 
@@ -259,7 +259,7 @@ function dfrn_dispatch_private($user, $postdata)
        // This should never fail
        if (!DBM::is_result($importer)) {
                logger('Contact not found for address ' . $msg['author']);
-               System::xmlExit(3, 'Contact not found');
+               System::xmlExit(3, 'Contact ' . $msg['author'] . ' not found');
        }
 
        // Set the user id. This is important if this is a public contact
index d14c623e864b7f6df93407f1fc52f21bbbd86ab5..6e7e21d1e90c36ac04d6587a63230813c29c7840 100644 (file)
@@ -444,6 +444,11 @@ class Probe
 
                                $old_fields = dba::selectFirst('contact', $fieldnames, $condition);
 
+                               // When the contact doesn't exist, the value "true" will trigger an insert
+                               if (!$old_fields) {
+                                       $old_fields = true;
+                               }
+
                                dba::update('contact', $fields, $condition, $old_fields);
                        }
                }
index ad7658a7641a8fc8737e94bb019bbf51e2461071..63bd2f83bc9ff3aedfb7b4a96392dd7891c76631 100644 (file)
@@ -1426,9 +1426,12 @@ class DFRN
                                Contact::markForArchival($contact);
                                return -22;
                        }
+                       $pubkey = $fcontact['pubkey'];
+               } else {
+                       $pubkey = '';
                }
 
-               $envelope = Diaspora::buildMessage($atom, $owner, $contact, $owner['uprvkey'], $fcontact['pubkey'], $public_batch);
+               $envelope = Diaspora::buildMessage($atom, $owner, $contact, $owner['uprvkey'], $pubkey, $public_batch);
 
                // Create the endpoint for public posts. This is some WIP and should later be added to the probing
                if ($public_batch && empty($contact["batch"])) {
index f4a649b51ccbe4de5740416d87965b64cd8a1edd..b25809a0e5f87552491ac75eb247d90b128c1049 100644 (file)
@@ -134,55 +134,58 @@ class Diaspora
         */
        private static function getRelayContact($server_url)
        {
-               $batch = $server_url . '/receive/public';
-
                $fields = ['batch', 'id', 'name', 'network', 'archive', 'blocked'];
 
                // Fetch the relay contact
-               $condition = ['uid' => 0, 'network' => NETWORK_DIASPORA, 'batch' => $batch,
+               $condition = ['uid' => 0, 'nurl' => normalise_link($server_url),
                        'contact-type' => ACCOUNT_TYPE_RELAY];
                $contact = dba::selectFirst('contact', $fields, $condition);
 
-               // If there is nothing found, we check if there is some unmarked relay
-               // This code segment can be removed before the release 2018-05
-               if (!DBM::is_result($contact)) {
-                       $condition = ['uid' => 0, 'network' => NETWORK_DIASPORA, 'batch' => $batch,
-                               'name' => 'relay', 'nick' => 'relay', 'url' => $server_url];
-                       $contact = dba::selectFirst('contact', $fields, $condition);
-
-                       if (DBM::is_result($contact)) {
-                               // Mark the relay account as a relay account
-                               $fields = ['contact-type' => ACCOUNT_TYPE_RELAY];
-                               dba::update('contact', $fields, ['id' => $contact['id']]);
-                       }
-               }
                if (DBM::is_result($contact)) {
                        if ($contact['archive'] || $contact['blocked']) {
                                return false;
                        }
                        return $contact;
                } else {
-                       $fields = ['uid' => 0, 'created' => DateTimeFormat::utcNow(),
-                               'name' => 'relay', 'nick' => 'relay',
-                               'url' => $server_url, 'nurl' => normalise_link($server_url),
-                               'batch' => $batch, 'network' => NETWORK_DIASPORA,
-                               'rel' => CONTACT_IS_FOLLOWER, 'blocked' => false,
-                               'contact-type' => ACCOUNT_TYPE_RELAY,
-                               'pending' => false, 'writable' => true];
-                       dba::insert('contact', $fields);
-
-                       $fields = ['batch', 'id', 'name', 'network'];
+                       self::setRelayContact($server_url);
+
                        $contact = dba::selectFirst('contact', $fields, $condition);
                        if (DBM::is_result($contact)) {
                                return $contact;
                        }
-
                }
 
                // It should never happen that we arrive here
                return [];
        }
 
+       /**
+        * @brief Update or insert a relay contact
+        *
+        * @param string $server_url The url of the server
+        * @param array $network_fields Optional network specific fields
+        */
+       public static function setRelayContact($server_url, $network_fields = [])
+       {
+               $fields = ['created' => DateTimeFormat::utcNow(),
+                       'name' => 'relay', 'nick' => 'relay',
+                       'url' => $server_url, 'network' => NETWORK_DIASPORA,
+                       'batch' => $server_url . '/receive/public',
+                       'rel' => CONTACT_IS_FOLLOWER, 'blocked' => false,
+                       'pending' => false, 'writable' => true];
+
+               $fields = array_merge($fields, $network_fields);
+
+               $condition = ['uid' => 0, 'nurl' => normalise_link($server_url),
+                       'contact-type' => ACCOUNT_TYPE_RELAY];
+
+               if (dba::exists('contact', $condition)) {
+                       unset($fields['created']);
+               }
+
+               dba::update('contact', $fields, $condition, true);
+       }
+
        /**
         * @brief Return a list of participating contacts for a thread
         *
index 06c2636aca8b33931ede15a5494feeda4f078267..672956ffb952fe492b23262b9031fe55e3f8e6ee 100644 (file)
@@ -18,6 +18,7 @@ use Friendica\Model\Profile;
 use Friendica\Network\Probe;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Network;
+use Friendica\Protocol\Diaspora;
 use dba;
 use DOMDocument;
 use DOMXPath;
@@ -1429,6 +1430,20 @@ class PortableContact
                                dba::insert('gserver-tag', ['gserver-id' => $gserver['id'], 'tag' => $tag]);
                        }
                }
+
+               // Create or update the relay contact
+               $fields = [];
+               if (isset($data->protocols)) {
+                       if (isset($data->protocols->diaspora)) {
+                               $fields['network'] = NETWORK_DIASPORA;
+                               $fields['batch'] = $data->protocols->diaspora;
+                       }
+                       if (isset($data->protocols->dfrn)) {
+                               $fields['network'] = NETWORK_DFRN;
+                               $fields['batch'] = $data->protocols->dfrn;
+                       }
+               }
+               Diaspora::setRelayContact($server_url, $fields);
        }
 
        /**
index f874e5f23024069200f284e6fa7edff11655073c..04e08edf523e23cee747a23888a9c3d3e3c40821 100644 (file)
@@ -199,7 +199,7 @@ class Delivery extends BaseObject
         */
        private static function deliverDFRN($cmd, $contact, $owner, $items, $target_item, $public_message, $top_level, $followup)
        {
-               logger('Deliver ' . $target_item["guid"] . ' via DFRN to ' . $contact['addr']);
+               logger('Deliver ' . $target_item["guid"] . ' via DFRN to ' . (empty($contact['addr']) ? $contact['url'] : $contact['addr']));
 
                if ($cmd == self::MAIL) {
                        $item = $target_item;
@@ -270,11 +270,18 @@ class Delivery extends BaseObject
 
                // We don't have a relationship with contacts on a public post.
                // Se we transmit with the new method and via Diaspora as a fallback
-               if ($items[0]['uid'] == 0) {
+               if (($items[0]['uid'] == 0) || ($contact['uid'] == 0)) {
                        // Transmit in public if it's a relay post
                        $public_dfrn = ($contact['contact-type'] == ACCOUNT_TYPE_RELAY);
 
                        $deliver_status = DFRN::transmit($owner, $contact, $atom, $public_dfrn);
+
+                       // We never spool failed relay deliveries
+                       if ($public_dfrn) {
+                               logger('Relay delivery to ' . $contact["url"] . ' with guid ' . $target_item["guid"] . ' returns ' . $deliver_status);
+                               return;
+                       }
+
                        if (($deliver_status < 200) || ($deliver_status > 299)) {
                                // Transmit via Diaspora if not possible via Friendica
                                self::deliverDiaspora($cmd, $contact, $owner, $items, $target_item, $public_message, $top_level, $followup);