Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into validate-user-info
authorlain <lain@soykaf.club>
Sat, 1 Dec 2018 08:55:46 +0000 (09:55 +0100)
committerlain <lain@soykaf.club>
Sat, 1 Dec 2018 08:55:46 +0000 (09:55 +0100)
41 files changed:
lib/pleroma/formatter.ex
lib/pleroma/plugs/oauth_plug.ex
lib/pleroma/plugs/user_is_admin_plug.ex
lib/pleroma/user.ex
lib/pleroma/user/info.ex [new file with mode: 0644]
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/activity_pub/transmogrifier.ex
lib/pleroma/web/activity_pub/views/user_view.ex
lib/pleroma/web/admin_api/admin_api_controller.ex
lib/pleroma/web/common_api/common_api.ex
lib/pleroma/web/http_signatures/http_signatures.ex
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/mastodon_api/views/account_view.ex
lib/pleroma/web/ostatus/ostatus.ex
lib/pleroma/web/router.ex
lib/pleroma/web/streamer.ex
lib/pleroma/web/twitter_api/twitter_api.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
lib/pleroma/web/twitter_api/views/user_view.ex
lib/pleroma/web/web_finger/web_finger.ex
lib/pleroma/web/websub/websub.ex
test/formatter_test.exs
test/plugs/user_is_admin_plug_test.exs
test/support/factory.ex
test/user_test.exs
test/web/activity_pub/activity_pub_test.exs
test/web/activity_pub/transmogrifier_test.exs
test/web/admin_api/admin_api_controller_test.exs
test/web/common_api/common_api_test.exs
test/web/mastodon_api/account_view_test.exs
test/web/mastodon_api/mastodon_api_controller_test.exs
test/web/node_info_test.exs
test/web/ostatus/ostatus_controller_test.exs
test/web/ostatus/ostatus_test.exs
test/web/ostatus/user_representer_test.exs
test/web/twitter_api/representers/activity_representer_test.exs
test/web/twitter_api/twitter_api_controller_test.exs
test/web/twitter_api/twitter_api_test.exs
test/web/twitter_api/views/user_view_test.exs
test/web/web_finger/web_finger_test.exs
test/web/websub/websub_test.exs

