From 50660d54e8cabd08fee649a6abc26f35a8d7a82c Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sat, 11 Feb 2017 17:09:36 +0100
Subject: [PATCH] Fix semantics of follow requests another slaps

---
 app/helpers/atom_builder_helper.rb |  1 +
 app/models/block.rb                |  4 ----
 app/models/favourite.rb            |  2 --
 app/models/follow.rb               |  4 ----
 app/models/follow_request.rb       | 17 ++++++++++-------
 app/models/stream_entry.rb         | 13 +++++++------
 docs/Extensions.md                 |  4 ++--
 spec/models/favourite_spec.rb      |  9 ++-------
 spec/models/follow_spec.rb         |  4 ++--
 9 files changed, 24 insertions(+), 34 deletions(-)

diff --git a/app/helpers/atom_builder_helper.rb b/app/helpers/atom_builder_helper.rb
index 5d20f8c2d6..08d70b7ac0 100644
--- a/app/helpers/atom_builder_helper.rb
+++ b/app/helpers/atom_builder_helper.rb
@@ -191,6 +191,7 @@ module AtomBuilderHelper
           include_author xml, stream_entry.target
         else
           object_type    xml, stream_entry.target.object_type
+          verb           xml, stream_entry.target.verb
           title          xml, stream_entry.target.title
           link_alternate xml, TagManager.instance.url_for(stream_entry.target)
         end
diff --git a/app/models/block.rb b/app/models/block.rb
index c2067c5b8f..d0662b6851 100644
--- a/app/models/block.rb
+++ b/app/models/block.rb
@@ -18,10 +18,6 @@ class Block < ApplicationRecord
     target_account
   end
 
-  def object_type
-    :person
-  end
-
   def hidden?
     true
   end
diff --git a/app/models/favourite.rb b/app/models/favourite.rb
index cd8e2098c2..82f8c52586 100644
--- a/app/models/favourite.rb
+++ b/app/models/favourite.rb
@@ -19,8 +19,6 @@ class Favourite < ApplicationRecord
     destroyed? ? "#{account.acct} no longer favourites a status by #{status.account.acct}" : "#{account.acct} favourited a status by #{status.account.acct}"
   end
 
-  delegate :object_type, to: :target
-
   def thread
     status
   end
diff --git a/app/models/follow.rb b/app/models/follow.rb
index f83490caad..e25c2bc9f8 100644
--- a/app/models/follow.rb
+++ b/app/models/follow.rb
@@ -20,10 +20,6 @@ class Follow < ApplicationRecord
     target_account
   end
 
-  def object_type
-    :person
-  end
-
   def title
     destroyed? ? "#{account.acct} is no longer following #{target_account.acct}" : "#{account.acct} started following #{target_account.acct}"
   end
diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb
index 989c2c2a23..080c686e53 100644
--- a/app/models/follow_request.rb
+++ b/app/models/follow_request.rb
@@ -13,7 +13,8 @@ class FollowRequest < ApplicationRecord
   validates :account_id, uniqueness: { scope: :target_account_id }
 
   def authorize!
-    @verb = :authorize
+    @verb   = :authorize
+    @target = clone.freeze
 
     account.follow!(target_account)
     MergeWorker.perform_async(target_account.id, account.id)
@@ -22,7 +23,9 @@ class FollowRequest < ApplicationRecord
   end
 
   def reject!
-    @verb = :reject
+    @verb   = :reject
+    @target = clone.freeze
+
     destroy!
   end
 
@@ -31,11 +34,11 @@ class FollowRequest < ApplicationRecord
   end
 
   def target
-    target_account
-  end
-
-  def object_type
-    :person
+    if destroyed? && @verb
+      @target
+    else
+      target_account
+    end
   end
 
   def hidden?
diff --git a/app/models/stream_entry.rb b/app/models/stream_entry.rb
index e0b85be158..bb68b1e141 100644
--- a/app/models/stream_entry.rb
+++ b/app/models/stream_entry.rb
@@ -6,10 +6,11 @@ class StreamEntry < ApplicationRecord
   belongs_to :account, inverse_of: :stream_entries
   belongs_to :activity, polymorphic: true
 
