Patches for Status.Net / GNU Social used on http://sn.1w6.org

(Arne Babenhauserheide)
2013-11-20: add patch to really federate groups. tip

add patch to really federate groups.

diff --git a/really-federate-groups.diff b/really-federate-groups.diff
new file mode 100644
--- /dev/null
+++ b/really-federate-groups.diff
@@ -0,0 +1,125 @@
+From d6794cba2e7047616ba8bcbc1217a4ae7f245d99 Mon Sep 17 00:00:00 2001
+From: Joshua Judson Rosen <rozzin@geekspace.com>
+Date: Sun, 29 Jul 2012 18:17:16 -0400
+Subject: [PATCH] Correctly distribute notices from remote posters through local groups to remote group-members via OStatus.
+ Allow the OStatus queue-handler to handle all posts,
+ and give it the smarts required to make correct decisions
+ about whether it should or shouldn't relay notices
+ over OStatus.
+ cf. http://status.net/open-source/issues/3540
+
+---
+ plugins/OStatus/OStatusPlugin.php           |   18 ++++------
+ plugins/OStatus/lib/ostatusqueuehandler.php |   53 +++++++++++++++++----------
+ 2 files changed, 40 insertions(+), 31 deletions(-)
+
+diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php
+index 43b90cf..90e5e9e 100644
+--- a/plugins/OStatus/OStatusPlugin.php
++++ b/plugins/OStatus/OStatusPlugin.php
+@@ -125,18 +125,14 @@ class OStatusPlugin extends Plugin
+      */
+     function onStartEnqueueNotice($notice, &$transports)
+     {
+-        if ($notice->isLocal()) {
+-        	 if ($notice->inScope(null)) {	
+-            	// put our transport first, in case there's any conflict (like OMB)
+-            	array_unshift($transports, 'ostatus');
+-		        $this->log(LOG_INFO, "Notice {$notice->id} queued for OStatus processing");
+-        	 } else {
+-		        // FIXME: we don't do privacy-controlled OStatus updates yet.
+-		        // once that happens, finer grain of control here.
+-		        $this->log(LOG_NOTICE, "Not queueing notice {$notice->id} for OStatus because of privacy; scope = {$notice->scope}");
+-        	 }
++        if ($notice->inScope(null)) {
++            // put our transport first, in case there's any conflict (like OMB)
++            array_unshift($transports, 'ostatus');
++            $this->log(LOG_INFO, "Notice {$notice->id} queued for OStatus processing");
+         } else {
+-        	$this->log(LOG_NOTICE, "Not queueing notice {$notice->id} for OStatus because it's not local.");
++            // FIXME: we don't do privacy-controlled OStatus updates yet.
++            // once that happens, finer grain of control here.
++            $this->log(LOG_NOTICE, "Not queueing notice {$notice->id} for OStatus because of privacy; scope = {$notice->scope}");
+         }
+         return true;
+     }
+diff --git a/plugins/OStatus/lib/ostatusqueuehandler.php b/plugins/OStatus/lib/ostatusqueuehandler.php
+index f528405..74e145b 100644
+--- a/plugins/OStatus/lib/ostatusqueuehandler.php
++++ b/plugins/OStatus/lib/ostatusqueuehandler.php
+@@ -60,40 +60,53 @@ class OStatusQueueHandler extends QueueHandler
+             return true;
+         }
+ 
+-        $this->pushUser();
++        if ($notice->isLocal()) {
++            // Notices generated on remote sites will have already
++            // been pushed to user's subscribers by their origin sites.
++            $this->pushUser();
++        }
+ 
+         foreach ($notice->getGroups() as $group) {
+             $oprofile = Ostatus_profile::staticGet('group_id', $group->id);
+             if ($oprofile) {
+-                $this->pingReply($oprofile);
++                // remote group
++                if ($notice->isLocal()) {
++                    $this->pingReply($oprofile);
++                }
+             } else {
++                // local group
+                 $this->pushGroup($group->id);
+             }
+         }
+-        
+-        foreach ($notice->getReplies() as $profile_id) {
+-            $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
+-            if ($oprofile) {
+-                $this->pingReply($oprofile);
++ 
++        if ($notice->isLocal()) {
++            // Notices generated on other sites will have already
++            // pinged their reply-targets.
++
++            foreach ($notice->getReplies() as $profile_id) {
++                $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
++                if ($oprofile) {
++                    $this->pingReply($oprofile);
++                }
+             }
+-        }
+ 
+-        if (!empty($this->notice->reply_to)) {
+-            $replyTo = Notice::staticGet('id', $this->notice->reply_to);
+-            if (!empty($replyTo)) {
+-                foreach($replyTo->getReplies() as $profile_id) {
+-                    $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
+-                    if ($oprofile) {
+-                        $this->pingReply($oprofile);
++            if (!empty($this->notice->reply_to)) {
++                $replyTo = Notice::staticGet('id', $this->notice->reply_to);
++                if (!empty($replyTo)) {
++                    foreach($replyTo->getReplies() as $profile_id) {
++                        $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
++                        if ($oprofile) {
++                            $this->pingReply($oprofile);
++                        }
+                     }
+                 }
+             }
+-        }
+ 
+-        foreach ($notice->getProfileTags() as $ptag) {
+-            $oprofile = Ostatus_profile::staticGet('peopletag_id', $ptag->id);
+-            if (!$oprofile) {
+-                $this->pushPeopletag($ptag);
++            foreach ($notice->getProfileTags() as $ptag) {
++                $oprofile = Ostatus_profile::staticGet('peopletag_id', $ptag->id);
++                if (!$oprofile) {
++                    $this->pushPeopletag($ptag);
++                }
+             }
+         }
+ 
+-- 
+1.7.1