diff options
Diffstat (limited to 'lib')
22 files changed, 235 insertions, 144 deletions
diff --git a/lib/pleroma/config/loader.ex b/lib/pleroma/config/loader.ex index 6ca6550bd..0f3ecf1ed 100644 --- a/lib/pleroma/config/loader.ex +++ b/lib/pleroma/config/loader.ex @@ -47,7 +47,7 @@ defmodule Pleroma.Config.Loader do    @spec filter_group(atom(), keyword()) :: keyword()    def filter_group(group, configs) do      Enum.reject(configs[group], fn {key, _v} -> -      key in @reject_keys or (group == :phoenix and key == :serve_endpoints) +      key in @reject_keys or (group == :phoenix and key == :serve_endpoints) or group == :postgrex      end)    end  end diff --git a/lib/pleroma/config/transfer_task.ex b/lib/pleroma/config/transfer_task.ex index f4722f99d..c02b70e96 100644 --- a/lib/pleroma/config/transfer_task.ex +++ b/lib/pleroma/config/transfer_task.ex @@ -46,14 +46,6 @@ defmodule Pleroma.Config.TransferTask do      with {_, true} <- {:configurable, Config.get(:configurable_from_database)} do        # We need to restart applications for loaded settings take effect -      # TODO: some problem with prometheus after restart! -      reject_restart = -        if restart_pleroma? do -          [nil, :prometheus] -        else -          [:pleroma, nil, :prometheus] -        end -        {logger, other} =          (Repo.all(ConfigDB) ++ deleted_settings)          |> Enum.map(&transform_and_merge/1) @@ -65,10 +57,20 @@ defmodule Pleroma.Config.TransferTask do        started_applications = Application.started_applications() +      # TODO: some problem with prometheus after restart! +      reject = [nil, :prometheus, :postgrex] + +      reject = +        if restart_pleroma? do +          reject +        else +          [:pleroma | reject] +        end +        other        |> Enum.map(&update/1)        |> Enum.uniq() -      |> Enum.reject(&(&1 in reject_restart)) +      |> Enum.reject(&(&1 in reject))        |> maybe_set_pleroma_last()        |> Enum.each(&restart(started_applications, &1, Config.get(:env))) diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index 9574432f0..e678fd415 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -261,7 +261,7 @@ defmodule Pleroma.Object do      end    end -  def increase_vote_count(ap_id, name) do +  def increase_vote_count(ap_id, name, actor) do      with %Object{} = object <- Object.normalize(ap_id),           "Question" <- object.data["type"] do        multiple = Map.has_key?(object.data, "anyOf") @@ -276,12 +276,15 @@ defmodule Pleroma.Object do              option          end) +      voters = [actor | object.data["voters"] || []] |> Enum.uniq() +        data =          if multiple do            Map.put(object.data, "anyOf", options)          else            Map.put(object.data, "oneOf", options)          end +        |> Map.put("voters", voters)        object        |> Object.change(%{data: data}) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index bef4679cb..477237756 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1180,7 +1180,9 @@ defmodule Pleroma.User do    end    @spec get_recipients_from_activity(Activity.t()) :: [User.t()] -  def get_recipients_from_activity(%Activity{recipients: to}) do +  def get_recipients_from_activity(%Activity{recipients: to, actor: actor}) do +    to = [actor | to] +      User.Query.build(%{recipients_from_activity: to, local: true, deactivated: false})      |> Repo.all()    end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 2da814cad..fab67e784 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -118,9 +118,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    def increase_poll_votes_if_vote(%{          "object" => %{"inReplyTo" => reply_ap_id, "name" => name}, -        "type" => "Create" +        "type" => "Create", +        "actor" => actor        }) do -    Object.increase_vote_count(reply_ap_id, name) +    Object.increase_vote_count(reply_ap_id, name, actor)    end    def increase_poll_votes_if_vote(_create_data), do: :noop diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index 4edc007fd..b7dcb1b86 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -149,6 +149,21 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do    defp check_banner_removal(_actor_info, object), do: {:ok, object}    @impl true +  def filter(%{"type" => "Delete", "actor" => actor} = object) do +    %{host: actor_host} = URI.parse(actor) + +    reject_deletes = +      Pleroma.Config.get([:mrf_simple, :reject_deletes]) +      |> MRF.subdomains_regex() + +    if MRF.subdomain_match?(reject_deletes, actor_host) do +      {:reject, nil} +    else +      {:ok, object} +    end +  end + +  @impl true    def filter(%{"actor" => actor} = object) do      actor_info = URI.parse(actor) diff --git a/lib/pleroma/web/api_spec/operations/account_operation.ex b/lib/pleroma/web/api_spec/operations/account_operation.ex index d3cebaf05..fcf030037 100644 --- a/lib/pleroma/web/api_spec/operations/account_operation.ex +++ b/lib/pleroma/web/api_spec/operations/account_operation.ex @@ -298,7 +298,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do        security: [%{"oAuth" => ["follow", "write:follows"]}],        requestBody: request_body("Parameters", AccountFollowsRequest, required: true),        responses: %{ -        200 => Operation.response("Account", "application/json", Account) +        200 => Operation.response("Account", "application/json", AccountRelationship)        }      }    end diff --git a/lib/pleroma/web/api_spec/operations/custom_emoji_operation.ex b/lib/pleroma/web/api_spec/operations/custom_emoji_operation.ex new file mode 100644 index 000000000..cf2215823 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/custom_emoji_operation.ex @@ -0,0 +1,25 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.CustomEmojiOperation do +  alias OpenApiSpex.Operation +  alias Pleroma.Web.ApiSpec.Schemas.CustomEmojisResponse + +  def open_api_operation(action) do +    operation = String.to_existing_atom("#{action}_operation") +    apply(__MODULE__, operation, []) +  end + +  def index_operation do +    %Operation{ +      tags: ["custom_emojis"], +      summary: "List custom custom emojis", +      description: "Returns custom emojis that are available on the server.", +      operationId: "CustomEmojiController.index", +      responses: %{ +        200 => Operation.response("Custom Emojis", "application/json", CustomEmojisResponse) +      } +    } +  end +end diff --git a/lib/pleroma/web/api_spec/schemas/custom_emoji.ex b/lib/pleroma/web/api_spec/schemas/custom_emoji.ex new file mode 100644 index 000000000..5531b2081 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/custom_emoji.ex @@ -0,0 +1,30 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.CustomEmoji do +  alias OpenApiSpex.Schema + +  require OpenApiSpex + +  OpenApiSpex.schema(%{ +    title: "CustomEmoji", +    description: "Response schema for an CustomEmoji", +    type: :object, +    properties: %{ +      shortcode: %Schema{type: :string}, +      url: %Schema{type: :string}, +      static_url: %Schema{type: :string}, +      visible_in_picker: %Schema{type: :boolean}, +      category: %Schema{type: :string}, +      tags: %Schema{type: :array} +    }, +    example: %{ +      "shortcode" => "aaaa", +      "url" => "https://files.mastodon.social/custom_emojis/images/000/007/118/original/aaaa.png", +      "static_url" => +        "https://files.mastodon.social/custom_emojis/images/000/007/118/static/aaaa.png", +      "visible_in_picker" => true +    } +  }) +end diff --git a/lib/pleroma/web/api_spec/schemas/custom_emojis_response.ex b/lib/pleroma/web/api_spec/schemas/custom_emojis_response.ex new file mode 100644 index 000000000..01582a63d --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/custom_emojis_response.ex @@ -0,0 +1,42 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.CustomEmojisResponse do +  alias Pleroma.Web.ApiSpec.Schemas.CustomEmoji + +  require OpenApiSpex + +  OpenApiSpex.schema(%{ +    title: "CustomEmojisResponse", +    description: "Response schema for custom emojis", +    type: :array, +    items: CustomEmoji, +    example: [ +      %{ +        "category" => "Fun", +        "shortcode" => "blank", +        "static_url" => "https://lain.com/emoji/blank.png", +        "tags" => ["Fun"], +        "url" => "https://lain.com/emoji/blank.png", +        "visible_in_picker" => true +      }, +      %{ +        "category" => "Gif,Fun", +        "shortcode" => "firefox", +        "static_url" => "https://lain.com/emoji/Firefox.gif", +        "tags" => ["Gif", "Fun"], +        "url" => "https://lain.com/emoji/Firefox.gif", +        "visible_in_picker" => true +      }, +      %{ +        "category" => "pack:mixed", +        "shortcode" => "sadcat", +        "static_url" => "https://lain.com/emoji/mixed/sadcat.png", +        "tags" => ["pack:mixed"], +        "url" => "https://lain.com/emoji/mixed/sadcat.png", +        "visible_in_picker" => true +      } +    ] +  }) +end diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex index fd904ef0a..f5803578d 100644 --- a/lib/pleroma/web/federator/federator.ex +++ b/lib/pleroma/web/federator/federator.ex @@ -72,19 +72,24 @@ defmodule Pleroma.Web.Federator do      # actor shouldn't be acting on objects outside their own AP server.      with {:ok, _user} <- ap_enabled_actor(params["actor"]),           nil <- Activity.normalize(params["id"]), -         :ok <- Containment.contain_origin_from_id(params["actor"], params), +         {_, :ok} <- +           {:correct_origin?, Containment.contain_origin_from_id(params["actor"], params)},           {:ok, activity} <- Transmogrifier.handle_incoming(params) do        {:ok, activity}      else +      {:correct_origin?, _} -> +        Logger.debug("Origin containment failure for #{params["id"]}") +        {:error, :origin_containment_failed} +        %Activity{} ->          Logger.debug("Already had #{params["id"]}") -        :error +        {:error, :already_present} -      _e -> +      e ->          # Just drop those for now          Logger.debug("Unhandled activity")          Logger.debug(Jason.encode!(params, pretty: true)) -        :error +        {:error, e}      end    end diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 2c774b694..93df79645 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -322,7 +322,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do    @doc "POST /api/v1/accounts/:id/follow"    def follow(%{assigns: %{user: %{id: id}, account: %{id: id}}}, _params) do -    {:error, :not_found} +    {:error, "Can not follow yourself"}    end    def follow(%{assigns: %{user: follower, account: followed}} = conn, params) do @@ -335,7 +335,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do    @doc "POST /api/v1/accounts/:id/unfollow"    def unfollow(%{assigns: %{user: %{id: id}, account: %{id: id}}}, _params) do -    {:error, :not_found} +    {:error, "Can not unfollow yourself"}    end    def unfollow(%{assigns: %{user: follower, account: followed}} = conn, _params) do @@ -383,14 +383,15 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do    end    @doc "POST /api/v1/follows" -  def follows(%{assigns: %{user: follower}, body_params: %{uri: uri}} = conn, _) do -    with {_, %User{} = followed} <- {:followed, User.get_cached_by_nickname(uri)}, -         {_, true} <- {:followed, follower.id != followed.id}, -         {:ok, follower, followed, _} <- CommonAPI.follow(follower, followed) do -      render(conn, "show.json", user: followed, for: follower) -    else -      {:followed, _} -> {:error, :not_found} -      {:error, message} -> json_response(conn, :forbidden, %{error: message}) +  def follows(%{body_params: %{uri: uri}} = conn, _) do +    case User.get_cached_by_nickname(uri) do +      %User{} = user -> +        conn +        |> assign(:account, user) +        |> follow(%{}) + +      nil -> +        {:error, :not_found}      end    end diff --git a/lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex b/lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex index d82de1db5..3bfebef8b 100644 --- a/lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex @@ -5,6 +5,10 @@  defmodule Pleroma.Web.MastodonAPI.CustomEmojiController do    use Pleroma.Web, :controller +  plug(OpenApiSpex.Plug.CastAndValidate) + +  defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.CustomEmojiOperation +    def index(conn, _params) do      render(conn, "index.json", custom_emojis: Pleroma.Emoji.get_all())    end diff --git a/lib/pleroma/web/mastodon_api/views/poll_view.ex b/lib/pleroma/web/mastodon_api/views/poll_view.ex index 40edbb213..59a5deb28 100644 --- a/lib/pleroma/web/mastodon_api/views/poll_view.ex +++ b/lib/pleroma/web/mastodon_api/views/poll_view.ex @@ -19,6 +19,7 @@ defmodule Pleroma.Web.MastodonAPI.PollView do        expired: expired,        multiple: multiple,        votes_count: votes_count, +      voters_count: (multiple || nil) && voters_count(object),        options: options,        voted: voted?(params),        emojis: Pleroma.Web.MastodonAPI.StatusView.build_emojis(object.data["emoji"]) @@ -62,6 +63,12 @@ defmodule Pleroma.Web.MastodonAPI.PollView do      end)    end +  defp voters_count(%{data: %{"voters" => [_ | _] = voters}}) do +    length(voters) +  end + +  defp voters_count(_), do: 0 +    defp voted?(%{object: object} = opts) do      if opts[:for] do        existing_votes = Pleroma.Web.ActivityPub.Utils.get_existing_votes(opts[:for].ap_id, object) diff --git a/lib/pleroma/web/push/impl.ex b/lib/pleroma/web/push/impl.ex index f1740a6e0..a9f893f7b 100644 --- a/lib/pleroma/web/push/impl.ex +++ b/lib/pleroma/web/push/impl.ex @@ -55,11 +55,12 @@ defmodule Pleroma.Web.Push.Impl do        |> Jason.encode!()        |> push_message(build_sub(subscription), gcm_api_key, subscription)      end +    |> (&{:ok, &1}).()    end    def perform(_) do      Logger.warn("Unknown notification type") -    :error +    {:error, :unknown_type}    end    @doc "Push message to web" diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 7e5960949..153802a43 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -16,79 +16,60 @@ defmodule Pleroma.Web.Router do      plug(Pleroma.Plugs.UserEnabledPlug)    end -  pipeline :api do -    plug(:accepts, ["json"]) -    plug(:fetch_session) +  pipeline :authenticate do      plug(Pleroma.Plugs.OAuthPlug)      plug(Pleroma.Plugs.BasicAuthDecoderPlug)      plug(Pleroma.Plugs.UserFetcherPlug)      plug(Pleroma.Plugs.SessionAuthenticationPlug)      plug(Pleroma.Plugs.LegacyAuthenticationPlug)      plug(Pleroma.Plugs.AuthenticationPlug) +  end + +  pipeline :after_auth do      plug(Pleroma.Plugs.UserEnabledPlug)      plug(Pleroma.Plugs.SetUserSessionIdPlug)      plug(Pleroma.Plugs.EnsureUserKeyPlug) -    plug(Pleroma.Plugs.IdempotencyPlug) -    plug(OpenApiSpex.Plug.PutApiSpec, module: Pleroma.Web.ApiSpec)    end -  pipeline :authenticated_api do +  pipeline :base_api do      plug(:accepts, ["json"])      plug(:fetch_session) +    plug(:authenticate) +    plug(OpenApiSpex.Plug.PutApiSpec, module: Pleroma.Web.ApiSpec) +  end + +  pipeline :api do +    plug(:base_api) +    plug(:after_auth) +    plug(Pleroma.Plugs.IdempotencyPlug) +  end + +  pipeline :authenticated_api do +    plug(:base_api)      plug(Pleroma.Plugs.AuthExpectedPlug) -    plug(Pleroma.Plugs.OAuthPlug) -    plug(Pleroma.Plugs.BasicAuthDecoderPlug) -    plug(Pleroma.Plugs.UserFetcherPlug) -    plug(Pleroma.Plugs.SessionAuthenticationPlug) -    plug(Pleroma.Plugs.LegacyAuthenticationPlug) -    plug(Pleroma.Plugs.AuthenticationPlug) -    plug(Pleroma.Plugs.UserEnabledPlug) -    plug(Pleroma.Plugs.SetUserSessionIdPlug) +    plug(:after_auth)      plug(Pleroma.Plugs.EnsureAuthenticatedPlug)      plug(Pleroma.Plugs.IdempotencyPlug) -    plug(OpenApiSpex.Plug.PutApiSpec, module: Pleroma.Web.ApiSpec)    end    pipeline :admin_api do -    plug(:accepts, ["json"]) -    plug(:fetch_session) -    plug(Pleroma.Plugs.OAuthPlug) -    plug(Pleroma.Plugs.BasicAuthDecoderPlug) -    plug(Pleroma.Plugs.UserFetcherPlug) -    plug(Pleroma.Plugs.SessionAuthenticationPlug) -    plug(Pleroma.Plugs.LegacyAuthenticationPlug) -    plug(Pleroma.Plugs.AuthenticationPlug) +    plug(:base_api)      plug(Pleroma.Plugs.AdminSecretAuthenticationPlug) -    plug(Pleroma.Plugs.UserEnabledPlug) -    plug(Pleroma.Plugs.SetUserSessionIdPlug) +    plug(:after_auth)      plug(Pleroma.Plugs.EnsureAuthenticatedPlug)      plug(Pleroma.Plugs.UserIsAdminPlug)      plug(Pleroma.Plugs.IdempotencyPlug) -    plug(OpenApiSpex.Plug.PutApiSpec, module: Pleroma.Web.ApiSpec)    end    pipeline :mastodon_html do -    plug(:accepts, ["html"]) -    plug(:fetch_session) -    plug(Pleroma.Plugs.OAuthPlug) -    plug(Pleroma.Plugs.BasicAuthDecoderPlug) -    plug(Pleroma.Plugs.UserFetcherPlug) -    plug(Pleroma.Plugs.SessionAuthenticationPlug) -    plug(Pleroma.Plugs.LegacyAuthenticationPlug) -    plug(Pleroma.Plugs.AuthenticationPlug) -    plug(Pleroma.Plugs.UserEnabledPlug) -    plug(Pleroma.Plugs.SetUserSessionIdPlug) -    plug(Pleroma.Plugs.EnsureUserKeyPlug) +    plug(:browser) +    plug(:authenticate) +    plug(:after_auth)    end    pipeline :pleroma_html do -    plug(:accepts, ["html"]) -    plug(:fetch_session) -    plug(Pleroma.Plugs.OAuthPlug) -    plug(Pleroma.Plugs.BasicAuthDecoderPlug) -    plug(Pleroma.Plugs.UserFetcherPlug) -    plug(Pleroma.Plugs.SessionAuthenticationPlug) -    plug(Pleroma.Plugs.AuthenticationPlug) +    plug(:browser) +    plug(:authenticate)      plug(Pleroma.Plugs.EnsureUserKeyPlug)    end @@ -515,7 +496,7 @@ defmodule Pleroma.Web.Router do    end    scope "/api" do -    pipe_through(:api) +    pipe_through(:base_api)      get("/openapi", OpenApiSpex.Plug.RenderSpec, [])    end @@ -529,10 +510,6 @@ defmodule Pleroma.Web.Router do      post("/qvitter/statuses/notifications/read", TwitterAPI.Controller, :notifications_read)    end -  pipeline :ap_service_actor do -    plug(:accepts, ["activity+json", "json"]) -  end -    pipeline :ostatus do      plug(:accepts, ["html", "xml", "rss", "atom", "activity+json", "json"])      plug(Pleroma.Plugs.StaticFEPlug) @@ -543,8 +520,7 @@ defmodule Pleroma.Web.Router do    end    scope "/", Pleroma.Web do -    pipe_through(:ostatus) -    pipe_through(:http_signature) +    pipe_through([:ostatus, :http_signature])      get("/objects/:uuid", OStatus.OStatusController, :object)      get("/activities/:uuid", OStatus.OStatusController, :activity) @@ -562,13 +538,6 @@ defmodule Pleroma.Web.Router do      get("/mailer/unsubscribe/:token", Mailer.SubscriptionController, :unsubscribe)    end -  # Server to Server (S2S) AP interactions -  pipeline :activitypub do -    plug(:accepts, ["activity+json", "json"]) -    plug(Pleroma.Web.Plugs.HTTPSignaturePlug) -    plug(Pleroma.Web.Plugs.MappedSignatureToIdentityPlug) -  end -    scope "/", Pleroma.Web.ActivityPub do      # XXX: not really ostatus      pipe_through(:ostatus) @@ -576,19 +545,22 @@ defmodule Pleroma.Web.Router do      get("/users/:nickname/outbox", ActivityPubController, :outbox)    end +  pipeline :ap_service_actor do +    plug(:accepts, ["activity+json", "json"]) +  end + +  # Server to Server (S2S) AP interactions +  pipeline :activitypub do +    plug(:ap_service_actor) +    plug(:http_signature) +  end +    # Client to Server (C2S) AP interactions    pipeline :activitypub_client do -    plug(:accepts, ["activity+json", "json"]) +    plug(:ap_service_actor)      plug(:fetch_session) -    plug(Pleroma.Plugs.OAuthPlug) -    plug(Pleroma.Plugs.BasicAuthDecoderPlug) -    plug(Pleroma.Plugs.UserFetcherPlug) -    plug(Pleroma.Plugs.SessionAuthenticationPlug) -    plug(Pleroma.Plugs.LegacyAuthenticationPlug) -    plug(Pleroma.Plugs.AuthenticationPlug) -    plug(Pleroma.Plugs.UserEnabledPlug) -    plug(Pleroma.Plugs.SetUserSessionIdPlug) -    plug(Pleroma.Plugs.EnsureUserKeyPlug) +    plug(:authenticate) +    plug(:after_auth)    end    scope "/", Pleroma.Web.ActivityPub do @@ -660,12 +632,7 @@ defmodule Pleroma.Web.Router do      get("/web/*path", MastoFEController, :index)    end -  pipeline :remote_media do -  end -    scope "/proxy/", Pleroma.Web.MediaProxy do -    pipe_through(:remote_media) -      get("/:sig/:url", MediaProxyController, :remote)      get("/:sig/:url/:filename", MediaProxyController, :remote)    end diff --git a/lib/pleroma/web/streamer/worker.ex b/lib/pleroma/web/streamer/worker.ex index abfed21c8..f6160fa4d 100644 --- a/lib/pleroma/web/streamer/worker.ex +++ b/lib/pleroma/web/streamer/worker.ex @@ -158,24 +158,6 @@ defmodule Pleroma.Web.Streamer.Worker do      should_send?(user, activity)    end -  def push_to_socket(topics, topic, %Activity{data: %{"type" => "Announce"}} = item) do -    Enum.each(topics[topic] || [], fn %StreamerSocket{ -                                        transport_pid: transport_pid, -                                        user: socket_user -                                      } -> -      # Get the current user so we have up-to-date blocks etc. -      if socket_user do -        user = User.get_cached_by_ap_id(socket_user.ap_id) - -        if should_send?(user, item) do -          send(transport_pid, {:text, StreamerView.render("update.json", item, user)}) -        end -      else -        send(transport_pid, {:text, StreamerView.render("update.json", item)}) -      end -    end) -  end -    def push_to_socket(topics, topic, %Participation{} = participation) do      Enum.each(topics[topic] || [], fn %StreamerSocket{transport_pid: transport_pid} ->        send(transport_pid, {:text, StreamerView.render("conversation.json", participation)}) diff --git a/lib/pleroma/web/templates/static_fe/static_fe/_attachment.html.eex b/lib/pleroma/web/templates/static_fe/static_fe/_attachment.html.eex index 7e04e9550..4853e7f4b 100644 --- a/lib/pleroma/web/templates/static_fe/static_fe/_attachment.html.eex +++ b/lib/pleroma/web/templates/static_fe/static_fe/_attachment.html.eex @@ -1,8 +1,8 @@  <%= case @mediaType do %>  <% "audio" -> %> -<audio src="<%= @url %>" controls="controls"></audio> +<audio class="u-audio" src="<%= @url %>" controls="controls"></audio>  <% "video" -> %> -<video src="<%= @url %>" controls="controls"></video> +<video class="u-video" src="<%= @url %>" controls="controls"></video>  <% _ -> %> -<img src="<%= @url %>" alt="<%= @name %>" title="<%= @name %>"> +<img class="u-photo" src="<%= @url %>" alt="<%= @name %>" title="<%= @name %>">  <% end %> diff --git a/lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex b/lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex index df5e5eedd..df0244795 100644 --- a/lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex +++ b/lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex @@ -1,12 +1,16 @@ -<div class="activity" <%= if @selected do %> id="selected" <% end %>> +<div class="activity h-entry" <%= if @selected do %> id="selected" <% end %>>    <p class="pull-right"> -    <%= link format_date(@published), to: @link, class: "activity-link" %> +    <a class="activity-link u-url u-uid" href="<%= @link %>"> +      <time class="dt-published" datetime="<%= @published %>"> +        <%= format_date(@published) %> +      </time> +    </a>    </p>    <%= render("_user_card.html", %{user: @user}) %>    <div class="activity-content">      <%= if @title != "" do %>        <details <%= if open_content?() do %>open<% end %>> -        <summary><%= raw @title %></summary> +        <summary class="p-name"><%= raw @title %></summary>          <div class="e-content"><%= raw @content %></div>        </details>      <% else %> diff --git a/lib/pleroma/web/templates/static_fe/static_fe/_user_card.html.eex b/lib/pleroma/web/templates/static_fe/static_fe/_user_card.html.eex index 56f3a1524..977b894d3 100644 --- a/lib/pleroma/web/templates/static_fe/static_fe/_user_card.html.eex +++ b/lib/pleroma/web/templates/static_fe/static_fe/_user_card.html.eex @@ -1,10 +1,10 @@  <div class="p-author h-card">    <a class="u-url" rel="author noopener" href="<%= (@user.uri || @user.ap_id) %>">      <div class="avatar"> -      <img src="<%= User.avatar_url(@user) |> MediaProxy.url %>" width="48" height="48" alt=""> +      <img class="u-photo" src="<%= User.avatar_url(@user) |> MediaProxy.url %>" width="48" height="48" alt="">      </div>      <span class="display-name"> -      <bdi><%= raw Formatter.emojify(@user.name, @user.emoji) %></bdi> +      <bdi class="p-name"><%= raw Formatter.emojify(@user.name, @user.emoji) %></bdi>        <span class="nickname"><%= @user.nickname %></span>      </span>    </a> diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 537f9f778..d5d5ce08f 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -199,15 +199,16 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do    end    def follow_import(%{assigns: %{user: follower}} = conn, %{"list" => list}) do -    with lines <- String.split(list, "\n"), -         followed_identifiers <- -           Enum.map(lines, fn line -> -             String.split(line, ",") |> List.first() -           end) -           |> List.delete("Account address") do -      User.follow_import(follower, followed_identifiers) -      json(conn, "job started") -    end +    followed_identifiers = +      list +      |> String.split("\n") +      |> Enum.map(&(&1 |> String.split(",") |> List.first())) +      |> List.delete("Account address") +      |> Enum.map(&(&1 |> String.trim() |> String.trim_leading("@"))) +      |> Enum.reject(&(&1 == "")) + +    User.follow_import(follower, followed_identifiers) +    json(conn, "job started")    end    def blocks_import(conn, %{"list" => %Plug.Upload{} = listfile}) do @@ -215,10 +216,9 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do    end    def blocks_import(%{assigns: %{user: blocker}} = conn, %{"list" => list}) do -    with blocked_identifiers <- String.split(list) do -      User.blocks_import(blocker, blocked_identifiers) -      json(conn, "job started") -    end +    blocked_identifiers = list |> String.split() |> Enum.map(&String.trim_leading(&1, "@")) +    User.blocks_import(blocker, blocked_identifiers) +    json(conn, "job started")    end    def change_password(%{assigns: %{user: user}} = conn, params) do diff --git a/lib/pleroma/workers/background_worker.ex b/lib/pleroma/workers/background_worker.ex index 0f8ece2c4..57c3a9c3a 100644 --- a/lib/pleroma/workers/background_worker.ex +++ b/lib/pleroma/workers/background_worker.ex @@ -35,7 +35,7 @@ defmodule Pleroma.Workers.BackgroundWorker do          _job        ) do      blocker = User.get_cached_by_id(blocker_id) -    User.perform(:blocks_import, blocker, blocked_identifiers) +    {:ok, User.perform(:blocks_import, blocker, blocked_identifiers)}    end    def perform( @@ -47,7 +47,7 @@ defmodule Pleroma.Workers.BackgroundWorker do          _job        ) do      follower = User.get_cached_by_id(follower_id) -    User.perform(:follow_import, follower, followed_identifiers) +    {:ok, User.perform(:follow_import, follower, followed_identifiers)}    end    def perform(%{"op" => "media_proxy_preload", "message" => message}, _job) do  | 
