]> git.mxchange.org Git - friendica.git/blobdiff - include/diaspora.php
Bugfix for pull request #2147 (Fix for issue #2122)
[friendica.git] / include / diaspora.php
old mode 100755 (executable)
new mode 100644 (file)
index fd9dd8f..e0eaf06
@@ -22,9 +22,15 @@ function diaspora_dispatch_public($msg) {
                return;
        }
 
+       // Use a dummy importer to import the data for the public copy
+       $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE);
+       $result = diaspora_dispatch($importer,$msg);
+       logger("Dispatcher reported ".$result, LOGGER_DEBUG);
+
+       // Now distribute it to the followers
        $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN
-               ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' )
-               AND `account_expired` = 0 AND `account_removed` = 0 ",
+               ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' )
+               AND `account_expired` = 0 AND `account_removed` = 0 ",
                dbesc(NETWORK_DIASPORA),
                dbesc($msg['author'])
        );
@@ -34,13 +40,8 @@ function diaspora_dispatch_public($msg) {
                        diaspora_dispatch($rr,$msg);
                }
        }
-       else {
-               logger('diaspora_public: no subscribers '.print_r($msg, true));
-
-               // Use a dummy importer
-               $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE);
-               diaspora_dispatch($importer,$msg);
-       }
+       else
+               logger('diaspora_public: no subscribers for '.$msg["author"].' '.print_r($msg, true));
 }
 
 
@@ -109,6 +110,9 @@ function diaspora_dispatch($importer,$msg,$attempt=1) {
        elseif($xmlbase->message) {
                $ret = diaspora_message($importer,$xmlbase->message,$msg);
        }
+       elseif($xmlbase->participation) {
+               $ret = diaspora_participation($importer,$xmlbase->participation);
+       }
        else {
                logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true));
        }
