diff options
34 files changed, 293 insertions, 308 deletions
diff --git a/lib/pleroma/emoji/formatter.ex b/lib/pleroma/emoji/formatter.ex index 59ff2cac3..dc45b8a38 100644 --- a/lib/pleroma/emoji/formatter.ex +++ b/lib/pleroma/emoji/formatter.ex @@ -38,22 +38,14 @@ defmodule Pleroma.Emoji.Formatter do    def demojify(text, nil), do: text -  @doc "Outputs a list of the emoji-shortcodes in a text" -  def get_emoji(text) when is_binary(text) do -    Enum.filter(Emoji.get_all(), fn {emoji, %Emoji{}} -> -      String.contains?(text, ":#{emoji}:") -    end) -  end - -  def get_emoji(_), do: [] -    @doc "Outputs a list of the emoji-Maps in a text"    def get_emoji_map(text) when is_binary(text) do -    get_emoji(text) +    Emoji.get_all() +    |> Enum.filter(fn {emoji, %Emoji{}} -> String.contains?(text, ":#{emoji}:") end)      |> Enum.reduce(%{}, fn {name, %Emoji{file: file}}, acc ->        Map.put(acc, name, "#{Pleroma.Web.Endpoint.static_url()}#{file}")      end)    end -  def get_emoji_map(_), do: [] +  def get_emoji_map(_), do: %{}  end diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index c44e7fc8b..02a93a8dc 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -31,7 +31,7 @@ defmodule Pleroma.Formatter do    def mention_handler("@" <> nickname, buffer, opts, acc) do      case User.get_cached_by_nickname(nickname) do        %User{id: id} = user -> -        ap_id = get_ap_id(user) +        user_url = user.uri || user.ap_id          nickname_text = get_nickname_text(nickname, opts)          link = @@ -42,7 +42,7 @@ defmodule Pleroma.Formatter do                ["@", Phoenix.HTML.Tag.content_tag(:span, nickname_text)],                "data-user": id,                class: "u-url mention", -              href: ap_id, +              href: user_url,                rel: "ugc"              ),              class: "h-card" @@ -146,9 +146,6 @@ defmodule Pleroma.Formatter do      end    end -  defp get_ap_id(%User{source_data: %{"url" => url}}) when is_binary(url), do: url -  defp get_ap_id(%User{ap_id: ap_id}), do: ap_id -    defp get_nickname_text(nickname, %{mentions_format: :full}), do: User.full_nickname(nickname)    defp get_nickname_text(nickname, _), do: User.local_nickname(nickname)  end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index d9410535b..896bab140 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -15,6 +15,7 @@ defmodule Pleroma.User do    alias Pleroma.Config    alias Pleroma.Conversation.Participation    alias Pleroma.Delivery +  alias Pleroma.Emoji    alias Pleroma.FollowingRelationship    alias Pleroma.Formatter    alias Pleroma.HTML @@ -28,6 +29,7 @@ defmodule Pleroma.User do    alias Pleroma.UserRelationship    alias Pleroma.Web    alias Pleroma.Web.ActivityPub.ActivityPub +  alias Pleroma.Web.ActivityPub.ObjectValidators.Types    alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.CommonAPI.Utils, as: CommonUtils @@ -82,6 +84,7 @@ defmodule Pleroma.User do      field(:password, :string, virtual: true)      field(:password_confirmation, :string, virtual: true)      field(:keys, :string) +    field(:public_key, :string)      field(:ap_id, :string)      field(:avatar, :map)      field(:local, :boolean, default: true) @@ -94,7 +97,6 @@ defmodule Pleroma.User do      field(:last_digest_emailed_at, :naive_datetime)      field(:banner, :map, default: %{})      field(:background, :map, default: %{}) -    field(:source_data, :map, default: %{})      field(:note_count, :integer, default: 0)      field(:follower_count, :integer, default: 0)      field(:following_count, :integer, default: 0) @@ -112,7 +114,7 @@ defmodule Pleroma.User do      field(:show_role, :boolean, default: true)      field(:settings, :map, default: nil)      field(:magic_key, :string, default: nil) -    field(:uri, :string, default: nil) +    field(:uri, Types.Uri, default: nil)      field(:hide_followers_count, :boolean, default: false)      field(:hide_follows_count, :boolean, default: false)      field(:hide_followers, :boolean, default: false) @@ -122,7 +124,7 @@ defmodule Pleroma.User do      field(:pinned_activities, {:array, :string}, default: [])      field(:email_notifications, :map, default: %{"digest" => false})      field(:mascot, :map, default: nil) -    field(:emoji, {:array, :map}, default: []) +    field(:emoji, :map, default: %{})      field(:pleroma_settings_store, :map, default: %{})      field(:fields, {:array, :map}, default: [])      field(:raw_fields, {:array, :map}, default: []) @@ -132,6 +134,8 @@ defmodule Pleroma.User do      field(:skip_thread_containment, :boolean, default: false)      field(:actor_type, :string, default: "Person")      field(:also_known_as, {:array, :string}, default: []) +    field(:inbox, :string) +    field(:shared_inbox, :string)      embeds_one(        :notification_settings, @@ -306,6 +310,7 @@ defmodule Pleroma.User do      end    end +  # Should probably be renamed or removed    def ap_id(%User{nickname: nickname}), do: "#{Web.base_url()}/users/#{nickname}"    def ap_followers(%User{follower_address: fa}) when is_binary(fa), do: fa @@ -339,6 +344,13 @@ defmodule Pleroma.User do      end    end +  defp fix_follower_address(%{follower_address: _, following_address: _} = params), do: params + +  defp fix_follower_address(%{nickname: nickname} = params), +    do: Map.put(params, :follower_address, ap_followers(%User{nickname: nickname})) + +  defp fix_follower_address(params), do: params +    def remote_user_changeset(struct \\ %User{local: false}, params) do      bio_limit = Pleroma.Config.get([:instance, :user_bio_length], 5000)      name_limit = Pleroma.Config.get([:instance, :user_name_length], 100) @@ -356,54 +368,48 @@ defmodule Pleroma.User do        |> truncate_if_exists(:name, name_limit)        |> truncate_if_exists(:bio, bio_limit)        |> truncate_fields_param() +      |> fix_follower_address() -    changeset = -      struct -      |> cast( -        params, -        [ -          :bio, -          :name, -          :ap_id, -          :nickname, -          :avatar, -          :ap_enabled, -          :source_data, -          :banner, -          :locked, -          :magic_key, -          :uri, -          :hide_followers, -          :hide_follows, -          :hide_followers_count, -          :hide_follows_count, -          :follower_count, -          :fields, -          :following_count, -          :discoverable, -          :invisible, -          :actor_type, -          :also_known_as, -          :last_refreshed_at -        ] -      ) -      |> validate_required([:name, :ap_id]) -      |> unique_constraint(:nickname) -      |> validate_format(:nickname, @email_regex) -      |> validate_length(:bio, max: bio_limit) -      |> validate_length(:name, max: name_limit) -      |> validate_fields(true) - -    case params[:source_data] do -      %{"followers" => followers, "following" => following} -> -        changeset -        |> put_change(:follower_address, followers) -        |> put_change(:following_address, following) - -      _ -> -        followers = ap_followers(%User{nickname: get_field(changeset, :nickname)}) -        put_change(changeset, :follower_address, followers) -    end +    struct +    |> cast( +      params, +      [ +        :bio, +        :name, +        :emoji, +        :ap_id, +        :inbox, +        :shared_inbox, +        :nickname, +        :public_key, +        :avatar, +        :ap_enabled, +        :banner, +        :locked, +        :last_refreshed_at, +        :magic_key, +        :uri, +        :follower_address, +        :following_address, +        :hide_followers, +        :hide_follows, +        :hide_followers_count, +        :hide_follows_count, +        :follower_count, +        :fields, +        :following_count, +        :discoverable, +        :invisible, +        :actor_type, +        :also_known_as +      ] +    ) +    |> validate_required([:name, :ap_id]) +    |> unique_constraint(:nickname) +    |> validate_format(:nickname, @email_regex) +    |> validate_length(:bio, max: bio_limit) +    |> validate_length(:name, max: name_limit) +    |> validate_fields(true)    end    def update_changeset(struct, params \\ %{}) do @@ -416,7 +422,11 @@ defmodule Pleroma.User do        [          :bio,          :name, +        :emoji,          :avatar, +        :public_key, +        :inbox, +        :shared_inbox,          :locked,          :no_rich_text,          :default_scope, @@ -443,6 +453,7 @@ defmodule Pleroma.User do      |> validate_length(:bio, max: bio_limit)      |> validate_length(:name, min: 1, max: name_limit)      |> put_fields() +    |> put_emoji()      |> put_change_if_present(:bio, &{:ok, parse_bio(&1, struct)})      |> put_change_if_present(:avatar, &put_upload(&1, :avatar))      |> put_change_if_present(:banner, &put_upload(&1, :banner)) @@ -478,6 +489,18 @@ defmodule Pleroma.User do      |> elem(0)    end +  defp put_emoji(changeset) do +    bio = get_change(changeset, :bio) +    name = get_change(changeset, :name) + +    if bio || name do +      emoji = Map.merge(Emoji.Formatter.get_emoji_map(bio), Emoji.Formatter.get_emoji_map(name)) +      put_change(changeset, :emoji, emoji) +    else +      changeset +    end +  end +    defp put_change_if_present(changeset, map_field, value_function) do      if value = get_change(changeset, map_field) do        with {:ok, new_value} <- value_function.(value) do @@ -572,7 +595,7 @@ defmodule Pleroma.User do      struct      |> confirmation_changeset(need_confirmation: need_confirmation?) -    |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation]) +    |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation, :emoji])      |> validate_required([:name, :nickname, :password, :password_confirmation])      |> validate_confirmation(:password)      |> unique_constraint(:email) @@ -1587,8 +1610,7 @@ defmodule Pleroma.User do      |> set_cache()    end -  # AP style -  def public_key(%{source_data: %{"publicKey" => %{"publicKeyPem" => public_key_pem}}}) do +  def public_key(%{public_key: public_key_pem}) when is_binary(public_key_pem) do      key =        public_key_pem        |> :public_key.pem_decode() @@ -1598,7 +1620,7 @@ defmodule Pleroma.User do      {:ok, key}    end -  def public_key(_), do: {:error, "not found key"} +  def public_key(_), do: {:error, "key not found"}    def get_public_key_for_ap_id(ap_id) do      with {:ok, %User{} = user} <- get_or_fetch_by_ap_id(ap_id), @@ -1917,12 +1939,6 @@ defmodule Pleroma.User do      |> update_and_set_cache()    end -  def update_source_data(user, source_data) do -    user -    |> cast(%{source_data: source_data}, [:source_data]) -    |> update_and_set_cache() -  end -    def roles(%{is_moderator: is_moderator, is_admin: is_admin}) do      %{        admin: is_admin, @@ -1930,21 +1946,6 @@ defmodule Pleroma.User do      }    end -  # ``fields`` is an array of mastodon profile field, containing ``{"name": "…", "value": "…"}``. -  # For example: [{"name": "Pronoun", "value": "she/her"}, …] -  def fields(%{fields: nil, source_data: %{"attachment" => attachment}}) do -    limit = Pleroma.Config.get([:instance, :max_remote_account_fields], 0) - -    attachment -    |> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end) -    |> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end) -    |> Enum.take(limit) -  end - -  def fields(%{fields: nil}), do: [] - -  def fields(%{fields: fields}), do: fields -    def validate_fields(changeset, remote? \\ false) do      limit_name = if remote?, do: :max_remote_account_fields, else: :max_account_fields      limit = Pleroma.Config.get([:instance, limit_name], 0) @@ -2132,9 +2133,7 @@ defmodule Pleroma.User do    # - display name    def sanitize_html(%User{} = user, filter) do      fields = -      user -      |> User.fields() -      |> Enum.map(fn %{"name" => name, "value" => value} -> +      Enum.map(user.fields, fn %{"name" => name, "value" => value} ->          %{            "name" => name,            "value" => HTML.filter_tags(value, Pleroma.HTML.Scrubber.LinksOnly) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 2602b966b..35af0f7dc 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1427,19 +1427,41 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do        |> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end)        |> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end) +    emojis = +      data +      |> Map.get("tag", []) +      |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) +      |> Enum.reduce(%{}, fn %{"icon" => %{"url" => url}, "name" => name}, acc -> +        Map.put(acc, String.trim(name, ":"), url) +      end) +      locked = data["manuallyApprovesFollowers"] || false      data = Transmogrifier.maybe_fix_user_object(data)      discoverable = data["discoverable"] || false      invisible = data["invisible"] || false      actor_type = data["type"] || "Person" +    public_key = +      if is_map(data["publicKey"]) && is_binary(data["publicKey"]["publicKeyPem"]) do +        data["publicKey"]["publicKeyPem"] +      else +        nil +      end + +    shared_inbox = +      if is_map(data["endpoints"]) && is_binary(data["endpoints"]["sharedInbox"]) do +        data["endpoints"]["sharedInbox"] +      else +        nil +      end +      user_data = %{        ap_id: data["id"],        uri: get_actor_url(data["url"]),        ap_enabled: true, -      source_data: data,        banner: banner,        fields: fields, +      emoji: emojis,        locked: locked,        discoverable: discoverable,        invisible: invisible, @@ -1449,7 +1471,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do        following_address: data["following"],        bio: data["summary"],        actor_type: actor_type, -      also_known_as: Map.get(data, "alsoKnownAs", []) +      also_known_as: Map.get(data, "alsoKnownAs", []), +      public_key: public_key, +      inbox: data["inbox"], +      shared_inbox: shared_inbox      }      # nickname can be nil because of virtual actors diff --git a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex index c95b622e4..462a5620a 100644 --- a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex @@ -35,6 +35,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do      field(:like_count, :integer, default: 0)      field(:announcement_count, :integer, default: 0)      field(:inRepyTo, :string) +    field(:uri, Types.Uri)      field(:likes, {:array, :string}, default: [])      field(:announcements, {:array, :string}, default: []) diff --git a/lib/pleroma/web/activity_pub/object_validators/types/object_id.ex b/lib/pleroma/web/activity_pub/object_validators/types/object_id.ex index f6e749b33..f71f76370 100644 --- a/lib/pleroma/web/activity_pub/object_validators/types/object_id.ex +++ b/lib/pleroma/web/activity_pub/object_validators/types/object_id.ex @@ -15,15 +15,9 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.ObjectID do    def cast(%{"id" => object}), do: cast(object) -  def cast(_) do -    :error -  end +  def cast(_), do: :error -  def dump(data) do -    {:ok, data} -  end +  def dump(data), do: {:ok, data} -  def load(data) do -    {:ok, data} -  end +  def load(data), do: {:ok, data}  end diff --git a/lib/pleroma/web/activity_pub/object_validators/types/uri.ex b/lib/pleroma/web/activity_pub/object_validators/types/uri.ex new file mode 100644 index 000000000..24845bcc0 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/types/uri.ex @@ -0,0 +1,20 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.Uri do +  use Ecto.Type + +  def type, do: :string + +  def cast(uri) when is_binary(uri) do +    case URI.parse(uri) do +      %URI{host: nil} -> :error +      %URI{host: ""} -> :error +      %URI{scheme: scheme} when scheme in ["https", "http"] -> {:ok, uri} +      _ -> :error +    end +  end + +  def cast(_), do: :error + +  def dump(data), do: {:ok, data} + +  def load(data), do: {:ok, data} +end diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex index 6c558e7f0..b70cbd043 100644 --- a/lib/pleroma/web/activity_pub/publisher.ex +++ b/lib/pleroma/web/activity_pub/publisher.ex @@ -141,8 +141,8 @@ defmodule Pleroma.Web.ActivityPub.Publisher do      |> Enum.map(& &1.ap_id)    end -  defp maybe_use_sharedinbox(%User{source_data: data}), -    do: (is_map(data["endpoints"]) && Map.get(data["endpoints"], "sharedInbox")) || data["inbox"] +  defp maybe_use_sharedinbox(%User{shared_inbox: nil, inbox: inbox}), do: inbox +  defp maybe_use_sharedinbox(%User{shared_inbox: shared_inbox}), do: shared_inbox    @doc """    Determine a user inbox to use based on heuristics.  These heuristics @@ -157,7 +157,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do    """    def determine_inbox(          %Activity{data: activity_data}, -        %User{source_data: data} = user +        %User{inbox: inbox} = user        ) do      to = activity_data["to"] || []      cc = activity_data["cc"] || [] @@ -174,7 +174,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do          maybe_use_sharedinbox(user)        true -> -        data["inbox"] +        inbox      end    end @@ -192,14 +192,13 @@ defmodule Pleroma.Web.ActivityPub.Publisher do      inboxes =        recipients        |> Enum.filter(&User.ap_enabled?/1) -      |> Enum.map(fn %{source_data: data} -> data["inbox"] end) +      |> Enum.map(fn actor -> actor.inbox end)        |> Enum.filter(fn inbox -> should_federate?(inbox, public) end)        |> Instances.filter_reachable()      Repo.checkout(fn ->        Enum.each(inboxes, fn {inbox, unreachable_since} -> -        %User{ap_id: ap_id} = -          Enum.find(recipients, fn %{source_data: data} -> data["inbox"] == inbox end) +        %User{ap_id: ap_id} = Enum.find(recipients, fn actor -> actor.inbox == inbox end)          # Get all the recipients on the same host and add them to cc. Otherwise, a remote          # instance would only accept a first message for the first recipient and ignore the rest. diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index d7ff6372c..09119137b 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -1160,7 +1160,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do    def take_emoji_tags(%User{emoji: emoji}) do      emoji -    |> Enum.flat_map(&Map.to_list/1) +    |> Map.to_list()      |> Enum.map(&build_emoji_tag/1)    end diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex index bc21ac6c7..34590b16d 100644 --- a/lib/pleroma/web/activity_pub/views/user_view.ex +++ b/lib/pleroma/web/activity_pub/views/user_view.ex @@ -79,10 +79,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do      emoji_tags = Transmogrifier.take_emoji_tags(user) -    fields = -      user -      |> User.fields() -      |> Enum.map(&Map.put(&1, "type", "PropertyValue")) +    fields = Enum.map(user.fields, &Map.put(&1, "type", "PropertyValue"))      %{        "id" => user.ap_id, @@ -103,7 +100,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do        },        "endpoints" => endpoints,        "attachment" => fields, -      "tag" => (user.source_data["tag"] || []) ++ emoji_tags, +      "tag" => emoji_tags,        "discoverable" => user.discoverable      }      |> Map.merge(maybe_make_image(&User.avatar_url/2, "icon", user)) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index c56756a3d..f50a909aa 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -332,26 +332,6 @@ defmodule Pleroma.Web.CommonAPI do    defp maybe_create_activity_expiration(result, _), do: result -  # Updates the emojis for a user based on their profile -  def update(user) do -    emoji = emoji_from_profile(user) -    source_data = Map.put(user.source_data, "tag", emoji) - -    user = -      case User.update_source_data(user, source_data) do -        {:ok, user} -> user -        _ -> user -      end - -    ActivityPub.update(%{ -      local: true, -      to: [Pleroma.Constants.as_public(), user.follower_address], -      cc: [], -      actor: user.ap_id, -      object: Pleroma.Web.ActivityPub.UserView.render("user.json", %{user: user}) -    }) -  end -    def pin(id_or_ap_id, %{ap_id: user_ap_id} = user) do      with %Activity{             actor: ^user_ap_id, diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index 635e7cd38..7eec5aa09 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -10,7 +10,6 @@ defmodule Pleroma.Web.CommonAPI.Utils do    alias Pleroma.Activity    alias Pleroma.Config    alias Pleroma.Conversation.Participation -  alias Pleroma.Emoji    alias Pleroma.Formatter    alias Pleroma.Object    alias Pleroma.Plugs.AuthenticationPlug @@ -18,7 +17,6 @@ defmodule Pleroma.Web.CommonAPI.Utils do    alias Pleroma.User    alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.ActivityPub.Visibility -  alias Pleroma.Web.Endpoint    alias Pleroma.Web.MediaProxy    require Logger @@ -175,7 +173,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do              "replies" => %{"type" => "Collection", "totalItems" => 0}            } -          {note, Map.merge(emoji, Emoji.Formatter.get_emoji_map(option))} +          {note, Map.merge(emoji, Pleroma.Emoji.Formatter.get_emoji_map(option))}          end)        end_time = @@ -431,19 +429,6 @@ defmodule Pleroma.Web.CommonAPI.Utils do      end    end -  def emoji_from_profile(%User{bio: bio, name: name}) do -    [bio, name] -    |> Enum.map(&Emoji.Formatter.get_emoji/1) -    |> Enum.concat() -    |> Enum.map(fn {shortcode, %Emoji{file: path}} -> -      %{ -        "type" => "Emoji", -        "icon" => %{"type" => "Image", "url" => "#{Endpoint.url()}#{path}"}, -        "name" => ":#{shortcode}:" -      } -    end) -  end -    def maybe_notify_to_recipients(          recipients,          %Activity{data: %{"to" => to, "type" => _type}} = _activity diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 7da1a11f6..a42e6b463 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -146,9 +146,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do    end    @doc "PATCH /api/v1/accounts/update_credentials" -  def update_credentials(%{assigns: %{user: original_user}} = conn, params) do -    user = original_user - +  def update_credentials(%{assigns: %{user: user}} = conn, params) do      user_params =        [          :no_rich_text, @@ -184,8 +182,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do      changeset = User.update_changeset(user, user_params)      with {:ok, user} <- User.update_and_set_cache(changeset) do -      if original_user != user, do: CommonAPI.update(user) -        render(conn, "show.json", user: user, for: user, with_pleroma_settings: true)      else        _e -> render_error(conn, :forbidden, "Invalid request") diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 8fb96a22a..b4b61e74c 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -181,13 +181,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do      bot = user.actor_type in ["Application", "Service"]      emojis = -      (user.source_data["tag"] || []) -      |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) -      |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> +      Enum.map(user.emoji, fn {shortcode, url} ->          %{ -          "shortcode" => String.trim(name, ":"), -          "url" => MediaProxy.url(url), -          "static_url" => MediaProxy.url(url), +          "shortcode" => shortcode, +          "url" => url, +          "static_url" => url,            "visible_in_picker" => false          }        end) diff --git a/lib/pleroma/web/pleroma_api/controllers/account_controller.ex b/lib/pleroma/web/pleroma_api/controllers/account_controller.ex index 9d0b3b1e4..60405fbff 100644 --- a/lib/pleroma/web/pleroma_api/controllers/account_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/account_controller.ex @@ -13,7 +13,6 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do    alias Pleroma.Plugs.RateLimiter    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub -  alias Pleroma.Web.CommonAPI    alias Pleroma.Web.MastodonAPI.StatusView    require Pleroma.Constants @@ -58,38 +57,32 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do    @doc "PATCH /api/v1/pleroma/accounts/update_avatar"    def update_avatar(%{assigns: %{user: user}} = conn, %{"img" => ""}) do -    {:ok, user} = +    {:ok, _user} =        user        |> Changeset.change(%{avatar: nil})        |> User.update_and_set_cache() -    CommonAPI.update(user) -      json(conn, %{url: nil})    end    def update_avatar(%{assigns: %{user: user}} = conn, params) do      {:ok, %{data: data}} = ActivityPub.upload(params, type: :avatar) -    {:ok, user} = user |> Changeset.change(%{avatar: data}) |> User.update_and_set_cache() +    {:ok, _user} = user |> Changeset.change(%{avatar: data}) |> User.update_and_set_cache()      %{"url" => [%{"href" => href} | _]} = data -    CommonAPI.update(user) -      json(conn, %{url: href})    end    @doc "PATCH /api/v1/pleroma/accounts/update_banner"    def update_banner(%{assigns: %{user: user}} = conn, %{"banner" => ""}) do -    with {:ok, user} <- User.update_banner(user, %{}) do -      CommonAPI.update(user) +    with {:ok, _user} <- User.update_banner(user, %{}) do        json(conn, %{url: nil})      end    end    def update_banner(%{assigns: %{user: user}} = conn, params) do      with {:ok, object} <- ActivityPub.upload(%{"img" => params["banner"]}, type: :banner), -         {:ok, user} <- User.update_banner(user, object.data) do -      CommonAPI.update(user) +         {:ok, _user} <- User.update_banner(user, object.data) do        %{"url" => [%{"href" => href} | _]} = object.data        json(conn, %{url: href}) diff --git a/lib/pleroma/web/static_fe/static_fe_view.ex b/lib/pleroma/web/static_fe/static_fe_view.ex index 66d87620c..b3d1d1ec8 100644 --- a/lib/pleroma/web/static_fe/static_fe_view.ex +++ b/lib/pleroma/web/static_fe/static_fe_view.ex @@ -18,15 +18,6 @@ defmodule Pleroma.Web.StaticFE.StaticFEView do    @media_types ["image", "audio", "video"] -  def emoji_for_user(%User{} = user) do -    user.source_data -    |> Map.get("tag", []) -    |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) -    |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> -      {String.trim(name, ":"), url} -    end) -  end -    def fetch_media_type(%{"mediaType" => mediaType}) do      Utils.fetch_media_type(@media_types, mediaType)    end 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 2a7582d45..56f3a1524 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 @@ -4,7 +4,7 @@        <img src="<%= User.avatar_url(@user) |> MediaProxy.url %>" width="48" height="48" alt="">      </div>      <span class="display-name"> -      <bdi><%= raw (@user.name |> Formatter.emojify(emoji_for_user(@user))) %></bdi> +      <bdi><%= raw Formatter.emojify(@user.name, @user.emoji) %></bdi>        <span class="nickname"><%= @user.nickname %></span>      </span>    </a> diff --git a/lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex b/lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex index e7d2aecad..3191bf450 100644 --- a/lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex +++ b/lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex @@ -7,7 +7,7 @@        <input type="hidden" name="profile" value="">        <button type="submit" class="collapse">Remote follow</button>      </form> -    <%= raw Formatter.emojify(@user.name, emoji_for_user(@user)) %> | +    <%= raw Formatter.emojify(@user.name, @user.emoji) %> |      <%= link "@#{@user.nickname}@#{Endpoint.host()}", to: (@user.uri || @user.ap_id) %>    </h3>    <p><%= raw @user.bio %></p> diff --git a/priv/repo/migrations/20200401030751_users_add_public_key.exs b/priv/repo/migrations/20200401030751_users_add_public_key.exs new file mode 100644 index 000000000..04e5ad1e2 --- /dev/null +++ b/priv/repo/migrations/20200401030751_users_add_public_key.exs @@ -0,0 +1,17 @@ +defmodule Pleroma.Repo.Migrations.UsersAddPublicKey do +  use Ecto.Migration + +  def up do +    alter table(:users) do +      add_if_not_exists(:public_key, :text) +    end + +    execute("UPDATE users SET public_key = source_data->'publicKey'->>'publicKeyPem'") +  end + +  def down do +    alter table(:users) do +      remove_if_exists(:public_key, :text) +    end +  end +end diff --git a/priv/repo/migrations/20200401072456_users_add_inboxes.exs b/priv/repo/migrations/20200401072456_users_add_inboxes.exs new file mode 100644 index 000000000..0947f0ab2 --- /dev/null +++ b/priv/repo/migrations/20200401072456_users_add_inboxes.exs @@ -0,0 +1,20 @@ +defmodule Pleroma.Repo.Migrations.UsersAddInboxes do +  use Ecto.Migration + +  def up do +    alter table(:users) do +      add_if_not_exists(:inbox, :text) +      add_if_not_exists(:shared_inbox, :text) +    end + +    execute("UPDATE users SET inbox = source_data->>'inbox'") +    execute("UPDATE users SET shared_inbox = source_data->'endpoints'->>'sharedInbox'") +  end + +  def down do +    alter table(:users) do +      remove_if_exists(:inbox, :text) +      remove_if_exists(:shared_inbox, :text) +    end +  end +end diff --git a/priv/repo/migrations/20200406100225_users_add_emoji.exs b/priv/repo/migrations/20200406100225_users_add_emoji.exs new file mode 100644 index 000000000..d0254c170 --- /dev/null +++ b/priv/repo/migrations/20200406100225_users_add_emoji.exs @@ -0,0 +1,35 @@ +defmodule Pleroma.Repo.Migrations.UsersPopulateEmoji do +  use Ecto.Migration + +  import Ecto.Query + +  alias Pleroma.User +  alias Pleroma.Repo + +  def up do +    execute("ALTER TABLE users ALTER COLUMN emoji SET DEFAULT '{}'::jsonb") +    execute("UPDATE users SET emoji = DEFAULT WHERE emoji = '[]'::jsonb") + +    from(u in User) +    |> select([u], struct(u, [:id, :ap_id, :source_data])) +    |> Repo.stream() +    |> Enum.each(fn user -> +      emoji = +        user.source_data +        |> Map.get("tag", []) +        |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) +        |> Enum.reduce(%{}, fn %{"icon" => %{"url" => url}, "name" => name}, acc -> +          Map.put(acc, String.trim(name, ":"), url) +        end) + +      user +      |> Ecto.Changeset.cast(%{emoji: emoji}, [:emoji]) +      |> Repo.update() +    end) +  end + +  def down do +    execute("ALTER TABLE users ALTER COLUMN emoji SET DEFAULT '[]'::jsonb") +    execute("UPDATE users SET emoji = DEFAULT WHERE emoji = '{}'::jsonb") +  end +end diff --git a/priv/repo/migrations/20200406105422_users_remove_source_data.exs b/priv/repo/migrations/20200406105422_users_remove_source_data.exs new file mode 100644 index 000000000..9812d480f --- /dev/null +++ b/priv/repo/migrations/20200406105422_users_remove_source_data.exs @@ -0,0 +1,15 @@ +defmodule Pleroma.Repo.Migrations.UsersRemoveSourceData do +  use Ecto.Migration + +  def up do +    alter table(:users) do +      remove_if_exists(:source_data, :map) +    end +  end + +  def down do +    alter table(:users) do +      add_if_not_exists(:source_data, :map, default: %{}) +    end +  end +end diff --git a/test/emoji/formatter_test.exs b/test/emoji/formatter_test.exs index 3bfee9420..12af6cd8b 100644 --- a/test/emoji/formatter_test.exs +++ b/test/emoji/formatter_test.exs @@ -3,7 +3,6 @@  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Emoji.FormatterTest do -  alias Pleroma.Emoji    alias Pleroma.Emoji.Formatter    use Pleroma.DataCase @@ -32,30 +31,19 @@ defmodule Pleroma.Emoji.FormatterTest do      end    end -  describe "get_emoji" do +  describe "get_emoji_map" do      test "it returns the emoji used in the text" do -      text = "I love :firefox:" - -      assert Formatter.get_emoji(text) == [ -               {"firefox", -                %Emoji{ -                  code: "firefox", -                  file: "/emoji/Firefox.gif", -                  tags: ["Gif", "Fun"], -                  safe_code: "firefox", -                  safe_file: "/emoji/Firefox.gif" -                }} -             ] +      assert Formatter.get_emoji_map("I love :firefox:") == %{ +               "firefox" => "http://localhost:4001/emoji/Firefox.gif" +             }      end      test "it returns a nice empty result when no emojis are present" do -      text = "I love moominamma" -      assert Formatter.get_emoji(text) == [] +      assert Formatter.get_emoji_map("I love moominamma") == %{}      end      test "it doesn't die when text is absent" do -      text = nil -      assert Formatter.get_emoji(text) == [] +      assert Formatter.get_emoji_map(nil) == %{}      end    end  end diff --git a/test/formatter_test.exs b/test/formatter_test.exs index 93fd8eab7..bef5a2c28 100644 --- a/test/formatter_test.exs +++ b/test/formatter_test.exs @@ -140,7 +140,7 @@ defmodule Pleroma.FormatterTest do        archaeme =          insert(:user,            nickname: "archa_eme_", -          source_data: %{"url" => "https://archeme/@archa_eme_"} +          uri: "https://archeme/@archa_eme_"          )        archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) diff --git a/test/signature_test.exs b/test/signature_test.exs index 04736d8b9..d5a2a62c4 100644 --- a/test/signature_test.exs +++ b/test/signature_test.exs @@ -19,12 +19,7 @@ defmodule Pleroma.SignatureTest do    @private_key "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEA48qb4v6kqigZutO9Ot0wkp27GIF2LiVaADgxQORZozZR63jH\nTaoOrS3Xhngbgc8SSOhfXET3omzeCLqaLNfXnZ8OXmuhJfJSU6mPUvmZ9QdT332j\nfN/g3iWGhYMf/M9ftCKh96nvFVO/tMruzS9xx7tkrfJjehdxh/3LlJMMImPtwcD7\nkFXwyt1qZTAU6Si4oQAJxRDQXHp1ttLl3Ob829VM7IKkrVmY8TD+JSlV0jtVJPj6\n1J19ytKTx/7UaucYvb9HIiBpkuiy5n/irDqKLVf5QEdZoNCdojOZlKJmTLqHhzKP\n3E9TxsUjhrf4/EqegNc/j982RvOxeu4i40zMQwIDAQABAoIBAQDH5DXjfh21i7b4\ncXJuw0cqget617CDUhemdakTDs9yH+rHPZd3mbGDWuT0hVVuFe4vuGpmJ8c+61X0\nRvugOlBlavxK8xvYlsqTzAmPgKUPljyNtEzQ+gz0I+3mH2jkin2rL3D+SksZZgKm\nfiYMPIQWB2WUF04gB46DDb2mRVuymGHyBOQjIx3WC0KW2mzfoFUFRlZEF+Nt8Ilw\nT+g/u0aZ1IWoszbsVFOEdghgZET0HEarum0B2Je/ozcPYtwmU10iBANGMKdLqaP/\nj954BPunrUf6gmlnLZKIKklJj0advx0NA+cL79+zeVB3zexRYSA5o9q0WPhiuTwR\n/aedWHnBAoGBAP0sDWBAM1Y4TRAf8ZI9PcztwLyHPzfEIqzbObJJnx1icUMt7BWi\n+/RMOnhrlPGE1kMhOqSxvXYN3u+eSmWTqai2sSH5Hdw2EqnrISSTnwNUPINX7fHH\njEkgmXQ6ixE48SuBZnb4w1EjdB/BA6/sjL+FNhggOc87tizLTkMXmMtTAoGBAOZV\n+wPuAMBDBXmbmxCuDIjoVmgSlgeRunB1SA8RCPAFAiUo3+/zEgzW2Oz8kgI+xVwM\n33XkLKrWG1Orhpp6Hm57MjIc5MG+zF4/YRDpE/KNG9qU1tiz0UD5hOpIU9pP4bR/\ngxgPxZzvbk4h5BfHWLpjlk8UUpgk6uxqfti48c1RAoGBALBOKDZ6HwYRCSGMjUcg\n3NPEUi84JD8qmFc2B7Tv7h2he2ykIz9iFAGpwCIyETQsJKX1Ewi0OlNnD3RhEEAy\nl7jFGQ+mkzPSeCbadmcpYlgIJmf1KN/x7fDTAepeBpCEzfZVE80QKbxsaybd3Dp8\nCfwpwWUFtBxr4c7J+gNhAGe/AoGAPn8ZyqkrPv9wXtyfqFjxQbx4pWhVmNwrkBPi\nZ2Qh3q4dNOPwTvTO8vjghvzIyR8rAZzkjOJKVFgftgYWUZfM5gE7T2mTkBYq8W+U\n8LetF+S9qAM2gDnaDx0kuUTCq7t87DKk6URuQ/SbI0wCzYjjRD99KxvChVGPBHKo\n1DjqMuECgYEAgJGNm7/lJCS2wk81whfy/ttKGsEIkyhPFYQmdGzSYC5aDc2gp1R3\nxtOkYEvdjfaLfDGEa4UX8CHHF+w3t9u8hBtcdhMH6GYb9iv6z0VBTt4A/11HUR49\n3Z7TQ18Iyh3jAUCzFV9IJlLIExq5Y7P4B3ojWFBN607sDCt8BMPbDYs=\n-----END RSA PRIVATE KEY-----" -  @public_key %{ -    "id" => "https://mastodon.social/users/lambadalambda#main-key", -    "owner" => "https://mastodon.social/users/lambadalambda", -    "publicKeyPem" => -      "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0P/Tq4gb4G/QVuMGbJo\nC/AfMNcv+m7NfrlOwkVzcU47jgESuYI4UtJayissCdBycHUnfVUd9qol+eznSODz\nCJhfJloqEIC+aSnuEPGA0POtWad6DU0E6/Ho5zQn5WAWUwbRQqowbrsm/GHo2+3v\neR5jGenwA6sYhINg/c3QQbksyV0uJ20Umyx88w8+TJuv53twOfmyDWuYNoQ3y5cc\nHKOZcLHxYOhvwg3PFaGfFHMFiNmF40dTXt9K96r7sbzc44iLD+VphbMPJEjkMuf8\nPGEFOBzy8pm3wJZw2v32RNW2VESwMYyqDzwHXGSq1a73cS7hEnc79gXlELsK04L9\nQQIDAQAB\n-----END PUBLIC KEY-----\n" -  } +  @public_key "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0P/Tq4gb4G/QVuMGbJo\nC/AfMNcv+m7NfrlOwkVzcU47jgESuYI4UtJayissCdBycHUnfVUd9qol+eznSODz\nCJhfJloqEIC+aSnuEPGA0POtWad6DU0E6/Ho5zQn5WAWUwbRQqowbrsm/GHo2+3v\neR5jGenwA6sYhINg/c3QQbksyV0uJ20Umyx88w8+TJuv53twOfmyDWuYNoQ3y5cc\nHKOZcLHxYOhvwg3PFaGfFHMFiNmF40dTXt9K96r7sbzc44iLD+VphbMPJEjkMuf8\nPGEFOBzy8pm3wJZw2v32RNW2VESwMYyqDzwHXGSq1a73cS7hEnc79gXlELsK04L9\nQQIDAQAB\n-----END PUBLIC KEY-----\n"    @rsa_public_key {      :RSAPublicKey, @@ -42,7 +37,7 @@ defmodule Pleroma.SignatureTest do      test "it returns key" do        expected_result = {:ok, @rsa_public_key} -      user = insert(:user, source_data: %{"publicKey" => @public_key}) +      user = insert(:user, public_key: @public_key)        assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == expected_result      end @@ -53,8 +48,8 @@ defmodule Pleroma.SignatureTest do               end) =~ "[error] Could not decode user"      end -    test "it returns error if public key is empty" do -      user = insert(:user, source_data: %{"publicKey" => %{}}) +    test "it returns error if public key is nil" do +      user = insert(:user, public_key: nil)        assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == {:error, :error}      end diff --git a/test/user_test.exs b/test/user_test.exs index 9a45570b1..65e118d6d 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -582,7 +582,7 @@ defmodule Pleroma.UserTest do        {:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin") -      assert user.source_data["endpoints"] +      assert user.inbox        refute user.last_refreshed_at == orig_user.last_refreshed_at      end diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 17e7b97de..6410df49b 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -180,7 +180,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        {:ok, user} = ActivityPub.make_user_from_ap_id(user_id)        assert user.ap_id == user_id        assert user.nickname == "admin@mastodon.example.org" -      assert user.source_data        assert user.ap_enabled        assert user.follower_address == "http://mastodon.example.org/users/admin/followers"      end diff --git a/test/web/activity_pub/publisher_test.exs b/test/web/activity_pub/publisher_test.exs index 801da03c1..c2bc38d52 100644 --- a/test/web/activity_pub/publisher_test.exs +++ b/test/web/activity_pub/publisher_test.exs @@ -48,10 +48,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do    describe "determine_inbox/2" do      test "it returns sharedInbox for messages involving as:Public in to" do -      user = -        insert(:user, %{ -          source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} -        }) +      user = insert(:user, %{shared_inbox: "http://example.com/inbox"})        activity = %Activity{          data: %{"to" => [@as_public], "cc" => [user.follower_address]} @@ -61,10 +58,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      end      test "it returns sharedInbox for messages involving as:Public in cc" do -      user = -        insert(:user, %{ -          source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} -        }) +      user = insert(:user, %{shared_inbox: "http://example.com/inbox"})        activity = %Activity{          data: %{"cc" => [@as_public], "to" => [user.follower_address]} @@ -74,11 +68,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      end      test "it returns sharedInbox for messages involving multiple recipients in to" do -      user = -        insert(:user, %{ -          source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} -        }) - +      user = insert(:user, %{shared_inbox: "http://example.com/inbox"})        user_two = insert(:user)        user_three = insert(:user) @@ -90,11 +80,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      end      test "it returns sharedInbox for messages involving multiple recipients in cc" do -      user = -        insert(:user, %{ -          source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} -        }) - +      user = insert(:user, %{shared_inbox: "http://example.com/inbox"})        user_two = insert(:user)        user_three = insert(:user) @@ -107,12 +93,10 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      test "it returns sharedInbox for messages involving multiple recipients in total" do        user = -        insert(:user, -          source_data: %{ -            "inbox" => "http://example.com/personal-inbox", -            "endpoints" => %{"sharedInbox" => "http://example.com/inbox"} -          } -        ) +        insert(:user, %{ +          shared_inbox: "http://example.com/inbox", +          inbox: "http://example.com/personal-inbox" +        })        user_two = insert(:user) @@ -125,12 +109,10 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      test "it returns inbox for messages involving single recipients in total" do        user = -        insert(:user, -          source_data: %{ -            "inbox" => "http://example.com/personal-inbox", -            "endpoints" => %{"sharedInbox" => "http://example.com/inbox"} -          } -        ) +        insert(:user, %{ +          shared_inbox: "http://example.com/inbox", +          inbox: "http://example.com/personal-inbox" +        })        activity = %Activity{          data: %{"to" => [user.ap_id], "cc" => []} @@ -258,11 +240,11 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do                     [:passthrough],                     [] do        follower = -        insert(:user, +        insert(:user, %{            local: false, -          source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}, +          inbox: "https://domain.com/users/nick1/inbox",            ap_enabled: true -        ) +        })        actor = insert(:user, follower_address: follower.ap_id)        user = insert(:user) @@ -295,14 +277,14 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do        fetcher =          insert(:user,            local: false, -          source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}, +          inbox: "https://domain.com/users/nick1/inbox",            ap_enabled: true          )        another_fetcher =          insert(:user,            local: false, -          source_data: %{"inbox" => "https://domain2.com/users/nick1/inbox"}, +          inbox: "https://domain2.com/users/nick1/inbox",            ap_enabled: true          ) diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 2332029e5..6057e360a 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -746,7 +746,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        user = User.get_cached_by_ap_id(activity.actor) -      assert User.fields(user) == [ +      assert user.fields == [                 %{"name" => "foo", "value" => "bar"},                 %{"name" => "foo1", "value" => "bar1"}               ] @@ -767,7 +767,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        user = User.get_cached_by_ap_id(user.ap_id) -      assert User.fields(user) == [ +      assert user.fields == [                 %{"name" => "foo", "value" => "updated"},                 %{"name" => "foo1", "value" => "updated"}               ] @@ -785,7 +785,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        user = User.get_cached_by_ap_id(user.ap_id) -      assert User.fields(user) == [ +      assert user.fields == [                 %{"name" => "foo", "value" => "updated"},                 %{"name" => "foo1", "value" => "updated"}               ] @@ -796,7 +796,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        user = User.get_cached_by_ap_id(user.ap_id) -      assert User.fields(user) == [] +      assert user.fields == []      end      test "it works for incoming update activities which lock the account" do @@ -2162,4 +2162,18 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do                 Transmogrifier.set_replies(object.data)["replies"]      end    end + +  test "take_emoji_tags/1" do +    user = insert(:user, %{emoji: %{"firefox" => "https://example.org/firefox.png"}}) + +    assert Transmogrifier.take_emoji_tags(user) == [ +             %{ +               "icon" => %{"type" => "Image", "url" => "https://example.org/firefox.png"}, +               "id" => "https://example.org/firefox.png", +               "name" => ":firefox:", +               "type" => "Emoji", +               "updated" => "1970-01-01T00:00:00Z" +             } +           ] +  end  end diff --git a/test/web/activity_pub/views/user_view_test.exs b/test/web/activity_pub/views/user_view_test.exs index 514fd97b8..8d00893a5 100644 --- a/test/web/activity_pub/views/user_view_test.exs +++ b/test/web/activity_pub/views/user_view_test.exs @@ -38,7 +38,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do    end    test "Renders with emoji tags" do -    user = insert(:user, emoji: [%{"bib" => "/test"}]) +    user = insert(:user, emoji: %{"bib" => "/test"})      assert %{               "tag" => [ diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index b12be973f..e130736ec 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -97,18 +97,6 @@ defmodule Pleroma.Web.CommonAPITest do      assert Object.normalize(activity).data["emoji"]["firefox"]    end -  test "it adds emoji when updating profiles" do -    user = insert(:user, %{name: ":firefox:"}) - -    {:ok, activity} = CommonAPI.update(user) -    user = User.get_cached_by_ap_id(user.ap_id) -    [firefox] = user.source_data["tag"] - -    assert firefox["name"] == ":firefox:" - -    assert Pleroma.Constants.as_public() in activity.recipients -  end -    describe "posting" do      test "it supports explicit addressing" do        user = insert(:user) diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index 98cf02d49..b21445fe9 100644 --- a/test/web/common_api/common_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -7,7 +7,6 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do    alias Pleroma.Object    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.CommonAPI.Utils -  alias Pleroma.Web.Endpoint    use Pleroma.DataCase    import ExUnit.CaptureLog @@ -42,28 +41,6 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do      end    end -  test "parses emoji from name and bio" do -    {:ok, user} = UserBuilder.insert(%{name: ":blank:", bio: ":firefox:"}) - -    expected = [ -      %{ -        "type" => "Emoji", -        "icon" => %{"type" => "Image", "url" => "#{Endpoint.url()}/emoji/Firefox.gif"}, -        "name" => ":firefox:" -      }, -      %{ -        "type" => "Emoji", -        "icon" => %{ -          "type" => "Image", -          "url" => "#{Endpoint.url()}/emoji/blank.png" -        }, -        "name" => ":blank:" -      } -    ] - -    assert expected == Utils.emoji_from_profile(user) -  end -    describe "format_input/3" do      test "works for bare text/plain" do        text = "hello world!" diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs index da844c24c..59e53bb03 100644 --- a/test/web/federator_test.exs +++ b/test/web/federator_test.exs @@ -78,7 +78,7 @@ defmodule Pleroma.Web.FederatorTest do          local: false,          nickname: "nick1@domain.com",          ap_id: "https://domain.com/users/nick1", -        source_data: %{"inbox" => inbox1}, +        inbox: inbox1,          ap_enabled: true        }) @@ -86,7 +86,7 @@ defmodule Pleroma.Web.FederatorTest do          local: false,          nickname: "nick2@domain2.com",          ap_id: "https://domain2.com/users/nick2", -        source_data: %{"inbox" => inbox2}, +        inbox: inbox2,          ap_enabled: true        }) diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index 4435f69ff..85fa4f6a2 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -19,16 +19,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do    end    test "Represent a user account" do -    source_data = %{ -      "tag" => [ -        %{ -          "type" => "Emoji", -          "icon" => %{"url" => "/file.png"}, -          "name" => ":karjalanpiirakka:" -        } -      ] -    } -      background_image = %{        "url" => [%{"href" => "https://example.com/images/asuka_hospital.png"}]      } @@ -37,13 +27,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        insert(:user, %{          follower_count: 3,          note_count: 5, -        source_data: source_data,          background: background_image,          nickname: "shp@shitposter.club",          name: ":karjalanpiirakka: shp",          bio:            "<script src=\"invalid-html\"></script><span>valid html</span>. a<br>b<br/>c<br >d<br />f", -        inserted_at: ~N[2017-08-15 15:47:06.597036] +        inserted_at: ~N[2017-08-15 15:47:06.597036], +        emoji: %{"karjalanpiirakka" => "/file.png"}        })      expected = %{ @@ -117,7 +107,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        insert(:user, %{          follower_count: 3,          note_count: 5, -        source_data: %{},          actor_type: "Service",          nickname: "shp@shitposter.club",          inserted_at: ~N[2017-08-15 15:47:06.597036] @@ -311,7 +300,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        insert(:user, %{          follower_count: 0,          note_count: 5, -        source_data: %{},          actor_type: "Service",          nickname: "shp@shitposter.club",          inserted_at: ~N[2017-08-15 15:47:06.597036]  | 
