[#534] Updating external instances reachability on incoming federation.
authorIvan Tashkinov <ivantashkinov@gmail.com>
Thu, 24 Jan 2019 14:37:23 +0000 (17:37 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Thu, 24 Jan 2019 14:37:23 +0000 (17:37 +0300)
lib/pleroma/instances/instance.ex
lib/pleroma/reverse_proxy.ex
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/activity_pub/activity_pub_controller.ex
lib/pleroma/web/controller_helper.ex
lib/pleroma/web/ostatus/ostatus_controller.ex
lib/pleroma/web/salmon/salmon.ex
lib/pleroma/web/websub/websub.ex
lib/pleroma/web/websub/websub_controller.ex

index 4507ef6d5faf22077f55edebddd811b5aa0beec7..fe52331a359c97eb620dc3d8cc106208c5314462 100644 (file)
@@ -24,7 +24,7 @@ defmodule Pleroma.Instances.Instance do
     |> unique_constraint(:host)
   end
 
-  def reachable?(url) do
+  def reachable?(url) when is_binary(url) do
     !Repo.one(
       from(i in Instance,
         where:
@@ -34,7 +34,9 @@ defmodule Pleroma.Instances.Instance do
     )
   end
 
-  def set_reachable(url) do
+  def reachable?(_), do: true
+
+  def set_reachable(url) when is_binary(url) do
     Repo.update_all(
       from(i in Instance, where: i.host == ^host(url)),
       set: [
@@ -44,7 +46,11 @@ defmodule Pleroma.Instances.Instance do
     )
   end
 
-  def set_unreachable(url, unreachable_since \\ nil) do
+  def set_reachable(_), do: {0, :noop}
+
+  def set_unreachable(url, unreachable_since \\ nil)
+
+  def set_unreachable(url, unreachable_since) when is_binary(url) do
     unreachable_since = unreachable_since || DateTime.utc_now()
     host = host(url)
     existing_record = Repo.get_by(Instance, %{host: host})
@@ -67,6 +73,8 @@ defmodule Pleroma.Instances.Instance do
     end
   end
 
+  def set_unreachable(_, _), do: {0, :noop}
+
   defp host(url_or_host) do
     if url_or_host =~ ~r/^http/i do
       URI.parse(url_or_host).host
index a25b5ea4e16f0af9c804d65a53a4fd4a7afd3fd4..d8b17212bf8eaa7d69b4d89534fe012c583a4072 100644 (file)
@@ -3,7 +3,8 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.ReverseProxy do
-  @keep_req_headers ~w(accept user-agent accept-encoding cache-control if-modified-since if-unmodified-since if-none-match if-range range)
+  @keep_req_headers ~w(accept user-agent accept-encoding cache-control if-modified-since if-unmodified-since) ++
+                      ~w(if-none-match if-range range referer)
   @resp_cache_headers ~w(etag date last-modified cache-control)
   @keep_resp_headers @resp_cache_headers ++
                        ~w(content-type content-disposition content-encoding content-range accept-ranges vary)
index 10155ff5a3c2cc72a527bd2fa3fedbd7afd1c174..44c295d658445c4d9777bdd883cd679e3113e166 100644 (file)
@@ -750,7 +750,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
                [
                  {"Content-Type", "application/activity+json"},
                  {"signature", signature},
-                 {"digest", digest}
+                 {"digest", digest},
+                 {"referer", Pleroma.Web.Endpoint.url()}
                ]
              ) do
       Instances.set_reachable(inbox)
index 7eed0a6006d86154400cfb50b69978ae281d1ac5..dc353dff030c7a51feb6f6cd32511e01910c4cd7 100644 (file)
@@ -4,6 +4,7 @@
 
 defmodule Pleroma.Web.ActivityPub.ActivityPubController do
   use Pleroma.Web, :controller
+
   alias Pleroma.{Activity, User, Object}
   alias Pleroma.Web.ActivityPub.{ObjectView, UserView}
   alias Pleroma.Web.ActivityPub.ActivityPub
@@ -18,6 +19,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
 
   plug(Pleroma.Web.FederatingPlug when action in [:inbox, :relay])
   plug(:relay_active? when action in [:relay])
+  plug(:set_requester_reachable when action in [:inbox])
 
   def relay_active?(conn, _) do
     if Keyword.get(Application.get_env(:pleroma, :instance), :allow_relay) do
@@ -289,4 +291,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
     |> put_status(500)
     |> json("error")
   end
+
+  defp set_requester_reachable(conn, _) do
+    Pleroma.Web.ControllerHelper.set_requester_reachable(conn)
+    conn
+  end
 end
index 14e3d19fd8b68aaf92ad44584669a850a7fbadc4..13cf1877f9689750272683719eda220ffc9278c0 100644 (file)
@@ -10,4 +10,9 @@ defmodule Pleroma.Web.ControllerHelper do
     |> put_status(status)
     |> json(json)
   end
+
+  def set_requester_reachable(conn) do
+    with [referer] <- get_req_header(conn, "referer"),
+         do: Pleroma.Instances.set_reachable(referer)
+  end
 end
index ce022bcc1306867f8a6dfdd753440a2905546e6a..a89f16b9497967fa193eb565aa74d7f7f8e17257 100644 (file)
@@ -15,6 +15,8 @@ defmodule Pleroma.Web.OStatus.OStatusController do
   alias Pleroma.Web.ActivityPub.ActivityPub
 
   plug(Pleroma.Web.FederatingPlug when action in [:salmon_incoming])
+  plug(:set_requester_reachable when action in [:salmon_incoming])
+
   action_fallback(:errors)
 
   def feed_redirect(conn, %{"nickname" => nickname}) do
@@ -201,4 +203,9 @@ defmodule Pleroma.Web.OStatus.OStatusController do
     |> put_status(500)
     |> text("Something went wrong")
   end
+
+  defp set_requester_reachable(conn, _) do
+    Pleroma.Web.ControllerHelper.set_requester_reachable(conn)
+    conn
+  end
 end
index 0423ccee07314edf2c5552aed6d55bdaeecc26a5..e4d2d95171432413b71530c33de479e38ec460a4 100644 (file)
@@ -173,7 +173,10 @@ defmodule Pleroma.Web.Salmon do
            poster.(
              url,
              feed,
-             [{"Content-Type", "application/magic-envelope+xml"}]
+             [
+               {"Content-Type", "application/magic-envelope+xml"},
+               {"referer", Pleroma.Web.Endpoint.url()}
+             ]
            ) do
       Instances.set_reachable(url)
       Logger.debug(fn -> "Pushed to #{url}, code #{code}" end)
index 9ceb5fbf7dcf431f6063530e8b2d986661c3e310..ac8903913c1f9ee4f81bc41154186f7992adf0c6 100644 (file)
@@ -275,7 +275,8 @@ defmodule Pleroma.Web.Websub do
              xml,
              [
                {"Content-Type", "application/atom+xml"},
-               {"X-Hub-Signature", "sha1=#{signature}"}
+               {"X-Hub-Signature", "sha1=#{signature}"},
+               {"referer", Pleroma.Web.Endpoint.url()}
              ]
            ) do
       Instances.set_reachable(callback)
index e58f144e5227d3721e44271122acd11653991128..02fe075d753c5c43fcaad005464b950864f17852 100644 (file)
@@ -4,9 +4,11 @@
 
 defmodule Pleroma.Web.Websub.WebsubController do
   use Pleroma.Web, :controller
+
   alias Pleroma.{Repo, User}
   alias Pleroma.Web.{Websub, Federator}
   alias Pleroma.Web.Websub.WebsubClientSubscription
+
   require Logger
 
   plug(
@@ -18,6 +20,8 @@ defmodule Pleroma.Web.Websub.WebsubController do
          ]
   )
 
+  plug(:set_requester_reachable when action in [:websub_incoming])
+
   def websub_subscription_request(conn, %{"nickname" => nickname} = params) do
     user = User.get_cached_by_nickname(nickname)
 
@@ -92,4 +96,9 @@ defmodule Pleroma.Web.Websub.WebsubController do
         |> send_resp(500, "Error")
     end
   end
+
+  defp set_requester_reachable(conn, _) do
+    Pleroma.Web.ControllerHelper.set_requester_reachable(conn)
+    conn
+  end
 end