index 26bb17377094340d69a0280086cc146ee4e85f83..1a5c07c8a61e73edba5ac88297090fd69aa28cbe 100644 (file)
@@ -116,8 +116,8 @@ defmodule Pleroma.Formatter do
       subs ++
         Enum.map(mentions, fn {match, %User{ap_id: ap_id, info: info}, uuid} ->
           ap_id =
-            if is_binary(info["source_data"]["url"]) do
-              info["source_data"]["url"]
+            if is_binary(info.source_data["url"]) do
+              info.source_data["url"]
             else
               ap_id
             end
index 0380ce14db4d0dac270686ad5a8d5633f01d3286..630f15eec8e837af098a153bfff666567fd611ee 100644 (file)
@@ -20,7 +20,7 @@ defmodule Pleroma.Plugs.OAuthPlug do
     with token when not is_nil(token) <- token,
          %Token{user_id: user_id} <- Repo.get_by(Token, token: token),
          %User{} = user <- Repo.get(User, user_id),
-         false <- !!user.info["deactivated"] do
+         false <- !!user.info.deactivated do
       conn
       |> assign(:user, user)
     else
index 5312f1499c103e36b5f8de2e223e07146391c684..cf22ce5d064602926db32e0820ea636f250472bb 100644 (file)
@@ -6,7 +6,7 @@ defmodule Pleroma.Plugs.UserIsAdminPlug do
     options
   end
 
-  def call(%{assigns: %{user: %User{info: %{"is_admin" => true}}}} = conn, _) do
+  def call(%{assigns: %{user: %User{info: %{is_admin: true}}}} = conn, _) do
     conn
   end
 
index 6e1d5559d359f6aab26e08731747a36a5d007ac9..bed8fd1b46d57bbc5851953b18d0468a968bb8e4 100644 (file)
@@ -19,11 +19,11 @@ defmodule Pleroma.User do
     field(:ap_id, :string)
     field(:avatar, :map)
     field(:local, :boolean, default: true)
-    field(:info, :map, default: %{})
     field(:follower_address, :string)
     field(:search_distance, :float, virtual: true)
     field(:last_refreshed_at, :naive_datetime)
     has_many(:notifications, Notification)
+    embeds_one(:info, Pleroma.User.Info)
 
     timestamps()
   end
@@ -36,13 +36,13 @@ defmodule Pleroma.User do
   end
 
   def banner_url(user) do
-    case user.info["banner"] do
+    case user.info.banner do
       %{"url" => [%{"href" => href} | _]} -> href
       _ -> "#{Web.base_url()}/images/banner.png"
     end
   end
 
-  def profile_url(%User{info: %{"source_data" => %{"url" => url}}}), do: url
+  def profile_url(%User{info: %{source_data: %{"url" => url}}}), do: url
   def profile_url(%User{ap_id: ap_id}), do: ap_id
   def profile_url(_), do: nil
 
@@ -61,9 +61,7 @@ defmodule Pleroma.User do
   end
 
   def info_changeset(struct, params \\ %{}) do
-    struct
-    |> cast(params, [:info])
-    |> validate_required([:info])
+    raise "NOT VALID ANYMORE"
   end
 
   def user_info(%User{} = user) do
@@ -71,27 +69,34 @@ defmodule Pleroma.User do
 
     %{
       following_count: length(user.following) - oneself,
-      note_count: user.info["note_count"] || 0,
-      follower_count: user.info["follower_count"] || 0,
-      locked: user.info["locked"] || false,
-      default_scope: user.info["default_scope"] || "public"
+      note_count: user.info.note_count,
+      follower_count: user.info.follower_count,
+      locked: user.info.locked,
+      default_scope: user.info.default_scope
     }
   end
 
   @email_regex ~r/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
   def remote_user_creation(params) do
+    params =
+      params
+      |> Map.put(:info, params[:info] || %{})
+
+    info_cng = User.Info.remote_user_creation(%User.Info{}, params[:info])
+
     changes =
       %User{}
-      |> cast(params, [:bio, :name, :ap_id, :nickname, :info, :avatar])
+      |> cast(params, [:bio, :name, :ap_id, :nickname, :avatar])
       |> validate_required([:name, :ap_id])
       |> unique_constraint(:nickname)
       |> validate_format(:nickname, @email_regex)
       |> validate_length(:bio, max: 5000)
       |> validate_length(:name, max: 100)
       |> put_change(:local, false)
+      |> put_embed(:info, info_cng)
 
     if changes.valid? do
-      case changes.changes[:info]["source_data"] do
+      case info_cng.changes[:source_data] do
         %{"followers" => followers} ->
           changes
           |> put_change(:follower_address, followers)
@@ -107,6 +112,7 @@ defmodule Pleroma.User do
     end
   end
 
+  # TODO: Check if this still used
   def update_changeset(struct, params \\ %{}) do
     struct
     |> cast(params, [:bio, :name])
@@ -121,12 +127,17 @@ defmodule Pleroma.User do
       params
       |> Map.put(:last_refreshed_at, NaiveDateTime.utc_now())
 
+    info_cng =
+      struct.info
+      |> User.Info.user_upgrade(params[:info])
+
     struct
-    |> cast(params, [:bio, :name, :info, :follower_address, :avatar, :last_refreshed_at])
+    |> cast(params, [:bio, :name, :follower_address, :avatar, :last_refreshed_at])
     |> unique_constraint(:nickname)
     |> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
     |> validate_length(:bio, max: 5000)
     |> validate_length(:name, max: 100)
+    |> put_embed(:info, info_cng)
   end
 
   def password_update_changeset(struct, params) do
@@ -191,7 +202,7 @@ defmodule Pleroma.User do
 
   def needs_update?(_), do: true
 
-  def maybe_direct_follow(%User{} = follower, %User{local: true, info: %{"locked" => true}}) do
+  def maybe_direct_follow(%User{} = follower, %User{local: true, info: %{locked: true}}) do
     {:ok, follower}
   end
 
@@ -222,7 +233,7 @@ defmodule Pleroma.User do
     ap_followers = followed.follower_address
 
     cond do
-      following?(follower, followed) or info["deactivated"] ->
+      following?(follower, followed) or info.deactivated ->
         {:error, "Could not follow user: #{followed.nickname} is already on your list."}
 
       deny_follow_blocked and blocks?(followed, follower) ->
@@ -274,7 +285,7 @@ defmodule Pleroma.User do
   end
 
   def locked?(%User{} = user) do
-    user.info["locked"] || false
+    user.info.locked || false
   end
 
   def get_by_ap_id(ap_id) do
@@ -411,22 +422,23 @@ defmodule Pleroma.User do
   end
 
   def increase_note_count(%User{} = user) do
-    note_count = (user.info["note_count"] || 0) + 1
-    new_info = Map.put(user.info, "note_count", note_count)
+    info_cng = User.Info.add_to_note_count(user.info, 1)
 
-    cs = info_changeset(user, %{info: new_info})
+    cng =
+      change(user)
+      |> put_embed(:info, info_cng)
 
-    update_and_set_cache(cs)
+    update_and_set_cache(cng)
   end
 
   def decrease_note_count(%User{} = user) do
-    note_count = user.info["note_count"] || 0
-    note_count = if note_count <= 0, do: 0, else: note_count - 1
-    new_info = Map.put(user.info, "note_count", note_count)
+    info_cng = User.Info.add_to_note_count(user.info, -1)
 
-    cs = info_changeset(user, %{info: new_info})
+    cng =
+      change(user)
+      |> put_embed(:info, info_cng)
 
-    update_and_set_cache(cs)
+    update_and_set_cache(cng)
   end
 
   def update_note_count(%User{} = user) do
@@ -439,11 +451,13 @@ defmodule Pleroma.User do
 
     note_count = Repo.one(note_count_query)
 
-    new_info = Map.put(user.info, "note_count", note_count)
+    info_cng = User.Info.set_note_count(user.info, note_count)
 
-    cs = info_changeset(user, %{info: new_info})
+    cng =
+      change(user)
+      |> put_embed(:info, info_cng)
 
-    update_and_set_cache(cs)
+    update_and_set_cache(cng)
   end
 
   def update_follower_count(%User{} = user) do
@@ -457,11 +471,15 @@ defmodule Pleroma.User do
 
     follower_count = Repo.one(follower_count_query)
 
-    new_info = Map.put(user.info, "follower_count", follower_count)
+    info_cng =
+      user.info
+      |> User.Info.set_follower_count(follower_count)
 
-    cs = info_changeset(user, %{info: new_info})
+    cng =
+      change(user)
+      |> put_embed(:info, info_cng)
 
-    update_and_set_cache(cs)
+    update_and_set_cache(cng)
   end
 
   def get_users_from_set_query(ap_ids, false) do
@@ -545,12 +563,15 @@ defmodule Pleroma.User do
       unfollow(blocked, blocker)
     end
 
-    blocks = blocker.info["blocks"] || []
-    new_blocks = Enum.uniq([ap_id | blocks])
-    new_info = Map.put(blocker.info, "blocks", new_blocks)
+    info_cng =
+      blocker.info
+      |> User.Info.add_to_block(ap_id)
+
+    cng =
+      change(blocker)
+      |> put_embed(:info, info_cng)
 
-    cs = User.info_changeset(blocker, %{info: new_info})
-    update_and_set_cache(cs)
+    update_and_set_cache(cng)
   end
 
   # helper to handle the block given only an actor's AP id
@@ -558,18 +579,21 @@ defmodule Pleroma.User do
     block(blocker, User.get_by_ap_id(ap_id))
   end
 
-  def unblock(user, %{ap_id: ap_id}) do
-    blocks = user.info["blocks"] || []
-    new_blocks = List.delete(blocks, ap_id)
-    new_info = Map.put(user.info, "blocks", new_blocks)
+  def unblock(blocker, %{ap_id: ap_id}) do
+    info_cng =
+      blocker.info
+      |> User.Info.remove_from_block(ap_id)
 
-    cs = User.info_changeset(user, %{info: new_info})
-    update_and_set_cache(cs)
+    cng =
+      change(blocker)
+      |> put_embed(:info, info_cng)
+
+    update_and_set_cache(cng)
   end
 
   def blocks?(user, %{ap_id: ap_id}) do
-    blocks = user.info["blocks"] || []
-    domain_blocks = user.info["domain_blocks"] || []
+    blocks = user.info.blocks
+    domain_blocks = user.info.domain_blocks
     %{host: host} = URI.parse(ap_id)
 
     Enum.member?(blocks, ap_id) ||
@@ -579,21 +603,27 @@ defmodule Pleroma.User do
   end
 
   def block_domain(user, domain) do
-    domain_blocks = user.info["domain_blocks"] || []
-    new_blocks = Enum.uniq([domain | domain_blocks])
-    new_info = Map.put(user.info, "domain_blocks", new_blocks)
+    info_cng =
+      user.info
+      |> User.Info.add_to_domain_block(domain)
+
+    cng =
+      change(user)
+      |> put_embed(:info, info_cng)
 
-    cs = User.info_changeset(user, %{info: new_info})
-    update_and_set_cache(cs)
+    update_and_set_cache(cng)
   end
 
   def unblock_domain(user, domain) do
-    blocks = user.info["domain_blocks"] || []
-    new_blocks = List.delete(blocks, domain)
-    new_info = Map.put(user.info, "domain_blocks", new_blocks)
+    info_cng =
+      user.info
+      |> User.Info.remove_from_domain_block(domain)
+
+    cng =
+      change(user)
+      |> put_embed(:info, info_cng)
 
-    cs = User.info_changeset(user, %{info: new_info})
-    update_and_set_cache(cs)
+    update_and_set_cache(cng)
   end
 
   def local_user_query() do
@@ -613,9 +643,13 @@ defmodule Pleroma.User do
   end
 
   def deactivate(%User{} = user, status \\ true) do
-    new_info = Map.put(user.info, "deactivated", status)
-    cs = User.info_changeset(user, %{info: new_info})
-    update_and_set_cache(cs)
+    info_cng = User.Info.set_activation_status(user.info, status)
+
+    cng =
+      change(user)
+      |> put_embed(:info, info_cng)
+
+    update_and_set_cache(cng)
   end
 
   def delete(%User{} = user) do
@@ -683,7 +717,7 @@ defmodule Pleroma.User do
       user
     else
       changes =
-        %User{}
+        %User{info: %User.Info{}}
         |> cast(%{}, [:ap_id, :nickname, :local])
         |> put_change(:ap_id, relay_uri)
         |> put_change(:nickname, nil)
@@ -697,7 +731,7 @@ defmodule Pleroma.User do
 
   # AP style
   def public_key_from_info(%{
-        "source_data" => %{"publicKey" => %{"publicKeyPem" => public_key_pem}}
+        source_data: %{"publicKey" => %{"publicKeyPem" => public_key_pem}}
       }) do
     key =
       :public_key.pem_decode(public_key_pem)
@@ -708,7 +742,7 @@ defmodule Pleroma.User do
   end
 
   # OStatus Magic Key
-  def public_key_from_info(%{"magic_key" => magic_key}) do
+  def public_key_from_info(%{magic_key: magic_key}) do
     {:ok, Pleroma.Web.Salmon.decode_key(magic_key)}
   end
 
@@ -730,11 +764,12 @@ defmodule Pleroma.User do
       |> Map.put(:name, blank?(data[:name]) || data[:nickname])
 
     cs = User.remote_user_creation(data)
+
     Repo.insert(cs, on_conflict: :replace_all, conflict_target: :nickname)
   end
 
   def ap_enabled?(%User{local: true}), do: true
-  def ap_enabled?(%User{info: info}), do: info["ap_enabled"]
+  def ap_enabled?(%User{info: info}), do: info.ap_enabled
   def ap_enabled?(_), do: false
 
   def get_or_fetch(uri_or_nickname) do
diff --git a/lib/pleroma/user/info.ex b/lib/pleroma/user/info.ex
new file mode 100644 (file)
index 0000000..a5ce601
--- /dev/null
@@ -0,0 +1,146 @@
+defmodule Pleroma.User.Info do
+  use Ecto.Schema
+  import Ecto.Changeset
+
+  embedded_schema do
+    field(:banner, :map, default: %{})
+    field(:background, :string, default: nil)
+    field(:source_data, :map, default: %{})
+    field(:note_count, :integer, default: 0)
+    field(:follower_count, :integer, default: 0)
+    field(:locked, :boolean, default: false)
+    field(:default_scope, :string, default: "public")
+    field(:blocks, {:array, :string}, default: [])
+    field(:domain_blocks, {:array, :string}, default: [])
+    field(:deactivated, :boolean, default: false)
+    field(:no_rich_text, :boolean, default: false)
+    field(:ap_enabled, :boolean, default: false)
+    field(:is_moderator, :boolean, default: false)
+    field(:is_admin, :boolean, default: false)
+    field(:keys, :string, default: nil)
+    field(:settings, :map, default: nil)
+    field(:magic_key, :string, default: nil)
+    field(:uri, :string, default: nil)
+    field(:topic, :string, default: nil)
+    field(:hub, :string, default: nil)
+    # topic, subject, salmon, subscribe_address, uri
+  end
+
+  def set_activation_status(info, deactivated) do
+    params = %{deactivated: deactivated}
+
+    info
+    |> cast(params, [:deactivated])
+    |> validate_required([:deactivated])
+  end
+
+  def add_to_note_count(info, number) do
+    set_note_count(info, info.note_count + number)
+  end
+
+  def set_note_count(info, number) do
+    params = %{note_count: Enum.max([0, number])}
+
+    info
+    |> cast(params, [:note_count])
+    |> validate_required([:note_count])
+  end
+
+  def set_follower_count(info, number) do
+    params = %{follower_count: Enum.max([0, number])}
+
+    info
+    |> cast(params, [:follower_count])
+    |> validate_required([:follower_count])
+  end
+
+  def set_blocks(info, blocks) do
+    params = %{blocks: blocks}
+
+    info
+    |> cast(params, [:blocks])
+    |> validate_required([:blocks])
+  end
+
+  def add_to_block(info, blocked) do
+    set_blocks(info, Enum.uniq([blocked | info.blocks]))
+  end
+
+  def remove_from_block(info, blocked) do
+    set_blocks(info, List.delete(info.blocks, blocked))
+  end
+
+  def set_domain_blocks(info, domain_blocks) do
+    params = %{domain_blocks: domain_blocks}
+
+    info
+    |> cast(params, [:domain_blocks])
+    |> validate_required([:domain_blocks])
+  end
+
+  def add_to_domain_block(info, domain_blocked) do
+    set_domain_blocks(info, Enum.uniq([domain_blocked | info.domain_blocks]))
+  end
+
+  def remove_from_domain_block(info, domain_blocked) do
+    set_domain_blocks(info, List.delete(info.domain_blocks, domain_blocked))
+  end
+
+  def set_keys(info, keys) do
+    params = %{keys: keys}
+
+    info
+    |> cast(params, [:keys])
+    |> validate_required([:keys])
+  end
+
+  def remote_user_creation(info, params) do
+    info
+    |> cast(params, [
+      :ap_enabled,
+      :source_data,
+      :banner,
+      :locked,
+      :magic_key,
+      :uri,
+      :hub,
+      :topic
+    ])
+  end
+
+  def user_upgrade(info, params) do
+    info
+    |> cast(params, [
+      :ap_enabled,
+      :source_data,
+      :banner,
+      :locked,
+      :magic_key
+    ])
+  end
+
+  def profile_update(info, params) do
+    info
+    |> cast(params, [
+      :locked,
+      :no_rich_text,
+      :default_scope
+    ])
+  end
+
+  def set_source_data(info, source_data) do
+    params = %{source_data: source_data}
+
+    info
+    |> cast(params, [:source_data])
+    |> validate_required([:source_data])
+  end
+
+  def admin_api_update(info, params) do
+    info
+    |> cast(params, [
+      :is_moderator,
+      :is_admin
+    ])
+  end
+end
index 76c15cf21639c2997e120b63566dd40c7bdd90a3..7e207c6201b1eb330c9c4737cfb437dd5a051ef4 100644 (file)
@@ -42,7 +42,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   defp check_actor_is_active(actor) do
     if not is_nil(actor) do
       with user <- User.get_cached_by_ap_id(actor),
-           false <- !!user.info["deactivated"] do
+           false <- user.info.deactivated do
         :ok
       else
         _e -> :reject
@@ -509,8 +509,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   end
 
   defp restrict_blocked(query, %{"blocking_user" => %User{info: info}}) do
-    blocks = info["blocks"] || []
-    domain_blocks = info["domain_blocks"] || []
+    blocks = info.blocks || []
+    domain_blocks = info.domain_blocks || []
 
     from(
       activity in query,
@@ -676,7 +676,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
     remote_inboxes =
       (Pleroma.Web.Salmon.remote_users(activity) ++ followers)
       |> Enum.filter(fn user -> User.ap_enabled?(user) end)
-      |> Enum.map(fn %{info: %{"source_data" => data}} ->
+      |> Enum.map(fn %{info: %{source_data: data}} ->
         (is_map(data["endpoints"]) && Map.get(data["endpoints"], "sharedInbox")) || data["inbox"]
       end)
       |> Enum.uniq()
index 5864855b0bb8a8f420ec90c2fa3adc00f4b621ec..17b0636094d8503490a027e1a4c8d9dc92c1c334 100644 (file)
@@ -447,7 +447,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
       update_data =
         new_user_data
         |> Map.take([:name, :bio, :avatar])
-        |> Map.put(:info, Map.merge(actor.info, %{"banner" => banner, "locked" => locked}))
+        |> Map.put(:info, %{"banner" => banner, "locked" => locked})
 
       actor
       |> User.upgrade_changeset(update_data)
@@ -850,10 +850,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
   def upgrade_user_from_ap_id(ap_id, async \\ true) do
     with %User{local: false} = user <- User.get_by_ap_id(ap_id),
          {:ok, data} <- ActivityPub.fetch_and_prepare_user_from_ap_id(ap_id) do
-      data =
-        data
-        |> Map.put(:info, Map.merge(user.info, data[:info]))
-
       already_ap = User.ap_enabled?(user)
 
       {:ok, user} =
index eb335813d2bf41333a8dfc6f334e85a57c92eb00..aaa7776022a75962973c732cb35ba09ed0752117 100644 (file)
@@ -12,7 +12,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do
   # the instance itself is not a Person, but instead an Application
   def render("user.json", %{user: %{nickname: nil} = user}) do
     {:ok, user} = WebFinger.ensure_keys_present(user)
-    {:ok, _, public_key} = Salmon.keys_from_pem(user.info["keys"])
+    {:ok, _, public_key} = Salmon.keys_from_pem(user.info.keys)
     public_key = :public_key.pem_entry_encode(:SubjectPublicKeyInfo, public_key)
     public_key = :public_key.pem_encode([public_key])
 
@@ -40,7 +40,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do
 
   def render("user.json", %{user: user}) do
     {:ok, user} = WebFinger.ensure_keys_present(user)
-    {:ok, _, public_key} = Salmon.keys_from_pem(user.info["keys"])
+    {:ok, _, public_key} = Salmon.keys_from_pem(user.info.keys)
     public_key = :public_key.pem_entry_encode(:SubjectPublicKeyInfo, public_key)
     public_key = :public_key.pem_encode([public_key])
 
@@ -55,7 +55,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do
       "name" => user.name,
       "summary" => user.bio,
       "url" => user.ap_id,
-      "manuallyApprovesFollowers" => user.info["locked"] || false,
+      "manuallyApprovesFollowers" => user.info.locked,
       "publicKey" => %{
         "id" => "#{user.ap_id}#main-key",
         "owner" => user.ap_id,
@@ -72,7 +72,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do
         "type" => "Image",
         "url" => User.banner_url(user)
       },
-      "tag" => user.info["source_data"]["tag"] || []
+      "tag" => user.info.source_data["tag"] || []
     }
     |> Map.merge(Utils.make_json_ld_header())
   end
index bcdb4ba37abdaa0934130f853d746a362ecdc110..2c67d9cdaf3011d25255fb6b9dd83594a80ea452 100644 (file)
@@ -45,21 +45,29 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
     user = User.get_by_nickname(nickname)
 
     info =
-      user.info
+      %{}
       |> Map.put("is_" <> permission_group, true)
 
-    cng = User.info_changeset(user, %{info: info})
+    info_cng = User.Info.admin_api_update(user.info, info)
+
+    cng =
+      Ecto.Changeset.change(user)
+      |> Ecto.Changeset.put_embed(:info, info_cng)
+
     {:ok, user} = User.update_and_set_cache(cng)
 
     conn
-    |> json(user.info)
+    |> json(info)
   end
 
   def right_get(conn, %{"nickname" => nickname}) do
     user = User.get_by_nickname(nickname)
 
     conn
-    |> json(user.info)
+    |> json(%{
+      is_moderator: user.info.is_moderator,
+      is_admin: user.info.is_admin
+    })
   end
 
   def right_add(conn, _) do
@@ -84,14 +92,19 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
       user = User.get_by_nickname(nickname)
 
       info =
-        user.info
+        %{}
         |> Map.put("is_" <> permission_group, false)
 
-      cng = User.info_changeset(user, %{info: info})
+      info_cng = User.Info.admin_api_update(user.info, info)
+
+      cng =
+        Ecto.Changeset.change(user)
+        |> Ecto.Changeset.put_embed(:info, info_cng)
+
       {:ok, user} = User.update_and_set_cache(cng)
 
       conn
-      |> json(user.info)
+      |> json(info)
     end
   end
 
index 77e4dbbd708057e55a9dbee8226efd5761cf5ce5..e3385310fc25ceb8d1d2ce499a6f431c2abfb8ea 100644 (file)
@@ -8,7 +8,7 @@ defmodule Pleroma.Web.CommonAPI do
   def delete(activity_id, user) do
     with %Activity{data: %{"object" => %{"id" => object_id}}} <- Repo.get(Activity, activity_id),
          %Object{} = object <- Object.normalize(object_id),
-         true <- user.info["is_moderator"] || user.ap_id == object.data["actor"],
+         true <- user.info.is_moderator || user.ap_id == object.data["actor"],
          {:ok, delete} <- ActivityPub.delete(object) do
       {:ok, delete}
     end
@@ -135,12 +135,13 @@ defmodule Pleroma.Web.CommonAPI do
     end
   end
 
+  # Updates the emojis for a user based on their profile
   def update(user) do
     user =
       with emoji <- emoji_from_profile(user),
-           source_data <- (user.info["source_data"] || %{}) |> Map.put("tag", emoji),
-           new_info <- Map.put(user.info, "source_data", source_data),
-           change <- User.info_changeset(user, %{info: new_info}),
+           source_data <- (user.info.source_data || %{}) |> Map.put("tag", emoji),
+           info_cng <- Pleroma.User.Info.set_source_data(user.info, source_data),
+           change <- Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_cng),
            {:ok, user} <- User.update_and_set_cache(change) do
         user
       else
index 5e42a871b682dc6945e863830d0b9dfc5e9e2721..0e54debd54e6c648d118f62bce5af1454c2c3785 100644 (file)
@@ -65,7 +65,7 @@ defmodule Pleroma.Web.HTTPSignatures do
   end
 
   def sign(user, headers) do
-    with {:ok, %{info: %{"keys" => keys}}} <- Pleroma.Web.WebFinger.ensure_keys_present(user),
+    with {:ok, %{info: %{keys: keys}}} <- Pleroma.Web.WebFinger.ensure_keys_present(user),
          {:ok, private_key, _} = Pleroma.Web.Salmon.keys_from_pem(keys) do
       sigstring = build_signing_string(headers, Map.keys(headers))
 
index 009be50e759a78515667dc49356fb07518445045..f209bb43c6ad51551bf11245f5427f2658b157cf 100644 (file)
@@ -63,34 +63,34 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
         user
       end
 
-    user =
-      if banner = params["header"] do
-        with %Plug.Upload{} <- banner,
-             {:ok, object} <- ActivityPub.upload(banner, type: :banner),
-             new_info <- Map.put(user.info, "banner", object.data),
-             change <- User.info_changeset(user, %{info: new_info}),
-             {:ok, user} <- User.update_and_set_cache(change) do
-          user
-        else
-          _e -> user
-        end
-      else
-        user
-      end
-
-    user =
-      if locked = params["locked"] do
-        with locked <- locked == "true",
-             new_info <- Map.put(user.info, "locked", locked),
-             change <- User.info_changeset(user, %{info: new_info}),
-             {:ok, user} <- User.update_and_set_cache(change) do
-          user
-        else
-          _e -> user
-        end
-      else
-        user
-      end
+    user =
+      if banner = params["header"] do
+        with %Plug.Upload{} <- banner,
+             {:ok, object} <- ActivityPub.upload(banner, type: :banner),
+             new_info <- Map.put(user.info, "banner", object.data),
+             change <- User.info_changeset(user, %{info: new_info}),
+             {:ok, user} <- User.update_and_set_cache(change) do
+          user
+        else
+          _e -> user
+        end
+      else
+        user
+      end
+
+    user =
+      if locked = params["locked"] do
+        with locked <- locked == "true",
+             new_info <- Map.put(user.info, "locked", locked),
+             change <- User.info_changeset(user, %{info: new_info}),
+             {:ok, user} <- User.update_and_set_cache(change) do
+          user
+        else
+          _e -> user
+        end
+      else
+        user
+      end
 
     with changeset <- User.update_changeset(user, params),
          {:ok, user} <- User.update_and_set_cache(changeset) do
@@ -644,7 +644,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
 
   # TODO: Use proper query
   def blocks(%{assigns: %{user: user}} = conn, _) do
-    with blocked_users <- user.info["blocks"] || [],
+    with blocked_users <- user.info.blocks || [],
          accounts <- Enum.map(blocked_users, fn ap_id -> User.get_cached_by_ap_id(ap_id) end) do
       res = AccountView.render("accounts.json", users: accounts, for: user, as: :user)
       json(conn, res)
@@ -652,7 +652,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   end
 
   def domain_blocks(%{assigns: %{user: %{info: info}}} = conn, _) do
-    json(conn, info["domain_blocks"] || [])
+    json(conn, info.domain_blocks || [])
   end
 
   def block_domain(%{assigns: %{user: blocker}} = conn, %{"domain" => domain}) do
@@ -900,11 +900,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
             max_toot_chars: limit
           },
           rights: %{
-            delete_others_notice: !!user.info["is_moderator"]
+            delete_others_notice: !!user.info.is_moderator
           },
           compose: %{
             me: "#{user.id}",
-            default_privacy: user.info["default_scope"] || "public",
+            default_privacy: user.info.default_scope,
             default_sensitive: false
           },
           media_attachments: %{
@@ -924,7 +924,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
             ]
           },
           settings:
