From 40390cc5ece7f9a1e723dca19946b86fcac46a77 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 10 Feb 2017 20:45:22 +0000 Subject: [PATCH] Diaspora Relay: Only accept postings from anyone when the relay is configured --- boot.php | 11 ++++ include/diaspora.php | 16 +++-- mod/_well_known.php | 135 ++++++++++++++++++++++--------------------- 3 files changed, 90 insertions(+), 72 deletions(-) diff --git a/boot.php b/boot.php index 56fb054358..e6fe089516 100644 --- a/boot.php +++ b/boot.php @@ -430,6 +430,17 @@ define('PRIORITY_LOW', 40); define('PRIORITY_NEGLIGIBLE',50); /* @}*/ +/** + * @name Social Relay settings + * + * See here: https://github.com/jaywink/social-relay + * and here: https://wiki.diasporafoundation.org/Relay_servers_for_public_posts + * @{ + */ +define('SR_SCOPE_NONE', ''); +define('SR_SCOPE_ALL', 'all'); +define('SR_SCOPE_TAGS', 'tags'); +/* @}*/ // Normally this constant is defined - but not if "pcntl" isn't installed if (!defined("SIGTERM")) diff --git a/include/diaspora.php b/include/diaspora.php index fdbc0479f9..53f2e7ea7d 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -8,6 +8,8 @@ * This will change in the future. */ +use \Friendica\Core\Config; + require_once("include/items.php"); require_once("include/bb2diaspora.php"); require_once("include/Scrape.php"); @@ -309,10 +311,6 @@ class Diaspora { return false; } - // Use a dummy importer to import the data for the public copy - $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE); - $message_id = self::dispatch($importer,$msg); - // 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') @@ -320,7 +318,7 @@ class Diaspora { dbesc(NETWORK_DIASPORA), dbesc($msg["author"]) ); - if ($r) { + if (dbm::is_result($r)) { foreach ($r as $rr) { logger("delivering to: ".$rr["username"]); self::dispatch($rr,$msg); @@ -329,6 +327,14 @@ class Diaspora { logger("No subscribers for ".$msg["author"]." ".print_r($msg, true), LOGGER_DEBUG); } + $social_relay = (bool)Config::get('system', 'relay_subscribe', false); + + // Use a dummy importer to import the data for the public copy + if (dbm::is_result($r) OR $social_relay) { + $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE); + $message_id = self::dispatch($importer,$msg); + } + return $message_id; } diff --git a/mod/_well_known.php b/mod/_well_known.php index 75948a0088..622d7fd93f 100644 --- a/mod/_well_known.php +++ b/mod/_well_known.php @@ -1,67 +1,68 @@ -argc > 1) { - switch($a->argv[1]) { - case "host-meta": - hostxrd_init($a); - break; - case "x-social-relay": - wk_social_relay($a); - break; - case "nodeinfo": - nodeinfo_wellknown($a); - break; - } - } - http_status_exit(404); - killme(); -} - -function wk_social_relay(App $a) { - - define('SR_SCOPE_ALL', 'all'); - define('SR_SCOPE_TAGS', 'tags'); - - $subscribe = (bool)get_config('system', 'relay_subscribe'); - - if ($subscribe) - $scope = get_config('system', 'relay_scope'); - else - $scope = ""; - - $tags = array(); - - if ($scope == SR_SCOPE_TAGS) { - - $server_tags = get_config('system', 'relay_server_tags'); - $tagitems = explode(",", $server_tags); - - foreach($tagitems AS $tag) - $tags[trim($tag, "# ")] = trim($tag, "# "); - - if (get_config('system', 'relay_user_tags')) { - $terms = q("SELECT DISTINCT(`term`) FROM `search`"); - - foreach($terms AS $term) { - $tag = trim($term["term"], "#"); - $tags[$tag] = $tag; - } - } - } - - $taglist = array(); - foreach($tags AS $tag) - $taglist[] = $tag; - - $relay = array("subscribe" => $subscribe, - "scope" => $scope, - "tags" => $taglist); - - header('Content-type: application/json; charset=utf-8'); - echo json_encode($relay, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES); - exit; -} +argc > 1) { + switch($a->argv[1]) { + case "host-meta": + hostxrd_init($a); + break; + case "x-social-relay": + wk_social_relay($a); + break; + case "nodeinfo": + nodeinfo_wellknown($a); + break; + } + } + http_status_exit(404); + killme(); +} + +function wk_social_relay(App $a) { + + $subscribe = (bool)Config::get('system', 'relay_subscribe', false); + + if ($subscribe) { + $scope = Config::get('system', 'relay_scope', SR_SCOPE_ALL); + } else { + $scope = SR_SCOPE_NONE; + } + + $tags = array(); + + if ($scope == SR_SCOPE_TAGS) { + $server_tags = Config::get('system', 'relay_server_tags'); + $tagitems = explode(",", $server_tags); + + foreach($tagitems AS $tag) { + $tags[trim($tag, "# ")] = trim($tag, "# "); + } + + if (Config::get('system', 'relay_user_tags')) { + $terms = q("SELECT DISTINCT(`term`) FROM `search`"); + + foreach($terms AS $term) { + $tag = trim($term["term"], "#"); + $tags[$tag] = $tag; + } + } + } + + $taglist = array(); + foreach($tags AS $tag) { + $taglist[] = $tag; + } + + $relay = array("subscribe" => $subscribe, + "scope" => $scope, + "tags" => $taglist); + + header('Content-type: application/json; charset=utf-8'); + echo json_encode($relay, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES); + exit; +}