commit: 1ea4a18ad859600841860cdd1a981da868aa18a0
parent a938d07df1679efd78e1b7c10e149270489761f7
Author: lambda <pleromagit@rogerbraun.net>
Date:   Sat, 16 Jun 2018 10:39:36 +0000
Merge branch 'feature/configure-mrf-rejectnonpublic' into 'develop'
Configs for mrf_rejectnonpublic
See merge request pleroma/pleroma!205
Diffstat:
3 files changed, 99 insertions(+), 3 deletions(-)
diff --git a/CONFIGURATION.md b/CONFIGURATION.md
@@ -0,0 +1,72 @@
+# Configuring Pleroma
+
+In the `config/` directory, you will find the following relevant files:
+
+* `config.exs`: default base configuration
+* `dev.exs`: default additional configuration for `MIX_ENV=dev`
+* `prod.exs`: default additional configuration for `MIX_ENV=prod`
+
+
+Do not modify files in the list above.
+Instead, overload the settings by editing the following files:
+
+* `dev.secret.exs`: custom additional configuration for `MIX_ENV=dev`
+* `prod.secret.exs`: custom additional configuration for `MIX_ENV=prod`
+
+## Message Rewrite Filters (MRFs)
+
+Modify incoming and outgoing posts.
+
+    config :pleroma, :instance,
+      rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy
+
+`rewrite_policy` specifies which MRF policies to apply.
+It can either be a single policy or a list of policies.
+Currently, MRFs availible by default are:
+
+* `Pleroma.Web.ActivityPub.MRF.NoOpPolicy`
+* `Pleroma.Web.ActivityPub.MRF.DropPolicy`
+* `Pleroma.Web.ActivityPub.MRF.SimplePolicy`
+* `Pleroma.Web.ActivityPub.MRF.RejectNonPublic`
+
+Some policies, such as SimplePolicy and RejectNonPublic,
+can be additionally configured in their respective sections.
+
+### NoOpPolicy
+
+Does not modify posts (this is the default `rewrite_policy`)
+
+### DropPolicy
+
+Drops all posts.
+It generally does not make sense to use this in production.
+
+### SimplePolicy
+
+Restricts the visibility of posts from certain instances.
+
+    config :pleroma, :mrf_simple,
+      media_removal: [],
+      media_nsfw: [],
+      federated_timeline_removal: [],
+      reject: []
+
+* `media_removal`: posts from these instances will have attachments 
+   removed
+* `media_nsfw`: posts from these instances will have attachments marked
+   as nsfw
+* `federated_timeline_removal`: posts from these instances will be 
+   marked as unlisted
+* `reject`: posts from these instances will be dropped
+
+### RejectNonPublic
+
+Drops posts with non-public visibility settings.
+
+    config :pleroma :mrf_rejectnonpublic
+      allow_followersonly: false,
+      allow_direct: false,
+
+* `allow_followersonly`: whether to allow follower-only posts through
+   the filter
+* `allow_direct`: whether to allow direct messages through the filter
diff --git a/config/config.exs b/config/config.exs
@@ -59,6 +59,10 @@ config :pleroma, :instance,
 
 config :pleroma, :activitypub, accept_blocks: true
 
+config :pleroma, :mrf_rejectnonpublic,
+  allow_followersonly: false,
+  allow_direct: false
+
 config :pleroma, :mrf_simple,
   media_removal: [],
   media_nsfw: [],
diff --git a/lib/pleroma/web/activity_pub/mrf/reject_non_public.ex b/lib/pleroma/web/activity_pub/mrf/reject_non_public.ex
@@ -2,6 +2,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublic do
   alias Pleroma.User
   @behaviour Pleroma.Web.ActivityPub.MRF
 
+  @mrf_rejectnonpublic Application.get_env(:pleroma, :mrf_rejectnonpublic)
+  @allow_followersonly Keyword.get(@mrf_rejectnonpublic, :allow_followersonly)
+  @allow_direct Keyword.get(@mrf_rejectnonpublic, :allow_direct)
+
   @impl true
   def filter(object) do
     if object["type"] == "Create" do
@@ -18,9 +22,25 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublic do
         end
 
       case visibility do
-        "public" -> {:ok, object}
-        "unlisted" -> {:ok, object}
-        _ -> {:reject, nil}
+        "public" ->
+          {:ok, object}
+
+        "unlisted" ->
+          {:ok, object}
+
+        "followers" ->
+          with true <- @allow_followersonly do
+            {:ok, object}
+          else
+            _e -> {:reject, nil}
+          end
+
+        "direct" ->
+          with true <- @allow_direct do
+            {:ok, object}
+          else
+            _e -> {:reject, nil}
+          end
       end
     else
       {:ok, object}