-            Map.get(user.info, "settings") ||
+            Map.get(user.info, :settings) ||
               %{
                 onboarded: true,
                 home: %{
index b68845e16b12ebefa7e8e37ba71d9e35dbae3d96..bcfa8836e0f3d2a04510728b5dbc62a7956776e8 100644 (file)
@@ -14,10 +14,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
     image = User.avatar_url(user) |> MediaProxy.url()
     header = User.banner_url(user) |> MediaProxy.url()
     user_info = User.user_info(user)
-    bot = (user.info["source_data"]["type"] || "Person") in ["Application", "Service"]
+    bot = (user.info.source_data["type"] || "Person") in ["Application", "Service"]
 
     emojis =
-      (user.info["source_data"]["tag"] || [])
+      (user.info.source_data["tag"] || [])
       |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end)
       |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} ->
         %{
@@ -29,7 +29,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
       end)
 
     fields =
-      (user.info["source_data"]["attachment"] || [])
+      (user.info.source_data["attachment"] || [])
       |> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end)
       |> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end)
 
index 1d0019d3b7dda0711a355e5c7522cfbad2a20b95..6a27f1730c83c3c35498411e0bf5f5733dc19128 100644 (file)
@@ -226,25 +226,21 @@ defmodule Pleroma.Web.OStatus do
     old_data = %{
       avatar: user.avatar,
       bio: user.bio,
-      name: user.name,
-      info: user.info
+      name: user.name
     }
 
     with false <- user.local,
          avatar <- make_avatar_object(doc),
          bio <- string_from_xpath("//author[1]/summary", doc),
          name <- string_from_xpath("//author[1]/poco:displayName", doc),
