]> git.mxchange.org Git - friendica.git/commitdiff
Merge remote-tracking branch 'upstream/develop' into 1508-public-relay
authorMichael Vogel <icarus@dabo.de>
Mon, 10 Aug 2015 08:52:54 +0000 (10:52 +0200)
committerMichael Vogel <icarus@dabo.de>
Mon, 10 Aug 2015 08:52:54 +0000 (10:52 +0200)
include/diaspora.php [changed mode: 0755->0644]
include/notifier.php
mod/_well_known.php

old mode 100755 (executable)
new mode 100644 (file)
index 534e254..3640c74
@@ -23,8 +23,8 @@ function diaspora_dispatch_public($msg) {
        }
 
        $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,8 +34,15 @@ function diaspora_dispatch_public($msg) {
                        diaspora_dispatch($rr,$msg);
                }
        }
-       else
-               logger('diaspora_public: no subscribers');
+       else {
+               logger('diaspora_public: no subscribers for '.$msg["author"].' '.print_r($msg, true));
+
+               // Use a dummy importer
+               $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE);
+               $result = diaspora_dispatch($importer,$msg);
+
+               logger("Dispatcher reported ".$result, LOGGER_DEBUG);
+       }
 }
 
 
@@ -545,7 +552,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.');
@@ -640,7 +647,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");
 
                        }
 
@@ -782,6 +789,11 @@ function diaspora_post_allow($importer,$contact) {
        if($contact['rel'] == CONTACT_IS_FOLLOWER)
                if($importer['page-flags'] == PAGE_COMMUNITY)
                        return true;
+
+       // Messages for the global users are always accepted
+       if ($importer['uid'] == 0)
+               return true;
+
        return false;
 }
 
@@ -823,8 +835,10 @@ 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)) {
                logger('diaspora_post: Ignoring this author.');
@@ -839,7 +853,7 @@ function diaspora_post($importer,$xml,$msg) {
        );
        if(count($r)) {
                logger('diaspora_post: message exists: ' . $guid);
-               return;
+               return 208;
        }
 
        $created = unxmlify($xml->created_at);
@@ -894,7 +908,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';
 
@@ -905,7 +919,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;
 
 }
 