-  belongs_to :status,    foreign_type: 'Status',    foreign_key: 'activity_id'
-  belongs_to :follow,    foreign_type: 'Follow',    foreign_key: 'activity_id'
-  belongs_to :favourite, foreign_type: 'Favourite', foreign_key: 'activity_id'
-  belongs_to :block,     foreign_type: 'Block',     foreign_key: 'activity_id'
+  belongs_to :status,         foreign_type: 'Status',        foreign_key: 'activity_id'
+  belongs_to :follow,         foreign_type: 'Follow',        foreign_key: 'activity_id'
+  belongs_to :favourite,      foreign_type: 'Favourite',     foreign_key: 'activity_id'
+  belongs_to :block,          foreign_type: 'Block',         foreign_key: 'activity_id'
+  belongs_to :follow_request, foreign_type: 'FollowRequest', foreign_key: 'activity_id'
 
   validates :account, :activity, presence: true
 
@@ -30,7 +31,7 @@ class StreamEntry < ApplicationRecord
   end
 
   def targeted?
-    [:follow, :request_friend, :authorize, :unfollow, :block, :unblock, :share, :favorite].include? verb
+    [:follow, :request_friend, :authorize, :reject, :unfollow, :block, :unblock, :share, :favorite].include? verb
   end
 
   def target
@@ -58,7 +59,7 @@ class StreamEntry < ApplicationRecord
   end
 
   def activity
-    !new_record? ? send(activity_type.downcase) : super
+    !new_record? ? send(activity_type.underscore) : super
   end
 
   private
diff --git a/docs/Extensions.md b/docs/Extensions.md
index b56b5b85c7..6a940eebca 100644
--- a/docs/Extensions.md
+++ b/docs/Extensions.md
@@ -23,7 +23,7 @@ Accounts and statuses have an access "scope":
 
 Accounts can be "private" or "public". The former requires a follow request to be approved before a follow relationship can be established, the latter can be followed directly.
 
-Statuses can be "private", "unlisted" or "public". Private must only be shown to the followers of the account, public can be displayed publicly. Unlisted statuses may be displayed publicly but preferably outside of any spotlights e.g. "whole known network" or "public" timelines.
+Statuses can be "private", "unlisted" or "public". Private must only be shown to the followers of the account or people mentioned in the status; public can be displayed publicly. Unlisted statuses may be displayed publicly but preferably outside of any spotlights e.g. "whole known network" or "public" timelines.
 
 Namespace of the scope element is `http://mastodon.social/schema/1.0`. Example:
 
@@ -47,7 +47,7 @@ Mastodon uses the following Salmon slaps to signal a follow request, a follow re
 - `http://activitystrea.ms/schema/1.0/authorize`
 - `http://activitystrea.ms/schema/1.0/reject`
 
-The activity object of the slaps is the account in question. Request-friend slap is sent to that account, when the end-user of that account decides, the authorize/reject decision slap is sent back to the requester.
+The activity object of the request-friend slap is the account in question. The activity object of the authorize and reject slaps is the original request-friend activity. Request-friend slap is sent to the locked account, when the end-user of that account decides, the authorize/reject decision slap is sent back to the requester.
 
 #### PuSH amendment
 
diff --git a/spec/models/favourite_spec.rb b/spec/models/favourite_spec.rb
index 6cf3af4647..cc3d604d60 100644
--- a/spec/models/favourite_spec.rb
+++ b/spec/models/favourite_spec.rb
@@ -26,13 +26,8 @@ RSpec.describe Favourite, type: :model do
   end
 
   describe '#object_type' do
-    it 'is a note when the target is a note' do
-      expect(subject.object_type).to be :note
-    end
-
-    it 'is a comment when the target is a comment' do
-      status.in_reply_to_id = 2
-      expect(subject.object_type).to be :comment
+    it 'is an activity' do
+      expect(subject.object_type).to be :activity
     end
   end
 
diff --git a/spec/models/follow_spec.rb b/spec/models/follow_spec.rb
index c9d02ab163..bc887b60d9 100644
--- a/spec/models/follow_spec.rb
+++ b/spec/models/follow_spec.rb
@@ -25,8 +25,8 @@ RSpec.describe Follow, type: :model do
   end
 
   describe '#object_type' do
-    it 'is a person' do
-      expect(subject.object_type).to be :person
+    it 'is an activity' do
+      expect(subject.object_type).to be :activity
     end
   end
 
-- 
GitLab