-         info <-
-           Map.put(user.info, "banner", make_avatar_object(doc, "header") || user.info["banner"]),
          new_data <- %{
            avatar: avatar || old_data.avatar,
            name: name || old_data.name,
-           bio: bio || old_data.bio,
-           info: info || old_data.info
+           bio: bio || old_data.bio
          },
          false <- new_data == old_data do
       change = Ecto.Changeset.change(user, new_data)
-      Repo.update(change)
+      User.update_and_set_cache(change)
     else
       _ ->
         {:ok, user}
index 09265954a8f512a446463dafa2a39b4bae610c43..d6a9d57798882186235eb00d9f317740be970351 100644 (file)
@@ -297,12 +297,6 @@ defmodule Pleroma.Web.Router do
     post("/account/update_profile_banner", TwitterAPI.Controller, :update_banner)
     post("/qvitter/update_background_image", TwitterAPI.Controller, :update_background)
 
-    post(
-      "/account/most_recent_notification",
-      TwitterAPI.Controller,
-      :update_most_recent_notification
-    )
-
     get("/statuses/home_timeline", TwitterAPI.Controller, :friends_timeline)
     get("/statuses/friends_timeline", TwitterAPI.Controller, :friends_timeline)
     get("/statuses/mentions", TwitterAPI.Controller, :mentions_timeline)
index 3065981571bf51f0d3584b491e76b035752c4800..99b8b7063a0433021839ebb98719eb65a670170c 100644 (file)
@@ -188,7 +188,7 @@ defmodule Pleroma.Web.Streamer do
       # Get the current user so we have up-to-date blocks etc.
       if socket.assigns[:user] do
         user = User.get_cached_by_ap_id(socket.assigns[:user].ap_id)
-        blocks = user.info["blocks"] || []
+        blocks = user.info.blocks || []
 
         parent = Object.normalize(item.data["object"])
 
@@ -206,7 +206,7 @@ defmodule Pleroma.Web.Streamer do
       # Get the current user so we have up-to-date blocks etc.
       if socket.assigns[:user] do
         user = User.get_cached_by_ap_id(socket.assigns[:user].ap_id)
-        blocks = user.info["blocks"] || []
+        blocks = user.info.blocks || []
 
         unless item.actor in blocks do
           send(socket.transport_pid, {:text, represent_update(item, user)})
index 6223580e1c4d2790cd4f6fb9dc32d2c4db790c12..39a2974bb41b8413b83018d4e0eca1b1dd525607 100644 (file)
@@ -148,7 +148,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
 
     cond do
       registrations_open || (!is_nil(token) && !token.used) ->
-        changeset = User.register_changeset(%User{}, params)
+        changeset = User.register_changeset(%User{info: %{}}, params)
 
         with {:ok, user} <- Repo.insert(changeset) do
           !registrations_open && UserInviteToken.mark_as_used(token.token)
@@ -279,14 +279,6 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
 
   def get_external_profile(for_user, uri) do
     with %User{} = user <- User.get_or_fetch(uri) do
-      spawn(fn ->
-        with url <- user.info["topic"],
-             {:ok, %{body: body}} <-
-               @httpoison.get(url, [], follow_redirect: true, timeout: 10000, recv_timeout: 20000) do
-          OStatus.handle_incoming(body)
-        end
-      end)
-
       {:ok, UserView.render("show.json", %{user: user, for: for_user})}
     else
       _e ->
index 064730867f611bfc12e333bc92c3839cad1ccafc..8f9d6c9050d064a90c2396c6645751e5d14509c1 100644 (file)
@@ -338,20 +338,6 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     end
   end
 
-  def update_most_recent_notification(%{assigns: %{user: user}} = conn, %{"id" => id}) do
-    with id when is_number(id) <- String.to_integer(id),
-         info <- user.info,
-         mrn <- max(id, user.info["most_recent_notification"] || 0),
-         updated_info <- Map.put(info, "most_recent_notification", mrn),
-         changeset <- User.info_changeset(user, %{info: updated_info}),
-         {:ok, _user} <- User.update_and_set_cache(changeset) do
-      conn
-      |> json_reply(200, Jason.encode!(mrn))
-    else
-      _e -> bad_request_reply(conn, "Can't update.")
-    end
-  end
-
   def followers(conn, params) do
     with {:ok, user} <- TwitterAPI.get_user(conn.assigns[:user], params),
          {:ok, followers} <- User.get_followers(user) do
@@ -439,67 +425,52 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     json(conn, [])
   end
 
