From cbf772f28250d93016d7a80f69fd5f6418783699 Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Fri, 9 Apr 2021 10:52:40 +0200
Subject: [PATCH] Add a check for valid URI before fetching it in AP Client

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 lib/federation/activity_pub/fetcher.ex | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/lib/federation/activity_pub/fetcher.ex b/lib/federation/activity_pub/fetcher.ex
index e23c7d163..58fcf7937 100644
--- a/lib/federation/activity_pub/fetcher.ex
+++ b/lib/federation/activity_pub/fetcher.ex
@@ -17,7 +17,8 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do
   def fetch(url, options \\ []) do
     on_behalf_of = Keyword.get(options, :on_behalf_of, Relay.get_actor())
 
-    with date <- Signature.generate_date_header(),
+    with false <- address_invalid(url),
+         date <- Signature.generate_date_header(),
          headers <-
            [{:Accept, "application/activity+json"}]
            |> maybe_date_fetch(date)
@@ -90,4 +91,12 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do
         {:error, err}
     end
   end
+
+  @spec address_invalid(String.t()) :: false | {:error, :invalid_url}
+  defp address_invalid(address) do
+    with %URI{host: host, scheme: scheme} <- URI.parse(address),
+         true <- is_nil(host) or is_nil(scheme) do
+      {:error, :invalid_url}
+    end
+  end
 end