+ defp extract_context_uri(%{"conversation" => "tag:" <> rest}) do
+ rest
+ |> String.split(",", parts: 2, trim: true)
+ |> hd()
+ |> case do
+ nil -> nil
+ hostname -> URI.parse("//" <> hostname)
+ end
+ end
+
+ defp extract_context_uri(%{"context" => "http" <> _ = context}), do: URI.parse(context)
+
+ defp extract_context_uri(_), do: nil
+
+ defp check_context(activity) do
+ uri = extract_context_uri(activity)
+
+ with {:uri, true} <- {:uri, Kernel.match?(%URI{}, uri)},
+ {:ok, _} <- check_accept(uri),
+ {:ok, _} <- check_reject(uri) do
+ {:ok, activity}
+ else
+ # Can't check.
+ {:uri, false} -> {:ok, activity}
+ {:reject, nil} -> {:reject, "[SimplePolicy]"}
+ {:reject, _} = e -> e
+ _ -> {:reject, "[SimplePolicy]"}
+ end
+ end
+
+ defp check_reply_to(%{"object" => %{"inReplyTo" => in_reply_to}} = activity) do
+ with {:ok, _} <- filter(in_reply_to) do
+ {:ok, activity}
+ end
+ end
+
+ defp check_reply_to(activity), do: {:ok, activity}
+
+ defp maybe_check_thread(activity) do
+ if Config.get([:mrf_simple, :handle_threads], true) do
+ with {:ok, _} <- check_context(activity),
+ {:ok, _} <- check_reply_to(activity) do
+ {:ok, activity}
+ end
+ else
+ {:ok, activity}
+ end
+ end
+