-  def update_profile(%{assigns: %{user: user}} = conn, params) do
-    params =
-      if bio = params["description"] do
-        mentions = Formatter.parse_mentions(bio)
-        tags = Formatter.parse_tags(bio)
-
-        emoji =
-          (user.info["source_data"]["tag"] || [])
-          |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end)
-          |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} ->
-            {String.trim(name, ":"), url}
-          end)
-
-        bio_html = CommonUtils.format_input(bio, mentions, tags, "text/plain")
-        Map.put(params, "bio", bio_html |> Formatter.emojify(emoji))
-      else
-        params
-      end
-
-    user =
-      if locked = params["locked"] do
-        with locked <- locked == "true",
-             new_info <- Map.put(user.info, "locked", locked),
-             change <- User.info_changeset(user, %{info: new_info}),
-             {:ok, user} <- User.update_and_set_cache(change) do
-          user
+  defp build_info_cng(user, params) do
+    info_params =
+      ["no_rich_text", "locked"]
+      |> Enum.reduce(%{}, fn key, res ->
+        if value = params[key] do
+          Map.put(res, key, value == "true")
         else
-          _e -> user
+          res
         end
-      else
-        user
-      end
+      end)
 
-    user =
-      if no_rich_text = params["no_rich_text"] do
-        with no_rich_text <- no_rich_text == "true",
-             new_info <- Map.put(user.info, "no_rich_text", no_rich_text),
-             change <- User.info_changeset(user, %{info: new_info}),
-             {:ok, user} <- User.update_and_set_cache(change) do
-          user
-        else
-          _e -> user
-        end
+    info_params =
+      if value = params["default_scope"] do
+        Map.put(info_params, "default_scope", value)
       else
-        user
+        info_params
       end
 
-    user =
-      if default_scope = params["default_scope"] do
-        with new_info <- Map.put(user.info, "default_scope", default_scope),
-             change <- User.info_changeset(user, %{info: new_info}),
-             {:ok, user} <- User.update_and_set_cache(change) do
-          user
-        else
-          _e -> user
-        end
-      else
-        user
-      end
+    User.Info.profile_update(user.info, info_params)
+  end
+
+  defp add_profile_emoji(user, params) do
+    if bio = params["description"] do
+      mentions = Formatter.parse_mentions(bio)
+      tags = Formatter.parse_tags(bio)
+
+      emoji =
+        (user.info.source_data["tag"] || [])
+        |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end)
+        |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} ->
+          {String.trim(name, ":"), url}
+        end)
+
+      bio_html = CommonUtils.format_input(bio, mentions, tags, "text/plain")
+      Map.put(params, "bio", bio_html |> Formatter.emojify(emoji))
+    else
+      params
+    end
+  end
+
+  def update_profile(%{assigns: %{user: user}} = conn, params) do
+    params = add_profile_emoji(user, params)
+    info_cng = build_info_cng(user, params)
 
     with changeset <- User.update_changeset(user, params),
+         changeset <- Ecto.Changeset.put_embed(changeset, :info, info_cng),
          {:ok, user} <- User.update_and_set_cache(changeset) do
       CommonAPI.update(user)
       render(conn, UserView, "user.json", %{user: user, for: user})
index a100a1127814fea4541ecd0ec7e20a581c297e21..b78024ed756b8c96e876d018b05d6a5f8675376b 100644 (file)
@@ -31,7 +31,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
     user_info = User.get_cached_user_info(user)
 
     emoji =
-      (user.info["source_data"]["tag"] || [])
+      (user.info.source_data["tag"] || [])
       |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end)
       |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} ->
         {String.trim(name, ":"), url}
@@ -40,7 +40,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
     # ``fields`` is an array of mastodon profile field, containing ``{"name": "…", "value": "…"}``.
     # For example: [{"name": "Pronoun", "value": "she/her"}, …]
     fields =
-      (user.info["source_data"]["attachment"] || [])
+      (user.info.source_data["attachment"] || [])
       |> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end)
       |> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end)
 
@@ -66,17 +66,17 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
       "profile_image_url_profile_size" => image,
       "profile_image_url_original" => image,
       "rights" => %{
-        "delete_others_notice" => !!user.info["is_moderator"]
+        "delete_others_notice" => !!user.info.is_moderator
       },
       "screen_name" => user.nickname,
       "statuses_count" => user_info[:note_count],
       "statusnet_profile_url" => user.ap_id,
       "cover_photo" => User.banner_url(user) |> MediaProxy.url(),
-      "background_image" => image_url(user.info["background"]) |> MediaProxy.url(),
+      "background_image" => image_url(user.info.background) |> MediaProxy.url(),
       "is_local" => user.local,
-      "locked" => !!user.info["locked"],
-      "default_scope" => user.info["default_scope"] || "public",
-      "no_rich_text" => user.info["no_rich_text"] || false,
+      "locked" => user.info.locked,
+      "default_scope" => user.info.default_scope,
+      "no_rich_text" => user.info.no_rich_text,
       "fields" => fields
     }
 
index 9f554d286daf6da1879baf811f8381345e74cdb3..eaee3a8c698cd37a69c6c1aa96e976c3eb65ba52 100644 (file)
@@ -45,7 +45,7 @@ defmodule Pleroma.Web.WebFinger do
 
   def represent_user(user, "JSON") do
     {:ok, user} = ensure_keys_present(user)