@@ -550,7 +554,7 @@ function diaspora_decode($importer,$xml) {
        // This will also convert diaspora public key from pkcs#1 to pkcs#8
 
        logger('mod-diaspora: Fetching key for ' . $author_link );
-       $key = get_diaspora_key($author_link);
+       $key = get_diaspora_key($author_link);
 
        if(! $key) {
                logger('mod-diaspora: Could not retrieve author key.');
@@ -588,7 +592,7 @@ function diaspora_request($importer,$xml) {
                // perhaps we were already sharing with this person. Now they're sharing with us.
                // That makes us friends.
 
-               if($contact['rel'] == CONTACT_IS_FOLLOWER && $importer['page-flags'] != PAGE_COMMUNITY) {
+               if($contact['rel'] == CONTACT_IS_FOLLOWER && in_array($importer['page-flags'], array(PAGE_FREELOVE))) {
                        q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d",
                                intval(CONTACT_IS_FRIEND),
                                intval($contact['id']),
@@ -645,7 +649,7 @@ function diaspora_request($importer,$xml) {
 
                                $i = item_store($arr);
                                if($i)
-                               proc_run('php',"include/notifier.php","activity","$i");
+                               proc_run('php',"include/notifier.php","activity","$i");
 
                        }
 
@@ -765,12 +769,12 @@ function diaspora_request($importer,$xml) {
        return;
 }
 
-function diaspora_post_allow($importer,$contact) {
+function diaspora_post_allow($importer,$contact, $is_comment = false) {
 
        // perhaps we were already sharing with this person. Now they're sharing with us.
        // That makes us friends.
        // Normally this should have handled by getting a request - but this could get lost
-       if($contact['rel'] == CONTACT_IS_FOLLOWER && $importer['page-flags'] != PAGE_COMMUNITY) {
+       if($contact['rel'] == CONTACT_IS_FOLLOWER && in_array($importer['page-flags'], array(PAGE_FREELOVE))) {
                q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d",
                        intval(CONTACT_IS_FRIEND),
                        intval($contact['id']),
@@ -785,7 +789,7 @@ function diaspora_post_allow($importer,$contact) {
        if($contact['rel'] == CONTACT_IS_SHARING || $contact['rel'] == CONTACT_IS_FRIEND)
                return true;
        if($contact['rel'] == CONTACT_IS_FOLLOWER)
-               if($importer['page-flags'] == PAGE_COMMUNITY)
+               if(($importer['page-flags'] == PAGE_COMMUNITY) OR $is_comment)
                        return true;
 
        // Messages for the global users are always accepted
@@ -833,23 +837,24 @@ function diaspora_post($importer,$xml,$msg) {
        }
 
        $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
-       if(! $contact)
-               return;
+       if(! $contact) {
+               logger('diaspora_post: A Contact for handle '.$diaspora_handle.' and user '.$importer['uid'].' was not found');
+               return 203;
+       }
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, false)) {
                logger('diaspora_post: Ignoring this author.');
                return 202;
        }
 
        $message_id = $diaspora_handle . ':' . $guid;
-       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
                intval($importer['uid']),
-               dbesc($message_id),
                dbesc($guid)
        );
        if(count($r)) {
                logger('diaspora_post: message exists: ' . $guid);
-               return;
+               return 208;
        }
 
        $created = unxmlify($xml->created_at);
@@ -904,7 +909,7 @@ function diaspora_post($importer,$xml,$msg) {
        $datarray['body'] = $body;
        $datarray['tag'] = $str_tags;
        if ($xml->provider_display_name)
-                $datarray["app"] = unxmlify($xml->provider_display_name);
+               $datarray["app"] = unxmlify($xml->provider_display_name);
        else
                $datarray['app']  = 'Diaspora';
 
@@ -915,7 +920,9 @@ function diaspora_post($importer,$xml,$msg) {
        DiasporaFetchGuid($datarray);
        $message_id = item_store($datarray);
 
-       return;
+       logger("Stored item with message id ".$message_id, LOGGER_DEBUG);
+
+       return 201;
 
 }
 
@@ -936,8 +943,8 @@ function DiasporaFetchGuidSub($match, $item) {
 function diaspora_store_by_guid($guid, $server, $uid = 0) {
        require_once("include/Contact.php");
 
-        $serverparts = parse_url($server);
-        $server = $serverparts["scheme"]."://".$serverparts["host"];
+       $serverparts = parse_url($server);
+       $server = $serverparts["scheme"]."://".$serverparts["host"];
 
        logger("Trying to fetch item ".$guid." from ".$server, LOGGER_DEBUG);
 
@@ -959,9 +966,8 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) {
        $objecttype = $item["object-type"];
 
        $message_id = $author.':'.$guid;
-       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
                intval($uid),
-               dbesc($message_id),
                dbesc($guid)
        );
        if(count($r))
@@ -969,9 +975,21 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) {
 
        $person = find_diaspora_person_by_handle($author);
 
-        $datarray = array();
+       $contact_id = get_contact($person['url'], $uid);
+
+       $contacts = q("SELECT * FROM `contact` WHERE `id` = %d", intval($contact_id));
+       $importers = q("SELECT * FROM `user` WHERE `uid` = %d", intval($uid));
+
+       if ($contacts AND $importers)
+               if(!diaspora_post_allow($importers[0],$contacts[0], false)) {
+                       logger('Ignoring author '.$person['url'].' for uid '.$uid);
+                       return false;
+               } else
+                       logger('Author '.$person['url'].' is allowed for uid '.$uid);
+
+       $datarray = array();
        $datarray['uid'] = $uid;
-       $datarray['contact-id'] = get_contact($person['url'], $uid);
+       $datarray['contact-id'] = $contact_id;
        $datarray['wall'] = 0;
        $datarray['network']  = NETWORK_DIASPORA;
        $datarray['guid'] = $guid;
@@ -1111,15 +1129,14 @@ function diaspora_reshare($importer,$xml,$msg) {
        if(! $contact)
                return;
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, false)) {
                logger('diaspora_reshare: Ignoring this author: ' . $diaspora_handle . ' ' . print_r($xml,true));
                return 202;
        }
 
        $message_id = $diaspora_handle . ':' . $guid;
-       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
                intval($importer['uid']),
-               dbesc($message_id),
                dbesc($guid)
        );
        if(count($r)) {
@@ -1297,15 +1314,14 @@ function diaspora_asphoto($importer,$xml,$msg) {
        if(! $contact)
                return;
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, false)) {
                logger('diaspora_asphoto: Ignoring this author.');
                return 202;
        }
 
        $message_id = $diaspora_handle . ':' . $guid;
-       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
                intval($importer['uid']),
-               dbesc($message_id),
                dbesc($guid)
        );
        if(count($r)) {
@@ -1370,11 +1386,6 @@ function diaspora_asphoto($importer,$xml,$msg) {
 
 }
 
-
-
-
-
-
 function diaspora_comment($importer,$xml,$msg) {
 
        $a = get_app();
@@ -1393,7 +1404,7 @@ function diaspora_comment($importer,$xml,$msg) {
                return;
        }
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, true)) {
                logger('diaspora_comment: Ignoring this author.');
                return 202;
        }
@@ -1494,16 +1505,27 @@ function diaspora_comment($importer,$xml,$msg) {
                }
        }
 
+       // Fetch the contact id - if we know this contact
+       $r = q("SELECT `id`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1",
+               dbesc(normalise_link($person['url'])), intval($importer['uid']));
+       if ($r) {
+               $cid = $r[0]['id'];
+               $network = $r[0]['network'];
+       } else {
+               $cid = $contact['id'];
+               $network = NETWORK_DIASPORA;
+       }
+
        $body = diaspora2bb($text);
        $message_id = $diaspora_handle . ':' . $guid;
 
        $datarray = array();
 
        $datarray['uid'] = $importer['uid'];
-       $datarray['contact-id'] = $contact['id'];
+       $datarray['contact-id'] = $cid;
        $datarray['type'] = 'remote-comment';
        $datarray['wall'] = $parent_item['wall'];
-       $datarray['network']  = NETWORK_DIASPORA;
+       $datarray['network']  = $network;
        $datarray['verb'] = ACTIVITY_POST;
        $datarray['gravity'] = GRAVITY_COMMENT;
        $datarray['guid'] = $guid;
@@ -1654,11 +1676,11 @@ function diaspora_conversation($importer,$xml,$msg) {
                );
                if($r)
                        $c = q("select * from conv where uid = %d and guid = '%s' limit 1",
-               intval($importer['uid']),
-           dbesc($guid)
-       );
+               intval($importer['uid']),
+           dbesc($guid)
+       );
            if(count($c))
-           $conversation = $c[0];
+           $conversation = $c[0];
        }
        if(! $conversation) {
                logger('diaspora_conversation: unable to create conversation.');
@@ -1785,7 +1807,7 @@ function diaspora_message($importer,$xml,$msg) {
        $msg_diaspora_handle = notags(unxmlify($xml->diaspora_handle));
        $msg_conversation_guid = notags(unxmlify($xml->conversation_guid));
 
-       $parent_uri = $diaspora_handle . ':' . $msg_parent_guid;
+       $parent_uri = $msg_diaspora_handle . ':' . $msg_parent_guid;
 
        $contact = diaspora_get_contact_by_handle($importer['uid'],$msg_diaspora_handle);
        if(! $contact) {
@@ -1821,7 +1843,7 @@ function diaspora_message($importer,$xml,$msg) {
 
        $author_signature = base64_decode($msg_author_signature);
 
-       $person = find_diaspora_person_by_handle($msg_diaspora_handle); 
+       $person = find_diaspora_person_by_handle($msg_diaspora_handle);
        if(is_array($person) && x($person,'pubkey'))
                $key = $person['pubkey'];
        else {
@@ -1868,6 +1890,9 @@ function diaspora_message($importer,$xml,$msg) {
        return;
 }
 
+function diaspora_participation($importer,$xml) {
+       logger("Unsupported message type 'participation' ".print_r($xml, true));
+}
 
 function diaspora_photo($importer,$xml,$msg,$attempt=1) {
 
@@ -1897,7 +1922,7 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) {
                return;
        }
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, false)) {
                logger('diaspora_photo: Ignoring this author.');
                return 202;
        }
@@ -1944,7 +1969,7 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) {
        $link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n";
 
        $link_text = scale_external_images($link_text, true,
-                                          array($remote_photo_name, 'scaled_full_' . $remote_photo_name));
+                                          array($remote_photo_name, 'scaled_full_' . $remote_photo_name));
 
        if(strpos($parent_item['body'],$link_text) === false) {
                $r = q("UPDATE `item` SET `body` = '%s', `visible` = 1 WHERE `id` = %d AND `uid` = %d",
@@ -1984,7 +2009,7 @@ function diaspora_like($importer,$xml,$msg) {
                return;
        }
 
-       if(! diaspora_post_allow($importer,$contact)) {
+       if(! diaspora_post_allow($importer,$contact, false)) {
                logger('diaspora_like: Ignoring this author.');
                return 202;
        }
@@ -2136,13 +2161,24 @@ function diaspora_like($importer,$xml,$msg) {
 EOT;
        $bodyverb = t('%1$s likes %2$s\'s %3$s');
 
+       // Fetch the contact id - if we know this contact
+       $r = q("SELECT `id`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1",
+               dbesc(normalise_link($person['url'])), intval($importer['uid']));
+       if ($r) {
+               $cid = $r[0]['id'];
+               $network = $r[0]['network'];
+       } else {
+               $cid = $contact['id'];
+               $network = NETWORK_DIASPORA;
+       }
+
        $arr = array();
 
        $arr['uri'] = $uri;
        $arr['uid'] = $importer['uid'];
        $arr['guid'] = $guid;
-       $arr['network']  = NETWORK_DIASPORA;
-       $arr['contact-id'] = $contact['id'];
+       $arr['network']  = $network;
+       $arr['contact-id'] = $cid;
        $arr['type'] = 'activity';
        $arr['wall'] = $parent_item['wall'];
        $arr['gravity'] = GRAVITY_LIKE;
@@ -2218,8 +2254,23 @@ function diaspora_retraction($importer,$xml) {
        if($type === 'Person') {
                require_once('include/Contact.php');
                contact_remove($contact['id']);
-       }
-       elseif($type === 'Post') {
+       } elseif($type === 'StatusMessage') {
+               $guid = notags(unxmlify($xml->post_guid));
+
+               $r = q("SELECT * FROM `item` WHERE `guid` = '%s' AND `uid` = %d AND NOT `file` LIKE '%%[%%' LIMIT 1",
+                       dbesc($guid),
+                       intval($importer['uid'])
+               );
+               if(count($r)) {
+                       if(link_compare($r[0]['author-link'],$contact['url'])) {
+                               q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d",
+                                       dbesc(datetime_convert()),
+                                       intval($r[0]['id'])
+                               );
+                               delete_thread($r[0]['id'], $r[0]['parent-uri']);
+                       }
+               }
+       } elseif($type === 'Post') {
                $r = q("select * from item where guid = '%s' and uid = %d and not file like '%%[%%' limit 1",
                        dbesc('guid'),
                        intval($importer['uid'])
@@ -2402,7 +2453,8 @@ function diaspora_profile($importer,$xml,$msg) {
 
        $birthday = str_replace('1000','1901',$birthday);
 
-       $birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d');
+       if ($birthday != "")
+               $birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d');
 
        // this is to prevent multiple birthday notifications in a single year
        // if we already have a stored birthday and the 'm-d' part hasn't changed, preserve the entry, which will preserve the notify year
@@ -2608,28 +2660,28 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
 function diaspora_is_reshare($body) {
        $body = trim($body);
 
-        // Skip if it isn't a pure repeated messages
-        // Does it start with a share?
-        if (strpos($body, "[share") > 0)
-                return(false);
+       // Skip if it isn't a pure repeated messages
+       // Does it start with a share?
+       if (strpos($body, "[share") > 0)
+               return(false);
 
-        // Does it end with a share?
-        if (strlen($body) > (strrpos($body, "[/share]") + 8))
-                return(false);
+       // Does it end with a share?
+       if (strlen($body) > (strrpos($body, "[/share]") + 8))
+               return(false);
 
-        $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body);
-        // Skip if there is no shared message in there
-        if ($body == $attributes)
-                return(false);
+       $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body);
+       // Skip if there is no shared message in there
+       if ($body == $attributes)
+               return(false);
 
-        $guid = "";
-        preg_match("/guid='(.*?)'/ism", $attributes, $matches);
-        if ($matches[1] != "")
-                $guid = $matches[1];
+       $guid = "";
+       preg_match("/guid='(.*?)'/ism", $attributes, $matches);
+       if ($matches[1] != "")
+               $guid = $matches[1];
 
-        preg_match('/guid="(.*?)"/ism', $attributes, $matches);
-        if ($matches[1] != "")
-                $guid = $matches[1];
+       preg_match('/guid="(.*?)"/ism', $attributes, $matches);
+       if ($matches[1] != "")
+               $guid = $matches[1];
 
        if ($guid != "") {
                $r = q("SELECT `contact-id` FROM `item` WHERE `guid` = '%s' AND `network` IN ('%s', '%s') LIMIT 1",
@@ -2642,35 +2694,35 @@ function diaspora_is_reshare($body) {
                }
        }
 
-        $profile = "";
-        preg_match("/profile='(.*?)'/ism", $attributes, $matches);
-        if ($matches[1] != "")
-                $profile = $matches[1];
+       $profile = "";
+       preg_match("/profile='(.*?)'/ism", $attributes, $matches);
+       if ($matches[1] != "")
+               $profile = $matches[1];
 
-        preg_match('/profile="(.*?)"/ism', $attributes, $matches);
-        if ($matches[1] != "")
-                $profile = $matches[1];
+       preg_match('/profile="(.*?)"/ism', $attributes, $matches);
+       if ($matches[1] != "")
+               $profile = $matches[1];
 
-        $ret= array();
+       $ret= array();
 
-        $ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile);
-        if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == ""))
-                return(false);
+       $ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile);
+       if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == ""))
+               return(false);
 
-        $link = "";
-        preg_match("/link='(.*?)'/ism", $attributes, $matches);
-        if ($matches[1] != "")
-                $link = $matches[1];
+       $link = "";
+       preg_match("/link='(.*?)'/ism", $attributes, $matches);
+       if ($matches[1] != "")
+               $link = $matches[1];
 
-        preg_match('/link="(.*?)"/ism', $attributes, $matches);
-        if ($matches[1] != "")
-                $link = $matches[1];
+       preg_match('/link="(.*?)"/ism', $attributes, $matches);
+       if ($matches[1] != "")
+               $link = $matches[1];
 
-        $ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link);
-        if (($ret["root_guid"] == $link) OR ($ret["root_guid"] == ""))
-                return(false);
+       $ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link);
+       if (($ret["root_guid"] == $link) OR ($ret["root_guid"] == ""))
+               return(false);
 
-        return($ret);
+       return($ret);
 }
 
 function diaspora_send_images($item,$owner,$contact,$images,$public_batch = false) {
@@ -2724,7 +2776,7 @@ function diaspora_send_followup($item,$owner,$contact,$public_batch = false) {
        // likes on comments
        if($item['verb'] === ACTIVITY_LIKE && $item['thr-parent']) {
                $p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1",
-                       dbesc($item['thr-parent'])
+                       dbesc($item['thr-parent'])
                      );
        }
        else {
@@ -2802,7 +2854,7 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
        // likes on comments
        if($item['verb'] === ACTIVITY_LIKE && $item['thr-parent']) {
                $p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1",
-                       dbesc($item['thr-parent'])
+                       dbesc($item['thr-parent'])
                      );
        }
        else {
@@ -2985,7 +3037,7 @@ function diaspora_send_mail($item,$owner,$contact) {
        $body = bb2diaspora($item['body']);
        $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C');
 
-       $signed_text =  $item['guid'] . ';' . $cnv['guid'] . ';' . $body .  ';' 
+       $signed_text =  $item['guid'] . ';' . $cnv['guid'] . ';' . $body .  ';'
                . $created . ';' . $myaddr . ';' . $cnv['guid'];
 
        $sig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
@@ -2993,7 +3045,7 @@ function diaspora_send_mail($item,$owner,$contact) {
        $msg = array(
                'guid' => xmlify($item['guid']),
                'parent_guid' => xmlify($cnv['guid']),
-               'parent_author_signature' => (($item['reply']) ? null : xmlify($sig)),
+               'parent_author_signature' => xmlify($sig),
                'author_signature' => xmlify($sig),
                'text' => xmlify($body),
                'created_at' => xmlify($created),
@@ -3074,3 +3126,47 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false)
 
        return(($return_code) ? $return_code : (-1));
 }
+
+function diaspora_fetch_relay() {
+
+       $serverdata = get_config("system", "relay_server");
+       if ($serverdata == "")
+               return array();
+
+       $relay = array();
+
+       $servers = explode(",", $serverdata);
+
+       foreach($servers AS $server) {
+               $server = trim($server);
+               $batch = $server."/receive/public";
+
+               $relais = q("SELECT `batch`, `id`, `name`,`network` FROM `contact` WHERE `uid` = 0 AND `batch` = '%s' LIMIT 1", dbesc($batch));
+
+               if (!$relais) {
+                       $addr = "relay@".str_replace("http://", "", normalise_link($server));
+
+                       $r = q("INSERT INTO `contact` (`uid`, `created`, `name`, `nick`, `addr`, `url`, `nurl`, `batch`, `network`, `rel`, `blocked`, `pending`, `writable`, `name-date`, `uri-date`, `avatar-date`)
+                               VALUES (0, '%s', '%s', 'relay', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, '%s', '%s', '%s')",
+                               datetime_convert(),
+                               dbesc($addr),
+                               dbesc($addr),
+                               dbesc($server),
+                               dbesc(normalise_link($server)),
+                               dbesc($batch),
+                               dbesc(NETWORK_DIASPORA),
+                               intval(CONTACT_IS_FOLLOWER),
+                               dbesc(datetime_convert()),
+                               dbesc(datetime_convert()),
+                               dbesc(datetime_convert())
+                       );
+
+                       $relais = q("SELECT `batch`, `id`, `name`,`network` FROM `contact` WHERE `uid` = 0 AND `batch` = '%s' LIMIT 1", dbesc($batch));
+                       if ($relais)
+                               $relay[] = $relais[0];
+               } else
+                       $relay[] = $relais[0];
+       }
+
+       return $relay;
+}