@@ -926,8 +942,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,7 +975,7 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) {
 
        $person = find_diaspora_person_by_handle($author);
 
-        $datarray = array();
+       $datarray = array();
        $datarray['uid'] = $uid;
        $datarray['contact-id'] = get_contact($person['url'], $uid);
        $datarray['wall'] = 0;
@@ -1605,7 +1621,7 @@ function diaspora_conversation($importer,$xml,$msg) {
        $created_at = datetime_convert('UTC','UTC',notags(unxmlify($xml->created_at)));
 
        $parent_uri = $diaspora_handle . ':' . $guid;
+
        $messages = $xml->message;
 
        if(! count($messages)) {
@@ -1619,7 +1635,7 @@ function diaspora_conversation($importer,$xml,$msg) {
                return;
        }
 
-       if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { 
+       if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
                logger('diaspora_conversation: Ignoring this author.');
                return 202;
        }
@@ -1644,11 +1660,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.');
@@ -1776,14 +1792,14 @@ function diaspora_message($importer,$xml,$msg) {
        $msg_conversation_guid = notags(unxmlify($xml->conversation_guid));
 
        $parent_uri = $diaspora_handle . ':' . $msg_parent_guid;
+
        $contact = diaspora_get_contact_by_handle($importer['uid'],$msg_diaspora_handle);
        if(! $contact) {
                logger('diaspora_message: cannot find contact: ' . $msg_diaspora_handle);
                return;
        }
 
-       if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { 
+       if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
                logger('diaspora_message: Ignoring this author.');
                return 202;
        }
@@ -1934,7 +1950,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",
@@ -2598,28 +2614,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",
@@ -2632,35 +2648,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) {
@@ -2714,7 +2730,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 {
@@ -2792,7 +2808,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 {
@@ -3064,3 +3080,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;
+}
index 67d5cdbbd869b7181a2b4f4b97913a7159cb2d27..84ed9884aaa85d2eb0ae2bab18f6adbdfc2083f8 100644 (file)
@@ -3,6 +3,7 @@ require_once("boot.php");
 require_once('include/queue_fn.php');
 require_once('include/html2plain.php');
 require_once("include/Scrape.php");
+require_once('include/diaspora.php');
 
 /*
  * This file was at one time responsible for doing all deliveries, but this caused
@@ -874,8 +875,6 @@ function notifier_run(&$argv, &$argc){
                                        }
                                        break;
                                case NETWORK_DIASPORA:
-                                       require_once('include/diaspora.php');
-
                                        if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')))
                                                break;
 
@@ -958,6 +957,11 @@ function notifier_run(&$argv, &$argc){
 
        if($public_message) {
 
+               if (!$followup)
+                       $r0 = diaspora_fetch_relay();
+               else
+                       $r0 = array();
+
                $r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s'
                        AND `uid` = %d AND `rel` != %d group by `batch` ORDER BY rand() ",
                        dbesc(NETWORK_DIASPORA),
@@ -974,7 +978,7 @@ function notifier_run(&$argv, &$argc){
                        intval(CONTACT_IS_SHARING)
                );
 
-               $r = array_merge($r2,$r1);
+               $r = array_merge($r2,$r1,$r0);
 
                if(count($r)) {
                        logger('pubdeliver: ' . print_r($r,true), LOGGER_DEBUG);
index 6792d36fe0fcfeaa09e1caf868679c1a37f3540e..3d722f72246e764e853ce8a8bb184aaebb7f2067 100644 (file)
@@ -2,13 +2,61 @@
 require_once("mod/hostxrd.php");\r
 \r
 function _well_known_init(&$a){\r
-    if ($a->argc > 1) {\r
-        switch($a->argv[1]) {\r
-            case "host-meta":\r
-                hostxrd_init($a);\r
-                break;\r
-        }\r
-    }\r
-    http_status_exit(404);\r
-    killme();\r
+       if ($a->argc > 1) {\r
+               switch($a->argv[1]) {\r
+                       case "host-meta":\r
+                               hostxrd_init($a);\r
+                               break;\r
+                       case "x-social-relay":\r
+                               wk_social_relay($a);\r
+                               break;\r
+               }\r
+       }\r
+       http_status_exit(404);\r
+       killme();\r
+}\r
+\r
+function wk_social_relay(&$a) {\r
+\r
+       define('SR_SCOPE_ALL', 'all');\r
+       define('SR_SCOPE_TAGS', 'tags');\r
+\r
+       $subscribe = (bool)get_config('system', 'relay_subscribe');\r
+\r
+       if ($subscribe)\r
+               $scope = get_config('system', 'relay_scope');\r
+       else\r
+               $scope = "";\r
+\r
+       $tags = array();\r
+\r
+       if ($scope == SR_SCOPE_TAGS) {\r
+\r
+               $server_tags = get_config('system', 'relay_server_tags');\r
+               $tagitems = explode(",", $server_tags);\r
+\r
+               foreach($tagitems AS $tag)\r
+                       $tags[trim($tag, "# ")] = trim($tag, "# ");\r
+\r
+               if (get_config('system', 'relay_user_tags')) {\r
+                       $terms = q("SELECT DISTINCT(`term`) FROM `search`");\r
+\r
+                       foreach($terms AS $term) {\r
+                               $tag = trim($term["term"], "#");\r
+                               $tags[$tag] = $tag;\r
+                       }\r
+               }\r
+       }\r
+\r
+       $taglist = array();\r
+       foreach($tags AS $tag)\r
+               $taglist[] = $tag;\r
+\r
+       $relay = array("subscribe" => $subscribe,\r
+                       "scope" => $scope,\r
+                       "tags" => $taglist);\r
+\r
+       header('Content-type: application/json; charset=utf-8');\r
+       echo json_encode($relay, true);\r
+       exit;\r
 }\r