-    {:ok, _private, public} = Salmon.keys_from_pem(user.info["keys"])
+    {:ok, _private, public} = Salmon.keys_from_pem(user.info.keys)
     magic_key = Salmon.encode_key(public)
 
     %{
@@ -83,7 +83,7 @@ defmodule Pleroma.Web.WebFinger do
 
   def represent_user(user, "XML") do
     {:ok, user} = ensure_keys_present(user)
-    {:ok, _private, public} = Salmon.keys_from_pem(user.info["keys"])
+    {:ok, _private, public} = Salmon.keys_from_pem(user.info.keys)
     magic_key = Salmon.encode_key(public)
 
     {
@@ -113,16 +113,22 @@ defmodule Pleroma.Web.WebFinger do
 
   # This seems a better fit in Salmon
   def ensure_keys_present(user) do
-    info = user.info || %{}
+    info = user.info
 
-    if info["keys"] do
+    if info.keys do
       {:ok, user}
     else
       {:ok, pem} = Salmon.generate_rsa_pem()
-      info = Map.put(info, "keys", pem)
 
-      Ecto.Changeset.change(user, info: info)
-      |> User.update_and_set_cache()
+      info_cng =
+        info
+        |> Pleroma.User.Info.set_keys(pem)
+
+      cng =
+        Ecto.Changeset.change(user)
+        |> Ecto.Changeset.put_embed(:info, info_cng)
+
+      User.update_and_set_cache(cng)
     end
   end
 
index 396dcf045265cde85d8340f4a22c5e5a188b526f..905d8d658e05ae23e9111e7c518ada188c98eba8 100644 (file)
@@ -146,7 +146,7 @@ defmodule Pleroma.Web.Websub do
   end
 
   def subscribe(subscriber, subscribed, requester \\ &request_subscription/1) do
-    topic = subscribed.info["topic"]
+    topic = subscribed.info.topic
     # FIXME: Race condition, use transactions
     {:ok, subscription} =
       with subscription when not is_nil(subscription) <-
@@ -158,7 +158,7 @@ defmodule Pleroma.Web.Websub do
         _e ->
           subscription = %WebsubClientSubscription{
             topic: topic,
-            hub: subscribed.info["hub"],
+            hub: subscribed.info.hub,
             subscribers: [subscriber.ap_id],
             state: "requested",
             secret: :crypto.strong_rand_bytes(8) |> Base.url_encode64(),
index 13084baa79bb65cd9d1823d0c929f9f5d08f623f..e4da84c101ad9bc7d7ae9dba3c055405bf81662f 100644 (file)
@@ -110,7 +110,7 @@ defmodule Pleroma.FormatterTest do
       archaeme =
         insert(:user, %{
           nickname: "archaeme",
-          info: %{"source_data" => %{"url" => "https://archeme/@archaeme"}}
+          info: %Pleroma.User.Info{source_data: %{"url" => "https://archeme/@archaeme"}}
         })
 
       archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"})
index ddf9eb13956cca5650002295bda12307cda32c38..031b2f466a2987e596f4264d9b648a1359acab65 100644 (file)
@@ -5,7 +5,7 @@ defmodule Pleroma.Plugs.UserIsAdminPlugTest do
   import Pleroma.Factory
 
   test "accepts a user that is admin", %{conn: conn} do
-    user = insert(:user, info: %{"is_admin" => true})
+    user = insert(:user, info: %{is_admin: true})
 
     conn =
       build_conn()
index 4f5060abf698a50a1a3bd421180f12aff55ce185..2889d8977fb803e1e9448b92dd95dc9ba11fdc09 100644 (file)
@@ -7,7 +7,8 @@ defmodule Pleroma.Factory do
       email: sequence(:email, &"user#{&1}@example.com"),
       nickname: sequence(:nickname, &"nick#{&1}"),
       password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),
-      bio: sequence(:bio, &"Tester Number #{&1}")
+      bio: sequence(:bio, &"Tester Number #{&1}"),
+      info: %{}
     }
 
     %{
index 231f1d94d9c61a220929f23616f0035fff61f5a5..f345f001f058ade6b95eaf691d8d374f40dc0499 100644 (file)
@@ -34,14 +34,14 @@ defmodule Pleroma.UserTest do
     user = Repo.get(User, user.id)
 
     followed = User.get_by_ap_id(followed.ap_id)
-    assert followed.info["follower_count"] == 1
+    assert followed.info.follower_count == 1
 
     assert User.ap_followers(followed) in user.following
   end
 
   test "can't follow a deactivated users" do
     user = insert(:user)
-    followed = insert(:user, info: %{"deactivated" => true})
+    followed = insert(:user, info: %{deactivated: true})
 
     {:error, _} = User.follow(user, followed)
   end
@@ -56,8 +56,8 @@ defmodule Pleroma.UserTest do
   end
 
   test "local users do not automatically follow local locked accounts" do
-    follower = insert(:user, info: %{"locked" => true})
-    followed = insert(:user, info: %{"locked" => true})
+    follower = insert(:user, info: %{locked: true})
+    followed = insert(:user, info: %{locked: true})
 
     {:ok, follower} = User.maybe_direct_follow(follower, followed)
 
@@ -185,12 +185,14 @@ defmodule Pleroma.UserTest do
           local: false,
           nickname: "admin@mastodon.example.org",
           ap_id: "http://mastodon.example.org/users/admin",
-          last_refreshed_at: a_week_ago
+          last_refreshed_at: a_week_ago,
+          info: %{}
         )
 
       assert orig_user.last_refreshed_at == a_week_ago
 
       user = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin")
+      assert user.info.source_data["endpoints"]
 
       refute user.last_refreshed_at == orig_user.last_refreshed_at
     end
@@ -311,45 +313,45 @@ defmodule Pleroma.UserTest do
 
       user = User.get_by_ap_id(note.data["actor"])
 
-      assert user.info["note_count"] == nil
+      assert user.info.note_count == 0
 
       {:ok, user} = User.update_note_count(user)
 
-      assert user.info["note_count"] == 1
+      assert user.info.note_count == 1
     end
 
     test "it increases the info->note_count property" do
       note = insert(:note)
       user = User.get_by_ap_id(note.data["actor"])
 
-      assert user.info["note_count"] == nil
+      assert user.info.note_count == 0
 
       {:ok, user} = User.increase_note_count(user)
 
-      assert user.info["note_count"] == 1
+      assert user.info.note_count == 1
 
       {:ok, user} = User.increase_note_count(user)
 
-      assert user.info["note_count"] == 2
+      assert user.info.note_count == 2
     end
 
     test "it decreases the info->note_count property" do
       note = insert(:note)
       user = User.get_by_ap_id(note.data["actor"])
 
-      assert user.info["note_count"] == nil
+      assert user.info.note_count == 0
 
       {:ok, user} = User.increase_note_count(user)
 
-      assert user.info["note_count"] == 1
+      assert user.info.note_count == 1
 
       {:ok, user} = User.decrease_note_count(user)
 
-      assert user.info["note_count"] == 0
+      assert user.info.note_count == 0
 
       {:ok, user} = User.decrease_note_count(user)
 
-      assert user.info["note_count"] == 0
+      assert user.info.note_count == 0
     end
 
     test "it sets the info->follower_count property" do
@@ -358,11 +360,11 @@ defmodule Pleroma.UserTest do
 
       User.follow(follower, user)
 
-      assert user.info["follower_count"] == nil
+      assert user.info.follower_count == 0
 
       {:ok, user} = User.update_follower_count(user)
 
-      assert user.info["follower_count"] == 1
+      assert user.info.follower_count == 1
     end
   end
 
@@ -489,11 +491,11 @@ defmodule Pleroma.UserTest do
 
   test ".deactivate can de-activate then re-activate a user" do
     user = insert(:user)
-    assert false == !!user.info["deactivated"]
+    assert false == user.info.deactivated
     {:ok, user} = User.deactivate(user)
-    assert true == user.info["deactivated"]
+    assert true == user.info.deactivated
     {:ok, user} = User.deactivate(user, false)
-    assert false == !!user.info["deactivated"]
+    assert false == user.info.deactivated
   end
 
   test ".delete deactivates a user, all follow relationships and all create activities" do
@@ -517,7 +519,7 @@ defmodule Pleroma.UserTest do
     follower = Repo.get(User, follower.id)
     user = Repo.get(User, user.id)
 
-    assert user.info["deactivated"]
+    assert user.info.deactivated
 
     refute User.following?(user, followed)
     refute User.following?(followed, follower)
index 35c381ac3f81954648859c5976def54980084213..1d561d38d273301115cc4324bf2271e64e90fd98 100644 (file)
@@ -14,8 +14,8 @@ 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.info["source_data"]
-      assert user.info["ap_enabled"]
+      assert user.info.source_data
+      assert user.info.ap_enabled
       assert user.follower_address == "http://mastodon.example.org/users/admin/followers"
     end
   end
index 829da0a6545d2938f8be23b8533ce666a228bf7e..e74b8f9a129efb099c64c9bde87a60fd8f723aa5 100644 (file)
@@ -92,7 +92,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
 
       user = User.get_by_ap_id(object["actor"])
 
-      assert user.info["note_count"] == 1
+      assert user.info.note_count == 1
     end
 
     test "it works for incoming notices with hashtags" do
@@ -307,7 +307,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
                }
              ]
 
-      assert user.info["banner"]["url"] == [
+      assert user.info.banner["url"] == [
                %{
                  "href" =>
                    "https://cd.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"
@@ -337,7 +337,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
       {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(update_data)
 
       user = User.get_cached_by_ap_id(data["actor"])
-      assert user.info["locked"] == true
+      assert user.info.locked == true
     end
 
     test "it works for incoming deletes" do
@@ -543,7 +543,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
 
     test "it works for incoming accepts which were orphaned" do
       follower = insert(:user)
-      followed = insert(:user, %{info: %{"locked" => true}})
+      followed = insert(:user, %{info: %User.Info{locked: true}})
 
       {:ok, follow_activity} = ActivityPub.follow(follower, followed)
 
@@ -565,7 +565,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
 
     test "it works for incoming accepts which are referenced by IRI only" do
       follower = insert(:user)
-      followed = insert(:user, %{info: %{"locked" => true}})
+      followed = insert(:user, %{info: %User.Info{locked: true}})
 
       {:ok, follow_activity} = ActivityPub.follow(follower, followed)
 
@@ -585,7 +585,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
 
     test "it fails for incoming accepts which cannot be correlated" do
       follower = insert(:user)
-      followed = insert(:user, %{info: %{"locked" => true}})
+      followed = insert(:user, %{info: %User.Info{locked: true}})
 
       accept_data =
         File.read!("test/fixtures/mastodon-accept-activity.json")
@@ -604,7 +604,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
 
     test "it fails for incoming rejects which cannot be correlated" do
       follower = insert(:user)
-      followed = insert(:user, %{info: %{"locked" => true}})
+      followed = insert(:user, %{info: %User.Info{locked: true}})
 
       accept_data =
         File.read!("test/fixtures/mastodon-reject-activity.json")
@@ -623,7 +623,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
 
     test "it works for incoming rejects which are orphaned" do
       follower = insert(:user)
-      followed = insert(:user, %{info: %{"locked" => true}})
+      followed = insert(:user, %{info: %User.Info{locked: true}})
 
       {:ok, follower} = User.follow(follower, followed)
       {:ok, _follow_activity} = ActivityPub.follow(follower, followed)
@@ -648,7 +648,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
 
     test "it works for incoming rejects which are referenced by IRI only" do
       follower = insert(:user)
-      followed = insert(:user, %{info: %{"locked" => true}})
+      followed = insert(:user, %{info: %User.Info{locked: true}})
 
       {:ok, follower} = User.follow(follower, followed)
       {:ok, follow_activity} = ActivityPub.follow(follower, followed)
@@ -815,18 +815,18 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
       assert "http://localhost:4001/users/rye@niu.moe/followers" in activity.recipients
 
       user = Repo.get(User, user.id)
-      assert user.info["note_count"] == 1
+      assert user.info.note_count == 1
 
       {:ok, user} = Transmogrifier.upgrade_user_from_ap_id("https://niu.moe/users/rye")
-      assert user.info["ap_enabled"]
-      assert user.info["note_count"] == 1
+      assert user.info.ap_enabled
+      assert user.info.note_count == 1
       assert user.follower_address == "https://niu.moe/users/rye/followers"
 
       # Wait for the background task
       :timer.sleep(1000)
 
       user = Repo.get(User, user.id)
-      assert user.info["note_count"] == 1
+      assert user.info.note_count == 1
 
       activity = Repo.get(Activity, activity.id)
       assert user.follower_address in activity.recipients
@@ -847,7 +847,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
                      "https://cdn.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"
                  }
                ]
-             } = user.info["banner"]
+             } = user.info.banner
 
       refute "..." in activity.recipients
 
index fa0cb71bf0f34d28f71b8864918e9a5270a9851e..9634ad7c5c6bdb70a47d19f961c83fffa9b5136c 100644 (file)
@@ -8,7 +8,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
 
   describe "/api/pleroma/admin/user" do
     test "Delete" do
-      admin = insert(:user, info: %{"is_admin" => true})
+      admin = insert(:user, info: %{is_admin: true})
       user = insert(:user)
 
       conn =
@@ -21,7 +21,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
     end
 
     test "Create" do
-      admin = insert(:user, info: %{"is_admin" => true})
+      admin = insert(:user, info: %{is_admin: true})
 
       conn =
         build_conn()
@@ -39,7 +39,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
 
   describe "/api/pleroma/admin/permission_group" do
     test "GET is giving user_info" do
-      admin = insert(:user, info: %{"is_admin" => true})
+      admin = insert(:user, info: %{is_admin: true})
 
       conn =
         build_conn()
@@ -47,33 +47,30 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
         |> put_req_header("accept", "application/json")
         |> get("/api/pleroma/admin/permission_group/#{admin.nickname}")
 
-      assert json_response(conn, 200) == admin.info
+      assert json_response(conn, 200) == %{
+               "is_admin" => true,
+               "is_moderator" => false
+             }
     end
 
     test "/:right POST, can add to a permission group" do
-      admin = insert(:user, info: %{"is_admin" => true})
+      admin = insert(:user, info: %{is_admin: true})
       user = insert(:user)
 
-      user_info =
-        user.info
-        |> Map.put("is_admin", true)
-
       conn =
         build_conn()
         |> assign(:user, admin)
         |> put_req_header("accept", "application/json")
         |> post("/api/pleroma/admin/permission_group/#{user.nickname}/admin")
 
-      assert json_response(conn, 200) == user_info
+      assert json_response(conn, 200) == %{
+               "is_admin" => true
+             }
     end
 
     test "/:right DELETE, can remove from a permission group" do
-      admin = insert(:user, info: %{"is_admin" => true})
-      user = insert(:user, info: %{"is_admin" => true})
-
-      user_info =
-        user.info
-        |> Map.put("is_admin", false)
+      admin = insert(:user, info: %{is_admin: true})
+      user = insert(:user, info: %{is_admin: true})
 
       conn =
         build_conn()
@@ -81,12 +78,14 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
         |> put_req_header("accept", "application/json")
         |> delete("/api/pleroma/admin/permission_group/#{user.nickname}/admin")
 
-      assert json_response(conn, 200) == user_info
+      assert json_response(conn, 200) == %{
+               "is_admin" => false
+             }
     end
   end
 
   test "/api/pleroma/admin/invite_token" do
-    admin = insert(:user, info: %{"is_admin" => true})
+    admin = insert(:user, info: %{is_admin: true})
 
     conn =
       build_conn()
@@ -98,8 +97,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
   end
 
   test "/api/pleroma/admin/password_reset" do
-    admin = insert(:user, info: %{"is_admin" => true})
-    user = insert(:user, info: %{"is_admin" => true})
+    admin = insert(:user, info: %{is_admin: true})
+    user = insert(:user)
 
     conn =
       build_conn()
index cd36e409ce5f8c0d596a87ae894643152f15f0f6..8fc65f4c0e2672bf0a125e59eb55007f831b5b00 100644 (file)
@@ -17,7 +17,7 @@ defmodule Pleroma.Web.CommonAPI.Test do
 
     CommonAPI.update(user)
     user = User.get_cached_by_ap_id(user.ap_id)
-    [karjalanpiirakka] = user.info["source_data"]["tag"]
+    [karjalanpiirakka] = user.info.source_data["tag"]
 
     assert karjalanpiirakka["name"] == ":karjalanpiirakka:"
   end
index dc52b92bca4465d8556ab94dc12f70e634086286..a2d3a254750511c023c7ff9bcf7a6ed47064b4e2 100644 (file)
@@ -17,7 +17,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
 
     user =
       insert(:user, %{
-        info: %{"note_count" => 5, "follower_count" => 3, "source_data" => source_data},
+        info: %{note_count: 5, follower_count: 3, source_data: source_data},
         nickname: "shp@shitposter.club",
         name: ":karjalanpiirakka: shp",
         bio: "<script src=\"invalid-html\"></script><span>valid html</span>",
@@ -63,7 +63,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
   test "Represent a Service(bot) account" do
     user =
       insert(:user, %{
-        info: %{"note_count" => 5, "follower_count" => 3, "source_data" => %{"type" => "Service"}},
+        info: %{note_count: 5, follower_count: 3, source_data: %{"type" => "Service"}},
         nickname: "shp@shitposter.club",
         inserted_at: ~N[2017-08-15 15:47:06.597036]
       })
index ad67cae6b5985cd17fe78c74048c8c3b5ed41612..ef9db20cfafbd316273130e6d499f2388b3def06 100644 (file)
@@ -252,7 +252,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
   end
 
   test "verify_credentials default scope unlisted", %{conn: conn} do
-    user = insert(:user, %{info: %{"default_scope" => "unlisted"}})
+    user = insert(:user, %{info: %Pleroma.User.Info{default_scope: "unlisted"}})
 
     conn =
       conn
@@ -845,7 +845,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
 
   describe "locked accounts" do
     test "/api/v1/follow_requests works" do
-      user = insert(:user, %{info: %{"locked" => true}})
+      user = insert(:user, %{info: %Pleroma.User.Info{locked: true}})
       other_user = insert(:user)
 
       {:ok, activity} = ActivityPub.follow(other_user, user)
@@ -865,7 +865,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     end
 
     test "/api/v1/follow_requests/:id/authorize works" do
-      user = insert(:user, %{info: %{"locked" => true}})
+      user = insert(:user, %{info: %Pleroma.User.Info{locked: true}})
       other_user = insert(:user)
 
       {:ok, activity} = ActivityPub.follow(other_user, user)
@@ -890,7 +890,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     end
 
     test "verify_credentials", %{conn: conn} do
-      user = insert(:user, %{info: %{"default_scope" => "private"}})
+      user = insert(:user, %{info: %Pleroma.User.Info{default_scope: "private"}})
 
       conn =
         conn
@@ -902,7 +902,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     end
 
     test "/api/v1/follow_requests/:id/reject works" do
-      user = insert(:user, %{info: %{"locked" => true}})
+      user = insert(:user, %{info: %Pleroma.User.Info{locked: true}})
       other_user = insert(:user)
 
       {:ok, activity} = ActivityPub.follow(other_user, user)
@@ -1105,7 +1105,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     refute User.blocks?(user, other_user)
   end
 
-  test "getting a list of domain blocks" do
+  test "getting a list of domain blocks", %{conn: conn} do
     user = insert(:user)
 
     {:ok, user} = User.block_domain(user, "bad.site")
index a6376453caf6807b585f00d941b4cfb95750194c..a5b0b7869b8594a71e5912bc0bd34afe5d582d86 100644 (file)
@@ -4,7 +4,7 @@ defmodule Pleroma.Web.NodeInfoTest do
   import Pleroma.Factory
 
   test "nodeinfo shows staff accounts", %{conn: conn} do
-    user = insert(:user, %{local: true, info: %{"is_moderator" => true}})
+    user = insert(:user, %{local: true, info: %{is_moderator: true}})
 
     conn =
       conn
@@ -15,7 +15,7 @@ defmodule Pleroma.Web.NodeInfoTest do
     assert user.ap_id in result["metadata"]["staffAccounts"]
   end
 
-  test "returns 404 when federation is disabled" do
+  test "returns 404 when federation is disabled", %{conn: conn} do
     instance =
       Application.get_env(:pleroma, :instance)
       |> Keyword.put(:federating, false)
@@ -37,7 +37,7 @@ defmodule Pleroma.Web.NodeInfoTest do
     Application.put_env(:pleroma, :instance, instance)
   end
 
-  test "returns 200 when federation is enabled" do
+  test "returns 200 when federation is enabled", %{conn: conn} do
     conn
     |> get("/.well-known/nodeinfo")
     |> json_response(200)
index 371c835c0b38bdfceb87cad00edf20fadc0aa545..e81adde685f78020efc1bacf5086c8f1f965dec0 100644 (file)
@@ -31,14 +31,16 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
     # Set a wrong magic-key for a user so it has to refetch
     salmon_user = User.get_by_ap_id("http://gs.example.org:4040/index.php/user/1")
     # Wrong key
-    info =
-      salmon_user.info
-      |> Map.put(
-        "magic_key",
-        "RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwrong1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB"
-      )
-
-    Repo.update(User.info_changeset(salmon_user, %{info: info}))
+    info_cng =
+      User.Info.remote_user_creation(salmon_user.info, %{
+        magic_key:
+          "RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwrong1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB"
+      })
+
+    cng =
+      Ecto.Changeset.change(salmon_user)
+      |> Ecto.Changeset.put_embed(:info, info_cng)
+      |> Repo.update()
 
     conn =
       build_conn()
index f95da8b0a1fc1d4ad5869f9605b1c0bb624927d1..6e526301481f233050f52e8a88121c6d44520824 100644 (file)
@@ -17,7 +17,7 @@ defmodule Pleroma.Web.OStatusTest do
     {:ok, [activity]} = OStatus.handle_incoming(incoming)
 
     user = User.get_by_ap_id(activity.data["actor"])
-    assert user.info["note_count"] == 1
+    assert user.info.note_count == 1
     assert activity.data["type"] == "Create"
     assert activity.data["object"]["type"] == "Note"
 
@@ -319,7 +319,7 @@ defmodule Pleroma.Web.OStatusTest do
       assert user.name == "Constance Variable"
       assert user.nickname == "lambadalambda@social.heldscal.la"
       assert user.local == false
-      assert user.info["uri"] == uri
+      assert user.info.uri == uri
       assert user.ap_id == uri
       assert user.bio == "Call me Deacon Blues."
       assert user.avatar["type"] == "Image"
@@ -447,7 +447,7 @@ defmodule Pleroma.Web.OStatusTest do
     end
   end
 
-  test "it doesn't add nil in the do field" do
+  test "it doesn't add nil in the to field" do
     incoming = File.read!("test/fixtures/nil_mention_entry.xml")
     {:ok, [activity]} = OStatus.handle_incoming(incoming)
 
index e41dfeb3d0f7f898653ceb3162b5d9010979dc9b..82fb8e793f7f0df015c5f32088bf5468eaa95209 100644 (file)
@@ -6,7 +6,7 @@ defmodule Pleroma.Web.OStatus.UserRepresenterTest do
   alias Pleroma.User
 
   test "returns a user with id, uri, name and link" do
-    user = build(:user, nickname: "レイン")
+    user = insert(:user, %{nickname: "レイン"})
     tuple = UserRepresenter.to_simple_form(user)
 
     res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> to_string
index 291fd52379b5890a241f84c0a45a6ba24e063111..7cae4e4a141a18629eb4d085ec564588eb421575 100644 (file)
@@ -58,7 +58,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenterTest do
   end
 
   test "an activity" do
-    {:ok, user} = UserBuilder.insert()
+    user = insert(:user)
     #   {:ok, mentioned_user } = UserBuilder.insert(%{nickname: "shp", ap_id: "shp"})
     mentioned_user = insert(:user, %{nickname: "shp"})
 
index 6bdcb4fd84ab8d35aba19767e0384e872511277b..a76112e375f561eb659d59ba12acfc7ae998f276 100644 (file)
@@ -31,26 +31,6 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
     end
   end
 
-  describe "POST /api/account/most_recent_notification" do
-    setup [:valid_user]
-
-    test "without valid credentials", %{conn: conn} do
-      conn = post(conn, "/api/account/most_recent_notification.json")
-      assert json_response(conn, 403) == %{"error" => "Invalid credentials."}
-    end
-
-    test "with credentials", %{conn: conn, user: user} do
-      conn =
-        conn
-        |> with_credentials(user.nickname, "test")
-        |> post("/api/account/most_recent_notification.json", %{id: "200"})
-
-      assert json_response(conn, 200)
-      user = User.get_by_nickname(user.nickname)
-      assert user.info["most_recent_notification"] == 200
-    end
-  end
-
   describe "POST /statuses/update.json" do
     setup [:valid_user]
 
@@ -87,7 +67,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
 
   describe "GET /statuses/public_timeline.json" do
     test "returns statuses", %{conn: conn} do
-      {:ok, user} = UserBuilder.insert()
+      user = insert(:user)
       activities = ActivityBuilder.insert_list(30, %{}, %{user: user})
       ActivityBuilder.insert_list(10, %{}, %{user: user})
       since_id = List.last(activities).id
@@ -591,7 +571,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
         |> post("/api/blocks/destroy.json", %{user_id: blocked.id})
 
       current_user = Repo.get(User, current_user.id)
-      assert current_user.info["blocks"] == []
+      assert current_user.info.blocks == []
 
       assert json_response(conn, 200) ==
                UserView.render("show.json", %{user: blocked, for: current_user})
@@ -966,7 +946,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
         })
 
       user = Repo.get!(User, user.id)
-      assert user.info["locked"] == true
+      assert user.info.locked == true
 
       assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
     end
@@ -982,7 +962,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
         })
 
       user = Repo.get!(User, user.id)
-      assert user.info["locked"] == false
+      assert user.info.locked == false
 
       assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
     end
@@ -1156,7 +1136,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
       user = insert(:user, %{info: %{"locked" => true}})
       other_user = insert(:user)
 
-      {:ok, activity} = ActivityPub.follow(other_user, user)
+      {:ok, _activity} = ActivityPub.follow(other_user, user)
 
       user = Repo.get(User, user.id)
       other_user = Repo.get(User, other_user.id)
@@ -1178,7 +1158,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
       user = insert(:user, %{info: %{"locked" => true}})
       other_user = insert(:user)
 
-      {:ok, activity} = ActivityPub.follow(other_user, user)
+      {:ok, _activity} = ActivityPub.follow(other_user, user)
 
       user = Repo.get(User, user.id)
       other_user = Repo.get(User, other_user.id)
@@ -1201,7 +1181,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
       user = insert(:user, %{info: %{"locked" => true}})
       other_user = insert(:user)
 
-      {:ok, activity} = ActivityPub.follow(other_user, user)
+      {:ok, _activity} = ActivityPub.follow(other_user, user)
 
       user = Repo.get(User, user.id)
       other_user = Repo.get(User, other_user.id)
index 8b9920bd967884ab55359f831fe20a9e462ffdf5..ec13b89d40f5bb8df7877873b69e4928b072e39c 100644 (file)
@@ -10,7 +10,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
 
   test "create a status" do
     user = insert(:user)
-    _mentioned_user = UserBuilder.insert(%{nickname: "shp", ap_id: "shp"})
+    _mentioned_user = insert(:user, %{nickname: "shp", ap_id: "shp"})
 
     object_data = %{
       "type" => "Image",
@@ -67,7 +67,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
 
     user = User.get_by_ap_id(user.ap_id)
 
-    assert user.info["note_count"] == 1
+    assert user.info.note_count == 1
   end
 
   test "create a status that is a reply" do
@@ -116,7 +116,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
     assert User.ap_followers(followed) in user.following
 
     followed = User.get_by_ap_id(followed.ap_id)
-    assert followed.info["follower_count"] == 1
+    assert followed.info.follower_count == 1
 
     {:error, msg} = TwitterAPI.follow(user, %{"screen_name" => followed.nickname})
     assert msg == "Could not follow user: #{followed.nickname} is already on your list."
@@ -169,7 +169,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
     {:ok, user, _unblocked} = TwitterAPI.block(user, %{"user_id" => unblocked.id})
 
     {:ok, user, _unblocked} = TwitterAPI.unblock(user, %{"user_id" => unblocked.id})
-    assert user.info["blocks"] == []
+    assert user.info.blocks == []
   end
 
   test "Unblock another user using screen_name" do
@@ -178,7 +178,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
     {:ok, user, _unblocked} = TwitterAPI.block(user, %{"screen_name" => unblocked.nickname})
 
     {:ok, user, _unblocked} = TwitterAPI.unblock(user, %{"screen_name" => unblocked.nickname})
-    assert user.info["blocks"] == []
+    assert user.info.blocks == []
   end
 
   test "upload a file" do
index 2c583c0d35a25cafb76567d0a85aa91b6006b980..e69ca24a9e6df860eb81a277a5977df912318207 100644 (file)
@@ -31,10 +31,10 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
     expected =
       "<img height=\"32px\" width=\"32px\" alt=\"karjalanpiirakka\" title=\"karjalanpiirakka\" src=\"/file.png\" /> man"
 
-    user = %{
-      user
-      | info: %{
-          "source_data" => %{
+    user =
+      insert(:user, %{
+        info: %{
+          source_data: %{
             "tag" => [
               %{
                 "type" => "Emoji",
@@ -43,10 +43,10 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
               }
             ]
           }
-        }
-    }
+        },
+        name: ":karjalanpiirakka: man"
+      })
 
-    user = %{user | name: ":karjalanpiirakka: man"}
     represented = UserView.render("show.json", %{user: user})
     assert represented["name_html"] == expected
   end
@@ -103,7 +103,7 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
   end
 
   test "A user for a given other follower", %{user: user} do
-    {:ok, follower} = UserBuilder.insert(%{following: [User.ap_followers(user)]})
+    follower = insert(:user, %{following: [User.ap_followers(user)]})
     {:ok, user} = User.update_follower_count(user)
     image = "http://localhost:4001/images/avi.png"
     banner = "http://localhost:4001/images/banner.png"
@@ -186,7 +186,7 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
   end
 
   test "a user that is a moderator" do
-    user = insert(:user, %{info: %{"is_moderator" => true}})
+    user = insert(:user, %{info: %{is_moderator: true}})
     represented = UserView.render("show.json", %{user: user, for: user})
 
     assert represented["rights"]["delete_others_notice"]
@@ -250,7 +250,7 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
     user =
       insert(:user, %{
         info: %{
-          "source_data" => %{
+          source_data: %{
             "attachment" =>
               Enum.map(fields, fn field -> Map.put(field, "type", "PropertyValue") end)
           }
index 99bf210ea54d957e613182543436909a204a037e..28d429565ab3a154793965b542e9f967305ac7c5 100644 (file)
@@ -99,15 +99,15 @@ defmodule Pleroma.Web.WebFingerTest do
   describe "ensure_keys_present" do
     test "it creates keys for a user and stores them in info" do
       user = insert(:user)
-      refute is_binary(user.info["keys"])
+      refute is_binary(user.info.keys)
       {:ok, user} = WebFinger.ensure_keys_present(user)
-      assert is_binary(user.info["keys"])
+      assert is_binary(user.info.keys)
     end
 
     test "it doesn't create keys if there already are some" do
-      user = insert(:user, %{info: %{"keys" => "xxx"}})
+      user = insert(:user, %{info: %{keys: "xxx"}})
       {:ok, user} = WebFinger.ensure_keys_present(user)
-      assert user.info["keys"] == "xxx"
+      assert user.info.keys == "xxx"
     end
   end
 end
index 5914a37fc167a527680b421bb3f3a76725992fcb..da7bc9112ec8131bf18c1911f2832da4faeca1a6 100644 (file)
@@ -99,7 +99,7 @@ defmodule Pleroma.Web.WebsubTest do
 
   test "initiate a subscription for a given user and topic" do
     subscriber = insert(:user)
-    user = insert(:user, %{info: %{"topic" => "some_topic", "hub" => "some_hub"}})
+    user = insert(:user, %{info: %Pleroma.User.Info{topic: "some_topic", hub: "some_hub"}})
 
     {:ok, websub} = Websub.subscribe(subscriber, user, &accepting_verifier/1)
     assert websub.subscribers == [subscriber.ap_id]