@@ -29,6 +29,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). | |||||
- MRF (Simple Policy): Also use `:accept`/`:reject` on the actors rather than only their activities | - MRF (Simple Policy): Also use `:accept`/`:reject` on the actors rather than only their activities | ||||
- OStatus: Extract RSS functionality | - OStatus: Extract RSS functionality | ||||
- Mastodon API: Add `pleroma.direct_conversation_id` to the status endpoint (`GET /api/v1/statuses/:id`) | - Mastodon API: Add `pleroma.direct_conversation_id` to the status endpoint (`GET /api/v1/statuses/:id`) | ||||
- Deprecated `User.Info` embedded schema (fields moved to `User`) | |||||
### Fixed | ### Fixed | ||||
- Mastodon API: Fix private and direct statuses not being filtered out from the public timeline for an authenticated user (`GET /api/v1/timelines/public`) | - Mastodon API: Fix private and direct statuses not being filtered out from the public timeline for an authenticated user (`GET /api/v1/timelines/public`) | ||||
@@ -109,10 +109,10 @@ defmodule Mix.Tasks.Pleroma.User do | |||||
start_pleroma() | start_pleroma() | ||||
with %User{} = user <- User.get_cached_by_nickname(nickname) do | with %User{} = user <- User.get_cached_by_nickname(nickname) do | ||||
{:ok, user} = User.deactivate(user, !user.info.deactivated) | |||||
{:ok, user} = User.deactivate(user, !user.deactivated) | |||||
shell_info( | shell_info( | ||||
"Activation status of #{nickname}: #{if(user.info.deactivated, do: "de", else: "")}activated" | |||||
"Activation status of #{nickname}: #{if(user.deactivated, do: "de", else: "")}activated" | |||||
) | ) | ||||
else | else | ||||
_ -> | _ -> | ||||
@@ -340,7 +340,7 @@ defmodule Mix.Tasks.Pleroma.User do | |||||
with %User{} = user <- User.get_cached_by_nickname(nickname) do | with %User{} = user <- User.get_cached_by_nickname(nickname) do | ||||
{:ok, user} = User.toggle_confirmation(user) | {:ok, user} = User.toggle_confirmation(user) | ||||
message = if user.info.confirmation_pending, do: "needs", else: "doesn't need" | |||||
message = if user.confirmation_pending, do: "needs", else: "doesn't need" | |||||
shell_info("#{nickname} #{message} confirmation.") | shell_info("#{nickname} #{message} confirmation.") | ||||
else | else | ||||
@@ -364,23 +364,23 @@ defmodule Mix.Tasks.Pleroma.User do | |||||
end | end | ||||
defp set_moderator(user, value) do | defp set_moderator(user, value) do | ||||
{:ok, user} = User.update_info(user, &User.Info.admin_api_update(&1, %{is_moderator: value})) | |||||
{:ok, user} = User.update_and_set_cache(user, %{is_moderator: value}) | |||||
shell_info("Moderator status of #{user.nickname}: #{user.info.is_moderator}") | |||||
shell_info("Moderator status of #{user.nickname}: #{user.is_moderator}") | |||||
user | user | ||||
end | end | ||||
defp set_admin(user, value) do | defp set_admin(user, value) do | ||||
{:ok, user} = User.update_info(user, &User.Info.admin_api_update(&1, %{is_admin: value})) | |||||
{:ok, user} = User.update_and_set_cache(user, %{is_admin: value}) | |||||
shell_info("Admin status of #{user.nickname}: #{user.info.is_admin}") | |||||
shell_info("Admin status of #{user.nickname}: #{user.is_admin}") | |||||
user | user | ||||
end | end | ||||
defp set_locked(user, value) do | defp set_locked(user, value) do | ||||
{:ok, user} = User.update_info(user, &User.Info.user_upgrade(&1, %{locked: value})) | |||||
{:ok, user} = User.update_and_set_cache(user, %{locked: value}) | |||||
shell_info("Locked status of #{user.nickname}: #{user.info.locked}") | |||||
shell_info("Locked status of #{user.nickname}: #{user.locked}") | |||||
user | user | ||||
end | end | ||||
end | end |
@@ -17,7 +17,7 @@ defmodule Pleroma.Daemons.DigestEmailDaemon do | |||||
now = NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second) | now = NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second) | ||||
from(u in inactive_users_query, | from(u in inactive_users_query, | ||||
where: fragment(~s(? #> '{"email_notifications","digest"}' @> 'true'), u.info), | |||||
where: fragment(~s(? ->'digest' @> 'true'), u.email_notifications), | |||||
where: u.last_digest_emailed_at < datetime_add(^now, ^negative_interval, "day"), | where: u.last_digest_emailed_at < datetime_add(^now, ^negative_interval, "day"), | ||||
select: u | select: u | ||||
) | ) | ||||
@@ -72,7 +72,7 @@ defmodule Pleroma.Emails.UserEmail do | |||||
Endpoint, | Endpoint, | ||||
:confirm_email, | :confirm_email, | ||||
user.id, | user.id, | ||||
to_string(user.info.confirmation_token) | |||||
to_string(user.confirmation_token) | |||||
) | ) | ||||
html_body = """ | html_body = """ | ||||
@@ -127,7 +127,7 @@ defmodule Pleroma.Formatter do | |||||
end | end | ||||
end | end | ||||
defp get_ap_id(%User{info: %{source_data: %{"url" => url}}}) when is_binary(url), do: url | |||||
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_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, %{mentions_format: :full}), do: User.full_nickname(nickname) | ||||
@@ -40,7 +40,7 @@ defmodule Pleroma.Notification do | |||||
|> where( | |> where( | ||||
[n, a], | [n, a], | ||||
fragment( | fragment( | ||||
"? not in (SELECT ap_id FROM users WHERE info->'deactivated' @> 'true')", | |||||
"? not in (SELECT ap_id FROM users WHERE deactivated = 'true')", | |||||
a.actor | a.actor | ||||
) | ) | ||||
) | ) | ||||
@@ -259,7 +259,7 @@ defmodule Pleroma.Notification do | |||||
def skip?( | def skip?( | ||||
:followers, | :followers, | ||||
activity, | activity, | ||||
%{info: %{notification_settings: %{"followers" => false}}} = user | |||||
%{notification_settings: %{"followers" => false}} = user | |||||
) do | ) do | ||||
actor = activity.data["actor"] | actor = activity.data["actor"] | ||||
follower = User.get_cached_by_ap_id(actor) | follower = User.get_cached_by_ap_id(actor) | ||||
@@ -269,14 +269,14 @@ defmodule Pleroma.Notification do | |||||
def skip?( | def skip?( | ||||
:non_followers, | :non_followers, | ||||
activity, | activity, | ||||
%{info: %{notification_settings: %{"non_followers" => false}}} = user | |||||
%{notification_settings: %{"non_followers" => false}} = user | |||||
) do | ) do | ||||
actor = activity.data["actor"] | actor = activity.data["actor"] | ||||
follower = User.get_cached_by_ap_id(actor) | follower = User.get_cached_by_ap_id(actor) | ||||
!User.following?(follower, user) | !User.following?(follower, user) | ||||
end | end | ||||
def skip?(:follows, activity, %{info: %{notification_settings: %{"follows" => false}}} = user) do | |||||
def skip?(:follows, activity, %{notification_settings: %{"follows" => false}} = user) do | |||||
actor = activity.data["actor"] | actor = activity.data["actor"] | ||||
followed = User.get_cached_by_ap_id(actor) | followed = User.get_cached_by_ap_id(actor) | ||||
User.following?(user, followed) | User.following?(user, followed) | ||||
@@ -285,7 +285,7 @@ defmodule Pleroma.Notification do | |||||
def skip?( | def skip?( | ||||
:non_follows, | :non_follows, | ||||
activity, | activity, | ||||
%{info: %{notification_settings: %{"non_follows" => false}}} = user | |||||
%{notification_settings: %{"non_follows" => false}} = user | |||||
) do | ) do | ||||
actor = activity.data["actor"] | actor = activity.data["actor"] | ||||
followed = User.get_cached_by_ap_id(actor) | followed = User.get_cached_by_ap_id(actor) | ||||
@@ -19,7 +19,7 @@ defmodule Pleroma.Plugs.AdminSecretAuthenticationPlug do | |||||
def call(%{params: %{"admin_token" => admin_token}} = conn, _) do | def call(%{params: %{"admin_token" => admin_token}} = conn, _) do | ||||
if secret_token() && admin_token == secret_token() do | if secret_token() && admin_token == secret_token() do | ||||
conn | conn | ||||
|> assign(:user, %User{info: %{is_admin: true}}) | |||||
|> assign(:user, %User{is_admin: true}) | |||||
else | else | ||||
conn | conn | ||||
end | end | ||||
@@ -71,7 +71,7 @@ defmodule Pleroma.Plugs.OAuthPlug do | |||||
) | ) | ||||
# credo:disable-for-next-line Credo.Check.Readability.MaxLineLength | # credo:disable-for-next-line Credo.Check.Readability.MaxLineLength | ||||
with %Token{user: %{info: %{deactivated: false} = _} = user} = token_record <- Repo.one(query) do | |||||
with %Token{user: %{deactivated: false} = user} = token_record <- Repo.one(query) do | |||||
{:ok, user, token_record} | {:ok, user, token_record} | ||||
end | end | ||||
end | end | ||||
@@ -10,7 +10,7 @@ defmodule Pleroma.Plugs.UserEnabledPlug do | |||||
options | options | ||||
end | end | ||||
def call(%{assigns: %{user: %User{info: %{deactivated: true}}}} = conn, _) do | |||||
def call(%{assigns: %{user: %User{deactivated: true}}} = conn, _) do | |||||
conn | conn | ||||
|> assign(:user, nil) | |> assign(:user, nil) | ||||
end | end | ||||
@@ -11,7 +11,7 @@ defmodule Pleroma.Plugs.UserIsAdminPlug do | |||||
options | options | ||||
end | end | ||||
def call(%{assigns: %{user: %User{info: %{is_admin: true}}}} = conn, _) do | |||||
def call(%{assigns: %{user: %User{is_admin: true}}} = conn, _) do | |||||
conn | conn | ||||
end | end | ||||
@@ -68,12 +68,7 @@ defmodule Pleroma.Stats do | |||||
domain_count = Enum.count(peers) | domain_count = Enum.count(peers) | ||||
status_query = | |||||
from(u in User.Query.build(%{local: true}), | |||||
select: fragment("sum((?->>'note_count')::int)", u.info) | |||||
) | |||||
status_count = Repo.one(status_query) | |||||
status_count = Repo.aggregate(User.Query.build(%{local: true}), :sum, :note_count) | |||||
user_count = Repo.aggregate(User.Query.build(%{local: true, active: true}), :count, :id) | user_count = Repo.aggregate(User.Query.build(%{local: true, active: true}), :count, :id) | ||||
@@ -63,6 +63,62 @@ defmodule Pleroma.User do | |||||
field(:tags, {:array, :string}, default: []) | field(:tags, {:array, :string}, default: []) | ||||
field(:last_refreshed_at, :naive_datetime_usec) | field(:last_refreshed_at, :naive_datetime_usec) | ||||
field(:last_digest_emailed_at, :naive_datetime) | 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) | |||||
# Should be filled in only for remote users | |||||
field(:following_count, :integer, default: nil) | |||||
field(:locked, :boolean, default: false) | |||||
field(:confirmation_pending, :boolean, default: false) | |||||
field(:password_reset_pending, :boolean, default: false) | |||||
field(:confirmation_token, :string, default: nil) | |||||
field(:default_scope, :string, default: "public") | |||||
field(:blocks, {:array, :string}, default: []) | |||||
field(:domain_blocks, {:array, :string}, default: []) | |||||
field(:mutes, {:array, :string}, default: []) | |||||
field(:muted_reblogs, {:array, :string}, default: []) | |||||
field(:muted_notifications, {:array, :string}, default: []) | |||||
field(:subscribers, {: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(:show_role, :boolean, default: true) | |||||
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) | |||||
field(:salmon, :string, default: nil) | |||||
field(:hide_followers_count, :boolean, default: false) | |||||
field(:hide_follows_count, :boolean, default: false) | |||||
field(:hide_followers, :boolean, default: false) | |||||
field(:hide_follows, :boolean, default: false) | |||||
field(:hide_favorites, :boolean, default: true) | |||||
field(:unread_conversation_count, :integer, default: 0) | |||||
field(:pinned_activities, {:array, :string}, default: []) | |||||
field(:email_notifications, :map, default: %{"digest" => false}) | |||||
field(:mascot, :map, default: nil) | |||||
field(:emoji, {:array, :map}, default: []) | |||||
field(:pleroma_settings_store, :map, default: %{}) | |||||
field(:fields, {:array, :map}, default: nil) | |||||
field(:raw_fields, {:array, :map}, default: []) | |||||
field(:discoverable, :boolean, default: false) | |||||
field(:skip_thread_containment, :boolean, default: false) | |||||
field(:notification_settings, :map, | |||||
default: %{ | |||||
"followers" => true, | |||||
"follows" => true, | |||||
"non_follows" => true, | |||||
"non_followers" => true | |||||
} | |||||
) | |||||
has_many(:notifications, Notification) | has_many(:notifications, Notification) | ||||
has_many(:registrations, Registration) | has_many(:registrations, Registration) | ||||
has_many(:deliveries, Delivery) | has_many(:deliveries, Delivery) | ||||
@@ -71,7 +127,7 @@ defmodule Pleroma.User do | |||||
timestamps() | timestamps() | ||||
end | end | ||||
def auth_active?(%User{info: %User.Info{confirmation_pending: true}}), | |||||
def auth_active?(%User{confirmation_pending: true}), | |||||
do: !Pleroma.Config.get([:instance, :account_activation_required]) | do: !Pleroma.Config.get([:instance, :account_activation_required]) | ||||
def auth_active?(%User{}), do: true | def auth_active?(%User{}), do: true | ||||
@@ -86,8 +142,8 @@ defmodule Pleroma.User do | |||||
def visible_for?(_, _), do: false | def visible_for?(_, _), do: false | ||||
def superuser?(%User{local: true, info: %User.Info{is_admin: true}}), do: true | |||||
def superuser?(%User{local: true, info: %User.Info{is_moderator: true}}), do: true | |||||
def superuser?(%User{local: true, is_admin: true}), do: true | |||||
def superuser?(%User{local: true, is_moderator: true}), do: true | |||||
def superuser?(_), do: false | def superuser?(_), do: false | ||||
def avatar_url(user, options \\ []) do | def avatar_url(user, options \\ []) do | ||||
@@ -98,13 +154,13 @@ defmodule Pleroma.User do | |||||
end | end | ||||
def banner_url(user, options \\ []) do | def banner_url(user, options \\ []) do | ||||
case user.info.banner do | |||||
case user.banner do | |||||
%{"url" => [%{"href" => href} | _]} -> href | %{"url" => [%{"href" => href} | _]} -> href | ||||
_ -> !options[:no_default] && "#{Web.base_url()}/images/banner.png" | _ -> !options[:no_default] && "#{Web.base_url()}/images/banner.png" | ||||
end | end | ||||
end | end | ||||
def profile_url(%User{info: %{source_data: %{"url" => url}}}), do: url | |||||
def profile_url(%User{source_data: %{"url" => url}}), do: url | |||||
def profile_url(%User{ap_id: ap_id}), do: ap_id | def profile_url(%User{ap_id: ap_id}), do: ap_id | ||||
def profile_url(_), do: nil | def profile_url(_), do: nil | ||||
@@ -119,15 +175,15 @@ defmodule Pleroma.User do | |||||
def user_info(%User{} = user, args \\ %{}) do | def user_info(%User{} = user, args \\ %{}) do | ||||
following_count = | following_count = | ||||
Map.get(args, :following_count, user.info.following_count || following_count(user)) | |||||
Map.get(args, :following_count, user.following_count || following_count(user)) | |||||
follower_count = Map.get(args, :follower_count, user.info.follower_count) | |||||
follower_count = Map.get(args, :follower_count, user.follower_count) | |||||
%{ | %{ | ||||
note_count: user.info.note_count, | |||||
locked: user.info.locked, | |||||
confirmation_pending: user.info.confirmation_pending, | |||||
default_scope: user.info.default_scope | |||||
note_count: user.note_count, | |||||
locked: user.locked, | |||||
confirmation_pending: user.confirmation_pending, | |||||
default_scope: user.default_scope | |||||
} | } | ||||
|> Map.put(:following_count, following_count) | |> Map.put(:following_count, following_count) | ||||
|> Map.put(:follower_count, follower_count) | |> Map.put(:follower_count, follower_count) | ||||
@@ -157,9 +213,7 @@ defmodule Pleroma.User do | |||||
@spec restrict_deactivated(Ecto.Query.t()) :: Ecto.Query.t() | @spec restrict_deactivated(Ecto.Query.t()) :: Ecto.Query.t() | ||||
def restrict_deactivated(query) do | def restrict_deactivated(query) do | ||||
from(u in query, | |||||
where: not fragment("? \\? 'deactivated' AND ?->'deactivated' @> 'true'", u.info, u.info) | |||||
) | |||||
from(u in query, where: u.deactivated != ^true) | |||||
end | end | ||||
def following_count(%User{following: []}), do: 0 | def following_count(%User{following: []}), do: 0 | ||||
@@ -170,6 +224,64 @@ defmodule Pleroma.User do | |||||
|> Repo.aggregate(:count, :id) | |> Repo.aggregate(:count, :id) | ||||
end | end | ||||
@info_fields [ | |||||
:banner, | |||||
:background, | |||||
:source_data, | |||||
:note_count, | |||||
:follower_count, | |||||
:following_count, | |||||
:locked, | |||||
:confirmation_pending, | |||||
:password_reset_pending, | |||||
:confirmation_token, | |||||
:default_scope, | |||||
:blocks, | |||||
:domain_blocks, | |||||
:mutes, | |||||
:muted_reblogs, | |||||
:muted_notifications, | |||||
:subscribers, | |||||
:deactivated, | |||||
:no_rich_text, | |||||
:ap_enabled, | |||||
:is_moderator, | |||||
:is_admin, | |||||
:show_role, | |||||
:settings, | |||||
:magic_key, | |||||
:uri, | |||||
:topic, | |||||
:hub, | |||||
:salmon, | |||||
:hide_followers_count, | |||||
:hide_follows_count, | |||||
:hide_followers, | |||||
:hide_follows, | |||||
:hide_favorites, | |||||
:unread_conversation_count, | |||||
:pinned_activities, | |||||
:email_notifications, | |||||
:mascot, | |||||
:emoji, | |||||
:pleroma_settings_store, | |||||
:fields, | |||||
:raw_fields, | |||||
:discoverable, | |||||
:skip_thread_containment, | |||||
:notification_settings | |||||
] | |||||
def info_fields, do: @info_fields | |||||
defp truncate_fields_param(params) do | |||||
if Map.has_key?(params, :fields) do | |||||
Map.put(params, :fields, Enum.map(params[:fields], &truncate_field/1)) | |||||
else | |||||
params | |||||
end | |||||
end | |||||
defp truncate_if_exists(params, key, max_length) do | defp truncate_if_exists(params, key, max_length) do | ||||
if Map.has_key?(params, key) and is_binary(params[key]) do | if Map.has_key?(params, key) and is_binary(params[key]) do | ||||
{value, _chopped} = String.split_at(params[key], max_length) | {value, _chopped} = String.split_at(params[key], max_length) | ||||
@@ -188,18 +300,20 @@ defmodule Pleroma.User do | |||||
|> Map.put(:info, params[:info] || %{}) | |> Map.put(:info, params[:info] || %{}) | ||||
|> truncate_if_exists(:name, name_limit) | |> truncate_if_exists(:name, name_limit) | ||||
|> truncate_if_exists(:bio, bio_limit) | |> truncate_if_exists(:bio, bio_limit) | ||||
|> truncate_fields_param() | |||||
changeset = | changeset = | ||||
%User{local: false} | %User{local: false} | ||||
|> cast(params, [:bio, :name, :ap_id, :nickname, :avatar]) | |||||
|> cast(params, [:bio, :name, :ap_id, :nickname, :avatar] ++ @info_fields) | |||||
|> validate_required([:name, :ap_id]) | |> validate_required([:name, :ap_id]) | ||||
|> unique_constraint(:nickname) | |> unique_constraint(:nickname) | ||||
|> validate_format(:nickname, @email_regex) | |> validate_format(:nickname, @email_regex) | ||||
|> validate_length(:bio, max: bio_limit) | |> validate_length(:bio, max: bio_limit) | ||||
|> validate_length(:name, max: name_limit) | |> validate_length(:name, max: name_limit) | ||||
|> change_info(&User.Info.remote_user_creation(&1, params[:info])) | |||||
|> validate_fields(true) | |||||
|> change_info(& &1) | |||||
case params[:info][:source_data] do | |||||
case params[:source_data] do | |||||
%{"followers" => followers, "following" => following} -> | %{"followers" => followers, "following" => following} -> | ||||
changeset | changeset | ||||
|> put_change(:follower_address, followers) | |> put_change(:follower_address, followers) | ||||
@@ -216,11 +330,12 @@ defmodule Pleroma.User do | |||||
name_limit = Pleroma.Config.get([:instance, :user_name_length], 100) | name_limit = Pleroma.Config.get([:instance, :user_name_length], 100) | ||||
struct | struct | ||||
|> cast(params, [:bio, :name, :avatar, :following]) | |||||
|> cast(params, [:bio, :name, :avatar, :following] ++ @info_fields) | |||||
|> unique_constraint(:nickname) | |> unique_constraint(:nickname) | ||||
|> validate_format(:nickname, local_nickname_regex()) | |> validate_format(:nickname, local_nickname_regex()) | ||||
|> validate_length(:bio, max: bio_limit) | |> validate_length(:bio, max: bio_limit) | ||||
|> validate_length(:name, min: 1, max: name_limit) | |> validate_length(:name, min: 1, max: name_limit) | ||||
|> validate_fields(false) | |||||
end | end | ||||
def upgrade_changeset(struct, params \\ %{}, remote? \\ false) do | def upgrade_changeset(struct, params \\ %{}, remote? \\ false) do | ||||
@@ -229,20 +344,26 @@ defmodule Pleroma.User do | |||||
params = Map.put(params, :last_refreshed_at, NaiveDateTime.utc_now()) | params = Map.put(params, :last_refreshed_at, NaiveDateTime.utc_now()) | ||||
params = if remote?, do: truncate_fields_param(params), else: params | |||||
struct | struct | ||||
|> cast(params, [ | |||||
:bio, | |||||
:name, | |||||
:follower_address, | |||||
:following_address, | |||||
:avatar, | |||||
:last_refreshed_at | |||||
]) | |||||
|> cast( | |||||
params, | |||||
[ | |||||
:bio, | |||||
:name, | |||||
:follower_address, | |||||
:following_address, | |||||
:avatar, | |||||
:last_refreshed_at | |||||
] ++ @info_fields | |||||
) | |||||
|> unique_constraint(:nickname) | |> unique_constraint(:nickname) | ||||
|> validate_format(:nickname, local_nickname_regex()) | |> validate_format(:nickname, local_nickname_regex()) | ||||
|> validate_length(:bio, max: bio_limit) | |> validate_length(:bio, max: bio_limit) | ||||
|> validate_length(:name, max: name_limit) | |> validate_length(:name, max: name_limit) | ||||
|> change_info(&User.Info.user_upgrade(&1, params[:info], remote?)) | |||||
|> validate_fields(remote?) | |||||
|> change_info(& &1) | |||||
end | end | ||||
def password_update_changeset(struct, params) do | def password_update_changeset(struct, params) do | ||||
@@ -250,8 +371,8 @@ defmodule Pleroma.User do | |||||
|> cast(params, [:password, :password_confirmation]) | |> cast(params, [:password, :password_confirmation]) | ||||
|> validate_required([:password, :password_confirmation]) | |> validate_required([:password, :password_confirmation]) | ||||
|> validate_confirmation(:password) | |> validate_confirmation(:password) | ||||
|> put_password_hash | |||||
|> put_embed(:info, User.Info.set_password_reset_pending(struct.info, false)) | |||||
|> put_password_hash() | |||||
|> put_change(:password_reset_pending, false) | |||||
end | end | ||||
@spec reset_password(User.t(), map) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} | @spec reset_password(User.t(), map) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} | ||||
@@ -268,19 +389,19 @@ defmodule Pleroma.User do | |||||
end | end | ||||
end | end | ||||
def update_password_reset_pending(user, value) do | |||||
user | |||||
|> change() | |||||
|> put_change(:password_reset_pending, value) | |||||
|> update_and_set_cache() | |||||
end | |||||
def force_password_reset_async(user) do | def force_password_reset_async(user) do | ||||
BackgroundWorker.enqueue("force_password_reset", %{"user_id" => user.id}) | BackgroundWorker.enqueue("force_password_reset", %{"user_id" => user.id}) | ||||
end | end | ||||
@spec force_password_reset(User.t()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} | @spec force_password_reset(User.t()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} | ||||
def force_password_reset(user) do | |||||
info_cng = User.Info.set_password_reset_pending(user.info, true) | |||||
user | |||||
|> change() | |||||
|> put_embed(:info, info_cng) | |||||
|> update_and_set_cache() | |||||
end | |||||
def force_password_reset(user), do: update_password_reset_pending(user, true) | |||||
def register_changeset(struct, params \\ %{}, opts \\ []) do | def register_changeset(struct, params \\ %{}, opts \\ []) do | ||||
bio_limit = Pleroma.Config.get([:instance, :user_bio_length], 5000) | bio_limit = Pleroma.Config.get([:instance, :user_bio_length], 5000) | ||||
@@ -294,6 +415,7 @@ defmodule Pleroma.User do | |||||
end | end | ||||
struct | 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]) | ||||
|> validate_required([:name, :nickname, :password, :password_confirmation]) | |> validate_required([:name, :nickname, :password, :password_confirmation]) | ||||
|> validate_confirmation(:password) | |> validate_confirmation(:password) | ||||
@@ -304,7 +426,7 @@ defmodule Pleroma.User do | |||||
|> validate_format(:email, @email_regex) | |> validate_format(:email, @email_regex) | ||||
|> validate_length(:bio, max: bio_limit) | |> validate_length(:bio, max: bio_limit) | ||||
|> validate_length(:name, min: 1, max: name_limit) | |> validate_length(:name, min: 1, max: name_limit) | ||||
|> change_info(&User.Info.confirmation_changeset(&1, need_confirmation: need_confirmation?)) | |||||
|> change_info(& &1) | |||||
|> maybe_validate_required_email(opts[:external]) | |> maybe_validate_required_email(opts[:external]) | ||||
|> put_password_hash | |> put_password_hash | ||||
|> put_ap_id() | |> put_ap_id() | ||||
@@ -355,7 +477,7 @@ defmodule Pleroma.User do | |||||
end | end | ||||
def try_send_confirmation_email(%User{} = user) do | def try_send_confirmation_email(%User{} = user) do | ||||
if user.info.confirmation_pending && | |||||
if user.confirmation_pending && | |||||
Pleroma.Config.get([:instance, :account_activation_required]) do | Pleroma.Config.get([:instance, :account_activation_required]) do | ||||
user | user | ||||
|> Pleroma.Emails.UserEmail.account_confirmation_email() | |> Pleroma.Emails.UserEmail.account_confirmation_email() | ||||
@@ -378,7 +500,7 @@ defmodule Pleroma.User do | |||||
def needs_update?(_), do: true | def needs_update?(_), do: true | ||||
@spec maybe_direct_follow(User.t(), User.t()) :: {:ok, User.t()} | {:error, String.t()} | @spec maybe_direct_follow(User.t(), User.t()) :: {:ok, User.t()} | {:error, String.t()} | ||||
def maybe_direct_follow(%User{} = follower, %User{local: true, info: %{locked: true}}) do | |||||
def maybe_direct_follow(%User{} = follower, %User{local: true, locked: true}) do | |||||
{:ok, follower} | {:ok, follower} | ||||
end | end | ||||
@@ -425,13 +547,13 @@ defmodule Pleroma.User do | |||||
set_cache(follower) | set_cache(follower) | ||||
end | end | ||||
def follow(%User{} = follower, %User{info: info} = followed) do | |||||
def follow(%User{} = follower, %User{} = followed) do | |||||
deny_follow_blocked = Pleroma.Config.get([:user, :deny_follow_blocked]) | deny_follow_blocked = Pleroma.Config.get([:user, :deny_follow_blocked]) | ||||
ap_followers = followed.follower_address | ap_followers = followed.follower_address | ||||
cond do | cond do | ||||
info.deactivated -> | |||||
{:error, "Could not follow user: You are deactivated."} | |||||
followed.deactivated -> | |||||
{:error, "Could not follow user: #{followed.nickname} is deactivated."} | |||||
deny_follow_blocked and blocks?(followed, follower) -> | deny_follow_blocked and blocks?(followed, follower) -> | ||||
{:error, "Could not follow user: #{followed.nickname} blocked you."} | {:error, "Could not follow user: #{followed.nickname} blocked you."} | ||||
@@ -489,7 +611,7 @@ defmodule Pleroma.User do | |||||
end | end | ||||
def locked?(%User{} = user) do | def locked?(%User{} = user) do | ||||
user.info.locked || false | |||||
user.locked || false | |||||
end | end | ||||
def get_by_id(id) do | def get_by_id(id) do | ||||
@@ -532,6 +654,12 @@ defmodule Pleroma.User do | |||||
{:ok, user} | {:ok, user} | ||||
end | end | ||||
def update_and_set_cache(struct, params) do | |||||
struct | |||||
|> update_changeset(params) | |||||
|> update_and_set_cache() | |||||
end | |||||
def update_and_set_cache(changeset) do | def update_and_set_cache(changeset) do | ||||
with {:ok, user} <- Repo.update(changeset, stale_error_field: :id) do | with {:ok, user} <- Repo.update(changeset, stale_error_field: :id) do | ||||
set_cache(user) | set_cache(user) | ||||
@@ -721,16 +849,7 @@ defmodule Pleroma.User do | |||||
def increase_note_count(%User{} = user) do | def increase_note_count(%User{} = user) do | ||||
User | User | ||||
|> where(id: ^user.id) | |> where(id: ^user.id) | ||||
|> update([u], | |||||
set: [ | |||||
info: | |||||
fragment( | |||||
"jsonb_set(?, '{note_count}', ((?->>'note_count')::int + 1)::varchar::jsonb, true)", | |||||
u.info, | |||||
u.info | |||||
) | |||||
] | |||||
) | |||||
|> update([u], inc: [note_count: 1]) | |||||
|> select([u], u) | |> select([u], u) | ||||
|> Repo.update_all([]) | |> Repo.update_all([]) | ||||
|> case do | |> case do | ||||
@@ -744,12 +863,7 @@ defmodule Pleroma.User do | |||||
|> where(id: ^user.id) | |> where(id: ^user.id) | ||||
|> update([u], | |> update([u], | ||||
set: [ | set: [ | ||||
info: | |||||
fragment( | |||||
"jsonb_set(?, '{note_count}', (greatest(0, (?->>'note_count')::int - 1))::varchar::jsonb, true)", | |||||
u.info, | |||||
u.info | |||||
) | |||||
note_count: fragment("greatest(0, note_count - 1)") | |||||
] | ] | ||||
) | ) | ||||
|> select([u], u) | |> select([u], u) | ||||
@@ -760,29 +874,17 @@ defmodule Pleroma.User do | |||||
end | end | ||||
end | end | ||||
def update_note_count(%User{} = user) do | |||||
def update_note_count(%User{} = user, note_count \\ nil) do | |||||
note_count = | note_count = | ||||
from( | |||||
a in Object, | |||||
where: fragment("?->>'actor' = ? and ?->>'type' = 'Note'", a.data, ^user.ap_id, a.data), | |||||
select: count(a.id) | |||||
) | |||||
|> Repo.one() | |||||
update_info(user, &User.Info.set_note_count(&1, note_count)) | |||||
end | |||||
def update_mascot(user, url) do | |||||
info_changeset = | |||||
User.Info.mascot_update( | |||||
user.info, | |||||
url | |||||
) | |||||
note_count || | |||||
from( | |||||
a in Object, | |||||
where: fragment("?->>'actor' = ? and ?->>'type' = 'Note'", a.data, ^user.ap_id, a.data), | |||||
select: count(a.id) | |||||
) | |||||
|> Repo.one() | |||||
user | |||||
|> change() | |||||
|> put_embed(:info, info_changeset) | |||||
|> update_and_set_cache() | |||||
update_and_set_cache(user, %{note_count: note_count}) | |||||
end | end | ||||
@spec maybe_fetch_follow_information(User.t()) :: User.t() | @spec maybe_fetch_follow_information(User.t()) :: User.t() | ||||
@@ -799,10 +901,24 @@ defmodule Pleroma.User do | |||||
def fetch_follow_information(user) do | def fetch_follow_information(user) do | ||||
with {:ok, info} <- ActivityPub.fetch_follow_information_for_user(user) do | with {:ok, info} <- ActivityPub.fetch_follow_information_for_user(user) do | ||||
update_info(user, &User.Info.follow_information_update(&1, info)) | |||||
user | |||||
|> follow_information_changeset(info) | |||||
|> update_and_set_cache() | |||||
end | end | ||||
end | end | ||||
defp follow_information_changeset(user, params) do | |||||
user | |||||
|> cast(params, [ | |||||
:hide_followers, | |||||
:hide_follows, | |||||
:follower_count, | |||||
:following_count, | |||||
:hide_followers_count, | |||||
:hide_follows_count | |||||
]) | |||||
end | |||||
def update_follower_count(%User{} = user) do | def update_follower_count(%User{} = user) do | ||||
if user.local or !Pleroma.Config.get([:instance, :external_user_synchronization]) do | if user.local or !Pleroma.Config.get([:instance, :external_user_synchronization]) do | ||||
follower_count_query = | follower_count_query = | ||||
@@ -813,14 +929,7 @@ defmodule Pleroma.User do | |||||
|> where(id: ^user.id) | |> where(id: ^user.id) | ||||
|> join(:inner, [u], s in subquery(follower_count_query)) | |> join(:inner, [u], s in subquery(follower_count_query)) | ||||
|> update([u, s], | |> update([u, s], | ||||
set: [ | |||||
info: | |||||
fragment( | |||||
"jsonb_set(?, '{follower_count}', ?::varchar::jsonb, true)", | |||||
u.info, | |||||
s.count | |||||
) | |||||
] | |||||
set: [follower_count: s.count] | |||||
) | ) | ||||
|> select([u], u) | |> select([u], u) | ||||
|> Repo.update_all([]) | |> Repo.update_all([]) | ||||
@@ -850,14 +959,7 @@ defmodule Pleroma.User do | |||||
User | User | ||||
|> join(:inner, [u], p in subquery(unread_query)) | |> join(:inner, [u], p in subquery(unread_query)) | ||||
|> update([u, p], | |> update([u, p], | ||||
set: [ | |||||
info: | |||||
fragment( | |||||
"jsonb_set(?, '{unread_conversation_count}', ?::varchar::jsonb, true)", | |||||
u.info, | |||||
p.count | |||||
) | |||||
] | |||||
set: [unread_conversation_count: p.count] | |||||
) | ) | ||||
|> where([u], u.id == ^user.id) | |> where([u], u.id == ^user.id) | ||||
|> select([u], u) | |> select([u], u) | ||||
@@ -878,14 +980,7 @@ defmodule Pleroma.User do | |||||
User | User | ||||
|> join(:inner, [u], p in subquery(unread_query)) | |> join(:inner, [u], p in subquery(unread_query)) | ||||
|> update([u, p], | |> update([u, p], | ||||
set: [ | |||||
info: | |||||
fragment( | |||||
"jsonb_set(?, '{unread_conversation_count}', (coalesce((?->>'unread_conversation_count')::int, 0) + 1)::varchar::jsonb, true)", | |||||
u.info, | |||||
u.info | |||||
) | |||||
] | |||||
inc: [unread_conversation_count: 1] | |||||
) | ) | ||||
|> where([u], u.id == ^user.id) | |> where([u], u.id == ^user.id) | ||||
|> where([u, p], p.count == 0) | |> where([u, p], p.count == 0) | ||||
@@ -942,14 +1037,14 @@ defmodule Pleroma.User do | |||||
if blocks?(subscribed, subscriber) and deny_follow_blocked do | if blocks?(subscribed, subscriber) and deny_follow_blocked do | ||||
{:error, "Could not subscribe: #{subscribed.nickname} is blocking you"} | {:error, "Could not subscribe: #{subscribed.nickname} is blocking you"} | ||||
else | else | ||||
update_info(subscribed, &User.Info.add_to_subscribers(&1, subscriber.ap_id)) | |||||
User.add_to_subscribers(subscribed, subscriber.ap_id) | |||||
end | end | ||||
end | end | ||||
end | end | ||||
def unsubscribe(unsubscriber, %{ap_id: ap_id}) do | def unsubscribe(unsubscriber, %{ap_id: ap_id}) do | ||||
with %User{} = user <- get_cached_by_ap_id(ap_id) do | with %User{} = user <- get_cached_by_ap_id(ap_id) do | ||||
update_info(user, &User.Info.remove_from_subscribers(&1, unsubscriber.ap_id)) | |||||
User.remove_from_subscribers(user, unsubscriber.ap_id) | |||||
end | end | ||||
end | end | ||||
@@ -1025,7 +1120,7 @@ defmodule Pleroma.User do | |||||
def subscribed_to?(user, %{ap_id: ap_id}) do | def subscribed_to?(user, %{ap_id: ap_id}) do | ||||
with %User{} = target <- get_cached_by_ap_id(ap_id) do | with %User{} = target <- get_cached_by_ap_id(ap_id) do | ||||
Enum.member?(target.info.subscribers, user.ap_id) | |||||
Enum.member?(target.subscribers, user.ap_id) | |||||
end | end | ||||
end | end | ||||
@@ -1043,7 +1138,7 @@ defmodule Pleroma.User do | |||||
@spec subscribers(User.t()) :: [User.t()] | @spec subscribers(User.t()) :: [User.t()] | ||||
def subscribers(user) do | def subscribers(user) do | ||||
User.Query.build(%{ap_id: user.info.subscribers, deactivated: false}) | |||||
User.Query.build(%{ap_id: user.subscribers, deactivated: false}) | |||||
|> Repo.all() | |> Repo.all() | ||||
end | end | ||||
@@ -1060,7 +1155,7 @@ defmodule Pleroma.User do | |||||
end | end | ||||
def deactivate(%User{} = user, status \\ true) do | def deactivate(%User{} = user, status \\ true) do | ||||
with {:ok, user} <- update_info(user, &User.Info.set_activation_status(&1, status)) do | |||||
with {:ok, user} <- set_activation_status(user, status) do | |||||
Enum.each(get_followers(user), &invalidate_cache/1) | Enum.each(get_followers(user), &invalidate_cache/1) | ||||
Enum.each(get_friends(user), &update_follower_count/1) | Enum.each(get_friends(user), &update_follower_count/1) | ||||
@@ -1068,8 +1163,23 @@ defmodule Pleroma.User do | |||||
end | end | ||||
end | end | ||||
def update_notification_settings(%User{} = user, settings \\ %{}) do | |||||
update_info(user, &User.Info.update_notification_settings(&1, settings)) | |||||
def update_notification_settings(%User{} = user, settings) do | |||||
settings = | |||||
settings | |||||
|> Enum.map(fn {k, v} -> {k, v in [true, "true", "True", "1"]} end) | |||||
|> Map.new() | |||||
notification_settings = | |||||
user.notification_settings | |||||
|> Map.merge(settings) | |||||
|> Map.take(["followers", "follows", "non_follows", "non_followers"]) | |||||
params = %{notification_settings: notification_settings} | |||||
user | |||||
|> cast(params, [:notification_settings]) | |||||
|> validate_required([:notification_settings]) | |||||
|> update_and_set_cache() | |||||
end | end | ||||
def delete(%User{} = user) do | def delete(%User{} = user) do | ||||
@@ -1107,7 +1217,7 @@ defmodule Pleroma.User do | |||||
pages = Pleroma.Config.get!([:fetch_initial_posts, :pages]) | pages = Pleroma.Config.get!([:fetch_initial_posts, :pages]) | ||||
# Insert all the posts in reverse order, so they're in the right order on the timeline | # Insert all the posts in reverse order, so they're in the right order on the timeline | ||||
user.info.source_data["outbox"] | |||||
user.source_data["outbox"] | |||||
|> Utils.fetch_ordered_collection(pages) | |> Utils.fetch_ordered_collection(pages) | ||||
|> Enum.reverse() | |> Enum.reverse() | ||||
|> Enum.each(&Pleroma.Web.Federator.incoming_ap_doc/1) | |> Enum.each(&Pleroma.Web.Federator.incoming_ap_doc/1) | ||||
@@ -1228,7 +1338,7 @@ defmodule Pleroma.User do | |||||
defp delete_activity(_activity), do: "Doing nothing" | defp delete_activity(_activity), do: "Doing nothing" | ||||
def html_filter_policy(%User{info: %{no_rich_text: true}}) do | |||||
def html_filter_policy(%User{no_rich_text: true}) do | |||||
Pleroma.HTML.Scrubber.TwitterText | Pleroma.HTML.Scrubber.TwitterText | ||||
end | end | ||||
@@ -1288,9 +1398,7 @@ defmodule Pleroma.User do | |||||
end | end | ||||
# AP style | # AP style | ||||
def public_key_from_info(%{ | |||||
source_data: %{"publicKey" => %{"publicKeyPem" => public_key_pem}} | |||||
}) do | |||||
def public_key(%{source_data: %{"publicKey" => %{"publicKeyPem" => public_key_pem}}}) do | |||||
key = | key = | ||||
public_key_pem | public_key_pem | ||||
|> :public_key.pem_decode() | |> :public_key.pem_decode() | ||||
@@ -1301,15 +1409,15 @@ defmodule Pleroma.User do | |||||
end | end | ||||
# OStatus Magic Key | # OStatus Magic Key | ||||
def public_key_from_info(%{magic_key: magic_key}) when not is_nil(magic_key) do | |||||
def public_key(%{magic_key: magic_key}) when not is_nil(magic_key) do | |||||
{:ok, Pleroma.Web.Salmon.decode_key(magic_key)} | {:ok, Pleroma.Web.Salmon.decode_key(magic_key)} | ||||
end | end | ||||
def public_key_from_info(_), do: {:error, "not found key"} | |||||
def public_key(_), do: {:error, "not found key"} | |||||
def get_public_key_for_ap_id(ap_id) do | def get_public_key_for_ap_id(ap_id) do | ||||
with {:ok, %User{} = user} <- get_or_fetch_by_ap_id(ap_id), | with {:ok, %User{} = user} <- get_or_fetch_by_ap_id(ap_id), | ||||
{:ok, public_key} <- public_key_from_info(user.info) do | |||||
{:ok, public_key} <- public_key(user) do | |||||
{:ok, public_key} | {:ok, public_key} | ||||
else | else | ||||
_ -> :error | _ -> :error | ||||
@@ -1328,7 +1436,7 @@ defmodule Pleroma.User do | |||||
end | end | ||||
def ap_enabled?(%User{local: true}), do: true | def ap_enabled?(%User{local: true}), do: true | ||||
def ap_enabled?(%User{info: info}), do: info.ap_enabled | |||||
def ap_enabled?(%User{ap_enabled: ap_enabled}), do: ap_enabled | |||||
def ap_enabled?(_), do: false | def ap_enabled?(_), do: false | ||||
@doc "Gets or fetch a user by uri or nickname." | @doc "Gets or fetch a user by uri or nickname." | ||||
@@ -1486,7 +1594,7 @@ defmodule Pleroma.User do | |||||
left_join: a in Pleroma.Activity, | left_join: a in Pleroma.Activity, | ||||
on: u.ap_id == a.actor, | on: u.ap_id == a.actor, | ||||
where: not is_nil(u.nickname), | where: not is_nil(u.nickname), | ||||
where: fragment("not (?->'deactivated' @> 'true')", u.info), | |||||
where: u.deactivated != ^true, | |||||
where: u.id not in ^has_read_notifications, | where: u.id not in ^has_read_notifications, | ||||
group_by: u.id, | group_by: u.id, | ||||
having: | having: | ||||
@@ -1500,16 +1608,16 @@ defmodule Pleroma.User do | |||||
## Examples | ## Examples | ||||
iex> Pleroma.User.switch_email_notifications(Pleroma.User{info: %{email_notifications: %{"digest" => false}}}, "digest", true) | |||||
Pleroma.User{info: %{email_notifications: %{"digest" => true}}} | |||||
iex> Pleroma.User.switch_email_notifications(Pleroma.User{email_notifications: %{"digest" => false}}, "digest", true) | |||||
Pleroma.User{email_notifications: %{"digest" => true}} | |||||
iex> Pleroma.User.switch_email_notifications(Pleroma.User{info: %{email_notifications: %{"digest" => true}}}, "digest", false) | |||||
Pleroma.User{info: %{email_notifications: %{"digest" => false}}} | |||||
iex> Pleroma.User.switch_email_notifications(Pleroma.User{email_notifications: %{"digest" => true}}, "digest", false) | |||||
Pleroma.User{email_notifications: %{"digest" => false}} | |||||
""" | """ | ||||
@spec switch_email_notifications(t(), String.t(), boolean()) :: | @spec switch_email_notifications(t(), String.t(), boolean()) :: | ||||
{:ok, t()} | {:error, Ecto.Changeset.t()} | {:ok, t()} | {:error, Ecto.Changeset.t()} | ||||
def switch_email_notifications(user, type, status) do | def switch_email_notifications(user, type, status) do | ||||
update_info(user, &User.Info.update_email_notifications(&1, %{type => status})) | |||||
User.update_email_notifications(user, %{type => status}) | |||||
end | end | ||||
@doc """ | @doc """ | ||||
@@ -1529,17 +1637,16 @@ defmodule Pleroma.User do | |||||
@spec toggle_confirmation(User.t()) :: {:ok, User.t()} | {:error, Changeset.t()} | @spec toggle_confirmation(User.t()) :: {:ok, User.t()} | {:error, Changeset.t()} | ||||
def toggle_confirmation(%User{} = user) do | def toggle_confirmation(%User{} = user) do | ||||
need_confirmation? = !user.info.confirmation_pending | |||||
user | user | ||||
|> update_info(&User.Info.confirmation_changeset(&1, need_confirmation: need_confirmation?)) | |||||
|> confirmation_changeset(need_confirmation: !user.confirmation_pending) | |||||
|> update_and_set_cache() | |||||
end | end | ||||
def get_mascot(%{info: %{mascot: %{} = mascot}}) when not is_nil(mascot) do | |||||
def get_mascot(%{mascot: %{} = mascot}) when not is_nil(mascot) do | |||||
mascot | mascot | ||||
end | end | ||||
def get_mascot(%{info: %{mascot: mascot}}) when is_nil(mascot) do | |||||
def get_mascot(%{mascot: mascot}) when is_nil(mascot) do | |||||
# use instance-default | # use instance-default | ||||
config = Pleroma.Config.get([:assets, :mascots]) | config = Pleroma.Config.get([:assets, :mascots]) | ||||
default_mascot = Pleroma.Config.get([:assets, :default_mascot]) | default_mascot = Pleroma.Config.get([:assets, :default_mascot]) | ||||
@@ -1609,6 +1716,31 @@ defmodule Pleroma.User do | |||||
|> update_and_set_cache() | |> update_and_set_cache() | ||||
end | end | ||||
# Internal function; public one is `deactivate/2` | |||||
defp set_activation_status(user, deactivated) do | |||||
user | |||||
|> cast(%{deactivated: deactivated}, [:deactivated]) | |||||
|> update_and_set_cache() | |||||
end | |||||
def update_banner(user, banner) do | |||||
user | |||||
|> cast(%{banner: banner}, [:banner]) | |||||
|> update_and_set_cache() | |||||
end | |||||
def update_background(user, background) do | |||||
user | |||||
|> cast(%{background: background}, [:background]) | |||||
|> 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 | |||||
@doc """ | @doc """ | ||||
Changes `user.info` and returns the user changeset. | Changes `user.info` and returns the user changeset. | ||||
@@ -1630,4 +1762,160 @@ defmodule Pleroma.User do | |||||
|> change_info(fun) | |> change_info(fun) | ||||
|> update_and_set_cache() | |> update_and_set_cache() | ||||
end | end | ||||
def roles(%{is_moderator: is_moderator, is_admin: is_admin}) do | |||||
%{ | |||||
admin: is_admin, | |||||
moderator: is_moderator | |||||
} | |||||
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) | |||||
changeset | |||||
|> validate_length(:fields, max: limit) | |||||
|> validate_change(:fields, fn :fields, fields -> | |||||
if Enum.all?(fields, &valid_field?/1) do | |||||
[] | |||||
else | |||||
[fields: "invalid"] | |||||
end | |||||
end) | |||||
end | |||||
defp valid_field?(%{"name" => name, "value" => value}) do | |||||
name_limit = Pleroma.Config.get([:instance, :account_field_name_length], 255) | |||||
value_limit = Pleroma.Config.get([:instance, :account_field_value_length], 255) | |||||
is_binary(name) && is_binary(value) && String.length(name) <= name_limit && | |||||
String.length(value) <= value_limit | |||||
end | |||||
defp valid_field?(_), do: false | |||||
defp truncate_field(%{"name" => name, "value" => value}) do | |||||
{name, _chopped} = | |||||
String.split_at(name, Pleroma.Config.get([:instance, :account_field_name_length], 255)) | |||||
{value, _chopped} = | |||||
String.split_at(value, Pleroma.Config.get([:instance, :account_field_value_length], 255)) | |||||
%{"name" => name, "value" => value} | |||||
end | |||||
def admin_api_update(user, params) do | |||||
user | |||||
|> cast(params, [ | |||||
:is_moderator, | |||||
:is_admin, | |||||
:show_role | |||||
]) | |||||
|> update_and_set_cache() | |||||
end | |||||
def mascot_update(user, url) do | |||||
user | |||||
|> cast(%{mascot: url}, [:mascot]) | |||||
|> validate_required([:mascot]) | |||||
|> update_and_set_cache() | |||||
end | |||||
def mastodon_settings_update(user, settings) do | |||||
user | |||||
|> cast(%{settings: settings}, [:settings]) | |||||
|> validate_required([:settings]) | |||||
|> update_and_set_cache() | |||||
end | |||||
@spec confirmation_changeset(User.t(), keyword()) :: Changeset.t() | |||||
def confirmation_changeset(user, need_confirmation: need_confirmation?) do | |||||
params = | |||||
if need_confirmation? do | |||||
%{ | |||||
confirmation_pending: true, | |||||
confirmation_token: :crypto.strong_rand_bytes(32) |> Base.url_encode64() | |||||
} | |||||
else | |||||
%{ | |||||
confirmation_pending: false, | |||||
confirmation_token: nil | |||||
} | |||||
end | |||||
cast(user, params, [:confirmation_pending, :confirmation_token]) | |||||
end | |||||
def add_pinnned_activity(user, %Pleroma.Activity{id: id}) do | |||||
if id not in user.pinned_activities do | |||||
max_pinned_statuses = Pleroma.Config.get([:instance, :max_pinned_statuses], 0) | |||||
params = %{pinned_activities: user.pinned_activities ++ [id]} | |||||
user | |||||
|> cast(params, [:pinned_activities]) | |||||
|> validate_length(:pinned_activities, | |||||
max: max_pinned_statuses, | |||||
message: "You have already pinned the maximum number of statuses" | |||||
) | |||||
else | |||||
change(user) | |||||
end | |||||
|> update_and_set_cache() | |||||
end | |||||
def remove_pinnned_activity(user, %Pleroma.Activity{id: id}) do | |||||
params = %{pinned_activities: List.delete(user.pinned_activities, id)} | |||||
user | |||||
|> cast(params, [:pinned_activities]) | |||||
|> update_and_set_cache() | |||||
end | |||||
def update_email_notifications(user, settings) do | |||||
email_notifications = | |||||
user.email_notifications | |||||
|> Map.merge(settings) | |||||
|> Map.take(["digest"]) | |||||
params = %{email_notifications: email_notifications} | |||||
fields = [:email_notifications] | |||||
user | |||||
|> cast(params, fields) | |||||
|> validate_required(fields) | |||||
|> update_and_set_cache() | |||||
end | |||||
defp set_subscribers(user, subscribers) do | |||||
params = %{subscribers: subscribers} | |||||
user | |||||
|> cast(params, [:subscribers]) | |||||
|> validate_required([:subscribers]) | |||||
|> update_and_set_cache() | |||||
end | |||||
def add_to_subscribers(user, subscribed) do | |||||
set_subscribers(user, Enum.uniq([subscribed | user.subscribers])) | |||||
end | |||||
def remove_from_subscribers(user, subscribed) do | |||||
set_subscribers(user, List.delete(user.subscribers, subscribed)) | |||||
end | |||||
end | end |
@@ -11,62 +11,11 @@ defmodule Pleroma.User.Info do | |||||
@type t :: %__MODULE__{} | @type t :: %__MODULE__{} | ||||
embedded_schema do | embedded_schema do | ||||
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) | |||||
# Should be filled in only for remote users | |||||
field(:following_count, :integer, default: nil) | |||||
field(:locked, :boolean, default: false) | |||||
field(:confirmation_pending, :boolean, default: false) | |||||
field(:password_reset_pending, :boolean, default: false) | |||||
field(:confirmation_token, :string, default: nil) | |||||
field(:default_scope, :string, default: "public") | |||||
field(:blocks, {:array, :string}, default: []) | field(:blocks, {:array, :string}, default: []) | ||||
field(:domain_blocks, {:array, :string}, default: []) | field(:domain_blocks, {:array, :string}, default: []) | ||||
field(:mutes, {:array, :string}, default: []) | field(:mutes, {:array, :string}, default: []) | ||||
field(:muted_reblogs, {:array, :string}, default: []) | field(:muted_reblogs, {:array, :string}, default: []) | ||||
field(:muted_notifications, {:array, :string}, default: []) | field(:muted_notifications, {:array, :string}, default: []) | ||||
field(:subscribers, {: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(:show_role, :boolean, default: true) | |||||
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) | |||||
field(:salmon, :string, default: nil) | |||||
field(:hide_followers_count, :boolean, default: false) | |||||
field(:hide_follows_count, :boolean, default: false) | |||||
field(:hide_followers, :boolean, default: false) | |||||
field(:hide_follows, :boolean, default: false) | |||||
field(:hide_favorites, :boolean, default: true) | |||||
field(:unread_conversation_count, :integer, default: 0) | |||||
field(:pinned_activities, {:array, :string}, default: []) | |||||
field(:email_notifications, :map, default: %{"digest" => false}) | |||||
field(:mascot, :map, default: nil) | |||||
field(:emoji, {:array, :map}, default: []) | |||||
field(:pleroma_settings_store, :map, default: %{}) | |||||
field(:fields, {:array, :map}, default: nil) | |||||
field(:raw_fields, {:array, :map}, default: []) | |||||
field(:discoverable, :boolean, default: false) | |||||
field(:notification_settings, :map, | |||||
default: %{ | |||||
"followers" => true, | |||||
"follows" => true, | |||||
"non_follows" => true, | |||||
"non_followers" => true | |||||
} | |||||
) | |||||
field(:skip_thread_containment, :boolean, default: false) | |||||
# Found in the wild | # Found in the wild | ||||
# ap_id -> Where is this used? | # ap_id -> Where is this used? | ||||
@@ -77,84 +26,6 @@ defmodule Pleroma.User.Info do | |||||
# subject _> Where is this used? | # subject _> Where is this used? | ||||
end | end | ||||
def set_activation_status(info, deactivated) do | |||||
params = %{deactivated: deactivated} | |||||
info | |||||
|> cast(params, [:deactivated]) | |||||
|> validate_required([:deactivated]) | |||||
end | |||||
def set_password_reset_pending(info, pending) do | |||||
params = %{password_reset_pending: pending} | |||||
info | |||||
|> cast(params, [:password_reset_pending]) | |||||
|> validate_required([:password_reset_pending]) | |||||
end | |||||
def update_notification_settings(info, settings) do | |||||
settings = | |||||
settings | |||||
|> Enum.map(fn {k, v} -> {k, v in [true, "true", "True", "1"]} end) | |||||
|> Map.new() | |||||
notification_settings = | |||||
info.notification_settings | |||||
|> Map.merge(settings) | |||||
|> Map.take(["followers", "follows", "non_follows", "non_followers"]) | |||||
params = %{notification_settings: notification_settings} | |||||
info | |||||
|> cast(params, [:notification_settings]) | |||||
|> validate_required([:notification_settings]) | |||||
end | |||||
@doc """ | |||||
Update email notifications in the given User.Info struct. | |||||
Examples: | |||||
iex> update_email_notifications(%Pleroma.User.Info{email_notifications: %{"digest" => false}}, %{"digest" => true}) | |||||
%Pleroma.User.Info{email_notifications: %{"digest" => true}} | |||||
""" | |||||
@spec update_email_notifications(t(), map()) :: Ecto.Changeset.t() | |||||
def update_email_notifications(info, settings) do | |||||
email_notifications = | |||||
info.email_notifications | |||||
|> Map.merge(settings) | |||||
|> Map.take(["digest"]) | |||||
params = %{email_notifications: email_notifications} | |||||
fields = [:email_notifications] | |||||
info | |||||
|> cast(params, fields) | |||||
|> validate_required(fields) | |||||
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_mutes(info, mutes) do | def set_mutes(info, mutes) do | ||||
params = %{mutes: mutes} | params = %{mutes: mutes} | ||||
@@ -181,14 +52,6 @@ defmodule Pleroma.User.Info do | |||||
|> validate_required([:blocks]) | |> validate_required([:blocks]) | ||||
end | end | ||||
def set_subscribers(info, subscribers) do | |||||
params = %{subscribers: subscribers} | |||||
info | |||||
|> cast(params, [:subscribers]) | |||||
|> validate_required([:subscribers]) | |||||
end | |||||
@spec add_to_mutes(Info.t(), String.t(), boolean()) :: Changeset.t() | @spec add_to_mutes(Info.t(), String.t(), boolean()) :: Changeset.t() | ||||
def add_to_mutes(info, muted, notifications?) do | def add_to_mutes(info, muted, notifications?) do | ||||
info | info | ||||
@@ -214,14 +77,6 @@ defmodule Pleroma.User.Info do | |||||
set_blocks(info, List.delete(info.blocks, blocked)) | set_blocks(info, List.delete(info.blocks, blocked)) | ||||
end | end | ||||
def add_to_subscribers(info, subscribed) do | |||||
set_subscribers(info, Enum.uniq([subscribed | info.subscribers])) | |||||
end | |||||
def remove_from_subscribers(info, subscribed) do | |||||
set_subscribers(info, List.delete(info.subscribers, subscribed)) | |||||
end | |||||
def set_domain_blocks(info, domain_blocks) do | def set_domain_blocks(info, domain_blocks) do | ||||
params = %{domain_blocks: domain_blocks} | params = %{domain_blocks: domain_blocks} | ||||
@@ -238,205 +93,6 @@ defmodule Pleroma.User.Info do | |||||
set_domain_blocks(info, List.delete(info.domain_blocks, domain_blocked)) | set_domain_blocks(info, List.delete(info.domain_blocks, domain_blocked)) | ||||
end | 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 | |||||
params = | |||||
if Map.has_key?(params, :fields) do | |||||
Map.put(params, :fields, Enum.map(params[:fields], &truncate_field/1)) | |||||
else | |||||
params | |||||
end | |||||
info | |||||
|> cast(params, [ | |||||
:ap_enabled, | |||||
:source_data, | |||||
:banner, | |||||
:locked, | |||||
:magic_key, | |||||
:uri, | |||||
:hub, | |||||
:topic, | |||||
:salmon, | |||||
:hide_followers, | |||||
:hide_follows, | |||||
:hide_followers_count, | |||||
:hide_follows_count, | |||||
:follower_count, | |||||
:fields, | |||||
:following_count, | |||||
:discoverable | |||||
]) | |||||
|> validate_fields(true) | |||||
end | |||||
def user_upgrade(info, params, remote? \\ false) do | |||||
info | |||||
|> cast(params, [ | |||||
:ap_enabled, | |||||
:source_data, | |||||
:banner, | |||||
:locked, | |||||
:magic_key, | |||||
:follower_count, | |||||
:following_count, | |||||
:hide_follows, | |||||
:fields, | |||||
:hide_followers, | |||||
:discoverable, | |||||
:hide_followers_count, | |||||
:hide_follows_count | |||||
]) | |||||
|> validate_fields(remote?) | |||||
end | |||||
def profile_update(info, params) do | |||||
info | |||||
|> cast(params, [ | |||||
:locked, | |||||
:no_rich_text, | |||||
:default_scope, | |||||
:banner, | |||||
:hide_follows, | |||||
:hide_followers, | |||||
:hide_followers_count, | |||||
:hide_follows_count, | |||||
:hide_favorites, | |||||
:background, | |||||
:show_role, | |||||
:skip_thread_containment, | |||||
:fields, | |||||
:raw_fields, | |||||
:pleroma_settings_store, | |||||
:discoverable | |||||
]) | |||||
|> validate_fields() | |||||
end | |||||
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) | |||||
changeset | |||||
|> validate_length(:fields, max: limit) | |||||
|> validate_change(:fields, fn :fields, fields -> | |||||
if Enum.all?(fields, &valid_field?/1) do | |||||
[] | |||||
else | |||||
[fields: "invalid"] | |||||
end | |||||
end) | |||||
end | |||||
defp valid_field?(%{"name" => name, "value" => value}) do | |||||
name_limit = Pleroma.Config.get([:instance, :account_field_name_length], 255) | |||||
value_limit = Pleroma.Config.get([:instance, :account_field_value_length], 255) | |||||
is_binary(name) && is_binary(value) && String.length(name) <= name_limit && | |||||
String.length(value) <= value_limit | |||||
end | |||||
defp valid_field?(_), do: false | |||||
defp truncate_field(%{"name" => name, "value" => value}) do | |||||
{name, _chopped} = | |||||
String.split_at(name, Pleroma.Config.get([:instance, :account_field_name_length], 255)) | |||||
{value, _chopped} = | |||||
String.split_at(value, Pleroma.Config.get([:instance, :account_field_value_length], 255)) | |||||
%{"name" => name, "value" => value} | |||||
end | |||||
@spec confirmation_changeset(Info.t(), keyword()) :: Changeset.t() | |||||
def confirmation_changeset(info, opts) do | |||||
need_confirmation? = Keyword.get(opts, :need_confirmation) | |||||
params = | |||||
if need_confirmation? do | |||||
%{ | |||||
confirmation_pending: true, | |||||
confirmation_token: :crypto.strong_rand_bytes(32) |> Base.url_encode64() | |||||
} | |||||
else | |||||
%{ | |||||
confirmation_pending: false, | |||||
confirmation_token: nil | |||||
} | |||||
end | |||||
cast(info, params, [:confirmation_pending, :confirmation_token]) | |||||
end | |||||
def mastodon_settings_update(info, settings) do | |||||
params = %{settings: settings} | |||||
info | |||||
|> cast(params, [:settings]) | |||||
|> validate_required([:settings]) | |||||
end | |||||
def mascot_update(info, url) do | |||||
params = %{mascot: url} | |||||
info | |||||
|> cast(params, [:mascot]) | |||||
|> validate_required([:mascot]) | |||||
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, | |||||
:show_role | |||||
]) | |||||
end | |||||
def add_pinnned_activity(info, %Pleroma.Activity{id: id}) do | |||||
if id not in info.pinned_activities do | |||||
max_pinned_statuses = Pleroma.Config.get([:instance, :max_pinned_statuses], 0) | |||||
params = %{pinned_activities: info.pinned_activities ++ [id]} | |||||
info | |||||
|> cast(params, [:pinned_activities]) | |||||
|> validate_length(:pinned_activities, | |||||
max: max_pinned_statuses, | |||||
message: "You have already pinned the maximum number of statuses" | |||||
) | |||||
else | |||||
change(info) | |||||
end | |||||
end | |||||
def remove_pinnned_activity(info, %Pleroma.Activity{id: id}) do | |||||
params = %{pinned_activities: List.delete(info.pinned_activities, id)} | |||||
cast(info, params, [:pinned_activities]) | |||||
end | |||||
def roles(%Info{is_moderator: is_moderator, is_admin: is_admin}) do | |||||
%{ | |||||
admin: is_admin, | |||||
moderator: is_moderator | |||||
} | |||||
end | |||||
def add_reblog_mute(info, ap_id) do | def add_reblog_mute(info, ap_id) do | ||||
params = %{muted_reblogs: info.muted_reblogs ++ [ap_id]} | params = %{muted_reblogs: info.muted_reblogs ++ [ap_id]} | ||||
@@ -448,31 +104,4 @@ defmodule Pleroma.User.Info do | |||||
cast(info, params, [:muted_reblogs]) | cast(info, params, [:muted_reblogs]) | ||||
end | 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 follow_information_update(info, params) do | |||||
info | |||||
|> cast(params, [ | |||||
:hide_followers, | |||||
:hide_follows, | |||||
:follower_count, | |||||
:following_count, | |||||
:hide_followers_count, | |||||
:hide_follows_count | |||||
]) | |||||
end | |||||
end | end |
@@ -56,7 +56,6 @@ defmodule Pleroma.User.Query do | |||||
@ilike_criteria [:nickname, :name, :query] | @ilike_criteria [:nickname, :name, :query] | ||||
@equal_criteria [:email] | @equal_criteria [:email] | ||||
@role_criteria [:is_admin, :is_moderator] | |||||
@contains_criteria [:ap_id, :nickname] | @contains_criteria [:ap_id, :nickname] | ||||
@spec build(criteria()) :: Query.t() | @spec build(criteria()) :: Query.t() | ||||
@@ -100,15 +99,19 @@ defmodule Pleroma.User.Query do | |||||
Enum.reduce(tags, query, &prepare_tag_criteria/2) | Enum.reduce(tags, query, &prepare_tag_criteria/2) | ||||
end | end | ||||
defp compose_query({key, _}, query) when key in @role_criteria do | |||||
where(query, [u], fragment("(?->? @> 'true')", u.info, ^to_string(key))) | |||||
defp compose_query({:is_admin, _}, query) do | |||||
where(query, [u], u.is_admin) | |||||
end | |||||
defp compose_query({:is_moderator, _}, query) do | |||||
where(query, [u], u.is_moderator) | |||||
end | end | ||||
defp compose_query({:super_users, _}, query) do | defp compose_query({:super_users, _}, query) do | ||||
where( | where( | ||||
query, | query, | ||||
[u], | [u], | ||||
fragment("?->'is_admin' @> 'true' OR ?->'is_moderator' @> 'true'", u.info, u.info) | |||||
u.is_admin or u.is_moderator | |||||
) | ) | ||||
end | end | ||||
@@ -117,7 +120,13 @@ defmodule Pleroma.User.Query do | |||||
defp compose_query({:external, _}, query), do: location_query(query, false) | defp compose_query({:external, _}, query), do: location_query(query, false) | ||||
defp compose_query({:active, _}, query) do | defp compose_query({:active, _}, query) do | ||||
where(query, [u], fragment("not (?->'deactivated' @> 'true')", u.info)) | |||||
User.restrict_deactivated(query) | |||||
|> where([u], not is_nil(u.nickname)) | |||||
end | |||||
defp compose_query({:legacy_active, _}, query) do | |||||
query | |||||
|> where([u], fragment("not (?->'deactivated' @> 'true')", u.info)) | |||||
|> where([u], not is_nil(u.nickname)) | |> where([u], not is_nil(u.nickname)) | ||||
end | end | ||||
@@ -126,7 +135,7 @@ defmodule Pleroma.User.Query do | |||||
end | end | ||||
defp compose_query({:deactivated, true}, query) do | defp compose_query({:deactivated, true}, query) do | ||||
where(query, [u], fragment("?->'deactivated' @> 'true'", u.info)) | |||||
where(query, [u], u.deactivated == ^true) | |||||
|> where([u], not is_nil(u.nickname)) | |> where([u], not is_nil(u.nickname)) | ||||
end | end | ||||
@@ -68,7 +68,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do | |||||
defp check_actor_is_active(actor) do | defp check_actor_is_active(actor) do | ||||
if not is_nil(actor) do | if not is_nil(actor) do | ||||
with user <- User.get_cached_by_ap_id(actor), | with user <- User.get_cached_by_ap_id(actor), | ||||
false <- user.info.deactivated do | |||||
false <- user.deactivated do | |||||
true | true | ||||
else | else | ||||
_e -> false | _e -> false | ||||
@@ -601,7 +601,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do | |||||
defp restrict_thread_visibility( | defp restrict_thread_visibility( | ||||
query, | query, | ||||
%{"user" => %User{info: %{skip_thread_containment: true}}}, | |||||
%{"user" => %User{skip_thread_containment: true}}, | |||||
_ | _ | ||||
), | ), | ||||
do: query | do: query | ||||
@@ -639,7 +639,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do | |||||
|> Map.put("user", reading_user) | |> Map.put("user", reading_user) | ||||
|> Map.put("actor_id", user.ap_id) | |> Map.put("actor_id", user.ap_id) | ||||
|> Map.put("whole_db", true) | |> Map.put("whole_db", true) | ||||
|> Map.put("pinned_activity_ids", user.info.pinned_activities) | |||||
|> Map.put("pinned_activity_ids", user.pinned_activities) | |||||
recipients = | recipients = | ||||
user_activities_recipients(%{ | user_activities_recipients(%{ | ||||
@@ -1049,14 +1049,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do | |||||
user_data = %{ | user_data = %{ | ||||
ap_id: data["id"], | ap_id: data["id"], | ||||
info: %{ | |||||
ap_enabled: true, | |||||
source_data: data, | |||||
banner: banner, | |||||
fields: fields, | |||||
locked: locked, | |||||
discoverable: discoverable | |||||
}, | |||||
banner: banner, | |||||
discoverable: discoverable, | |||||
source_data: data, | |||||
fields: fields, | |||||
locked: locked, | |||||
ap_enabled: true, | |||||
avatar: avatar, | avatar: avatar, | ||||
name: data["name"], | name: data["name"], | ||||
follower_address: data["followers"], | follower_address: data["followers"], | ||||
@@ -137,7 +137,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do | |||||
with %User{} = user <- User.get_cached_by_nickname(nickname), | with %User{} = user <- User.get_cached_by_nickname(nickname), | ||||
{user, for_user} <- ensure_user_keys_present_and_maybe_refresh_for_user(user, for_user), | {user, for_user} <- ensure_user_keys_present_and_maybe_refresh_for_user(user, for_user), | ||||
{:show_follows, true} <- | {:show_follows, true} <- | ||||
{:show_follows, (for_user && for_user == user) || !user.info.hide_follows} do | |||||
{:show_follows, (for_user && for_user == user) || !user.hide_follows} do | |||||
{page, _} = Integer.parse(page) | {page, _} = Integer.parse(page) | ||||
conn | conn | ||||
@@ -174,7 +174,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do | |||||
with %User{} = user <- User.get_cached_by_nickname(nickname), | with %User{} = user <- User.get_cached_by_nickname(nickname), | ||||
{user, for_user} <- ensure_user_keys_present_and_maybe_refresh_for_user(user, for_user), | {user, for_user} <- ensure_user_keys_present_and_maybe_refresh_for_user(user, for_user), | ||||
{:show_followers, true} <- | {:show_followers, true} <- | ||||
{:show_followers, (for_user && for_user == user) || !user.info.hide_followers} do | |||||
{:show_followers, (for_user && for_user == user) || !user.hide_followers} do | |||||
{page, _} = Integer.parse(page) | {page, _} = Integer.parse(page) | ||||
conn | conn | ||||
@@ -387,7 +387,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do | |||||
def handle_user_activity(user, %{"type" => "Delete"} = params) do | def handle_user_activity(user, %{"type" => "Delete"} = params) do | ||||
with %Object{} = object <- Object.normalize(params["object"]), | with %Object{} = object <- Object.normalize(params["object"]), | ||||
true <- user.info.is_moderator || user.ap_id == object.data["actor"], | |||||
true <- user.is_moderator || user.ap_id == object.data["actor"], | |||||
{:ok, delete} <- ActivityPub.delete(object) do | {:ok, delete} <- ActivityPub.delete(object) do | ||||
{:ok, delete} | {:ok, delete} | ||||
else | else | ||||
@@ -11,7 +11,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy do | |||||
# has the user successfully posted before? | # has the user successfully posted before? | ||||
defp old_user?(%User{} = u) do | defp old_user?(%User{} = u) do | ||||
u.info.note_count > 0 || u.info.follower_count > 0 | |||||
u.note_count > 0 || u.follower_count > 0 | |||||
end | end | ||||
# does the post contain links? | # does the post contain links? | ||||
@@ -140,7 +140,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do | |||||
|> Enum.map(& &1.ap_id) | |> Enum.map(& &1.ap_id) | ||||
end | end | ||||
defp maybe_use_sharedinbox(%User{info: %{source_data: data}}), | |||||
defp maybe_use_sharedinbox(%User{source_data: data}), | |||||
do: (is_map(data["endpoints"]) && Map.get(data["endpoints"], "sharedInbox")) || data["inbox"] | do: (is_map(data["endpoints"]) && Map.get(data["endpoints"], "sharedInbox")) || data["inbox"] | ||||
@doc """ | @doc """ | ||||
@@ -156,7 +156,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do | |||||
""" | """ | ||||
def determine_inbox( | def determine_inbox( | ||||
%Activity{data: activity_data}, | %Activity{data: activity_data}, | ||||
%User{info: %{source_data: data}} = user | |||||
%User{source_data: data} = user | |||||
) do | ) do | ||||
to = activity_data["to"] || [] | to = activity_data["to"] || [] | ||||
cc = activity_data["cc"] || [] | cc = activity_data["cc"] || [] | ||||
@@ -190,12 +190,12 @@ defmodule Pleroma.Web.ActivityPub.Publisher do | |||||
recipients | recipients | ||||
|> Enum.filter(&User.ap_enabled?/1) | |> Enum.filter(&User.ap_enabled?/1) | ||||
|> Enum.map(fn %{info: %{source_data: data}} -> data["inbox"] end) | |||||
|> Enum.map(fn %{source_data: data} -> data["inbox"] end) | |||||
|> Enum.filter(fn inbox -> should_federate?(inbox, public) end) | |> Enum.filter(fn inbox -> should_federate?(inbox, public) end) | ||||
|> Instances.filter_reachable() | |> Instances.filter_reachable() | ||||
|> Enum.each(fn {inbox, unreachable_since} -> | |> Enum.each(fn {inbox, unreachable_since} -> | ||||
%User{ap_id: ap_id} = | %User{ap_id: ap_id} = | ||||
Enum.find(recipients, fn %{info: %{source_data: data}} -> data["inbox"] == inbox end) | |||||
Enum.find(recipients, fn %{source_data: data} -> data["inbox"] == inbox end) | |||||
# Get all the recipients on the same host and add them to cc. Otherwise, a remote | # 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. | # instance would only accept a first message for the first recipient and ignore the rest. | ||||
@@ -600,9 +600,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do | |||||
with %User{ap_id: ^actor_id} = actor <- User.get_cached_by_ap_id(object["id"]) do | with %User{ap_id: ^actor_id} = actor <- User.get_cached_by_ap_id(object["id"]) do | ||||
{:ok, new_user_data} = ActivityPub.user_data_from_user_object(object) | {:ok, new_user_data} = ActivityPub.user_data_from_user_object(object) | ||||
banner = new_user_data[:info][:banner] | |||||
locked = new_user_data[:info][:locked] || false | |||||
attachment = get_in(new_user_data, [:info, :source_data, "attachment"]) || [] | |||||
locked = new_user_data[:locked] || false | |||||
attachment = get_in(new_user_data, [:source_data, "attachment"]) || [] | |||||
fields = | fields = | ||||
attachment | attachment | ||||
@@ -611,8 +610,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do | |||||
update_data = | update_data = | ||||
new_user_data | new_user_data | ||||
|> Map.take([:name, :bio, :avatar]) | |||||
|> Map.put(:info, %{banner: banner, locked: locked, fields: fields}) | |||||
|> Map.take([:avatar, :banner, :bio, :name]) | |||||
|> Map.put(:fields, fields) | |||||
|> Map.put(:locked, locked) | |||||
actor | actor | ||||
|> User.upgrade_changeset(update_data, true) | |> User.upgrade_changeset(update_data, true) | ||||
@@ -979,7 +979,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do | |||||
%{"type" => "Mention", "href" => ap_id, "name" => "@#{nickname}"} | %{"type" => "Mention", "href" => ap_id, "name" => "@#{nickname}"} | ||||
end | end | ||||
def take_emoji_tags(%User{info: %{emoji: emoji} = _user_info} = _user) do | |||||
def take_emoji_tags(%User{emoji: emoji}) do | |||||
emoji | emoji | ||||
|> Enum.flat_map(&Map.to_list/1) | |> Enum.flat_map(&Map.to_list/1) | ||||
|> Enum.map(&build_emoji_tag/1) | |> Enum.map(&build_emoji_tag/1) | ||||
@@ -78,8 +78,8 @@ defmodule Pleroma.Web.ActivityPub.UserView do | |||||
emoji_tags = Transmogrifier.take_emoji_tags(user) | emoji_tags = Transmogrifier.take_emoji_tags(user) | ||||
fields = | fields = | ||||
user.info | |||||
|> User.Info.fields() | |||||
user | |||||
|> User.fields() | |||||
|> Enum.map(fn %{"name" => name, "value" => value} -> | |> Enum.map(fn %{"name" => name, "value" => value} -> | ||||
%{ | %{ | ||||
"name" => Pleroma.HTML.strip_tags(name), | "name" => Pleroma.HTML.strip_tags(name), | ||||
@@ -99,7 +99,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do | |||||
"name" => user.name, | "name" => user.name, | ||||
"summary" => user.bio, | "summary" => user.bio, | ||||
"url" => user.ap_id, | "url" => user.ap_id, | ||||
"manuallyApprovesFollowers" => user.info.locked, | |||||
"manuallyApprovesFollowers" => user.locked, | |||||
"publicKey" => %{ | "publicKey" => %{ | ||||
"id" => "#{user.ap_id}#main-key", | "id" => "#{user.ap_id}#main-key", | ||||
"owner" => user.ap_id, | "owner" => user.ap_id, | ||||
@@ -107,8 +107,8 @@ defmodule Pleroma.Web.ActivityPub.UserView do | |||||
}, | }, | ||||
"endpoints" => endpoints, | "endpoints" => endpoints, | ||||
"attachment" => fields, | "attachment" => fields, | ||||
"tag" => (user.info.source_data["tag"] || []) ++ emoji_tags, | |||||
"discoverable" => user.info.discoverable | |||||
"tag" => (user.source_data["tag"] || []) ++ emoji_tags, | |||||
"discoverable" => user.discoverable | |||||
} | } | ||||
|> Map.merge(maybe_make_image(&User.avatar_url/2, "icon", user)) | |> Map.merge(maybe_make_image(&User.avatar_url/2, "icon", user)) | ||||
|> Map.merge(maybe_make_image(&User.banner_url/2, "image", user)) | |> Map.merge(maybe_make_image(&User.banner_url/2, "image", user)) | ||||
@@ -116,8 +116,8 @@ defmodule Pleroma.Web.ActivityPub.UserView do | |||||
end | end | ||||
def render("following.json", %{user: user, page: page} = opts) do | def render("following.json", %{user: user, page: page} = opts) do | ||||
showing_items = (opts[:for] && opts[:for] == user) || !user.info.hide_follows | |||||
showing_count = showing_items || !user.info.hide_follows_count | |||||
showing_items = (opts[:for] && opts[:for] == user) || !user.hide_follows | |||||
showing_count = showing_items || !user.hide_follows_count | |||||
query = User.get_friends_query(user) | query = User.get_friends_query(user) | ||||
query = from(user in query, select: [:ap_id]) | query = from(user in query, select: [:ap_id]) | ||||
@@ -135,8 +135,8 @@ defmodule Pleroma.Web.ActivityPub.UserView do | |||||
end | end | ||||
def render("following.json", %{user: user} = opts) do | def render("following.json", %{user: user} = opts) do | ||||
showing_items = (opts[:for] && opts[:for] == user) || !user.info.hide_follows | |||||
showing_count = showing_items || !user.info.hide_follows_count | |||||
showing_items = (opts[:for] && opts[:for] == user) || !user.hide_follows | |||||
showing_count = showing_items || !user.hide_follows_count | |||||
query = User.get_friends_query(user) | query = User.get_friends_query(user) | ||||
query = from(user in query, select: [:ap_id]) | query = from(user in query, select: [:ap_id]) | ||||
@@ -155,7 +155,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do | |||||
"totalItems" => total, | "totalItems" => total, | ||||
"first" => | "first" => | ||||
if showing_items do | if showing_items do | ||||
collection(following, "#{user.ap_id}/following", 1, !user.info.hide_follows) | |||||
collection(following, "#{user.ap_id}/following", 1, !user.hide_follows) | |||||
else | else | ||||
"#{user.ap_id}/following?page=1" | "#{user.ap_id}/following?page=1" | ||||
end | end | ||||
@@ -164,8 +164,8 @@ defmodule Pleroma.Web.ActivityPub.UserView do | |||||
end | end | ||||
def render("followers.json", %{user: user, page: page} = opts) do | def render("followers.json", %{user: user, page: page} = opts) do | ||||
showing_items = (opts[:for] && opts[:for] == user) || !user.info.hide_followers | |||||
showing_count = showing_items || !user.info.hide_followers_count | |||||
showing_items = (opts[:for] && opts[:for] == user) || !user.hide_followers | |||||
showing_count = showing_items || !user.hide_followers_count | |||||
query = User.get_followers_query(user) | query = User.get_followers_query(user) | ||||
query = from(user in query, select: [:ap_id]) | query = from(user in query, select: [:ap_id]) | ||||
@@ -183,8 +183,8 @@ defmodule Pleroma.Web.ActivityPub.UserView do | |||||
end | end | ||||
def render("followers.json", %{user: user} = opts) do | def render("followers.json", %{user: user} = opts) do | ||||
showing_items = (opts[:for] && opts[:for] == user) || !user.info.hide_followers | |||||
showing_count = showing_items || !user.info.hide_followers_count | |||||
showing_items = (opts[:for] && opts[:for] == user) || !user.hide_followers | |||||
showing_count = showing_items || !user.hide_followers_count | |||||
query = User.get_followers_query(user) | query = User.get_followers_query(user) | ||||
query = from(user in query, select: [:ap_id]) | query = from(user in query, select: [:ap_id]) | ||||
@@ -234,9 +234,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do | |||||
def user_toggle_activation(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname}) do | def user_toggle_activation(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname}) do | ||||
user = User.get_cached_by_nickname(nickname) | user = User.get_cached_by_nickname(nickname) | ||||
{:ok, updated_user} = User.deactivate(user, !user.info.deactivated) | |||||
{:ok, updated_user} = User.deactivate(user, !user.deactivated) | |||||
action = if user.info.deactivated, do: "activate", else: "deactivate" | |||||
action = if user.deactivated, do: "activate", else: "deactivate" | |||||
ModerationLog.insert_log(%{ | ModerationLog.insert_log(%{ | ||||
actor: admin, | actor: admin, | ||||
@@ -318,12 +318,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do | |||||
"nickname" => nickname | "nickname" => nickname | ||||
}) | }) | ||||
when permission_group in ["moderator", "admin"] do | when permission_group in ["moderator", "admin"] do | ||||
info = Map.put(%{}, "is_" <> permission_group, true) | |||||
fields = %{:"is_#{permission_group}" => true} | |||||
{:ok, user} = | {:ok, user} = | ||||
nickname | nickname | ||||
|> User.get_cached_by_nickname() | |> User.get_cached_by_nickname() | ||||
|> User.update_info(&User.Info.admin_api_update(&1, info)) | |||||
|> User.admin_api_update(fields) | |||||
ModerationLog.insert_log(%{ | ModerationLog.insert_log(%{ | ||||
action: "grant", | action: "grant", | ||||
@@ -332,7 +332,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do | |||||
permission: permission_group | permission: permission_group | ||||
}) | }) | ||||
json(conn, info) | |||||
json(conn, fields) | |||||
end | end | ||||
def right_add(conn, _) do | def right_add(conn, _) do | ||||
@@ -344,8 +344,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do | |||||
conn | conn | ||||
|> json(%{ | |> json(%{ | ||||
is_moderator: user.info.is_moderator, | |||||
is_admin: user.info.is_admin | |||||
is_moderator: user.is_moderator, | |||||
is_admin: user.is_admin | |||||
}) | }) | ||||
end | end | ||||
@@ -361,12 +361,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do | |||||
} | } | ||||
) | ) | ||||
when permission_group in ["moderator", "admin"] do | when permission_group in ["moderator", "admin"] do | ||||
info = Map.put(%{}, "is_" <> permission_group, false) | |||||
fields = %{:"is_#{permission_group}" => false} | |||||
{:ok, user} = | {:ok, user} = | ||||
nickname | nickname | ||||
|> User.get_cached_by_nickname() | |> User.get_cached_by_nickname() | ||||
|> User.update_info(&User.Info.admin_api_update(&1, info)) | |||||
|> User.admin_api_update(fields) | |||||
ModerationLog.insert_log(%{ | ModerationLog.insert_log(%{ | ||||
action: "revoke", | action: "revoke", | ||||
@@ -375,7 +375,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do | |||||
permission: permission_group | permission: permission_group | ||||
}) | }) | ||||
json(conn, info) | |||||
json(conn, fields) | |||||
end | end | ||||
def right_delete(conn, _) do | def right_delete(conn, _) do | ||||
@@ -389,7 +389,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do | |||||
with {:ok, status} <- Ecto.Type.cast(:boolean, status), | with {:ok, status} <- Ecto.Type.cast(:boolean, status), | ||||
%User{} = user <- User.get_cached_by_nickname(nickname), | %User{} = user <- User.get_cached_by_nickname(nickname), | ||||
{:ok, _} <- User.deactivate(user, !status) do | {:ok, _} <- User.deactivate(user, !status) do | ||||
action = if(user.info.deactivated, do: "activate", else: "deactivate") | |||||
action = if(user.deactivated, do: "activate", else: "deactivate") | |||||
ModerationLog.insert_log(%{ | ModerationLog.insert_log(%{ | ||||
actor: admin, | actor: admin, | ||||
@@ -7,7 +7,6 @@ defmodule Pleroma.Web.AdminAPI.AccountView do | |||||
alias Pleroma.HTML | alias Pleroma.HTML | ||||
alias Pleroma.User | alias Pleroma.User | ||||
alias Pleroma.User.Info | |||||
alias Pleroma.Web.AdminAPI.AccountView | alias Pleroma.Web.AdminAPI.AccountView | ||||
alias Pleroma.Web.MediaProxy | alias Pleroma.Web.MediaProxy | ||||
@@ -28,9 +27,9 @@ defmodule Pleroma.Web.AdminAPI.AccountView do | |||||
"avatar" => avatar, | "avatar" => avatar, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"display_name" => display_name, | "display_name" => display_name, | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"local" => user.local, | "local" => user.local, | ||||
"roles" => Info.roles(user.info), | |||||
"roles" => User.roles(user), | |||||
"tags" => user.tags || [] | "tags" => user.tags || [] | ||||
} | } | ||||
end | end | ||||
@@ -263,10 +263,10 @@ defmodule Pleroma.Web.CommonAPI do | |||||
# Updates the emojis for a user based on their profile | # Updates the emojis for a user based on their profile | ||||
def update(user) do | def update(user) do | ||||
emoji = emoji_from_profile(user) | emoji = emoji_from_profile(user) | ||||
source_data = user.info |> Map.get(:source_data, %{}) |> Map.put("tag", emoji) | |||||
source_data = Map.put(user.source_data, "tag", emoji) | |||||
user = | user = | ||||
case User.update_info(user, &User.Info.set_source_data(&1, source_data)) do | |||||
case User.update_source_data(user, source_data) do | |||||
{:ok, user} -> user | {:ok, user} -> user | ||||
_ -> user | _ -> user | ||||
end | end | ||||
@@ -287,20 +287,20 @@ defmodule Pleroma.Web.CommonAPI do | |||||
object: %Object{data: %{"type" => "Note"}} | object: %Object{data: %{"type" => "Note"}} | ||||
} = activity <- get_by_id_or_ap_id(id_or_ap_id), | } = activity <- get_by_id_or_ap_id(id_or_ap_id), | ||||
true <- Visibility.is_public?(activity), | true <- Visibility.is_public?(activity), | ||||
{:ok, _user} <- User.update_info(user, &User.Info.add_pinnned_activity(&1, activity)) do | |||||
{:ok, _user} <- User.add_pinnned_activity(user, activity) do | |||||
{:ok, activity} | {:ok, activity} | ||||
else | else | ||||
{:error, %{changes: %{info: %{errors: [pinned_activities: {err, _}]}}}} -> {:error, err} | |||||
{:error, %{errors: [pinned_activities: {err, _}]}} -> {:error, err} | |||||
_ -> {:error, dgettext("errors", "Could not pin")} | _ -> {:error, dgettext("errors", "Could not pin")} | ||||
end | end | ||||
end | end | ||||
def unpin(id_or_ap_id, user) do | def unpin(id_or_ap_id, user) do | ||||
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id), | with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id), | ||||
{:ok, _user} <- User.update_info(user, &User.Info.remove_pinnned_activity(&1, activity)) do | |||||
{:ok, _user} <- User.remove_pinnned_activity(user, activity) do | |||||
{:ok, activity} | {:ok, activity} | ||||
else | else | ||||
%{errors: [pinned_activities: {err, _}]} -> {:error, err} | |||||
{:error, %{errors: [pinned_activities: {err, _}]}} -> {:error, err} | |||||
_ -> {:error, dgettext("errors", "Could not unpin")} | _ -> {:error, dgettext("errors", "Could not unpin")} | ||||
end | end | ||||
end | end | ||||
@@ -36,7 +36,7 @@ defmodule Pleroma.Web.MastoFEController do | |||||
@doc "PUT /api/web/settings" | @doc "PUT /api/web/settings" | ||||
def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _params) do | def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _params) do | ||||
with {:ok, _} <- User.update_info(user, &User.Info.mastodon_settings_update(&1, settings)) do | |||||
with {:ok, _} <- User.mastodon_settings_update(user, settings) do | |||||
json(conn, %{}) | json(conn, %{}) | ||||
else | else | ||||
e -> | e -> | ||||
@@ -130,25 +130,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do | |||||
def update_credentials(%{assigns: %{user: original_user}} = conn, params) do | def update_credentials(%{assigns: %{user: original_user}} = conn, params) do | ||||
user = original_user | user = original_user | ||||
user_params = | |||||
%{} | |||||
|> add_if_present(params, "display_name", :name) | |||||
|> add_if_present(params, "note", :bio, fn value -> {:ok, User.parse_bio(value, user)} end) | |||||
|> add_if_present(params, "avatar", :avatar, fn value -> | |||||
with %Plug.Upload{} <- value, | |||||
{:ok, object} <- ActivityPub.upload(value, type: :avatar) do | |||||
{:ok, object.data} | |||||
end | |||||
end) | |||||
emojis_text = (user_params["display_name"] || "") <> (user_params["note"] || "") | |||||
user_info_emojis = | |||||
user.info | |||||
|> Map.get(:emoji, []) | |||||
|> Enum.concat(Emoji.Formatter.get_emoji_map(emojis_text)) | |||||
|> Enum.dedup() | |||||
params = | params = | ||||
if Map.has_key?(params, "fields_attributes") do | if Map.has_key?(params, "fields_attributes") do | ||||
Map.update!(params, "fields_attributes", fn fields -> | Map.update!(params, "fields_attributes", fn fields -> | ||||
@@ -160,7 +141,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do | |||||
params | params | ||||
end | end | ||||
info_params = | |||||
user_params = | |||||
[ | [ | ||||
:no_rich_text, | :no_rich_text, | ||||
:locked, | :locked, | ||||
@@ -176,15 +157,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do | |||||
|> Enum.reduce(%{}, fn key, acc -> | |> Enum.reduce(%{}, fn key, acc -> | ||||
add_if_present(acc, params, to_string(key), key, &{:ok, truthy_param?(&1)}) | add_if_present(acc, params, to_string(key), key, &{:ok, truthy_param?(&1)}) | ||||
end) | end) | ||||
|> add_if_present(params, "default_scope", :default_scope) | |||||
|> add_if_present(params, "fields_attributes", :fields, fn fields -> | |||||
fields = Enum.map(fields, fn f -> Map.update!(f, "value", &AutoLinker.link(&1)) end) | |||||
{:ok, fields} | |||||
end) | |||||
|> add_if_present(params, "fields_attributes", :raw_fields) | |||||
|> add_if_present(params, "pleroma_settings_store", :pleroma_settings_store, fn value -> | |||||
{:ok, Map.merge(user.info.pleroma_settings_store, value)} | |||||
|> add_if_present(params, "display_name", :name) | |||||
|> add_if_present(params, "note", :bio, fn value -> {:ok, User.parse_bio(value, user)} end) | |||||
|> add_if_present(params, "avatar", :avatar, fn value -> | |||||
with %Plug.Upload{} <- value, | |||||
{:ok, object} <- ActivityPub.upload(value, type: :avatar) do | |||||
{:ok, object.data} | |||||
end | |||||
end) | end) | ||||
|> add_if_present(params, "header", :banner, fn value -> | |> add_if_present(params, "header", :banner, fn value -> | ||||
with %Plug.Upload{} <- value, | with %Plug.Upload{} <- value, | ||||
@@ -198,12 +177,31 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do | |||||
{:ok, object.data} | {:ok, object.data} | ||||
end | end | ||||
end) | end) | ||||
|> Map.put(:emoji, user_info_emojis) | |||||
|> add_if_present(params, "fields_attributes", :fields, fn fields -> | |||||
fields = Enum.map(fields, fn f -> Map.update!(f, "value", &AutoLinker.link(&1)) end) | |||||
{:ok, fields} | |||||
end) | |||||
|> add_if_present(params, "fields_attributes", :raw_fields) | |||||
|> add_if_present(params, "pleroma_settings_store", :pleroma_settings_store, fn value -> | |||||
{:ok, Map.merge(user.pleroma_settings_store, value)} | |||||
end) | |||||
|> add_if_present(params, "default_scope", :default_scope) | |||||
emojis_text = (user_params["display_name"] || "") <> (user_params["note"] || "") | |||||
user_emojis = | |||||
user | |||||
|> Map.get(:emoji, []) | |||||
|> Enum.concat(Emoji.Formatter.get_emoji_map(emojis_text)) | |||||
|> Enum.dedup() | |||||
user_params = Map.put(user_params, :emoji, user_emojis) | |||||
changeset = | changeset = | ||||
user | user | ||||
|> User.update_changeset(user_params) | |> User.update_changeset(user_params) | ||||
|> User.change_info(&User.Info.profile_update(&1, info_params)) | |||||
|> User.change_info(& &1) | |||||
with {:ok, user} <- User.update_and_set_cache(changeset) do | with {:ok, user} <- User.update_and_set_cache(changeset) do | ||||
if original_user != user, do: CommonAPI.update(user) | if original_user != user, do: CommonAPI.update(user) | ||||
@@ -269,7 +267,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do | |||||
followers = | followers = | ||||
cond do | cond do | ||||
for_user && user.id == for_user.id -> MastodonAPI.get_followers(user, params) | for_user && user.id == for_user.id -> MastodonAPI.get_followers(user, params) | ||||
user.info.hide_followers -> [] | |||||
user.hide_followers -> [] | |||||
true -> MastodonAPI.get_followers(user, params) | true -> MastodonAPI.get_followers(user, params) | ||||
end | end | ||||
@@ -283,7 +281,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do | |||||
followers = | followers = | ||||
cond do | cond do | ||||
for_user && user.id == for_user.id -> MastodonAPI.get_friends(user, params) | for_user && user.id == for_user.id -> MastodonAPI.get_friends(user, params) | ||||
user.info.hide_follows -> [] | |||||
user.hide_follows -> [] | |||||
true -> MastodonAPI.get_friends(user, params) | true -> MastodonAPI.get_friends(user, params) | ||||
end | end | ||||
@@ -74,23 +74,23 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do | |||||
user_info = User.get_cached_user_info(user) | user_info = User.get_cached_user_info(user) | ||||
following_count = | following_count = | ||||
if !user.info.hide_follows_count or !user.info.hide_follows or opts[:for] == user do | |||||
if !user.hide_follows_count or !user.hide_follows or opts[:for] == user do | |||||
user_info.following_count | user_info.following_count | ||||
else | else | ||||
0 | 0 | ||||
end | end | ||||
followers_count = | followers_count = | ||||
if !user.info.hide_followers_count or !user.info.hide_followers or opts[:for] == user do | |||||
if !user.hide_followers_count or !user.hide_followers or opts[:for] == user do | |||||
user_info.follower_count | user_info.follower_count | ||||
else | else | ||||
0 | 0 | ||||
end | end | ||||
bot = (user.info.source_data["type"] || "Person") in ["Application", "Service"] | |||||
bot = (user.source_data["type"] || "Person") in ["Application", "Service"] | |||||
emojis = | emojis = | ||||
(user.info.source_data["tag"] || []) | |||||
(user.source_data["tag"] || []) | |||||
|> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) | |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) | ||||
|> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> | |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> | ||||
%{ | %{ | ||||
@@ -102,8 +102,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do | |||||
end) | end) | ||||
fields = | fields = | ||||
user.info | |||||
|> User.Info.fields() | |||||
user | |||||
|> User.fields() | |||||
|> Enum.map(fn %{"name" => name, "value" => value} -> | |> Enum.map(fn %{"name" => name, "value" => value} -> | ||||
%{ | %{ | ||||
"name" => Pleroma.HTML.strip_tags(name), | "name" => Pleroma.HTML.strip_tags(name), | ||||
@@ -111,23 +111,19 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do | |||||
} | } | ||||
end) | end) | ||||
raw_fields = Map.get(user.info, :raw_fields, []) | |||||
bio = HTML.filter_tags(user.bio, User.html_filter_policy(opts[:for])) | bio = HTML.filter_tags(user.bio, User.html_filter_policy(opts[:for])) | ||||
relationship = render("relationship.json", %{user: opts[:for], target: user}) | relationship = render("relationship.json", %{user: opts[:for], target: user}) | ||||
discoverable = user.info.discoverable | |||||
%{ | %{ | ||||
id: to_string(user.id), | id: to_string(user.id), | ||||
username: username_from_nickname(user.nickname), | username: username_from_nickname(user.nickname), | ||||
acct: user.nickname, | acct: user.nickname, | ||||
display_name: display_name, | display_name: display_name, | ||||
locked: user_info.locked, | |||||
locked: user.locked, | |||||
created_at: Utils.to_masto_date(user.inserted_at), | created_at: Utils.to_masto_date(user.inserted_at), | ||||
followers_count: followers_count, | followers_count: followers_count, | ||||
following_count: following_count, | following_count: following_count, | ||||
statuses_count: user_info.note_count, | |||||
statuses_count: user.note_count, | |||||
note: bio || "", | note: bio || "", | ||||
url: User.profile_url(user), | url: User.profile_url(user), | ||||
avatar: image, | avatar: image, | ||||
@@ -140,9 +136,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do | |||||
source: %{ | source: %{ | ||||
note: HTML.strip_tags((user.bio || "") |> String.replace("<br>", "\n")), | note: HTML.strip_tags((user.bio || "") |> String.replace("<br>", "\n")), | ||||
sensitive: false, | sensitive: false, | ||||
fields: raw_fields, | |||||
fields: user.raw_fields, | |||||
pleroma: %{ | pleroma: %{ | ||||
discoverable: discoverable | |||||
discoverable: user.discoverable | |||||
} | } | ||||
}, | }, | ||||
@@ -150,14 +146,14 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do | |||||
pleroma: %{ | pleroma: %{ | ||||
confirmation_pending: user_info.confirmation_pending, | confirmation_pending: user_info.confirmation_pending, | ||||
tags: user.tags, | tags: user.tags, | ||||
hide_followers_count: user.info.hide_followers_count, | |||||
hide_follows_count: user.info.hide_follows_count, | |||||
hide_followers: user.info.hide_followers, | |||||
hide_follows: user.info.hide_follows, | |||||
hide_favorites: user.info.hide_favorites, | |||||
hide_followers_count: user.hide_followers_count, | |||||
hide_follows_count: user.hide_follows_count, | |||||
hide_followers: user.hide_followers, | |||||
hide_follows: user.hide_follows, | |||||
hide_favorites: user.hide_favorites, | |||||
relationship: relationship, | relationship: relationship, | ||||
skip_thread_containment: user.info.skip_thread_containment, | |||||
background_image: image_url(user.info.background) |> MediaProxy.url() | |||||
skip_thread_containment: user.skip_thread_containment, | |||||
background_image: image_url(user.background) |> MediaProxy.url() | |||||
} | } | ||||
} | } | ||||
|> maybe_put_role(user, opts[:for]) | |> maybe_put_role(user, opts[:for]) | ||||
@@ -195,21 +191,21 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do | |||||
data, | data, | ||||
%User{id: user_id} = user, | %User{id: user_id} = user, | ||||
%User{id: user_id}, | %User{id: user_id}, | ||||
user_info | |||||
_user_info | |||||
) do | ) do | ||||
data | data | ||||
|> Kernel.put_in([:source, :privacy], user_info.default_scope) | |||||
|> Kernel.put_in([:source, :pleroma, :show_role], user.info.show_role) | |||||
|> Kernel.put_in([:source, :pleroma, :no_rich_text], user.info.no_rich_text) | |||||
|> Kernel.put_in([:source, :privacy], user.default_scope) | |||||
|> Kernel.put_in([:source, :pleroma, :show_role], user.show_role) | |||||
|> Kernel.put_in([:source, :pleroma, :no_rich_text], user.no_rich_text) | |||||
end | end | ||||
defp maybe_put_settings(data, _, _, _), do: data | defp maybe_put_settings(data, _, _, _), do: data | ||||
defp maybe_put_settings_store(data, %User{info: info, id: id}, %User{id: id}, %{ | |||||
defp maybe_put_settings_store(data, %User{} = user, %User{}, %{ | |||||
with_pleroma_settings: true | with_pleroma_settings: true | ||||
}) do | }) do | ||||
data | data | ||||
|> Kernel.put_in([:pleroma, :settings_store], info.pleroma_settings_store) | |||||
|> Kernel.put_in([:pleroma, :settings_store], user.pleroma_settings_store) | |||||
end | end | ||||
defp maybe_put_settings_store(data, _, _, _), do: data | defp maybe_put_settings_store(data, _, _, _), do: data | ||||
@@ -223,28 +219,28 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do | |||||
defp maybe_put_chat_token(data, _, _, _), do: data | defp maybe_put_chat_token(data, _, _, _), do: data | ||||
defp maybe_put_role(data, %User{info: %{show_role: true}} = user, _) do | |||||
defp maybe_put_role(data, %User{show_role: true} = user, _) do | |||||
data | data | ||||
|> Kernel.put_in([:pleroma, :is_admin], user.info.is_admin) | |||||
|> Kernel.put_in([:pleroma, :is_moderator], user.info.is_moderator) | |||||
|> Kernel.put_in([:pleroma, :is_admin], user.is_admin) | |||||
|> Kernel.put_in([:pleroma, :is_moderator], user.is_moderator) | |||||
end | end | ||||
defp maybe_put_role(data, %User{id: user_id} = user, %User{id: user_id}) do | defp maybe_put_role(data, %User{id: user_id} = user, %User{id: user_id}) do | ||||
data | data | ||||
|> Kernel.put_in([:pleroma, :is_admin], user.info.is_admin) | |||||
|> Kernel.put_in([:pleroma, :is_moderator], user.info.is_moderator) | |||||
|> Kernel.put_in([:pleroma, :is_admin], user.is_admin) | |||||
|> Kernel.put_in([:pleroma, :is_moderator], user.is_moderator) | |||||
end | end | ||||
defp maybe_put_role(data, _, _), do: data | defp maybe_put_role(data, _, _), do: data | ||||
defp maybe_put_notification_settings(data, %User{id: user_id} = user, %User{id: user_id}) do | defp maybe_put_notification_settings(data, %User{id: user_id} = user, %User{id: user_id}) do | ||||
Kernel.put_in(data, [:pleroma, :notification_settings], user.info.notification_settings) | |||||
Kernel.put_in(data, [:pleroma, :notification_settings], user.notification_settings) | |||||
end | end | ||||
defp maybe_put_notification_settings(data, _, _), do: data | defp maybe_put_notification_settings(data, _, _), do: data | ||||
defp maybe_put_activation_status(data, user, %User{info: %{is_admin: true}}) do | |||||
Kernel.put_in(data, [:pleroma, :deactivated], user.info.deactivated) | |||||
defp maybe_put_activation_status(data, user, %User{is_admin: true}) do | |||||
Kernel.put_in(data, [:pleroma, :deactivated], user.deactivated) | |||||
end | end | ||||
defp maybe_put_activation_status(data, _, _), do: data | defp maybe_put_activation_status(data, _, _), do: data | ||||
@@ -253,7 +249,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do | |||||
data | data | ||||
|> Kernel.put_in( | |> Kernel.put_in( | ||||
[:pleroma, :unread_conversation_count], | [:pleroma, :unread_conversation_count], | ||||
user.info.unread_conversation_count | |||||
user.unread_conversation_count | |||||
) | ) | ||||
end | end | ||||
@@ -498,6 +498,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do | |||||
defp present?(false), do: false | defp present?(false), do: false | ||||
defp present?(_), do: true | defp present?(_), do: true | ||||
defp pinned?(%Activity{id: id}, %User{info: %{pinned_activities: pinned_activities}}), | |||||
defp pinned?(%Activity{id: id}, %User{pinned_activities: pinned_activities}), | |||||
do: id in pinned_activities | do: id in pinned_activities | ||||
end | end |
@@ -202,9 +202,9 @@ defmodule Pleroma.Web.OAuth.OAuthController do | |||||
with {:ok, %User{} = user} <- Authenticator.get_user(conn), | with {:ok, %User{} = user} <- Authenticator.get_user(conn), | ||||
{:ok, app} <- Token.Utils.fetch_app(conn), | {:ok, app} <- Token.Utils.fetch_app(conn), | ||||
{:auth_active, true} <- {:auth_active, User.auth_active?(user)}, | {:auth_active, true} <- {:auth_active, User.auth_active?(user)}, | ||||
{:user_active, true} <- {:user_active, !user.info.deactivated}, | |||||
{:user_active, true} <- {:user_active, !user.deactivated}, | |||||
{:password_reset_pending, false} <- | {:password_reset_pending, false} <- | ||||
{:password_reset_pending, user.info.password_reset_pending}, | |||||
{:password_reset_pending, user.password_reset_pending}, | |||||
{:ok, scopes} <- validate_scopes(app, params), | {:ok, scopes} <- validate_scopes(app, params), | ||||
{:ok, auth} <- Authorization.create_authorization(app, user, scopes), | {:ok, auth} <- Authorization.create_authorization(app, user, scopes), | ||||
{:ok, token} <- Token.exchange_token(app, auth) do | {:ok, token} <- Token.exchange_token(app, auth) do | ||||
@@ -14,7 +14,7 @@ defmodule Pleroma.Web.OStatus.FollowHandler do | |||||
followed_uri when not is_nil(followed_uri) <- | followed_uri when not is_nil(followed_uri) <- | ||||
XML.string_from_xpath("/entry/activity:object/id", entry), | XML.string_from_xpath("/entry/activity:object/id", entry), | ||||
{:ok, followed} <- OStatus.find_or_make_user(followed_uri), | {:ok, followed} <- OStatus.find_or_make_user(followed_uri), | ||||
{:locked, false} <- {:locked, followed.info.locked}, | |||||
{:locked, false} <- {:locked, followed.locked}, | |||||
{:ok, activity} <- ActivityPub.follow(actor, followed, id, false) do | {:ok, activity} <- ActivityPub.follow(actor, followed, id, false) do | ||||
User.follow(actor, followed) | User.follow(actor, followed) | ||||
{:ok, activity} | {:ok, activity} | ||||
@@ -287,14 +287,19 @@ defmodule Pleroma.Web.OStatus do | |||||
end | end | ||||
defp build_user_data(info) do | defp build_user_data(info) do | ||||
%{ | |||||
info_fields = Enum.map(User.info_fields(), &to_string/1) | |||||
info | |||||
|> Map.take(info_fields) | |||||
|> Map.new(fn {k, v} -> {String.to_atom(k), v} end) | |||||
|> Map.merge(%{ | |||||
name: info["name"], | name: info["name"], | ||||
nickname: info["nickname"] <> "@" <> info["host"], | nickname: info["nickname"] <> "@" <> info["host"], | ||||
ap_id: info["uri"], | ap_id: info["uri"], | ||||
info: info, | info: info, | ||||
avatar: info["avatar"], | avatar: info["avatar"], | ||||
bio: info["bio"] | bio: info["bio"] | ||||
} | |||||
}) | |||||
end | end | ||||
# TODO: Just takes the first one for now. | # TODO: Just takes the first one for now. | ||||
@@ -80,9 +80,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do | |||||
@doc "PATCH /api/v1/pleroma/accounts/update_banner" | @doc "PATCH /api/v1/pleroma/accounts/update_banner" | ||||
def update_banner(%{assigns: %{user: user}} = conn, %{"banner" => ""}) do | def update_banner(%{assigns: %{user: user}} = conn, %{"banner" => ""}) do | ||||
new_info = %{"banner" => %{}} | |||||
with {:ok, user} <- User.update_info(user, &User.Info.profile_update(&1, new_info)) do | |||||
with {:ok, user} <- User.update_banner(user, %{}) do | |||||
CommonAPI.update(user) | CommonAPI.update(user) | ||||
json(conn, %{url: nil}) | json(conn, %{url: nil}) | ||||
end | end | ||||
@@ -90,8 +88,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do | |||||
def update_banner(%{assigns: %{user: user}} = conn, params) do | def update_banner(%{assigns: %{user: user}} = conn, params) do | ||||
with {:ok, object} <- ActivityPub.upload(%{"img" => params["banner"]}, type: :banner), | with {:ok, object} <- ActivityPub.upload(%{"img" => params["banner"]}, type: :banner), | ||||
new_info <- %{"banner" => object.data}, | |||||
{:ok, user} <- User.update_info(user, &User.Info.profile_update(&1, new_info)) do | |||||
{:ok, user} <- User.update_banner(user, object.data) do | |||||
CommonAPI.update(user) | CommonAPI.update(user) | ||||
%{"url" => [%{"href" => href} | _]} = object.data | %{"url" => [%{"href" => href} | _]} = object.data | ||||
@@ -101,17 +98,14 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do | |||||
@doc "PATCH /api/v1/pleroma/accounts/update_background" | @doc "PATCH /api/v1/pleroma/accounts/update_background" | ||||
def update_background(%{assigns: %{user: user}} = conn, %{"img" => ""}) do | def update_background(%{assigns: %{user: user}} = conn, %{"img" => ""}) do | ||||
new_info = %{"background" => %{}} | |||||
with {:ok, _user} <- User.update_info(user, &User.Info.profile_update(&1, new_info)) do | |||||
with {:ok, _user} <- User.update_background(user, %{}) do | |||||
json(conn, %{url: nil}) | json(conn, %{url: nil}) | ||||
end | end | ||||
end | end | ||||
def update_background(%{assigns: %{user: user}} = conn, params) do | def update_background(%{assigns: %{user: user}} = conn, params) do | ||||
with {:ok, object} <- ActivityPub.upload(params, type: :background), | with {:ok, object} <- ActivityPub.upload(params, type: :background), | ||||
new_info <- %{"background" => object.data}, | |||||
{:ok, _user} <- User.update_info(user, &User.Info.profile_update(&1, new_info)) do | |||||
{:ok, _user} <- User.update_background(user, object.data) do | |||||
%{"url" => [%{"href" => href} | _]} = object.data | %{"url" => [%{"href" => href} | _]} = object.data | ||||
json(conn, %{url: href}) | json(conn, %{url: href}) | ||||
@@ -119,7 +113,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do | |||||
end | end | ||||
@doc "GET /api/v1/pleroma/accounts/:id/favourites" | @doc "GET /api/v1/pleroma/accounts/:id/favourites" | ||||
def favourites(%{assigns: %{account: %{info: %{hide_favorites: true}}}} = conn, _params) do | |||||
def favourites(%{assigns: %{account: %{hide_favorites: true}}} = conn, _params) do | |||||
render_error(conn, :forbidden, "Can't get favorites") | render_error(conn, :forbidden, "Can't get favorites") | ||||
end | end | ||||
@@ -24,9 +24,7 @@ defmodule Pleroma.Web.PleromaAPI.MascotController do | |||||
with {:ok, object} <- ActivityPub.upload(file, actor: User.ap_id(user)), | with {:ok, object} <- ActivityPub.upload(file, actor: User.ap_id(user)), | ||||
# Reject if not an image | # Reject if not an image | ||||
%{type: "image"} = attachment <- render_attachment(object) do | %{type: "image"} = attachment <- render_attachment(object) do | ||||
# Sure! | |||||
# Save to the user's info | |||||
{:ok, _user} = User.update_info(user, &User.Info.mascot_update(&1, attachment)) | |||||
{:ok, _user} = User.mascot_update(user, attachment) | |||||
json(conn, attachment) | json(conn, attachment) | ||||
else | else | ||||
@@ -147,7 +147,7 @@ defmodule Pleroma.Web.Salmon do | |||||
end | end | ||||
@doc "Pushes an activity to remote account." | @doc "Pushes an activity to remote account." | ||||
def publish_one(%{recipient: %{info: %{salmon: salmon}}} = params), | |||||
def publish_one(%{recipient: %{salmon: salmon}} = params), | |||||
do: publish_one(Map.put(params, :recipient, salmon)) | do: publish_one(Map.put(params, :recipient, salmon)) | ||||
def publish_one(%{recipient: url, feed: feed} = params) when is_binary(url) do | def publish_one(%{recipient: url, feed: feed} = params) when is_binary(url) do | ||||
@@ -217,19 +217,19 @@ defmodule Pleroma.Web.Salmon do | |||||
remote_users = remote_users(user, activity) | remote_users = remote_users(user, activity) | ||||
salmon_urls = Enum.map(remote_users, & &1.info.salmon) | |||||
salmon_urls = Enum.map(remote_users, & &1.salmon) | |||||
reachable_urls_metadata = Instances.filter_reachable(salmon_urls) | reachable_urls_metadata = Instances.filter_reachable(salmon_urls) | ||||
reachable_urls = Map.keys(reachable_urls_metadata) | reachable_urls = Map.keys(reachable_urls_metadata) | ||||
remote_users | remote_users | ||||
|> Enum.filter(&(&1.info.salmon in reachable_urls)) | |||||
|> Enum.filter(&(&1.salmon in reachable_urls)) | |||||
|> Enum.each(fn remote_user -> | |> Enum.each(fn remote_user -> | ||||
Logger.debug(fn -> "Sending Salmon to #{remote_user.ap_id}" end) | Logger.debug(fn -> "Sending Salmon to #{remote_user.ap_id}" end) | ||||
Publisher.enqueue_one(__MODULE__, %{ | Publisher.enqueue_one(__MODULE__, %{ | ||||
recipient_id: remote_user.id, | recipient_id: remote_user.id, | ||||
feed: feed, | feed: feed, | ||||
unreachable_since: reachable_urls_metadata[remote_user.info.salmon] | |||||
unreachable_since: reachable_urls_metadata[remote_user.salmon] | |||||
}) | }) | ||||
end) | end) | ||||
end | end | ||||
@@ -212,7 +212,7 @@ defmodule Pleroma.Web.Streamer.Worker do | |||||
end | end | ||||
@spec thread_containment(Activity.t(), User.t()) :: boolean() | @spec thread_containment(Activity.t(), User.t()) :: boolean() | ||||
defp thread_containment(_activity, %User{info: %{skip_thread_containment: true}}), do: true | |||||
defp thread_containment(_activity, %User{skip_thread_containment: true}), do: true | |||||
defp thread_containment(activity, user) do | defp thread_containment(activity, user) do | ||||
if Config.get([:instance, :skip_thread_containment]) do | if Config.get([:instance, :skip_thread_containment]) do | ||||
@@ -20,11 +20,10 @@ defmodule Pleroma.Web.TwitterAPI.Controller do | |||||
action_fallback(:errors) | action_fallback(:errors) | ||||
def confirm_email(conn, %{"user_id" => uid, "token" => token}) do | def confirm_email(conn, %{"user_id" => uid, "token" => token}) do | ||||
new_info = [need_confirmation: false] | |||||
with %User{info: info} = user <- User.get_cached_by_id(uid), | |||||
true <- user.local and info.confirmation_pending and info.confirmation_token == token, | |||||
{:ok, _} <- User.update_info(user, &User.Info.confirmation_changeset(&1, new_info)) do | |||||
with %User{} = user <- User.get_cached_by_id(uid), | |||||
true <- user.local and user.confirmation_pending and user.confirmation_token == token, | |||||
{:ok, _} <- | |||||
User.update_and_set_cache(User.confirmation_changeset(user, need_confirmation: false)) do | |||||
redirect(conn, to: "/") | redirect(conn, to: "/") | ||||
end | end | ||||
end | end | ||||
@@ -61,12 +61,12 @@ defmodule Pleroma.Web.MastoFEView do | |||||
}, | }, | ||||
poll_limits: Config.get([:instance, :poll_limits]), | poll_limits: Config.get([:instance, :poll_limits]), | ||||
rights: %{ | rights: %{ | ||||
delete_others_notice: present?(user.info.is_moderator), | |||||
admin: present?(user.info.is_admin) | |||||
delete_others_notice: present?(user.is_moderator), | |||||
admin: present?(user.is_admin) | |||||
}, | }, | ||||
compose: %{ | compose: %{ | ||||
me: "#{user.id}", | me: "#{user.id}", | ||||
default_privacy: user.info.default_scope, | |||||
default_privacy: user.default_scope, | |||||
default_sensitive: false, | default_sensitive: false, | ||||
allow_content_types: Config.get([:instance, :allowed_post_formats]) | allow_content_types: Config.get([:instance, :allowed_post_formats]) | ||||
}, | }, | ||||
@@ -86,7 +86,7 @@ defmodule Pleroma.Web.MastoFEView do | |||||
"video\/mp4" | "video\/mp4" | ||||
] | ] | ||||
}, | }, | ||||
settings: user.info.settings || @default_settings, | |||||
settings: user.settings || @default_settings, | |||||
push_subscription: nil, | push_subscription: nil, | ||||
accounts: %{user.id => render(AccountView, "show.json", user: user, for: user)}, | accounts: %{user.id => render(AccountView, "show.json", user: user, for: user)}, | ||||
custom_emojis: render(CustomEmojiView, "index.json", custom_emojis: custom_emojis), | custom_emojis: render(CustomEmojiView, "index.json", custom_emojis: custom_emojis), | ||||
@@ -181,7 +181,7 @@ defmodule Pleroma.Web.Websub do | |||||
end | end | ||||
def subscribe(subscriber, subscribed, requester \\ &request_subscription/1) do | def subscribe(subscriber, subscribed, requester \\ &request_subscription/1) do | ||||
topic = subscribed.info.topic | |||||
topic = subscribed.topic | |||||
# FIXME: Race condition, use transactions | # FIXME: Race condition, use transactions | ||||
{:ok, subscription} = | {:ok, subscription} = | ||||
with subscription when not is_nil(subscription) <- | with subscription when not is_nil(subscription) <- | ||||
@@ -193,7 +193,7 @@ defmodule Pleroma.Web.Websub do | |||||
_e -> | _e -> | ||||
subscription = %WebsubClientSubscription{ | subscription = %WebsubClientSubscription{ | ||||
topic: topic, | topic: topic, | ||||
hub: subscribed.info.hub, | |||||
hub: subscribed.hub, | |||||
subscribers: [subscriber.ap_id], | subscribers: [subscriber.ap_id], | ||||
state: "requested", | state: "requested", | ||||
secret: :crypto.strong_rand_bytes(8) |> Base.url_encode64(), | secret: :crypto.strong_rand_bytes(8) |> Base.url_encode64(), | ||||
@@ -5,7 +5,11 @@ defmodule Pleroma.Repo.Migrations.AddFollowingAddressFromSourceData do | |||||
def change do | def change do | ||||
query = | query = | ||||
User.external_users_query() | |||||
User.Query.build(%{ | |||||
external: true, | |||||
legacy_active: true, | |||||
order_by: :id | |||||
}) | |||||
|> select([u], struct(u, [:id, :ap_id, :info])) | |> select([u], struct(u, [:id, :ap_id, :info])) | ||||
Pleroma.Repo.stream(query) | Pleroma.Repo.stream(query) | ||||
@@ -1,6 +1,5 @@ | |||||
defmodule Pleroma.Repo.Migrations.CopyMutedToMutedNotifications do | defmodule Pleroma.Repo.Migrations.CopyMutedToMutedNotifications do | ||||
use Ecto.Migration | use Ecto.Migration | ||||
alias Pleroma.User | |||||
def change do | def change do | ||||
execute( | execute( | ||||
@@ -0,0 +1,54 @@ | |||||
defmodule Pleroma.Repo.Migrations.CopyUsersInfoaddsToUsers do | |||||
use Ecto.Migration | |||||
def change do | |||||
alter table(:users) do | |||||
add(:banner, :map, default: %{}) | |||||
add(:background, :map, default: %{}) | |||||
add(:source_data, :map, default: %{}) | |||||
add(:note_count, :integer, default: 0) | |||||
add(:follower_count, :integer, default: 0) | |||||
# Should be filled in only for remote users | |||||
add(:following_count, :integer, default: nil) | |||||
add(:locked, :boolean, default: false) | |||||
add(:confirmation_pending, :boolean, default: false) | |||||
add(:password_reset_pending, :boolean, default: false) | |||||
add(:confirmation_token, :text, default: nil) | |||||
add(:default_scope, :string, default: "public") | |||||
add(:blocks, {:array, :text}, default: []) | |||||
add(:domain_blocks, {:array, :text}, default: []) | |||||
add(:mutes, {:array, :text}, default: []) | |||||
add(:muted_reblogs, {:array, :text}, default: []) | |||||
add(:muted_notifications, {:array, :text}, default: []) | |||||
add(:subscribers, {:array, :text}, default: []) | |||||
add(:deactivated, :boolean, default: false, null: false) | |||||
add(:no_rich_text, :boolean, default: false, null: false) | |||||
add(:ap_enabled, :boolean, default: false, null: false) | |||||
add(:is_moderator, :boolean, default: false, null: false) | |||||
add(:is_admin, :boolean, default: false, null: false) | |||||
add(:show_role, :boolean, default: true, null: false) | |||||
add(:settings, :map, default: nil) | |||||
add(:magic_key, :text, default: nil) | |||||
add(:uri, :text, default: nil) | |||||
add(:topic, :text, default: nil) | |||||
add(:hub, :text, default: nil) | |||||
add(:salmon, :text, default: nil) | |||||
add(:hide_followers_count, :boolean, default: false, null: false) | |||||
add(:hide_follows_count, :boolean, default: false, null: false) | |||||
add(:hide_followers, :boolean, default: false, null: false) | |||||
add(:hide_follows, :boolean, default: false, null: false) | |||||
add(:hide_favorites, :boolean, default: true, null: false) | |||||
add(:unread_conversation_count, :integer, default: 0) | |||||
add(:pinned_activities, {:array, :text}, default: []) | |||||
add(:email_notifications, :map, default: %{"digest" => false}) | |||||
add(:mascot, :map, default: nil) | |||||
add(:emoji, {:array, :map}, default: []) | |||||
add(:pleroma_settings_store, :map, default: %{}) | |||||
add(:fields, {:array, :map}, default: nil) | |||||
add(:raw_fields, {:array, :map}, default: []) | |||||
add(:discoverable, :boolean, default: false, null: false) | |||||
add(:notification_settings, :map, default: %{}) | |||||
add(:skip_thread_containment, :boolean, default: false, null: false) | |||||
end | |||||
end | |||||
end |
@@ -20,7 +20,7 @@ defmodule Pleroma.DigestEmailDaemonTest do | |||||
|> Timex.to_naive_datetime() | |> Timex.to_naive_datetime() | ||||
user2 = insert(:user, last_digest_emailed_at: date) | user2 = insert(:user, last_digest_emailed_at: date) | ||||
User.switch_email_notifications(user2, "digest", true) | |||||
{:ok, _} = User.switch_email_notifications(user2, "digest", true) | |||||
CommonAPI.post(user, %{"status" => "hey @#{user2.nickname}!"}) | CommonAPI.post(user, %{"status" => "hey @#{user2.nickname}!"}) | ||||
DigestEmailDaemon.perform() | DigestEmailDaemon.perform() | ||||
@@ -36,7 +36,7 @@ defmodule Pleroma.Emails.UserEmailTest do | |||||
test "build account confirmation email" do | test "build account confirmation email" do | ||||
config = Pleroma.Config.get(:instance) | config = Pleroma.Config.get(:instance) | ||||
user = insert(:user, info: %Pleroma.User.Info{confirmation_token: "conf-token"}) | |||||
user = insert(:user, confirmation_token: "conf-token") | |||||
email = UserEmail.account_confirmation_email(user) | email = UserEmail.account_confirmation_email(user) | ||||
assert email.from == {config[:name], config[:notify_email]} | assert email.from == {config[:name], config[:notify_email]} | ||||
assert email.to == [{user.name, user.email}] | assert email.to == [{user.name, user.email}] | ||||
@@ -125,10 +125,10 @@ defmodule Pleroma.FormatterTest do | |||||
gsimg = insert(:user, %{nickname: "gsimg"}) | gsimg = insert(:user, %{nickname: "gsimg"}) | ||||
archaeme = | archaeme = | ||||
insert(:user, %{ | |||||
insert(:user, | |||||
nickname: "archa_eme_", | nickname: "archa_eme_", | ||||
info: %User.Info{source_data: %{"url" => "https://archeme/@archa_eme_"}} | |||||
}) | |||||
source_data: %{"url" => "https://archeme/@archa_eme_"} | |||||
) | |||||
archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) | archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"}) | ||||
@@ -12,8 +12,8 @@ defmodule Pleroma.ModerationLogTest do | |||||
describe "user moderation" do | describe "user moderation" do | ||||
setup do | setup do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
moderator = insert(:user, info: %{is_moderator: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
moderator = insert(:user, is_moderator: true) | |||||
subject1 = insert(:user) | subject1 = insert(:user) | ||||
subject2 = insert(:user) | subject2 = insert(:user) | ||||
@@ -136,7 +136,7 @@ defmodule Pleroma.NotificationTest do | |||||
test "it disables notifications from followers" do | test "it disables notifications from followers" do | ||||
follower = insert(:user) | follower = insert(:user) | ||||
followed = insert(:user, info: %{notification_settings: %{"followers" => false}}) | |||||
followed = insert(:user, notification_settings: %{"followers" => false}) | |||||
User.follow(follower, followed) | User.follow(follower, followed) | ||||
{:ok, activity} = CommonAPI.post(follower, %{"status" => "hey @#{followed.nickname}"}) | {:ok, activity} = CommonAPI.post(follower, %{"status" => "hey @#{followed.nickname}"}) | ||||
refute Notification.create_notification(activity, followed) | refute Notification.create_notification(activity, followed) | ||||
@@ -144,13 +144,13 @@ defmodule Pleroma.NotificationTest do | |||||
test "it disables notifications from non-followers" do | test "it disables notifications from non-followers" do | ||||
follower = insert(:user) | follower = insert(:user) | ||||
followed = insert(:user, info: %{notification_settings: %{"non_followers" => false}}) | |||||
followed = insert(:user, notification_settings: %{"non_followers" => false}) | |||||
{:ok, activity} = CommonAPI.post(follower, %{"status" => "hey @#{followed.nickname}"}) | {:ok, activity} = CommonAPI.post(follower, %{"status" => "hey @#{followed.nickname}"}) | ||||
refute Notification.create_notification(activity, followed) | refute Notification.create_notification(activity, followed) | ||||
end | end | ||||
test "it disables notifications from people the user follows" do | test "it disables notifications from people the user follows" do | ||||
follower = insert(:user, info: %{notification_settings: %{"follows" => false}}) | |||||
follower = insert(:user, notification_settings: %{"follows" => false}) | |||||
followed = insert(:user) | followed = insert(:user) | ||||
User.follow(follower, followed) | User.follow(follower, followed) | ||||
follower = Repo.get(User, follower.id) | follower = Repo.get(User, follower.id) | ||||
@@ -159,7 +159,7 @@ defmodule Pleroma.NotificationTest do | |||||
end | end | ||||
test "it disables notifications from people the user does not follow" do | test "it disables notifications from people the user does not follow" do | ||||
follower = insert(:user, info: %{notification_settings: %{"non_follows" => false}}) | |||||
follower = insert(:user, notification_settings: %{"non_follows" => false}) | |||||
followed = insert(:user) | followed = insert(:user) | ||||
{:ok, activity} = CommonAPI.post(followed, %{"status" => "hey @#{follower.nickname}"}) | {:ok, activity} = CommonAPI.post(followed, %{"status" => "hey @#{follower.nickname}"}) | ||||
refute Notification.create_notification(activity, follower) | refute Notification.create_notification(activity, follower) | ||||
@@ -37,6 +37,6 @@ defmodule Pleroma.Plugs.AdminSecretAuthenticationPlugTest do | |||||
%{conn | params: %{"admin_token" => "password123"}} | %{conn | params: %{"admin_token" => "password123"}} | ||||
|> AdminSecretAuthenticationPlug.call(%{}) | |> AdminSecretAuthenticationPlug.call(%{}) | ||||
assert conn.assigns[:user].info.is_admin | |||||
assert conn.assigns[:user].is_admin | |||||
end | end | ||||
end | end |
@@ -17,7 +17,7 @@ defmodule Pleroma.Plugs.UserEnabledPlugTest do | |||||
end | end | ||||
test "with a user that is deactivated, it removes that user", %{conn: conn} do | test "with a user that is deactivated, it removes that user", %{conn: conn} do | ||||
user = insert(:user, info: %{deactivated: true}) | |||||
user = insert(:user, deactivated: true) | |||||
conn = | conn = | ||||
conn | conn | ||||
@@ -9,7 +9,7 @@ defmodule Pleroma.Plugs.UserIsAdminPlugTest do | |||||
import Pleroma.Factory | import Pleroma.Factory | ||||
test "accepts a user that is admin" do | test "accepts a user that is admin" do | ||||
user = insert(:user, info: %{is_admin: true}) | |||||
user = insert(:user, is_admin: true) | |||||
conn = | conn = | ||||
build_conn() | build_conn() | ||||
@@ -42,7 +42,7 @@ defmodule Pleroma.SignatureTest do | |||||
test "it returns key" do | test "it returns key" do | ||||
expected_result = {:ok, @rsa_public_key} | expected_result = {:ok, @rsa_public_key} | ||||
user = insert(:user, %{info: %{source_data: %{"publicKey" => @public_key}}}) | |||||
user = insert(:user, source_data: %{"publicKey" => @public_key}) | |||||
assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == expected_result | assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == expected_result | ||||
end | end | ||||
@@ -54,7 +54,7 @@ defmodule Pleroma.SignatureTest do | |||||
end | end | ||||
test "it returns error if public key is empty" do | test "it returns error if public key is empty" do | ||||
user = insert(:user, %{info: %{source_data: %{"publicKey" => %{}}}}) | |||||
user = insert(:user, source_data: %{"publicKey" => %{}}) | |||||
assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == {:error, :error} | assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == {:error, :error} | ||||
end | end | ||||
@@ -22,18 +22,18 @@ defmodule Mix.Tasks.Pleroma.CountStatusesTest do | |||||
user = refresh_record(user) | user = refresh_record(user) | ||||
user2 = refresh_record(user2) | user2 = refresh_record(user2) | ||||
assert %{info: %{note_count: 2}} = user | |||||
assert %{info: %{note_count: 1}} = user2 | |||||
assert %{note_count: 2} = user | |||||
assert %{note_count: 1} = user2 | |||||
{:ok, user} = User.update_info(user, &User.Info.set_note_count(&1, 0)) | |||||
{:ok, user2} = User.update_info(user2, &User.Info.set_note_count(&1, 0)) | |||||
{:ok, user} = User.update_note_count(user, 0) | |||||
{:ok, user2} = User.update_note_count(user2, 0) | |||||
assert %{info: %{note_count: 0}} = user | |||||
assert %{info: %{note_count: 0}} = user2 | |||||
assert %{note_count: 0} = user | |||||
assert %{note_count: 0} = user2 | |||||
assert capture_io(fn -> Mix.Tasks.Pleroma.CountStatuses.run([]) end) == "Done\n" | assert capture_io(fn -> Mix.Tasks.Pleroma.CountStatuses.run([]) end) == "Done\n" | ||||
assert %{info: %{note_count: 2}} = refresh_record(user) | |||||
assert %{info: %{note_count: 1}} = refresh_record(user2) | |||||
assert %{note_count: 2} = refresh_record(user) | |||||
assert %{note_count: 1} = refresh_record(user2) | |||||
end | end | ||||
end | end |
@@ -72,26 +72,25 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do | |||||
describe "running update_users_following_followers_counts" do | describe "running update_users_following_followers_counts" do | ||||
test "following and followers count are updated" do | test "following and followers count are updated" do | ||||
[user, user2] = insert_pair(:user) | [user, user2] = insert_pair(:user) | ||||
{:ok, %User{following: following, info: info} = user} = User.follow(user, user2) | |||||
{:ok, %User{following: following} = user} = User.follow(user, user2) | |||||
assert length(following) == 2 | assert length(following) == 2 | ||||
assert info.follower_count == 0 | |||||
assert user.follower_count == 0 | |||||
{:ok, user} = | {:ok, user} = | ||||
user | user | ||||
|> Ecto.Changeset.change(%{following: following ++ following}) | |||||
|> User.change_info(&Ecto.Changeset.change(&1, %{follower_count: 3})) | |||||
|> Ecto.Changeset.change(%{following: following ++ following, follower_count: 3}) | |||||
|> Repo.update() | |> Repo.update() | ||||
assert length(user.following) == 4 | assert length(user.following) == 4 | ||||
assert user.info.follower_count == 3 | |||||
assert user.follower_count == 3 | |||||
assert :ok == Mix.Tasks.Pleroma.Database.run(["update_users_following_followers_counts"]) | assert :ok == Mix.Tasks.Pleroma.Database.run(["update_users_following_followers_counts"]) | ||||
user = User.get_by_id(user.id) | user = User.get_by_id(user.id) | ||||
assert length(user.following) == 2 | assert length(user.following) == 2 | ||||
assert user.info.follower_count == 0 | |||||
assert user.follower_count == 0 | |||||
end | end | ||||
end | end | ||||
@@ -58,8 +58,8 @@ defmodule Mix.Tasks.Pleroma.UserTest do | |||||
assert user.name == unsaved.name | assert user.name == unsaved.name | ||||
assert user.email == unsaved.email | assert user.email == unsaved.email | ||||
assert user.bio == unsaved.bio | assert user.bio == unsaved.bio | ||||
assert user.info.is_moderator | |||||
assert user.info.is_admin | |||||
assert user.is_moderator | |||||
assert user.is_admin | |||||
end | end | ||||
test "user is not created" do | test "user is not created" do | ||||
@@ -113,11 +113,11 @@ defmodule Mix.Tasks.Pleroma.UserTest do | |||||
assert message =~ " deactivated" | assert message =~ " deactivated" | ||||
user = User.get_cached_by_nickname(user.nickname) | user = User.get_cached_by_nickname(user.nickname) | ||||
assert user.info.deactivated | |||||
assert user.deactivated | |||||
end | end | ||||
test "user is activated" do | test "user is activated" do | ||||
user = insert(:user, info: %{deactivated: true}) | |||||
user = insert(:user, deactivated: true) | |||||
Mix.Tasks.Pleroma.User.run(["toggle_activated", user.nickname]) | Mix.Tasks.Pleroma.User.run(["toggle_activated", user.nickname]) | ||||
@@ -125,7 +125,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do | |||||
assert message =~ " activated" | assert message =~ " activated" | ||||
user = User.get_cached_by_nickname(user.nickname) | user = User.get_cached_by_nickname(user.nickname) | ||||
refute user.info.deactivated | |||||
refute user.deactivated | |||||
end | end | ||||
test "no user to toggle" do | test "no user to toggle" do | ||||
@@ -155,7 +155,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do | |||||
user = User.get_cached_by_nickname(user.nickname) | user = User.get_cached_by_nickname(user.nickname) | ||||
assert Enum.empty?(user.following) | assert Enum.empty?(user.following) | ||||
assert user.info.deactivated | |||||
assert user.deactivated | |||||
end | end | ||||
test "no user to unsubscribe" do | test "no user to unsubscribe" do | ||||
@@ -182,13 +182,13 @@ defmodule Mix.Tasks.Pleroma.UserTest do | |||||
assert message =~ ~r/Admin status .* true/ | assert message =~ ~r/Admin status .* true/ | ||||
user = User.get_cached_by_nickname(user.nickname) | user = User.get_cached_by_nickname(user.nickname) | ||||
assert user.info.is_moderator | |||||
assert user.info.locked | |||||
assert user.info.is_admin | |||||
assert user.is_moderator | |||||
assert user.locked | |||||
assert user.is_admin | |||||
end | end | ||||
test "All statuses unset" do | test "All statuses unset" do | ||||
user = insert(:user, info: %{is_moderator: true, locked: true, is_admin: true}) | |||||
user = insert(:user, locked: true, is_moderator: true, is_admin: true) | |||||
Mix.Tasks.Pleroma.User.run([ | Mix.Tasks.Pleroma.User.run([ | ||||
"set", | "set", | ||||
@@ -208,9 +208,9 @@ defmodule Mix.Tasks.Pleroma.UserTest do | |||||
assert message =~ ~r/Admin status .* false/ | assert message =~ ~r/Admin status .* false/ | ||||
user = User.get_cached_by_nickname(user.nickname) | user = User.get_cached_by_nickname(user.nickname) | ||||
refute user.info.is_moderator | |||||
refute user.info.locked | |||||
refute user.info.is_admin | |||||
refute user.is_moderator | |||||
refute user.locked | |||||
refute user.is_admin | |||||
end | end | ||||
test "no user to set status" do | test "no user to set status" do | ||||
@@ -358,28 +358,28 @@ defmodule Mix.Tasks.Pleroma.UserTest do | |||||
describe "running toggle_confirmed" do | describe "running toggle_confirmed" do | ||||
test "user is confirmed" do | test "user is confirmed" do | ||||
%{id: id, nickname: nickname} = insert(:user, info: %{confirmation_pending: false}) | |||||
%{id: id, nickname: nickname} = insert(:user, confirmation_pending: false) | |||||
assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname]) | assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname]) | ||||
assert_received {:mix_shell, :info, [message]} | assert_received {:mix_shell, :info, [message]} | ||||
assert message == "#{nickname} needs confirmation." | assert message == "#{nickname} needs confirmation." | ||||
user = Repo.get(User, id) | user = Repo.get(User, id) | ||||
assert user.info.confirmation_pending | |||||
assert user.info.confirmation_token | |||||
assert user.confirmation_pending | |||||
assert user.confirmation_token | |||||
end | end | ||||
test "user is not confirmed" do | test "user is not confirmed" do | ||||
%{id: id, nickname: nickname} = | %{id: id, nickname: nickname} = | ||||
insert(:user, info: %{confirmation_pending: true, confirmation_token: "some token"}) | |||||
insert(:user, confirmation_pending: true, confirmation_token: "some token") | |||||
assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname]) | assert :ok = Mix.Tasks.Pleroma.User.run(["toggle_confirmed", nickname]) | ||||
assert_received {:mix_shell, :info, [message]} | assert_received {:mix_shell, :info, [message]} | ||||
assert message == "#{nickname} doesn't need confirmation." | assert message == "#{nickname} doesn't need confirmation." | ||||
user = Repo.get(User, id) | user = Repo.get(User, id) | ||||
refute user.info.confirmation_pending | |||||
refute user.info.confirmation_token | |||||
refute user.confirmation_pending | |||||
refute user.confirmation_token | |||||
end | end | ||||
test "it prints an error message when user is not exist" do | test "it prints an error message when user is not exist" do | ||||
@@ -1,24 +0,0 @@ | |||||
defmodule Pleroma.UserInfoTest do | |||||
alias Pleroma.Repo | |||||
alias Pleroma.User.Info | |||||
use Pleroma.DataCase | |||||
import Pleroma.Factory | |||||
describe "update_email_notifications/2" do | |||||
setup do | |||||
user = insert(:user, %{info: %{email_notifications: %{"digest" => true}}}) | |||||
{:ok, user: user} | |||||
end | |||||
test "Notifications are updated", %{user: user} do | |||||
true = user.info.email_notifications["digest"] | |||||
changeset = Info.update_email_notifications(user.info, %{"digest" => false}) | |||||
assert changeset.valid? | |||||
{:ok, result} = Ecto.Changeset.apply_action(changeset, :insert) | |||||
assert result.email_notifications["digest"] == false | |||||
end | |||||
end | |||||
end |
@@ -68,7 +68,7 @@ defmodule Pleroma.UserTest do | |||||
test "returns all pending follow requests" do | test "returns all pending follow requests" do | ||||
unlocked = insert(:user) | unlocked = insert(:user) | ||||
locked = insert(:user, %{info: %{locked: true}}) | |||||
locked = insert(:user, locked: true) | |||||
follower = insert(:user) | follower = insert(:user) | ||||
CommonAPI.follow(follower, unlocked) | CommonAPI.follow(follower, unlocked) | ||||
@@ -81,7 +81,7 @@ defmodule Pleroma.UserTest do | |||||
end | end | ||||
test "doesn't return already accepted or duplicate follow requests" do | test "doesn't return already accepted or duplicate follow requests" do | ||||
locked = insert(:user, %{info: %{locked: true}}) | |||||
locked = insert(:user, locked: true) | |||||
pending_follower = insert(:user) | pending_follower = insert(:user) | ||||
accepted_follower = insert(:user) | accepted_follower = insert(:user) | ||||
@@ -95,7 +95,7 @@ defmodule Pleroma.UserTest do | |||||
end | end | ||||
test "clears follow requests when requester is blocked" do | test "clears follow requests when requester is blocked" do | ||||
followed = insert(:user, %{info: %{locked: true}}) | |||||
followed = insert(:user, locked: true) | |||||
follower = insert(:user) | follower = insert(:user) | ||||
CommonAPI.follow(follower, followed) | CommonAPI.follow(follower, followed) | ||||
@@ -151,14 +151,14 @@ defmodule Pleroma.UserTest do | |||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
followed = User.get_cached_by_ap_id(followed.ap_id) | followed = User.get_cached_by_ap_id(followed.ap_id) | ||||
assert followed.info.follower_count == 1 | |||||
assert followed.follower_count == 1 | |||||
assert User.ap_followers(followed) in user.following | assert User.ap_followers(followed) in user.following | ||||
end | end | ||||
test "can't follow a deactivated users" do | test "can't follow a deactivated users" do | ||||
user = insert(:user) | user = insert(:user) | ||||
followed = insert(:user, info: %{deactivated: true}) | |||||
followed = insert(:user, %{deactivated: true}) | |||||
{:error, _} = User.follow(user, followed) | {:error, _} = User.follow(user, followed) | ||||
end | end | ||||
@@ -182,8 +182,8 @@ defmodule Pleroma.UserTest do | |||||
end | end | ||||
test "local users do not automatically follow local locked accounts" do | 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, locked: true) | |||||
followed = insert(:user, locked: true) | |||||
{:ok, follower} = User.maybe_direct_follow(follower, followed) | {:ok, follower} = User.maybe_direct_follow(follower, followed) | ||||
@@ -400,8 +400,8 @@ defmodule Pleroma.UserTest do | |||||
{:ok, user} = Repo.insert(changeset) | {:ok, user} = Repo.insert(changeset) | ||||
assert user.info.confirmation_pending | |||||
assert user.info.confirmation_token | |||||
assert user.confirmation_pending | |||||
assert user.confirmation_token | |||||
end | end | ||||
test "it creates confirmed user if :confirmed option is given" do | test "it creates confirmed user if :confirmed option is given" do | ||||
@@ -410,8 +410,8 @@ defmodule Pleroma.UserTest do | |||||
{:ok, user} = Repo.insert(changeset) | {:ok, user} = Repo.insert(changeset) | ||||
refute user.info.confirmation_pending | |||||
refute user.info.confirmation_token | |||||
refute user.confirmation_pending | |||||
refute user.confirmation_token | |||||
end | end | ||||
end | end | ||||
@@ -505,7 +505,8 @@ defmodule Pleroma.UserTest do | |||||
assert orig_user.last_refreshed_at == a_week_ago | assert orig_user.last_refreshed_at == a_week_ago | ||||
{:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin") | {:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin") | ||||
assert user.info.source_data["endpoints"] | |||||
assert user.source_data["endpoints"] | |||||
refute user.last_refreshed_at == orig_user.last_refreshed_at | refute user.last_refreshed_at == orig_user.last_refreshed_at | ||||
end | end | ||||
@@ -611,63 +612,63 @@ defmodule Pleroma.UserTest do | |||||
end | end | ||||
describe "updating note and follower count" do | describe "updating note and follower count" do | ||||
test "it sets the info->note_count property" do | |||||
test "it sets the note_count property" do | |||||
note = insert(:note) | note = insert(:note) | ||||
user = User.get_cached_by_ap_id(note.data["actor"]) | user = User.get_cached_by_ap_id(note.data["actor"]) | ||||
assert user.info.note_count == 0 | |||||
assert user.note_count == 0 | |||||
{:ok, user} = User.update_note_count(user) | {:ok, user} = User.update_note_count(user) | ||||
assert user.info.note_count == 1 | |||||
assert user.note_count == 1 | |||||
end | end | ||||
test "it increases the info->note_count property" do | |||||
test "it increases the note_count property" do | |||||
note = insert(:note) | note = insert(:note) | ||||
user = User.get_cached_by_ap_id(note.data["actor"]) | user = User.get_cached_by_ap_id(note.data["actor"]) | ||||
assert user.info.note_count == 0 | |||||
assert user.note_count == 0 | |||||
{:ok, user} = User.increase_note_count(user) | {:ok, user} = User.increase_note_count(user) | ||||
assert user.info.note_count == 1 | |||||
assert user.note_count == 1 | |||||
{:ok, user} = User.increase_note_count(user) | {:ok, user} = User.increase_note_count(user) | ||||
assert user.info.note_count == 2 | |||||
assert user.note_count == 2 | |||||
end | end | ||||
test "it decreases the info->note_count property" do | |||||
test "it decreases the note_count property" do | |||||
note = insert(:note) | note = insert(:note) | ||||
user = User.get_cached_by_ap_id(note.data["actor"]) | user = User.get_cached_by_ap_id(note.data["actor"]) | ||||
assert user.info.note_count == 0 | |||||
assert user.note_count == 0 | |||||
{:ok, user} = User.increase_note_count(user) | {:ok, user} = User.increase_note_count(user) | ||||
assert user.info.note_count == 1 | |||||
assert user.note_count == 1 | |||||
{:ok, user} = User.decrease_note_count(user) | {:ok, user} = User.decrease_note_count(user) | ||||
assert user.info.note_count == 0 | |||||
assert user.note_count == 0 | |||||
{:ok, user} = User.decrease_note_count(user) | {:ok, user} = User.decrease_note_count(user) | ||||
assert user.info.note_count == 0 | |||||
assert user.note_count == 0 | |||||
end | end | ||||
test "it sets the info->follower_count property" do | |||||
test "it sets the follower_count property" do | |||||
user = insert(:user) | user = insert(:user) | ||||
follower = insert(:user) | follower = insert(:user) | ||||
User.follow(follower, user) | User.follow(follower, user) | ||||
assert user.info.follower_count == 0 | |||||
assert user.follower_count == 0 | |||||
{:ok, user} = User.update_follower_count(user) | {:ok, user} = User.update_follower_count(user) | ||||
assert user.info.follower_count == 1 | |||||
assert user.follower_count == 1 | |||||
end | end | ||||
end | end | ||||
@@ -958,14 +959,14 @@ defmodule Pleroma.UserTest do | |||||
describe ".deactivate" do | describe ".deactivate" do | ||||
test "can de-activate then re-activate a user" do | test "can de-activate then re-activate a user" do | ||||
user = insert(:user) | user = insert(:user) | ||||
assert false == user.info.deactivated | |||||
assert false == user.deactivated | |||||
{:ok, user} = User.deactivate(user) | {:ok, user} = User.deactivate(user) | ||||
assert true == user.info.deactivated | |||||
assert true == user.deactivated | |||||
{:ok, user} = User.deactivate(user, false) | {:ok, user} = User.deactivate(user, false) | ||||
assert false == user.info.deactivated | |||||
assert false == user.deactivated | |||||
end | end | ||||
test "hide a user from followers " do | |||||
test "hide a user from followers" do | |||||
user = insert(:user) | user = insert(:user) | ||||
user2 = insert(:user) | user2 = insert(:user) | ||||
@@ -1041,7 +1042,7 @@ defmodule Pleroma.UserTest do | |||||
end | end | ||||
test "it deletes deactivated user" do | test "it deletes deactivated user" do | ||||
{:ok, user} = insert(:user, info: %{deactivated: true}) |> User.set_cache() | |||||
{:ok, user} = insert(:user, deactivated: true) |> User.set_cache() | |||||
{:ok, job} = User.delete(user) | {:ok, job} = User.delete(user) | ||||
{:ok, _user} = ObanHelpers.perform(job) | {:ok, _user} = ObanHelpers.perform(job) | ||||
@@ -1180,7 +1181,7 @@ defmodule Pleroma.UserTest do | |||||
end | end | ||||
test "html_filter_policy returns TwitterText scrubber when rich-text is disabled" do | test "html_filter_policy returns TwitterText scrubber when rich-text is disabled" do | ||||
user = insert(:user, %{info: %{no_rich_text: true}}) | |||||
user = insert(:user, no_rich_text: true) | |||||
assert Pleroma.HTML.Scrubber.TwitterText == User.html_filter_policy(user) | assert Pleroma.HTML.Scrubber.TwitterText == User.html_filter_policy(user) | ||||
end | end | ||||
@@ -1217,8 +1218,8 @@ defmodule Pleroma.UserTest do | |||||
test "auth_active?/1 works correctly" do | test "auth_active?/1 works correctly" do | ||||
Pleroma.Config.put([:instance, :account_activation_required], true) | Pleroma.Config.put([:instance, :account_activation_required], true) | ||||
local_user = insert(:user, local: true, info: %{confirmation_pending: true}) | |||||
confirmed_user = insert(:user, local: true, info: %{confirmation_pending: false}) | |||||
local_user = insert(:user, local: true, confirmation_pending: true) | |||||
confirmed_user = insert(:user, local: true, confirmation_pending: false) | |||||
remote_user = insert(:user, local: false) | remote_user = insert(:user, local: false) | ||||
refute User.auth_active?(local_user) | refute User.auth_active?(local_user) | ||||
@@ -1235,20 +1236,20 @@ defmodule Pleroma.UserTest do | |||||
test "returns false for remote users" do | test "returns false for remote users" do | ||||
user = insert(:user, local: false) | user = insert(:user, local: false) | ||||
remote_admin_user = insert(:user, local: false, info: %{is_admin: true}) | |||||
remote_admin_user = insert(:user, local: false, is_admin: true) | |||||
refute User.superuser?(user) | refute User.superuser?(user) | ||||
refute User.superuser?(remote_admin_user) | refute User.superuser?(remote_admin_user) | ||||
end | end | ||||
test "returns true for local moderators" do | test "returns true for local moderators" do | ||||
user = insert(:user, local: true, info: %{is_moderator: true}) | |||||
user = insert(:user, local: true, is_moderator: true) | |||||
assert User.superuser?(user) | assert User.superuser?(user) | ||||
end | end | ||||
test "returns true for local admins" do | test "returns true for local admins" do | ||||
user = insert(:user, local: true, info: %{is_admin: true}) | |||||
user = insert(:user, local: true, is_admin: true) | |||||
assert User.superuser?(user) | assert User.superuser?(user) | ||||
end | end | ||||
@@ -1264,14 +1265,14 @@ defmodule Pleroma.UserTest do | |||||
test "returns false when the account is unauthenticated and auth is required" do | test "returns false when the account is unauthenticated and auth is required" do | ||||
Pleroma.Config.put([:instance, :account_activation_required], true) | Pleroma.Config.put([:instance, :account_activation_required], true) | ||||
user = insert(:user, local: true, info: %{confirmation_pending: true}) | |||||
user = insert(:user, local: true, confirmation_pending: true) | |||||
other_user = insert(:user, local: true) | other_user = insert(:user, local: true) | ||||
refute User.visible_for?(user, other_user) | refute User.visible_for?(user, other_user) | ||||
end | end | ||||
test "returns true when the account is unauthenticated and auth is not required" do | test "returns true when the account is unauthenticated and auth is not required" do | ||||
user = insert(:user, local: true, info: %{confirmation_pending: true}) | |||||
user = insert(:user, local: true, confirmation_pending: true) | |||||
other_user = insert(:user, local: true) | other_user = insert(:user, local: true) | ||||
assert User.visible_for?(user, other_user) | assert User.visible_for?(user, other_user) | ||||
@@ -1280,8 +1281,8 @@ defmodule Pleroma.UserTest do | |||||
test "returns true when the account is unauthenticated and being viewed by a privileged account (auth required)" do | test "returns true when the account is unauthenticated and being viewed by a privileged account (auth required)" do | ||||
Pleroma.Config.put([:instance, :account_activation_required], true) | Pleroma.Config.put([:instance, :account_activation_required], true) | ||||
user = insert(:user, local: true, info: %{confirmation_pending: true}) | |||||
other_user = insert(:user, local: true, info: %{is_admin: true}) | |||||
user = insert(:user, local: true, confirmation_pending: true) | |||||
other_user = insert(:user, local: true, is_admin: true) | |||||
assert User.visible_for?(user, other_user) | assert User.visible_for?(user, other_user) | ||||
end | end | ||||
@@ -1347,7 +1348,7 @@ defmodule Pleroma.UserTest do | |||||
users = | users = | ||||
Enum.map(1..total, fn _ -> | Enum.map(1..total, fn _ -> | ||||
insert(:user, last_digest_emailed_at: days_ago(20), info: %{deactivated: false}) | |||||
insert(:user, last_digest_emailed_at: days_ago(20), deactivated: false) | |||||
end) | end) | ||||
inactive_users_ids = | inactive_users_ids = | ||||
@@ -1365,7 +1366,7 @@ defmodule Pleroma.UserTest do | |||||
users = | users = | ||||
Enum.map(1..total, fn _ -> | Enum.map(1..total, fn _ -> | ||||
insert(:user, last_digest_emailed_at: days_ago(20), info: %{deactivated: false}) | |||||
insert(:user, last_digest_emailed_at: days_ago(20), deactivated: false) | |||||
end) | end) | ||||
{inactive, active} = Enum.split(users, trunc(total / 2)) | {inactive, active} = Enum.split(users, trunc(total / 2)) | ||||
@@ -1398,7 +1399,7 @@ defmodule Pleroma.UserTest do | |||||
users = | users = | ||||
Enum.map(1..total, fn _ -> | Enum.map(1..total, fn _ -> | ||||
insert(:user, last_digest_emailed_at: days_ago(20), info: %{deactivated: false}) | |||||
insert(:user, last_digest_emailed_at: days_ago(20), deactivated: false) | |||||
end) | end) | ||||
[sender | recipients] = users | [sender | recipients] = users | ||||
@@ -1438,19 +1439,19 @@ defmodule Pleroma.UserTest do | |||||
describe "toggle_confirmation/1" do | describe "toggle_confirmation/1" do | ||||
test "if user is confirmed" do | test "if user is confirmed" do | ||||
user = insert(:user, info: %{confirmation_pending: false}) | |||||
user = insert(:user, confirmation_pending: false) | |||||
{:ok, user} = User.toggle_confirmation(user) | {:ok, user} = User.toggle_confirmation(user) | ||||
assert user.info.confirmation_pending | |||||
assert user.info.confirmation_token | |||||
assert user.confirmation_pending | |||||
assert user.confirmation_token | |||||
end | end | ||||
test "if user is unconfirmed" do | test "if user is unconfirmed" do | ||||
user = insert(:user, info: %{confirmation_pending: true, confirmation_token: "some token"}) | |||||
user = insert(:user, confirmation_pending: true, confirmation_token: "some token") | |||||
{:ok, user} = User.toggle_confirmation(user) | {:ok, user} = User.toggle_confirmation(user) | ||||
refute user.info.confirmation_pending | |||||
refute user.info.confirmation_token | |||||
refute user.confirmation_pending | |||||
refute user.confirmation_token | |||||
end | end | ||||
end | end | ||||
@@ -1486,7 +1487,7 @@ defmodule Pleroma.UserTest do | |||||
user1 = insert(:user, local: false, ap_id: "http://localhost:4001/users/masto_closed") | user1 = insert(:user, local: false, ap_id: "http://localhost:4001/users/masto_closed") | ||||
user2 = insert(:user, local: false, ap_id: "http://localhost:4001/users/fuser2") | user2 = insert(:user, local: false, ap_id: "http://localhost:4001/users/fuser2") | ||||
insert(:user, local: true) | insert(:user, local: true) | ||||
insert(:user, local: false, info: %{deactivated: true}) | |||||
insert(:user, local: false, deactivated: true) | |||||
{:ok, user1: user1, user2: user2} | {:ok, user1: user1, user2: user2} | ||||
end | end | ||||
@@ -1605,7 +1606,7 @@ defmodule Pleroma.UserTest do | |||||
local: false, | local: false, | ||||
follower_address: "http://localhost:4001/users/masto_closed/followers", | follower_address: "http://localhost:4001/users/masto_closed/followers", | ||||
following_address: "http://localhost:4001/users/masto_closed/following", | following_address: "http://localhost:4001/users/masto_closed/following", | ||||
info: %{ap_enabled: true} | |||||
ap_enabled: true | |||||
) | ) | ||||
assert User.user_info(other_user).following_count == 0 | assert User.user_info(other_user).following_count == 0 | ||||
@@ -1628,7 +1629,7 @@ defmodule Pleroma.UserTest do | |||||
local: false, | local: false, | ||||
follower_address: "http://localhost:4001/users/masto_closed/followers", | follower_address: "http://localhost:4001/users/masto_closed/followers", | ||||
following_address: "http://localhost:4001/users/masto_closed/following", | following_address: "http://localhost:4001/users/masto_closed/following", | ||||
info: %{ap_enabled: true} | |||||
ap_enabled: true | |||||
) | ) | ||||
assert User.user_info(other_user).following_count == 0 | assert User.user_info(other_user).following_count == 0 | ||||
@@ -1651,7 +1652,7 @@ defmodule Pleroma.UserTest do | |||||
local: false, | local: false, | ||||
follower_address: "http://localhost:4001/users/masto_closed/followers", | follower_address: "http://localhost:4001/users/masto_closed/followers", | ||||
following_address: "http://localhost:4001/users/masto_closed/following", | following_address: "http://localhost:4001/users/masto_closed/following", | ||||
info: %{ap_enabled: true} | |||||
ap_enabled: true | |||||
) | ) | ||||
assert User.user_info(other_user).following_count == 0 | assert User.user_info(other_user).following_count == 0 | ||||
@@ -1691,41 +1692,6 @@ defmodule Pleroma.UserTest do | |||||
end | end | ||||
end | end | ||||
describe "set_password_reset_pending/2" do | |||||
setup do | |||||
[user: insert(:user)] | |||||
end | |||||
test "sets password_reset_pending to true", %{user: user} do | |||||
%{password_reset_pending: password_reset_pending} = user.info | |||||
refute password_reset_pending | |||||
{:ok, %{info: %{password_reset_pending: password_reset_pending}}} = | |||||
User.force_password_reset(user) | |||||
assert password_reset_pending | |||||
end | |||||
end | |||||
test "change_info/2" do | |||||
user = insert(:user) | |||||
assert user.info.hide_follows == false | |||||
changeset = User.change_info(user, &User.Info.profile_update(&1, %{hide_follows: true})) | |||||
assert changeset.changes.info.changes.hide_follows == true | |||||
end | |||||
test "update_info/2" do | |||||
user = insert(:user) | |||||
assert user.info.hide_follows == false | |||||
assert {:ok, _} = User.update_info(user, &User.Info.profile_update(&1, %{hide_follows: true})) | |||||
assert %{info: %{hide_follows: true}} = Repo.get(User, user.id) | |||||
assert {:ok, %{info: %{hide_follows: true}}} = Cachex.get(:user_cache, "ap_id:#{user.ap_id}") | |||||
end | |||||
describe "get_cached_by_nickname_or_id" do | describe "get_cached_by_nickname_or_id" do | ||||
setup do | setup do | ||||
limit_to_local_content = Pleroma.Config.get([:instance, :limit_to_local_content]) | limit_to_local_content = Pleroma.Config.get([:instance, :limit_to_local_content]) | ||||
@@ -1782,4 +1748,18 @@ defmodule Pleroma.UserTest do | |||||
assert %User{} = User.get_cached_by_nickname_or_id(local_user.nickname) | assert %User{} = User.get_cached_by_nickname_or_id(local_user.nickname) | ||||
end | end | ||||
end | end | ||||
describe "update_email_notifications/2" do | |||||
setup do | |||||
user = insert(:user, email_notifications: %{"digest" => true}) | |||||
{:ok, user: user} | |||||
end | |||||
test "Notifications are updated", %{user: user} do | |||||
true = user.email_notifications["digest"] | |||||
assert {:ok, result} = User.update_email_notifications(user, %{"digest" => false}) | |||||
assert result.email_notifications["digest"] == false | |||||
end | |||||
end | |||||
end | end |
@@ -683,7 +683,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do | |||||
test "it returns returns a uri if the user has 'hide_followers' set", %{conn: conn} do | test "it returns returns a uri if the user has 'hide_followers' set", %{conn: conn} do | ||||
user = insert(:user) | user = insert(:user) | ||||
user_two = insert(:user, %{info: %{hide_followers: true}}) | |||||
user_two = insert(:user, hide_followers: true) | |||||
User.follow(user, user_two) | User.follow(user, user_two) | ||||
result = | result = | ||||
@@ -696,7 +696,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do | |||||
test "it returns a 403 error on pages, if the user has 'hide_followers' set and the request is not authenticated", | test "it returns a 403 error on pages, if the user has 'hide_followers' set and the request is not authenticated", | ||||
%{conn: conn} do | %{conn: conn} do | ||||
user = insert(:user, %{info: %{hide_followers: true}}) | |||||
user = insert(:user, hide_followers: true) | |||||
result = | result = | ||||
conn | conn | ||||
@@ -708,7 +708,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do | |||||
test "it renders the page, if the user has 'hide_followers' set and the request is authenticated with the same user", | test "it renders the page, if the user has 'hide_followers' set and the request is authenticated with the same user", | ||||
%{conn: conn} do | %{conn: conn} do | ||||
user = insert(:user, %{info: %{hide_followers: true}}) | |||||
user = insert(:user, hide_followers: true) | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | ||||
@@ -764,7 +764,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do | |||||
end | end | ||||
test "it returns a uri if the user has 'hide_follows' set", %{conn: conn} do | test "it returns a uri if the user has 'hide_follows' set", %{conn: conn} do | ||||
user = insert(:user, %{info: %{hide_follows: true}}) | |||||
user = insert(:user, hide_follows: true) | |||||
user_two = insert(:user) | user_two = insert(:user) | ||||
User.follow(user, user_two) | User.follow(user, user_two) | ||||
@@ -778,7 +778,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do | |||||
test "it returns a 403 error on pages, if the user has 'hide_follows' set and the request is not authenticated", | test "it returns a 403 error on pages, if the user has 'hide_follows' set and the request is not authenticated", | ||||
%{conn: conn} do | %{conn: conn} do | ||||
user = insert(:user, %{info: %{hide_follows: true}}) | |||||
user = insert(:user, hide_follows: true) | |||||
result = | result = | ||||
conn | conn | ||||
@@ -790,7 +790,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do | |||||
test "it renders the page, if the user has 'hide_follows' set and the request is authenticated with the same user", | test "it renders the page, if the user has 'hide_follows' set and the request is authenticated with the same user", | ||||
%{conn: conn} do | %{conn: conn} do | ||||
user = insert(:user, %{info: %{hide_follows: true}}) | |||||
user = insert(:user, hide_follows: true) | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, user, _other_user, _activity} = CommonAPI.follow(user, other_user) | {:ok, user, _other_user, _activity} = CommonAPI.follow(user, other_user) | ||||
@@ -93,8 +93,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do | |||||
{:ok, user} = ActivityPub.make_user_from_ap_id(user_id) | {:ok, user} = ActivityPub.make_user_from_ap_id(user_id) | ||||
assert user.ap_id == user_id | assert user.ap_id == user_id | ||||
assert user.nickname == "admin@mastodon.example.org" | assert user.nickname == "admin@mastodon.example.org" | ||||
assert user.info.source_data | |||||
assert user.info.ap_enabled | |||||
assert user.source_data | |||||
assert user.ap_enabled | |||||
assert user.follower_address == "http://mastodon.example.org/users/admin/followers" | assert user.follower_address == "http://mastodon.example.org/users/admin/followers" | ||||
end | end | ||||
@@ -279,7 +279,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do | |||||
assert activity.actor == user.ap_id | assert activity.actor == user.ap_id | ||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
assert user.info.note_count == 0 | |||||
assert user.note_count == 0 | |||||
end | end | ||||
test "can be fetched into a timeline" do | test "can be fetched into a timeline" do | ||||
@@ -342,7 +342,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do | |||||
}) | }) | ||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
assert user.info.note_count == 2 | |||||
assert user.note_count == 2 | |||||
end | end | ||||
test "increases replies count" do | test "increases replies count" do | ||||
@@ -1009,7 +1009,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do | |||||
end | end | ||||
test "decrements user note count only for public activities" do | test "decrements user note count only for public activities" do | ||||
user = insert(:user, info: %{note_count: 10}) | |||||
user = insert(:user, note_count: 10) | |||||
{:ok, a1} = | {:ok, a1} = | ||||
CommonAPI.post(User.get_cached_by_id(user.id), %{ | CommonAPI.post(User.get_cached_by_id(user.id), %{ | ||||
@@ -1041,7 +1041,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do | |||||
{:ok, _} = Object.normalize(a4) |> ActivityPub.delete() | {:ok, _} = Object.normalize(a4) |> ActivityPub.delete() | ||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
assert user.info.note_count == 10 | |||||
assert user.note_count == 10 | |||||
end | end | ||||
test "it creates a delete activity and checks that it is also sent to users mentioned by the deleted object" do | test "it creates a delete activity and checks that it is also sent to users mentioned by the deleted object" do | ||||
@@ -1305,9 +1305,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do | |||||
following_address: "http://localhost:4001/users/masto_closed/following" | following_address: "http://localhost:4001/users/masto_closed/following" | ||||
) | ) | ||||
{:ok, info} = ActivityPub.fetch_follow_information_for_user(user) | |||||
assert info.hide_followers == true | |||||
assert info.hide_follows == false | |||||
{:ok, follow_info} = ActivityPub.fetch_follow_information_for_user(user) | |||||
assert follow_info.hide_followers == true | |||||
assert follow_info.hide_follows == false | |||||
end | end | ||||
test "detects hidden follows" do | test "detects hidden follows" do | ||||
@@ -1328,9 +1328,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do | |||||
following_address: "http://localhost:4001/users/masto_closed/following" | following_address: "http://localhost:4001/users/masto_closed/following" | ||||
) | ) | ||||
{:ok, info} = ActivityPub.fetch_follow_information_for_user(user) | |||||
assert info.hide_followers == false | |||||
assert info.hide_follows == true | |||||
{:ok, follow_info} = ActivityPub.fetch_follow_information_for_user(user) | |||||
assert follow_info.hide_followers == false | |||||
assert follow_info.hide_follows == true | |||||
end | end | ||||
end | end | ||||
end | end |
@@ -35,7 +35,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do | |||||
test "it allows posts without links" do | test "it allows posts without links" do | ||||
user = insert(:user) | user = insert(:user) | ||||
assert user.info.note_count == 0 | |||||
assert user.note_count == 0 | |||||
message = | message = | ||||
@linkless_message | @linkless_message | ||||
@@ -47,7 +47,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do | |||||
test "it disallows posts with links" do | test "it disallows posts with links" do | ||||
user = insert(:user) | user = insert(:user) | ||||
assert user.info.note_count == 0 | |||||
assert user.note_count == 0 | |||||
message = | message = | ||||
@linkful_message | @linkful_message | ||||
@@ -59,9 +59,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do | |||||
describe "with old user" do | describe "with old user" do | ||||
test "it allows posts without links" do | test "it allows posts without links" do | ||||
user = insert(:user, info: %{note_count: 1}) | |||||
user = insert(:user, note_count: 1) | |||||
assert user.info.note_count == 1 | |||||
assert user.note_count == 1 | |||||
message = | message = | ||||
@linkless_message | @linkless_message | ||||
@@ -71,9 +71,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do | |||||
end | end | ||||
test "it allows posts with links" do | test "it allows posts with links" do | ||||
user = insert(:user, info: %{note_count: 1}) | |||||
user = insert(:user, note_count: 1) | |||||
assert user.info.note_count == 1 | |||||
assert user.note_count == 1 | |||||
message = | message = | ||||
@linkful_message | @linkful_message | ||||
@@ -85,9 +85,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do | |||||
describe "with followed new user" do | describe "with followed new user" do | ||||
test "it allows posts without links" do | test "it allows posts without links" do | ||||
user = insert(:user, info: %{follower_count: 1}) | |||||
user = insert(:user, follower_count: 1) | |||||
assert user.info.follower_count == 1 | |||||
assert user.follower_count == 1 | |||||
message = | message = | ||||
@linkless_message | @linkless_message | ||||
@@ -97,9 +97,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do | |||||
end | end | ||||
test "it allows posts with links" do | test "it allows posts with links" do | ||||
user = insert(:user, info: %{follower_count: 1}) | |||||
user = insert(:user, follower_count: 1) | |||||
assert user.info.follower_count == 1 | |||||
assert user.follower_count == 1 | |||||
message = | message = | ||||
@linkful_message | @linkful_message | ||||
@@ -133,7 +133,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do | |||||
describe "with contentless-objects" do | describe "with contentless-objects" do | ||||
test "it does not reject them or error out" do | test "it does not reject them or error out" do | ||||
user = insert(:user, info: %{note_count: 1}) | |||||
user = insert(:user, note_count: 1) | |||||
message = | message = | ||||
@response_message | @response_message | ||||
@@ -27,7 +27,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do | |||||
test "it returns sharedInbox for messages involving as:Public in to" do | test "it returns sharedInbox for messages involving as:Public in to" do | ||||
user = | user = | ||||
insert(:user, %{ | insert(:user, %{ | ||||
info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}} | |||||
source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} | |||||
}) | }) | ||||
activity = %Activity{ | activity = %Activity{ | ||||
@@ -40,7 +40,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do | |||||
test "it returns sharedInbox for messages involving as:Public in cc" do | test "it returns sharedInbox for messages involving as:Public in cc" do | ||||
user = | user = | ||||
insert(:user, %{ | insert(:user, %{ | ||||
info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}} | |||||
source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} | |||||
}) | }) | ||||
activity = %Activity{ | activity = %Activity{ | ||||
@@ -53,7 +53,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do | |||||
test "it returns sharedInbox for messages involving multiple recipients in to" do | test "it returns sharedInbox for messages involving multiple recipients in to" do | ||||
user = | user = | ||||
insert(:user, %{ | insert(:user, %{ | ||||
info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}} | |||||
source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} | |||||
}) | }) | ||||
user_two = insert(:user) | user_two = insert(:user) | ||||
@@ -69,7 +69,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do | |||||
test "it returns sharedInbox for messages involving multiple recipients in cc" do | test "it returns sharedInbox for messages involving multiple recipients in cc" do | ||||
user = | user = | ||||
insert(:user, %{ | insert(:user, %{ | ||||
info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}} | |||||
source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}} | |||||
}) | }) | ||||
user_two = insert(:user) | user_two = insert(:user) | ||||
@@ -84,14 +84,12 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do | |||||
test "it returns sharedInbox for messages involving multiple recipients in total" do | test "it returns sharedInbox for messages involving multiple recipients in total" do | ||||
user = | user = | ||||
insert(:user, %{ | |||||
info: %{ | |||||
source_data: %{ | |||||
"inbox" => "http://example.com/personal-inbox", | |||||
"endpoints" => %{"sharedInbox" => "http://example.com/inbox"} | |||||
} | |||||
insert(:user, | |||||
source_data: %{ | |||||
"inbox" => "http://example.com/personal-inbox", | |||||
"endpoints" => %{"sharedInbox" => "http://example.com/inbox"} | |||||
} | } | ||||
}) | |||||
) | |||||
user_two = insert(:user) | user_two = insert(:user) | ||||
@@ -104,14 +102,12 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do | |||||
test "it returns inbox for messages involving single recipients in total" do | test "it returns inbox for messages involving single recipients in total" do | ||||
user = | user = | ||||
insert(:user, %{ | |||||
info: %{ | |||||
source_data: %{ | |||||
"inbox" => "http://example.com/personal-inbox", | |||||
"endpoints" => %{"sharedInbox" => "http://example.com/inbox"} | |||||
} | |||||
insert(:user, | |||||
source_data: %{ | |||||
"inbox" => "http://example.com/personal-inbox", | |||||
"endpoints" => %{"sharedInbox" => "http://example.com/inbox"} | |||||
} | } | ||||
}) | |||||
) | |||||
activity = %Activity{ | activity = %Activity{ | ||||
data: %{"to" => [user.ap_id], "cc" => []} | data: %{"to" => [user.ap_id], "cc" => []} | ||||
@@ -241,10 +237,8 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do | |||||
follower = | follower = | ||||
insert(:user, | insert(:user, | ||||
local: false, | local: false, | ||||
info: %{ | |||||
ap_enabled: true, | |||||
source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"} | |||||
} | |||||
source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}, | |||||
ap_enabled: true | |||||
) | ) | ||||
actor = insert(:user, follower_address: follower.ap_id) | actor = insert(:user, follower_address: follower.ap_id) | ||||
@@ -278,19 +272,15 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do | |||||
fetcher = | fetcher = | ||||
insert(:user, | insert(:user, | ||||
local: false, | local: false, | ||||
info: %{ | |||||
ap_enabled: true, | |||||
source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"} | |||||
} | |||||
source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}, | |||||
ap_enabled: true | |||||
) | ) | ||||
another_fetcher = | another_fetcher = | ||||
insert(:user, | insert(:user, | ||||
local: false, | local: false, | ||||
info: %{ | |||||
ap_enabled: true, | |||||
source_data: %{"inbox" => "https://domain2.com/users/nick1/inbox"} | |||||
} | |||||
source_data: %{"inbox" => "https://domain2.com/users/nick1/inbox"}, | |||||
ap_enabled: true | |||||
) | ) | ||||
actor = insert(:user) | actor = insert(:user) | ||||
@@ -58,7 +58,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do | |||||
end | end | ||||
test "with locked accounts, it does not create a follow or an accept" do | test "with locked accounts, it does not create a follow or an accept" do | ||||
user = insert(:user, info: %{locked: true}) | |||||
user = insert(:user, locked: true) | |||||
data = | data = | ||||
File.read!("test/fixtures/mastodon-follow-activity.json") | File.read!("test/fixtures/mastodon-follow-activity.json") | ||||
@@ -148,7 +148,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
user = User.get_cached_by_ap_id(object_data["actor"]) | user = User.get_cached_by_ap_id(object_data["actor"]) | ||||
assert user.info.note_count == 1 | |||||
assert user.note_count == 1 | |||||
end | end | ||||
test "it works for incoming notices with hashtags" do | test "it works for incoming notices with hashtags" do | ||||
@@ -585,7 +585,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
} | } | ||||
] | ] | ||||
assert user.info.banner["url"] == [ | |||||
assert user.banner["url"] == [ | |||||
%{ | %{ | ||||
"href" => | "href" => | ||||
"https://cd.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png" | "https://cd.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png" | ||||
@@ -604,7 +604,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
user = User.get_cached_by_ap_id(activity.actor) | user = User.get_cached_by_ap_id(activity.actor) | ||||
assert User.Info.fields(user.info) == [ | |||||
assert User.fields(user) == [ | |||||
%{"name" => "foo", "value" => "bar"}, | %{"name" => "foo", "value" => "bar"}, | ||||
%{"name" => "foo1", "value" => "bar1"} | %{"name" => "foo1", "value" => "bar1"} | ||||
] | ] | ||||
@@ -625,7 +625,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
user = User.get_cached_by_ap_id(user.ap_id) | user = User.get_cached_by_ap_id(user.ap_id) | ||||
assert User.Info.fields(user.info) == [ | |||||
assert User.fields(user) == [ | |||||
%{"name" => "foo", "value" => "updated"}, | %{"name" => "foo", "value" => "updated"}, | ||||
%{"name" => "foo1", "value" => "updated"} | %{"name" => "foo1", "value" => "updated"} | ||||
] | ] | ||||
@@ -643,7 +643,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
user = User.get_cached_by_ap_id(user.ap_id) | user = User.get_cached_by_ap_id(user.ap_id) | ||||
assert User.Info.fields(user.info) == [ | |||||
assert User.fields(user) == [ | |||||
%{"name" => "foo", "value" => "updated"}, | %{"name" => "foo", "value" => "updated"}, | ||||
%{"name" => "foo1", "value" => "updated"} | %{"name" => "foo1", "value" => "updated"} | ||||
] | ] | ||||
@@ -654,7 +654,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
user = User.get_cached_by_ap_id(user.ap_id) | user = User.get_cached_by_ap_id(user.ap_id) | ||||
assert User.Info.fields(user.info) == [] | |||||
assert User.fields(user) == [] | |||||
end | end | ||||
test "it works for incoming update activities which lock the account" do | test "it works for incoming update activities which lock the account" do | ||||
@@ -677,7 +677,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(update_data) | {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(update_data) | ||||
user = User.get_cached_by_ap_id(data["actor"]) | user = User.get_cached_by_ap_id(data["actor"]) | ||||
assert user.info.locked == true | |||||
assert user.locked == true | |||||
end | end | ||||
test "it works for incoming deletes" do | test "it works for incoming deletes" do | ||||
@@ -918,7 +918,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
test "it works for incoming accepts which were orphaned" do | test "it works for incoming accepts which were orphaned" do | ||||
follower = insert(:user) | follower = insert(:user) | ||||
followed = insert(:user, %{info: %User.Info{locked: true}}) | |||||
followed = insert(:user, locked: true) | |||||
{:ok, follow_activity} = ActivityPub.follow(follower, followed) | {:ok, follow_activity} = ActivityPub.follow(follower, followed) | ||||
@@ -940,7 +940,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
test "it works for incoming accepts which are referenced by IRI only" do | test "it works for incoming accepts which are referenced by IRI only" do | ||||
follower = insert(:user) | follower = insert(:user) | ||||
followed = insert(:user, %{info: %User.Info{locked: true}}) | |||||
followed = insert(:user, locked: true) | |||||
{:ok, follow_activity} = ActivityPub.follow(follower, followed) | {:ok, follow_activity} = ActivityPub.follow(follower, followed) | ||||
@@ -960,7 +960,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
test "it fails for incoming accepts which cannot be correlated" do | test "it fails for incoming accepts which cannot be correlated" do | ||||
follower = insert(:user) | follower = insert(:user) | ||||
followed = insert(:user, %{info: %User.Info{locked: true}}) | |||||
followed = insert(:user, locked: true) | |||||
accept_data = | accept_data = | ||||
File.read!("test/fixtures/mastodon-accept-activity.json") | File.read!("test/fixtures/mastodon-accept-activity.json") | ||||
@@ -979,7 +979,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
test "it fails for incoming rejects which cannot be correlated" do | test "it fails for incoming rejects which cannot be correlated" do | ||||
follower = insert(:user) | follower = insert(:user) | ||||
followed = insert(:user, %{info: %User.Info{locked: true}}) | |||||
followed = insert(:user, locked: true) | |||||
accept_data = | accept_data = | ||||
File.read!("test/fixtures/mastodon-reject-activity.json") | File.read!("test/fixtures/mastodon-reject-activity.json") | ||||
@@ -998,7 +998,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
test "it works for incoming rejects which are orphaned" do | test "it works for incoming rejects which are orphaned" do | ||||
follower = insert(:user) | follower = insert(:user) | ||||
followed = insert(:user, %{info: %User.Info{locked: true}}) | |||||
followed = insert(:user, locked: true) | |||||
{:ok, follower} = User.follow(follower, followed) | {:ok, follower} = User.follow(follower, followed) | ||||
{:ok, _follow_activity} = ActivityPub.follow(follower, followed) | {:ok, _follow_activity} = ActivityPub.follow(follower, followed) | ||||
@@ -1024,7 +1024,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
test "it works for incoming rejects which are referenced by IRI only" do | test "it works for incoming rejects which are referenced by IRI only" do | ||||
follower = insert(:user) | follower = insert(:user) | ||||
followed = insert(:user, %{info: %User.Info{locked: true}}) | |||||
followed = insert(:user, locked: true) | |||||
{:ok, follower} = User.follow(follower, followed) | {:ok, follower} = User.follow(follower, followed) | ||||
{:ok, follow_activity} = ActivityPub.follow(follower, followed) | {:ok, follow_activity} = ActivityPub.follow(follower, followed) | ||||
@@ -1326,18 +1326,18 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
assert "http://localhost:4001/users/rye@niu.moe/followers" in activity.recipients | assert "http://localhost:4001/users/rye@niu.moe/followers" in activity.recipients | ||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
assert user.info.note_count == 1 | |||||
assert user.note_count == 1 | |||||
{:ok, user} = Transmogrifier.upgrade_user_from_ap_id("https://niu.moe/users/rye") | {:ok, user} = Transmogrifier.upgrade_user_from_ap_id("https://niu.moe/users/rye") | ||||
ObanHelpers.perform_all() | ObanHelpers.perform_all() | ||||
assert user.info.ap_enabled | |||||
assert user.info.note_count == 1 | |||||
assert user.ap_enabled | |||||
assert user.note_count == 1 | |||||
assert user.follower_address == "https://niu.moe/users/rye/followers" | assert user.follower_address == "https://niu.moe/users/rye/followers" | ||||
assert user.following_address == "https://niu.moe/users/rye/following" | assert user.following_address == "https://niu.moe/users/rye/following" | ||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
assert user.info.note_count == 1 | |||||
assert user.note_count == 1 | |||||
activity = Activity.get_by_id(activity.id) | activity = Activity.get_by_id(activity.id) | ||||
assert user.follower_address in activity.recipients | assert user.follower_address in activity.recipients | ||||
@@ -1358,7 +1358,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do | |||||
"https://cdn.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png" | "https://cdn.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png" | ||||
} | } | ||||
] | ] | ||||
} = user.info.banner | |||||
} = user.banner | |||||
refute "..." in activity.recipients | refute "..." in activity.recipients | ||||
@@ -297,7 +297,7 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do | |||||
describe "update_follow_state_for_all/2" do | describe "update_follow_state_for_all/2" do | ||||
test "updates the state of all Follow activities with the same actor and object" do | test "updates the state of all Follow activities with the same actor and object" do | ||||
user = insert(:user, info: %{locked: true}) | |||||
user = insert(:user, locked: true) | |||||
follower = insert(:user) | follower = insert(:user) | ||||
{:ok, follow_activity} = ActivityPub.follow(follower, user) | {:ok, follow_activity} = ActivityPub.follow(follower, user) | ||||
@@ -321,7 +321,7 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do | |||||
describe "update_follow_state/2" do | describe "update_follow_state/2" do | ||||
test "updates the state of the given follow activity" do | test "updates the state of the given follow activity" do | ||||
user = insert(:user, info: %{locked: true}) | |||||
user = insert(:user, locked: true) | |||||
follower = insert(:user) | follower = insert(:user) | ||||
{:ok, follow_activity} = ActivityPub.follow(follower, user) | {:ok, follow_activity} = ActivityPub.follow(follower, user) | ||||
@@ -29,7 +29,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do | |||||
{:ok, user} = | {:ok, user} = | ||||
insert(:user) | insert(:user) | ||||
|> User.upgrade_changeset(%{info: %{fields: fields}}) | |||||
|> User.upgrade_changeset(%{fields: fields}) | |||||
|> User.update_and_set_cache() | |> User.update_and_set_cache() | ||||
assert %{ | assert %{ | ||||
@@ -38,7 +38,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do | |||||
end | end | ||||
test "Renders with emoji tags" do | test "Renders with emoji tags" do | ||||
user = insert(:user, %{info: %{emoji: [%{"bib" => "/test"}]}}) | |||||
user = insert(:user, emoji: [%{"bib" => "/test"}]) | |||||
assert %{ | assert %{ | ||||
"tag" => [ | "tag" => [ | ||||
@@ -64,9 +64,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do | |||||
user = | user = | ||||
insert(:user, | insert(:user, | ||||
avatar: %{"url" => [%{"href" => "https://someurl"}]}, | avatar: %{"url" => [%{"href" => "https://someurl"}]}, | ||||
info: %{ | |||||
banner: %{"url" => [%{"href" => "https://somebanner"}]} | |||||
} | |||||
banner: %{"url" => [%{"href" => "https://somebanner"}]} | |||||
) | ) | ||||
{:ok, user} = User.ensure_keys_present(user) | {:ok, user} = User.ensure_keys_present(user) | ||||
@@ -121,8 +119,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | ||||
assert %{"totalItems" => 1} = UserView.render("followers.json", %{user: user}) | assert %{"totalItems" => 1} = UserView.render("followers.json", %{user: user}) | ||||
info = Map.merge(user.info, %{hide_followers_count: true, hide_followers: true}) | |||||
user = Map.put(user, :info, info) | |||||
user = Map.merge(user, %{hide_followers_count: true, hide_followers: true}) | |||||
assert %{"totalItems" => 0} = UserView.render("followers.json", %{user: user}) | assert %{"totalItems" => 0} = UserView.render("followers.json", %{user: user}) | ||||
end | end | ||||
@@ -131,8 +128,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | ||||
assert %{"totalItems" => 1} = UserView.render("followers.json", %{user: user}) | assert %{"totalItems" => 1} = UserView.render("followers.json", %{user: user}) | ||||
info = Map.merge(user.info, %{hide_followers_count: false, hide_followers: true}) | |||||
user = Map.put(user, :info, info) | |||||
user = Map.merge(user, %{hide_followers_count: false, hide_followers: true}) | |||||
assert %{"totalItems" => 1} = UserView.render("followers.json", %{user: user}) | assert %{"totalItems" => 1} = UserView.render("followers.json", %{user: user}) | ||||
end | end | ||||
end | end | ||||
@@ -143,8 +139,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, user, _other_user, _activity} = CommonAPI.follow(user, other_user) | {:ok, user, _other_user, _activity} = CommonAPI.follow(user, other_user) | ||||
assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user}) | assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user}) | ||||
info = Map.merge(user.info, %{hide_follows_count: true, hide_follows: true}) | |||||
user = Map.put(user, :info, info) | |||||
user = Map.merge(user, %{hide_follows_count: true, hide_follows: true}) | |||||
assert %{"totalItems" => 0} = UserView.render("following.json", %{user: user}) | assert %{"totalItems" => 0} = UserView.render("following.json", %{user: user}) | ||||
end | end | ||||
@@ -153,8 +148,7 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, user, _other_user, _activity} = CommonAPI.follow(user, other_user) | {:ok, user, _other_user, _activity} = CommonAPI.follow(user, other_user) | ||||
assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user}) | assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user}) | ||||
info = Map.merge(user.info, %{hide_follows_count: false, hide_follows: true}) | |||||
user = Map.put(user, :info, info) | |||||
user = Map.merge(user, %{hide_follows_count: false, hide_follows: true}) | |||||
assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user}) | assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user}) | ||||
end | end | ||||
end | end | ||||
@@ -19,7 +19,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "/api/pleroma/admin/users" do | describe "/api/pleroma/admin/users" do | ||||
test "Delete" do | test "Delete" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
conn = | conn = | ||||
@@ -40,7 +40,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "Create" do | test "Create" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = | conn = | ||||
build_conn() | build_conn() | ||||
@@ -70,7 +70,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "Cannot create user with exisiting email" do | test "Cannot create user with exisiting email" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
conn = | conn = | ||||
@@ -101,7 +101,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "Cannot create user with exisiting nickname" do | test "Cannot create user with exisiting nickname" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
conn = | conn = | ||||
@@ -132,7 +132,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "Multiple user creation works in transaction" do | test "Multiple user creation works in transaction" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
conn = | conn = | ||||
@@ -181,7 +181,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "/api/pleroma/admin/users/:nickname" do | describe "/api/pleroma/admin/users/:nickname" do | ||||
test "Show", %{conn: conn} do | test "Show", %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
conn = | conn = | ||||
@@ -204,7 +204,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "when the user doesn't exist", %{conn: conn} do | test "when the user doesn't exist", %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = build(:user) | user = build(:user) | ||||
conn = | conn = | ||||
@@ -218,7 +218,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "/api/pleroma/admin/users/follow" do | describe "/api/pleroma/admin/users/follow" do | ||||
test "allows to force-follow another user" do | test "allows to force-follow another user" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
follower = insert(:user) | follower = insert(:user) | ||||
@@ -244,7 +244,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "/api/pleroma/admin/users/unfollow" do | describe "/api/pleroma/admin/users/unfollow" do | ||||
test "allows to force-unfollow another user" do | test "allows to force-unfollow another user" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
follower = insert(:user) | follower = insert(:user) | ||||
@@ -272,7 +272,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "PUT /api/pleroma/admin/users/tag" do | describe "PUT /api/pleroma/admin/users/tag" do | ||||
setup do | setup do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user1 = insert(:user, %{tags: ["x"]}) | user1 = insert(:user, %{tags: ["x"]}) | ||||
user2 = insert(:user, %{tags: ["y"]}) | user2 = insert(:user, %{tags: ["y"]}) | ||||
user3 = insert(:user, %{tags: ["unchanged"]}) | user3 = insert(:user, %{tags: ["unchanged"]}) | ||||
@@ -321,7 +321,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "DELETE /api/pleroma/admin/users/tag" do | describe "DELETE /api/pleroma/admin/users/tag" do | ||||
setup do | setup do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user1 = insert(:user, %{tags: ["x"]}) | user1 = insert(:user, %{tags: ["x"]}) | ||||
user2 = insert(:user, %{tags: ["y", "z"]}) | user2 = insert(:user, %{tags: ["y", "z"]}) | ||||
user3 = insert(:user, %{tags: ["unchanged"]}) | user3 = insert(:user, %{tags: ["unchanged"]}) | ||||
@@ -370,7 +370,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "/api/pleroma/admin/users/:nickname/permission_group" do | describe "/api/pleroma/admin/users/:nickname/permission_group" do | ||||
test "GET is giving user_info" do | test "GET is giving user_info" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = | conn = | ||||
build_conn() | build_conn() | ||||
@@ -385,7 +385,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "/:right POST, can add to a permission group" do | test "/:right POST, can add to a permission group" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
conn = | conn = | ||||
@@ -405,8 +405,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "/:right DELETE, can remove from a permission group" do | test "/:right DELETE, can remove from a permission group" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
user = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user, is_admin: true) | |||||
conn = | conn = | ||||
build_conn() | build_conn() | ||||
@@ -427,7 +427,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "PUT /api/pleroma/admin/users/:nickname/activation_status" do | describe "PUT /api/pleroma/admin/users/:nickname/activation_status" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = | conn = | ||||
conn | conn | ||||
@@ -445,7 +445,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
|> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: false}) | |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: false}) | ||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
assert user.info.deactivated == true | |||||
assert user.deactivated == true | |||||
assert json_response(conn, :no_content) | assert json_response(conn, :no_content) | ||||
log_entry = Repo.one(ModerationLog) | log_entry = Repo.one(ModerationLog) | ||||
@@ -455,14 +455,14 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "activates the user", %{conn: conn, admin: admin} do | test "activates the user", %{conn: conn, admin: admin} do | ||||
user = insert(:user, info: %{deactivated: true}) | |||||
user = insert(:user, deactivated: true) | |||||
conn = | conn = | ||||
conn | conn | ||||
|> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: true}) | |> put("/api/pleroma/admin/users/#{user.nickname}/activation_status", %{status: true}) | ||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
assert user.info.deactivated == false | |||||
assert user.deactivated == false | |||||
assert json_response(conn, :no_content) | assert json_response(conn, :no_content) | ||||
log_entry = Repo.one(ModerationLog) | log_entry = Repo.one(ModerationLog) | ||||
@@ -485,7 +485,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "POST /api/pleroma/admin/email_invite, with valid config" do | describe "POST /api/pleroma/admin/email_invite, with valid config" do | ||||
setup do | setup do | ||||
[user: insert(:user, info: %{is_admin: true})] | |||||
[user: insert(:user, is_admin: true)] | |||||
end | end | ||||
clear_config([:instance, :registrations_open]) do | clear_config([:instance, :registrations_open]) do | ||||
@@ -545,7 +545,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do | describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do | ||||
setup do | setup do | ||||
[user: insert(:user, info: %{is_admin: true})] | |||||
[user: insert(:user, is_admin: true)] | |||||
end | end | ||||
clear_config([:instance, :registrations_open]) | clear_config([:instance, :registrations_open]) | ||||
@@ -577,7 +577,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "/api/pleroma/admin/users/:nickname/password_reset" do | test "/api/pleroma/admin/users/:nickname/password_reset" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
conn = | conn = | ||||
@@ -593,7 +593,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "GET /api/pleroma/admin/users" do | describe "GET /api/pleroma/admin/users" do | ||||
setup do | setup do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = | conn = | ||||
build_conn() | build_conn() | ||||
@@ -609,7 +609,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
users = | users = | ||||
[ | [ | ||||
%{ | %{ | ||||
"deactivated" => admin.info.deactivated, | |||||
"deactivated" => admin.deactivated, | |||||
"id" => admin.id, | "id" => admin.id, | ||||
"nickname" => admin.nickname, | "nickname" => admin.nickname, | ||||
"roles" => %{"admin" => true, "moderator" => false}, | "roles" => %{"admin" => true, "moderator" => false}, | ||||
@@ -619,7 +619,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"display_name" => HTML.strip_tags(admin.name || admin.nickname) | "display_name" => HTML.strip_tags(admin.name || admin.nickname) | ||||
}, | }, | ||||
%{ | %{ | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -660,7 +660,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"page_size" => 50, | "page_size" => 50, | ||||
"users" => [ | "users" => [ | ||||
%{ | %{ | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -684,7 +684,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"page_size" => 50, | "page_size" => 50, | ||||
"users" => [ | "users" => [ | ||||
%{ | %{ | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -708,7 +708,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"page_size" => 50, | "page_size" => 50, | ||||
"users" => [ | "users" => [ | ||||
%{ | %{ | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -732,7 +732,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"page_size" => 50, | "page_size" => 50, | ||||
"users" => [ | "users" => [ | ||||
%{ | %{ | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -756,7 +756,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"page_size" => 50, | "page_size" => 50, | ||||
"users" => [ | "users" => [ | ||||
%{ | %{ | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -780,7 +780,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"page_size" => 1, | "page_size" => 1, | ||||
"users" => [ | "users" => [ | ||||
%{ | %{ | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -799,7 +799,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"page_size" => 1, | "page_size" => 1, | ||||
"users" => [ | "users" => [ | ||||
%{ | %{ | ||||
"deactivated" => user2.info.deactivated, | |||||
"deactivated" => user2.deactivated, | |||||
"id" => user2.id, | "id" => user2.id, | ||||
"nickname" => user2.nickname, | "nickname" => user2.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -813,7 +813,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "only local users" do | test "only local users" do | ||||
admin = insert(:user, info: %{is_admin: true}, nickname: "john") | |||||
admin = insert(:user, is_admin: true, nickname: "john") | |||||
user = insert(:user, nickname: "bob") | user = insert(:user, nickname: "bob") | ||||
insert(:user, nickname: "bobb", local: false) | insert(:user, nickname: "bobb", local: false) | ||||
@@ -828,7 +828,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"page_size" => 50, | "page_size" => 50, | ||||
"users" => [ | "users" => [ | ||||
%{ | %{ | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -842,7 +842,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "only local users with no query", %{admin: old_admin} do | test "only local users with no query", %{admin: old_admin} do | ||||
admin = insert(:user, info: %{is_admin: true}, nickname: "john") | |||||
admin = insert(:user, is_admin: true, nickname: "john") | |||||
user = insert(:user, nickname: "bob") | user = insert(:user, nickname: "bob") | ||||
insert(:user, nickname: "bobb", local: false) | insert(:user, nickname: "bobb", local: false) | ||||
@@ -855,7 +855,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
users = | users = | ||||
[ | [ | ||||
%{ | %{ | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -865,7 +865,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"display_name" => HTML.strip_tags(user.name || user.nickname) | "display_name" => HTML.strip_tags(user.name || user.nickname) | ||||
}, | }, | ||||
%{ | %{ | ||||
"deactivated" => admin.info.deactivated, | |||||
"deactivated" => admin.deactivated, | |||||
"id" => admin.id, | "id" => admin.id, | ||||
"nickname" => admin.nickname, | "nickname" => admin.nickname, | ||||
"roles" => %{"admin" => true, "moderator" => false}, | "roles" => %{"admin" => true, "moderator" => false}, | ||||
@@ -895,7 +895,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "load only admins", %{conn: conn, admin: admin} do | test "load only admins", %{conn: conn, admin: admin} do | ||||
second_admin = insert(:user, info: %{is_admin: true}) | |||||
second_admin = insert(:user, is_admin: true) | |||||
insert(:user) | insert(:user) | ||||
insert(:user) | insert(:user) | ||||
@@ -934,7 +934,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "load only moderators", %{conn: conn} do | test "load only moderators", %{conn: conn} do | ||||
moderator = insert(:user, info: %{is_moderator: true}) | |||||
moderator = insert(:user, is_moderator: true) | |||||
insert(:user) | insert(:user) | ||||
insert(:user) | insert(:user) | ||||
@@ -999,11 +999,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "it works with multiple filters" do | test "it works with multiple filters" do | ||||
admin = insert(:user, nickname: "john", info: %{is_admin: true}) | |||||
user = insert(:user, nickname: "bob", local: false, info: %{deactivated: true}) | |||||
admin = insert(:user, nickname: "john", is_admin: true) | |||||
user = insert(:user, nickname: "bob", local: false, deactivated: true) | |||||
insert(:user, nickname: "ken", local: true, info: %{deactivated: true}) | |||||
insert(:user, nickname: "bobb", local: false, info: %{deactivated: false}) | |||||
insert(:user, nickname: "ken", local: true, deactivated: true) | |||||
insert(:user, nickname: "bobb", local: false, deactivated: false) | |||||
conn = | conn = | ||||
build_conn() | build_conn() | ||||
@@ -1015,7 +1015,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"page_size" => 50, | "page_size" => 50, | ||||
"users" => [ | "users" => [ | ||||
%{ | %{ | ||||
"deactivated" => user.info.deactivated, | |||||
"deactivated" => user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -1030,7 +1030,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation" do | test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
conn = | conn = | ||||
@@ -1040,7 +1040,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
assert json_response(conn, 200) == | assert json_response(conn, 200) == | ||||
%{ | %{ | ||||
"deactivated" => !user.info.deactivated, | |||||
"deactivated" => !user.deactivated, | |||||
"id" => user.id, | "id" => user.id, | ||||
"nickname" => user.nickname, | "nickname" => user.nickname, | ||||
"roles" => %{"admin" => false, "moderator" => false}, | "roles" => %{"admin" => false, "moderator" => false}, | ||||
@@ -1058,7 +1058,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "POST /api/pleroma/admin/users/invite_token" do | describe "POST /api/pleroma/admin/users/invite_token" do | ||||
setup do | setup do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = | conn = | ||||
build_conn() | build_conn() | ||||
@@ -1122,7 +1122,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "GET /api/pleroma/admin/users/invites" do | describe "GET /api/pleroma/admin/users/invites" do | ||||
setup do | setup do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = | conn = | ||||
build_conn() | build_conn() | ||||
@@ -1160,7 +1160,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "POST /api/pleroma/admin/users/revoke_invite" do | describe "POST /api/pleroma/admin/users/revoke_invite" do | ||||
test "with token" do | test "with token" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
{:ok, invite} = UserInviteToken.create_invite() | {:ok, invite} = UserInviteToken.create_invite() | ||||
conn = | conn = | ||||
@@ -1180,7 +1180,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
end | end | ||||
test "with invalid token" do | test "with invalid token" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = | conn = | ||||
build_conn() | build_conn() | ||||
@@ -1193,7 +1193,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "GET /api/pleroma/admin/reports/:id" do | describe "GET /api/pleroma/admin/reports/:id" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
%{conn: assign(conn, :user, admin)} | %{conn: assign(conn, :user, admin)} | ||||
end | end | ||||
@@ -1226,7 +1226,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "PUT /api/pleroma/admin/reports/:id" do | describe "PUT /api/pleroma/admin/reports/:id" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
[reporter, target_user] = insert_pair(:user) | [reporter, target_user] = insert_pair(:user) | ||||
activity = insert(:note_activity, user: target_user) | activity = insert(:note_activity, user: target_user) | ||||
@@ -1287,7 +1287,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "GET /api/pleroma/admin/reports" do | describe "GET /api/pleroma/admin/reports" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
%{conn: assign(conn, :user, admin)} | %{conn: assign(conn, :user, admin)} | ||||
end | end | ||||
@@ -1407,7 +1407,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
# | # | ||||
describe "POST /api/pleroma/admin/reports/:id/respond" do | describe "POST /api/pleroma/admin/reports/:id/respond" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
%{conn: assign(conn, :user, admin), admin: admin} | %{conn: assign(conn, :user, admin), admin: admin} | ||||
end | end | ||||
@@ -1462,7 +1462,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "PUT /api/pleroma/admin/statuses/:id" do | describe "PUT /api/pleroma/admin/statuses/:id" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
activity = insert(:note_activity) | activity = insert(:note_activity) | ||||
%{conn: assign(conn, :user, admin), id: activity.id, admin: admin} | %{conn: assign(conn, :user, admin), id: activity.id, admin: admin} | ||||
@@ -1528,7 +1528,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "DELETE /api/pleroma/admin/statuses/:id" do | describe "DELETE /api/pleroma/admin/statuses/:id" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
activity = insert(:note_activity) | activity = insert(:note_activity) | ||||
%{conn: assign(conn, :user, admin), id: activity.id, admin: admin} | %{conn: assign(conn, :user, admin), id: activity.id, admin: admin} | ||||
@@ -1558,7 +1558,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "GET /api/pleroma/admin/config" do | describe "GET /api/pleroma/admin/config" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
%{conn: assign(conn, :user, admin)} | %{conn: assign(conn, :user, admin)} | ||||
end | end | ||||
@@ -1595,7 +1595,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "POST /api/pleroma/admin/config" do | describe "POST /api/pleroma/admin/config" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
temp_file = "config/test.exported_from_db.secret.exs" | temp_file = "config/test.exported_from_db.secret.exs" | ||||
@@ -2163,7 +2163,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "config mix tasks run" do | describe "config mix tasks run" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
temp_file = "config/test.exported_from_db.secret.exs" | temp_file = "config/test.exported_from_db.secret.exs" | ||||
@@ -2199,7 +2199,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "GET /api/pleroma/admin/users/:nickname/statuses" do | describe "GET /api/pleroma/admin/users/:nickname/statuses" do | ||||
setup do | setup do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
date1 = (DateTime.to_unix(DateTime.utc_now()) + 2000) |> DateTime.from_unix!() | date1 = (DateTime.to_unix(DateTime.utc_now()) + 2000) |> DateTime.from_unix!() | ||||
@@ -2256,8 +2256,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "GET /api/pleroma/admin/moderation_log" do | describe "GET /api/pleroma/admin/moderation_log" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
moderator = insert(:user, info: %{is_moderator: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
moderator = insert(:user, is_moderator: true) | |||||
%{conn: assign(conn, :user, admin), admin: admin, moderator: moderator} | %{conn: assign(conn, :user, admin), admin: admin, moderator: moderator} | ||||
end | end | ||||
@@ -2465,14 +2465,14 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
describe "PATCH /users/:nickname/force_password_reset" do | describe "PATCH /users/:nickname/force_password_reset" do | ||||
setup %{conn: conn} do | setup %{conn: conn} do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
user = insert(:user) | user = insert(:user) | ||||
%{conn: assign(conn, :user, admin), admin: admin, user: user} | %{conn: assign(conn, :user, admin), admin: admin, user: user} | ||||
end | end | ||||
test "sets password_reset_pending to true", %{admin: admin, user: user} do | test "sets password_reset_pending to true", %{admin: admin, user: user} do | ||||
assert user.info.password_reset_pending == false | |||||
assert user.password_reset_pending == false | |||||
conn = | conn = | ||||
build_conn() | build_conn() | ||||
@@ -2483,7 +2483,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
ObanHelpers.perform_all() | ObanHelpers.perform_all() | ||||
assert User.get_by_id(user.id).info.password_reset_pending == true | |||||
assert User.get_by_id(user.id).password_reset_pending == true | |||||
end | end | ||||
end | end | ||||
end | end | ||||
@@ -47,9 +47,9 @@ defmodule Pleroma.Web.AdminAPI.SearchTest do | |||||
end | end | ||||
test "it returns active/deactivated users" do | test "it returns active/deactivated users" do | ||||
insert(:user, info: %{deactivated: true}) | |||||
insert(:user, info: %{deactivated: true}) | |||||
insert(:user, info: %{deactivated: false}) | |||||
insert(:user, deactivated: true) | |||||
insert(:user, deactivated: true) | |||||
insert(:user, deactivated: false) | |||||
{:ok, _results, active_count} = | {:ok, _results, active_count} = | ||||
Search.user(%{ | Search.user(%{ | ||||
@@ -70,7 +70,7 @@ defmodule Pleroma.Web.AdminAPI.SearchTest do | |||||
test "it returns specific user" do | test "it returns specific user" do | ||||
insert(:user) | insert(:user) | ||||
insert(:user) | insert(:user) | ||||
user = insert(:user, nickname: "bob", local: true, info: %{deactivated: false}) | |||||
user = insert(:user, nickname: "bob", local: true, deactivated: false) | |||||
{:ok, _results, total_count} = Search.user(%{query: ""}) | {:ok, _results, total_count} = Search.user(%{query: ""}) | ||||
@@ -108,7 +108,7 @@ defmodule Pleroma.Web.AdminAPI.SearchTest do | |||||
end | end | ||||
test "it returns admin user" do | test "it returns admin user" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
insert(:user) | insert(:user) | ||||
insert(:user) | insert(:user) | ||||
@@ -119,7 +119,7 @@ defmodule Pleroma.Web.AdminAPI.SearchTest do | |||||
end | end | ||||
test "it returns moderator user" do | test "it returns moderator user" do | ||||
moderator = insert(:user, info: %{is_moderator: true}) | |||||
moderator = insert(:user, is_moderator: true) | |||||
insert(:user) | insert(:user) | ||||
insert(:user) | insert(:user) | ||||
@@ -49,6 +49,8 @@ defmodule Pleroma.Web.AdminAPI.ReportViewTest do | |||||
{:ok, report_activity} = | {:ok, report_activity} = | ||||
CommonAPI.report(user, %{"account_id" => other_user.id, "status_ids" => [activity.id]}) | CommonAPI.report(user, %{"account_id" => other_user.id, "status_ids" => [activity.id]}) | ||||
other_user = Pleroma.User.get_by_id(other_user.id) | |||||
expected = %{ | expected = %{ | ||||
content: nil, | content: nil, | ||||
actor: | actor: | ||||
@@ -100,7 +100,7 @@ defmodule Pleroma.Web.CommonAPITest do | |||||
{:ok, activity} = CommonAPI.update(user) | {:ok, activity} = CommonAPI.update(user) | ||||
user = User.get_cached_by_ap_id(user.ap_id) | user = User.get_cached_by_ap_id(user.ap_id) | ||||
[firefox] = user.info.source_data["tag"] | |||||
[firefox] = user.source_data["tag"] | |||||
assert firefox["name"] == ":firefox:" | assert firefox["name"] == ":firefox:" | ||||
@@ -291,7 +291,7 @@ defmodule Pleroma.Web.CommonAPITest do | |||||
id = activity.id | id = activity.id | ||||
user = refresh_record(user) | user = refresh_record(user) | ||||
assert %User{info: %{pinned_activities: [^id]}} = user | |||||
assert %User{pinned_activities: [^id]} = user | |||||
end | end | ||||
test "unlisted statuses can be pinned", %{user: user} do | test "unlisted statuses can be pinned", %{user: user} do | ||||
@@ -325,7 +325,7 @@ defmodule Pleroma.Web.CommonAPITest do | |||||
user = refresh_record(user) | user = refresh_record(user) | ||||
assert %User{info: %{pinned_activities: []}} = user | |||||
assert %User{pinned_activities: []} = user | |||||
end | end | ||||
test "should unpin when deleting a status", %{user: user, activity: activity} do | test "should unpin when deleting a status", %{user: user, activity: activity} do | ||||
@@ -337,7 +337,7 @@ defmodule Pleroma.Web.CommonAPITest do | |||||
user = refresh_record(user) | user = refresh_record(user) | ||||
assert %User{info: %{pinned_activities: []}} = user | |||||
assert %User{pinned_activities: []} = user | |||||
end | end | ||||
end | end | ||||
@@ -468,7 +468,7 @@ defmodule Pleroma.Web.CommonAPITest do | |||||
describe "accept_follow_request/2" do | describe "accept_follow_request/2" do | ||||
test "after acceptance, it sets all existing pending follow request states to 'accept'" do | test "after acceptance, it sets all existing pending follow request states to 'accept'" do | ||||
user = insert(:user, info: %{locked: true}) | |||||
user = insert(:user, locked: true) | |||||
follower = insert(:user) | follower = insert(:user) | ||||
follower_two = insert(:user) | follower_two = insert(:user) | ||||
@@ -488,7 +488,7 @@ defmodule Pleroma.Web.CommonAPITest do | |||||
end | end | ||||
test "after rejection, it sets all existing pending follow request states to 'reject'" do | test "after rejection, it sets all existing pending follow request states to 'reject'" do | ||||
user = insert(:user, info: %{locked: true}) | |||||
user = insert(:user, locked: true) | |||||
follower = insert(:user) | follower = insert(:user) | ||||
follower_two = insert(:user) | follower_two = insert(:user) | ||||
@@ -81,14 +81,16 @@ defmodule Pleroma.Web.FederatorTest do | |||||
local: false, | local: false, | ||||
nickname: "nick1@domain.com", | nickname: "nick1@domain.com", | ||||
ap_id: "https://domain.com/users/nick1", | ap_id: "https://domain.com/users/nick1", | ||||
info: %{ap_enabled: true, source_data: %{"inbox" => inbox1}} | |||||
source_data: %{"inbox" => inbox1}, | |||||
ap_enabled: true | |||||
}) | }) | ||||
insert(:user, %{ | insert(:user, %{ | ||||
local: false, | local: false, | ||||
nickname: "nick2@domain2.com", | nickname: "nick2@domain2.com", | ||||
ap_id: "https://domain2.com/users/nick2", | ap_id: "https://domain2.com/users/nick2", | ||||
info: %{ap_enabled: true, source_data: %{"inbox" => inbox2}} | |||||
source_data: %{"inbox" => inbox2}, | |||||
ap_enabled: true | |||||
}) | }) | ||||
dt = NaiveDateTime.utc_now() | dt = NaiveDateTime.utc_now() | ||||
@@ -162,7 +164,7 @@ defmodule Pleroma.Web.FederatorTest do | |||||
local: false, | local: false, | ||||
nickname: "nick1@domain.com", | nickname: "nick1@domain.com", | ||||
ap_id: "https://domain.com/users/nick1", | ap_id: "https://domain.com/users/nick1", | ||||
info: %{salmon: "https://domain.com/salmon"} | |||||
salmon: "https://domain.com/salmon" | |||||
}) | }) | ||||
remote_user2 = | remote_user2 = | ||||
@@ -170,7 +172,7 @@ defmodule Pleroma.Web.FederatorTest do | |||||
local: false, | local: false, | ||||
nickname: "nick2@domain2.com", | nickname: "nick2@domain2.com", | ||||
ap_id: "https://domain2.com/users/nick2", | ap_id: "https://domain2.com/users/nick2", | ||||
info: %{salmon: "https://domain2.com/salmon"} | |||||
salmon: "https://domain2.com/salmon" | |||||
}) | }) | ||||
remote_user2_id = remote_user2.id | remote_user2_id = remote_user2.id | ||||
@@ -23,7 +23,7 @@ defmodule Pleroma.Web.MastodonAPI.MastoFEController do | |||||
assert _result = json_response(conn, 200) | assert _result = json_response(conn, 200) | ||||
user = User.get_cached_by_ap_id(user.ap_id) | user = User.get_cached_by_ap_id(user.ap_id) | ||||
assert user.info.settings == %{"programming" => "socks"} | |||||
assert user.settings == %{"programming" => "socks"} | |||||
end | end | ||||
describe "index/2 redirections" do | describe "index/2 redirections" do | ||||
@@ -153,7 +153,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do | |||||
|> json_response(200) | |> json_response(200) | ||||
assert response["pleroma"]["skip_thread_containment"] == true | assert response["pleroma"]["skip_thread_containment"] == true | ||||
assert refresh_record(user).info.skip_thread_containment | |||||
assert refresh_record(user).skip_thread_containment | |||||
end | end | ||||
test "updates the user's hide_follows status", %{conn: conn} do | test "updates the user's hide_follows status", %{conn: conn} do | ||||
@@ -255,7 +255,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do | |||||
test "getting followers, hide_followers", %{conn: conn} do | test "getting followers, hide_followers", %{conn: conn} do | ||||
user = insert(:user) | user = insert(:user) | ||||
other_user = insert(:user, %{info: %{hide_followers: true}}) | |||||
other_user = insert(:user, hide_followers: true) | |||||
{:ok, _user} = User.follow(user, other_user) | {:ok, _user} = User.follow(user, other_user) | ||||
conn = | conn = | ||||
@@ -267,7 +267,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do | |||||
test "getting followers, hide_followers, same user requesting", %{conn: conn} do | test "getting followers, hide_followers, same user requesting", %{conn: conn} do | ||||
user = insert(:user) | user = insert(:user) | ||||
other_user = insert(:user, %{info: %{hide_followers: true}}) | |||||
other_user = insert(:user, hide_followers: true) | |||||
{:ok, _user} = User.follow(user, other_user) | {:ok, _user} = User.follow(user, other_user) | ||||
conn = | conn = | ||||
@@ -335,7 +335,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do | |||||
end | end | ||||
test "getting following, hide_follows", %{conn: conn} do | test "getting following, hide_follows", %{conn: conn} do | ||||
user = insert(:user, %{info: %{hide_follows: true}}) | |||||
user = insert(:user, hide_follows: true) | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, user} = User.follow(user, other_user) | {:ok, user} = User.follow(user, other_user) | ||||
@@ -347,7 +347,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do | |||||
end | end | ||||
test "getting following, hide_follows, same user requesting", %{conn: conn} do | test "getting following, hide_follows, same user requesting", %{conn: conn} do | ||||
user = insert(:user, %{info: %{hide_follows: true}}) | |||||
user = insert(:user, hide_follows: true) | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, user} = User.follow(user, other_user) | {:ok, user} = User.follow(user, other_user) | ||||
@@ -669,7 +669,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do | |||||
token_from_db = Repo.preload(token_from_db, :user) | token_from_db = Repo.preload(token_from_db, :user) | ||||
assert token_from_db.user | assert token_from_db.user | ||||
assert token_from_db.user.info.confirmation_pending | |||||
assert token_from_db.user.confirmation_pending | |||||
end | end | ||||
test "returns error when user already registred", %{conn: conn, valid_params: valid_params} do | test "returns error when user already registred", %{conn: conn, valid_params: valid_params} do | ||||
@@ -713,7 +713,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do | |||||
token_from_db = Repo.preload(token_from_db, :user) | token_from_db = Repo.preload(token_from_db, :user) | ||||
assert token_from_db.user | assert token_from_db.user | ||||
assert token_from_db.user.info.confirmation_pending | |||||
assert token_from_db.user.confirmation_pending | |||||
end | end | ||||
conn = | conn = | ||||
@@ -798,7 +798,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do | |||||
end | end | ||||
test "verify_credentials default scope unlisted", %{conn: conn} do | test "verify_credentials default scope unlisted", %{conn: conn} do | ||||
user = insert(:user, %{info: %User.Info{default_scope: "unlisted"}}) | |||||
user = insert(:user, default_scope: "unlisted") | |||||
conn = | conn = | ||||
conn | conn | ||||
@@ -810,7 +810,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do | |||||
end | end | ||||
test "locked accounts", %{conn: conn} do | test "locked accounts", %{conn: conn} do | ||||
user = insert(:user, %{info: %User.Info{default_scope: "private"}}) | |||||
user = insert(:user, default_scope: "private") | |||||
conn = | conn = | ||||
conn | conn | ||||
@@ -17,7 +17,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do | |||||
{:ok, user_two} = User.follow(user_two, user_one) | {:ok, user_two} = User.follow(user_two, user_one) | ||||
assert User.get_cached_by_id(user_two.id).info.unread_conversation_count == 0 | |||||
assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 | |||||
{:ok, direct} = | {:ok, direct} = | ||||
CommonAPI.post(user_one, %{ | CommonAPI.post(user_one, %{ | ||||
@@ -25,7 +25,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do | |||||
"visibility" => "direct" | "visibility" => "direct" | ||||
}) | }) | ||||
assert User.get_cached_by_id(user_two.id).info.unread_conversation_count == 1 | |||||
assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 | |||||
{:ok, _follower_only} = | {:ok, _follower_only} = | ||||
CommonAPI.post(user_one, %{ | CommonAPI.post(user_one, %{ | ||||
@@ -56,7 +56,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do | |||||
assert is_binary(res_id) | assert is_binary(res_id) | ||||
assert unread == true | assert unread == true | ||||
assert res_last_status["id"] == direct.id | assert res_last_status["id"] == direct.id | ||||
assert User.get_cached_by_id(user_one.id).info.unread_conversation_count == 1 | |||||
assert User.get_cached_by_id(user_one.id).unread_conversation_count == 1 | |||||
end | end | ||||
test "updates the last_status on reply", %{conn: conn} do | test "updates the last_status on reply", %{conn: conn} do | ||||
@@ -107,7 +107,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do | |||||
|> post("/api/v1/conversations/#{direct_conversation_id}/read") | |> post("/api/v1/conversations/#{direct_conversation_id}/read") | ||||
|> json_response(200) | |> json_response(200) | ||||
assert User.get_cached_by_id(user_one.id).info.unread_conversation_count == 0 | |||||
assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 | |||||
# The conversation is marked as unread on reply | # The conversation is marked as unread on reply | ||||
{:ok, _} = | {:ok, _} = | ||||
@@ -123,7 +123,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do | |||||
|> get("/api/v1/conversations") | |> get("/api/v1/conversations") | ||||
|> json_response(200) | |> json_response(200) | ||||
assert User.get_cached_by_id(user_one.id).info.unread_conversation_count == 1 | |||||
assert User.get_cached_by_id(user_one.id).unread_conversation_count == 1 | |||||
# A reply doesn't increment the user's unread_conversation_count if the conversation is unread | # A reply doesn't increment the user's unread_conversation_count if the conversation is unread | ||||
{:ok, _} = | {:ok, _} = | ||||
@@ -133,7 +133,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do | |||||
"in_reply_to_status_id" => direct.id | "in_reply_to_status_id" => direct.id | ||||
}) | }) | ||||
assert User.get_cached_by_id(user_one.id).info.unread_conversation_count == 1 | |||||
assert User.get_cached_by_id(user_one.id).unread_conversation_count == 1 | |||||
end | end | ||||
test "(vanilla) Mastodon frontend behaviour", %{conn: conn} do | test "(vanilla) Mastodon frontend behaviour", %{conn: conn} do | ||||
@@ -12,7 +12,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do | |||||
describe "locked accounts" do | describe "locked accounts" do | ||||
test "/api/v1/follow_requests works" do | test "/api/v1/follow_requests works" do | ||||
user = insert(:user, %{info: %User.Info{locked: true}}) | |||||
user = insert(:user, locked: true) | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, _activity} = ActivityPub.follow(other_user, user) | {:ok, _activity} = ActivityPub.follow(other_user, user) | ||||
@@ -32,7 +32,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do | |||||
end | end | ||||
test "/api/v1/follow_requests/:id/authorize works" do | test "/api/v1/follow_requests/:id/authorize works" do | ||||
user = insert(:user, %{info: %User.Info{locked: true}}) | |||||
user = insert(:user, locked: true) | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, _activity} = ActivityPub.follow(other_user, user) | {:ok, _activity} = ActivityPub.follow(other_user, user) | ||||
@@ -57,7 +57,7 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestControllerTest do | |||||
end | end | ||||
test "/api/v1/follow_requests/:id/reject works" do | test "/api/v1/follow_requests/:id/reject works" do | ||||
user = insert(:user, %{info: %User.Info{locked: true}}) | |||||
user = insert(:user, locked: true) | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, _activity} = ActivityPub.follow(other_user, user) | {:ok, _activity} = ActivityPub.follow(other_user, user) | ||||
@@ -41,20 +41,13 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do | |||||
user = insert(:user, %{local: true}) | user = insert(:user, %{local: true}) | ||||
user2 = insert(:user, %{local: true}) | user2 = insert(:user, %{local: true}) | ||||
{:ok, _user2} = User.deactivate(user2, !user2.info.deactivated) | |||||
{:ok, _user2} = User.deactivate(user2, !user2.deactivated) | |||||
insert(:user, %{local: false, nickname: "u@peer1.com"}) | insert(:user, %{local: false, nickname: "u@peer1.com"}) | ||||
insert(:user, %{local: false, nickname: "u@peer2.com"}) | insert(:user, %{local: false, nickname: "u@peer2.com"}) | ||||
{:ok, _} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofe"}) | {:ok, _} = Pleroma.Web.CommonAPI.post(user, %{"status" => "cofe"}) | ||||
# Stats should count users with missing or nil `info.deactivated` value | |||||
{:ok, _user} = | |||||
user.id | |||||
|> User.get_cached_by_id() | |||||
|> User.update_info(&Ecto.Changeset.change(&1, %{deactivated: nil})) | |||||
Pleroma.Stats.force_update() | Pleroma.Stats.force_update() | ||||
conn = get(conn, "/api/v1/instance") | conn = get(conn, "/api/v1/instance") | ||||
@@ -526,8 +526,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do | |||||
test "when you're an admin or moderator", %{conn: conn} do | test "when you're an admin or moderator", %{conn: conn} do | ||||
activity1 = insert(:note_activity) | activity1 = insert(:note_activity) | ||||
activity2 = insert(:note_activity) | activity2 = insert(:note_activity) | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
moderator = insert(:user, info: %{is_moderator: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
moderator = insert(:user, is_moderator: true) | |||||
res_conn = | res_conn = | ||||
conn | conn | ||||
@@ -14,11 +14,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPITest do | |||||
import Pleroma.Factory | import Pleroma.Factory | ||||
describe "follow/3" do | describe "follow/3" do | ||||
test "returns error when user deactivated" do | |||||
test "returns error when followed user is deactivated" do | |||||
follower = insert(:user) | follower = insert(:user) | ||||
user = insert(:user, local: true, info: %{deactivated: true}) | |||||
user = insert(:user, local: true, deactivated: true) | |||||
{:error, error} = MastodonAPI.follow(follower, user) | {:error, error} = MastodonAPI.follow(follower, user) | ||||
assert error == "Could not follow user: You are deactivated." | |||||
assert error == "Could not follow user: #{user.nickname} is deactivated." | |||||
end | end | ||||
test "following for user" do | test "following for user" do | ||||
@@ -26,12 +26,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
user = | user = | ||||
insert(:user, %{ | insert(:user, %{ | ||||
info: %{ | |||||
note_count: 5, | |||||
follower_count: 3, | |||||
source_data: source_data, | |||||
background: background_image | |||||
}, | |||||
follower_count: 3, | |||||
note_count: 5, | |||||
source_data: source_data, | |||||
background: background_image, | |||||
nickname: "shp@shitposter.club", | nickname: "shp@shitposter.club", | ||||
name: ":karjalanpiirakka: shp", | name: ":karjalanpiirakka: shp", | ||||
bio: "<script src=\"invalid-html\"></script><span>valid html</span>", | bio: "<script src=\"invalid-html\"></script><span>valid html</span>", | ||||
@@ -101,7 +99,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
"non_followers" => true | "non_followers" => true | ||||
} | } | ||||
privacy = user.info.default_scope | |||||
privacy = user.default_scope | |||||
assert %{ | assert %{ | ||||
pleroma: %{notification_settings: ^notification_settings}, | pleroma: %{notification_settings: ^notification_settings}, | ||||
@@ -112,7 +110,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
test "Represent a Service(bot) account" do | test "Represent a Service(bot) account" do | ||||
user = | user = | ||||
insert(:user, %{ | insert(:user, %{ | ||||
info: %{note_count: 5, follower_count: 3, source_data: %{"type" => "Service"}}, | |||||
follower_count: 3, | |||||
note_count: 5, | |||||
source_data: %{"type" => "Service"}, | |||||
nickname: "shp@shitposter.club", | nickname: "shp@shitposter.club", | ||||
inserted_at: ~N[2017-08-15 15:47:06.597036] | inserted_at: ~N[2017-08-15 15:47:06.597036] | ||||
}) | }) | ||||
@@ -164,8 +164,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
end | end | ||||
test "Represent a deactivated user for an admin" do | test "Represent a deactivated user for an admin" do | ||||
admin = insert(:user, %{info: %{is_admin: true}}) | |||||
deactivated_user = insert(:user, %{info: %{deactivated: true}}) | |||||
admin = insert(:user, is_admin: true) | |||||
deactivated_user = insert(:user, deactivated: true) | |||||
represented = AccountView.render("show.json", %{user: deactivated_user, for: admin}) | represented = AccountView.render("show.json", %{user: deactivated_user, for: admin}) | ||||
assert represented[:pleroma][:deactivated] == true | assert represented[:pleroma][:deactivated] == true | ||||
end | end | ||||
@@ -253,7 +253,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
test "represent a relationship for the user with a pending follow request" do | test "represent a relationship for the user with a pending follow request" do | ||||
user = insert(:user) | user = insert(:user) | ||||
other_user = insert(:user, %{info: %User.Info{locked: true}}) | |||||
other_user = insert(:user, locked: true) | |||||
{:ok, user, other_user, _} = CommonAPI.follow(user, other_user) | {:ok, user, other_user, _} = CommonAPI.follow(user, other_user) | ||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
@@ -282,7 +282,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
test "represent an embedded relationship" do | test "represent an embedded relationship" do | ||||
user = | user = | ||||
insert(:user, %{ | insert(:user, %{ | ||||
info: %{note_count: 5, follower_count: 0, source_data: %{"type" => "Service"}}, | |||||
follower_count: 0, | |||||
note_count: 5, | |||||
source_data: %{"type" => "Service"}, | |||||
nickname: "shp@shitposter.club", | nickname: "shp@shitposter.club", | ||||
inserted_at: ~N[2017-08-15 15:47:06.597036] | inserted_at: ~N[2017-08-15 15:47:06.597036] | ||||
}) | }) | ||||
@@ -352,7 +354,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
end | end | ||||
test "returns the settings store if the requesting user is the represented user and it's requested specifically" do | test "returns the settings store if the requesting user is the represented user and it's requested specifically" do | ||||
user = insert(:user, %{info: %User.Info{pleroma_settings_store: %{fe: "test"}}}) | |||||
user = insert(:user, pleroma_settings_store: %{fe: "test"}) | |||||
result = | result = | ||||
AccountView.render("show.json", %{user: user, for: user, with_pleroma_settings: true}) | AccountView.render("show.json", %{user: user, for: user, with_pleroma_settings: true}) | ||||
@@ -374,14 +376,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
describe "hiding follows/following" do | describe "hiding follows/following" do | ||||
test "shows when follows/followers stats are hidden and sets follow/follower count to 0" do | test "shows when follows/followers stats are hidden and sets follow/follower count to 0" do | ||||
info = %{ | |||||
hide_followers: true, | |||||
hide_followers_count: true, | |||||
hide_follows: true, | |||||
hide_follows_count: true | |||||
} | |||||
user = insert(:user, info: info) | |||||
user = | |||||
insert(:user, %{ | |||||
hide_followers: true, | |||||
hide_followers_count: true, | |||||
hide_follows: true, | |||||
hide_follows_count: true | |||||
}) | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user) | {:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user) | ||||
@@ -395,7 +396,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
end | end | ||||
test "shows when follows/followers are hidden" do | test "shows when follows/followers are hidden" do | ||||
user = insert(:user, info: %{hide_followers: true, hide_follows: true}) | |||||
user = insert(:user, hide_followers: true, hide_follows: true) | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user) | {:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user) | ||||
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | ||||
@@ -408,7 +409,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
end | end | ||||
test "shows actual follower/following count to the account owner" do | test "shows actual follower/following count to the account owner" do | ||||
user = insert(:user, info: %{hide_followers: true, hide_follows: true}) | |||||
user = insert(:user, hide_followers: true, hide_follows: true) | |||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user) | {:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user) | ||||
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | ||||
@@ -456,7 +457,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
end | end | ||||
test "shows non-zero when follow requests are pending" do | test "shows non-zero when follow requests are pending" do | ||||
user = insert(:user, %{info: %{locked: true}}) | |||||
user = insert(:user, locked: true) | |||||
assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) | assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) | ||||
@@ -468,7 +469,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
end | end | ||||
test "decreases when accepting a follow request" do | test "decreases when accepting a follow request" do | ||||
user = insert(:user, %{info: %{locked: true}}) | |||||
user = insert(:user, locked: true) | |||||
assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) | assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) | ||||
@@ -485,7 +486,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
end | end | ||||
test "decreases when rejecting a follow request" do | test "decreases when rejecting a follow request" do | ||||
user = insert(:user, %{info: %{locked: true}}) | |||||
user = insert(:user, locked: true) | |||||
assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) | assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) | ||||
@@ -502,14 +503,14 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
end | end | ||||
test "shows non-zero when historical unapproved requests are present" do | test "shows non-zero when historical unapproved requests are present" do | ||||
user = insert(:user, %{info: %{locked: true}}) | |||||
user = insert(:user, locked: true) | |||||
assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) | assert %{locked: true} = AccountView.render("show.json", %{user: user, for: user}) | ||||
other_user = insert(:user) | other_user = insert(:user) | ||||
{:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user) | ||||
{:ok, user} = User.update_info(user, &User.Info.user_upgrade(&1, %{locked: false})) | |||||
{:ok, user} = User.update_and_set_cache(user, %{locked: false}) | |||||
assert %{locked: false, follow_requests_count: 1} = | assert %{locked: false, follow_requests_count: 1} = | ||||
AccountView.render("show.json", %{user: user, for: user}) | AccountView.render("show.json", %{user: user, for: user}) | ||||
@@ -24,8 +24,8 @@ defmodule Pleroma.Web.NodeInfoTest do | |||||
end | end | ||||
test "nodeinfo shows staff accounts", %{conn: conn} do | test "nodeinfo shows staff accounts", %{conn: conn} do | ||||
moderator = insert(:user, %{local: true, info: %{is_moderator: true}}) | |||||
admin = insert(:user, %{local: true, info: %{is_admin: true}}) | |||||
moderator = insert(:user, local: true, is_moderator: true) | |||||
admin = insert(:user, local: true, is_admin: true) | |||||
conn = | conn = | ||||
conn | conn | ||||
@@ -780,8 +780,8 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do | |||||
{:ok, user} = | {:ok, user} = | ||||
insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt(password)) | insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt(password)) | ||||
|> User.change_info(&User.Info.confirmation_changeset(&1, need_confirmation: true)) | |||||
|> Repo.update() | |||||
|> User.confirmation_changeset(need_confirmation: true) | |||||
|> User.update_and_set_cache() | |||||
refute Pleroma.User.auth_active?(user) | refute Pleroma.User.auth_active?(user) | ||||
@@ -808,7 +808,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do | |||||
user = | user = | ||||
insert(:user, | insert(:user, | ||||
password_hash: Comeonin.Pbkdf2.hashpwsalt(password), | password_hash: Comeonin.Pbkdf2.hashpwsalt(password), | ||||
info: %{deactivated: true} | |||||
deactivated: true | |||||
) | ) | ||||
app = insert(:oauth_app) | app = insert(:oauth_app) | ||||
@@ -834,7 +834,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do | |||||
user = | user = | ||||
insert(:user, | insert(:user, | ||||
password_hash: Comeonin.Pbkdf2.hashpwsalt(password), | password_hash: Comeonin.Pbkdf2.hashpwsalt(password), | ||||
info: %{password_reset_pending: true} | |||||
password_reset_pending: true | |||||
) | ) | ||||
app = insert(:oauth_app, scopes: ["read", "write"]) | app = insert(:oauth_app, scopes: ["read", "write"]) | ||||
@@ -51,7 +51,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do | |||||
end) =~ "[error]" | end) =~ "[error]" | ||||
# Wrong key | # Wrong key | ||||
info = %{ | |||||
update_params = %{ | |||||
magic_key: | magic_key: | ||||
"RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwrong1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB" | "RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwrong1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB" | ||||
} | } | ||||
@@ -59,7 +59,8 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do | |||||
# Set a wrong magic-key for a user so it has to refetch | # Set a wrong magic-key for a user so it has to refetch | ||||
"http://gs.example.org:4040/index.php/user/1" | "http://gs.example.org:4040/index.php/user/1" | ||||
|> User.get_cached_by_ap_id() | |> User.get_cached_by_ap_id() | ||||
|> User.update_info(&User.Info.remote_user_creation(&1, info)) | |||||
|> User.update_changeset(update_params) | |||||
|> User.update_and_set_cache() | |||||
assert capture_log(fn -> | assert capture_log(fn -> | ||||
conn = | conn = | ||||
@@ -33,7 +33,7 @@ defmodule Pleroma.Web.OStatusTest do | |||||
object = Object.normalize(activity) | object = Object.normalize(activity) | ||||
user = User.get_cached_by_ap_id(activity.data["actor"]) | user = User.get_cached_by_ap_id(activity.data["actor"]) | ||||
assert user.info.note_count == 1 | |||||
assert user.note_count == 1 | |||||
assert activity.data["type"] == "Create" | assert activity.data["type"] == "Create" | ||||
assert object.data["type"] == "Note" | assert object.data["type"] == "Note" | ||||
@@ -328,7 +328,7 @@ defmodule Pleroma.Web.OStatusTest do | |||||
test "refuse following over OStatus if the followed's account is locked" do | test "refuse following over OStatus if the followed's account is locked" do | ||||
incoming = File.read!("test/fixtures/follow.xml") | incoming = File.read!("test/fixtures/follow.xml") | ||||
_user = insert(:user, info: %{locked: true}, ap_id: "https://pawoo.net/users/pekorino") | |||||
_user = insert(:user, locked: true, ap_id: "https://pawoo.net/users/pekorino") | |||||
{:ok, [{:error, "It's not possible to follow locked accounts over OStatus"}]} = | {:ok, [{:error, "It's not possible to follow locked accounts over OStatus"}]} = | ||||
OStatus.handle_incoming(incoming) | OStatus.handle_incoming(incoming) | ||||
@@ -392,7 +392,7 @@ defmodule Pleroma.Web.OStatusTest do | |||||
assert user.name == "Constance Variable" | assert user.name == "Constance Variable" | ||||
assert user.nickname == "lambadalambda@social.heldscal.la" | assert user.nickname == "lambadalambda@social.heldscal.la" | ||||
assert user.local == false | assert user.local == false | ||||
assert user.info.uri == uri | |||||
assert user.uri == uri | |||||
assert user.ap_id == uri | assert user.ap_id == uri | ||||
assert user.bio == "Call me Deacon Blues." | assert user.bio == "Call me Deacon Blues." | ||||
assert user.avatar["type"] == "Image" | assert user.avatar["type"] == "Image" | ||||
@@ -402,36 +402,34 @@ defmodule Pleroma.Web.OStatusTest do | |||||
assert user == user_again | assert user == user_again | ||||
end | end | ||||
test "find_or_make_user sets all the nessary input fields" do | |||||
test "find_or_make_user sets all the necessary input fields" do | |||||
uri = "https://social.heldscal.la/user/23211" | uri = "https://social.heldscal.la/user/23211" | ||||
{:ok, user} = OStatus.find_or_make_user(uri) | {:ok, user} = OStatus.find_or_make_user(uri) | ||||
assert user.info == | |||||
%User.Info{ | |||||
id: user.info.id, | |||||
ap_enabled: false, | |||||
background: %{}, | |||||
banner: %{}, | |||||
blocks: [], | |||||
deactivated: false, | |||||
default_scope: "public", | |||||
domain_blocks: [], | |||||
follower_count: 0, | |||||
is_admin: false, | |||||
is_moderator: false, | |||||
keys: nil, | |||||
locked: false, | |||||
no_rich_text: false, | |||||
note_count: 0, | |||||
settings: nil, | |||||
source_data: %{}, | |||||
hub: "https://social.heldscal.la/main/push/hub", | |||||
magic_key: | |||||
"RSA.uzg6r1peZU0vXGADWxGJ0PE34WvmhjUmydbX5YYdOiXfODVLwCMi1umGoqUDm-mRu4vNEdFBVJU1CpFA7dKzWgIsqsa501i2XqElmEveXRLvNRWFB6nG03Q5OUY2as8eE54BJm0p20GkMfIJGwP6TSFb-ICp3QjzbatuSPJ6xCE=.AQAB", | |||||
salmon: "https://social.heldscal.la/main/salmon/user/23211", | |||||
topic: "https://social.heldscal.la/api/statuses/user_timeline/23211.atom", | |||||
uri: "https://social.heldscal.la/user/23211" | |||||
} | |||||
assert user.ap_enabled == false | |||||
assert user.background == %{} | |||||
assert user.banner == %{} | |||||
assert user.blocks == [] | |||||
assert user.deactivated == false | |||||
assert user.default_scope == "public" | |||||
assert user.domain_blocks == [] | |||||
assert user.follower_count == 0 | |||||
assert user.is_admin == false | |||||
assert user.is_moderator == false | |||||
assert user.is_moderator == false | |||||
assert is_nil(user.keys) | |||||
assert user.locked == false | |||||
assert user.magic_key == | |||||
"RSA.uzg6r1peZU0vXGADWxGJ0PE34WvmhjUmydbX5YYdOiXfODVLwCMi1umGoqUDm-mRu4vNEdFBVJU1CpFA7dKzWgIsqsa501i2XqElmEveXRLvNRWFB6nG03Q5OUY2as8eE54BJm0p20GkMfIJGwP6TSFb-ICp3QjzbatuSPJ6xCE=.AQAB" | |||||
assert user.no_rich_text == false | |||||
assert user.note_count == 0 | |||||
assert is_nil(user.settings) | |||||
assert user.hub == "https://social.heldscal.la/main/push/hub" | |||||
assert user.salmon == "https://social.heldscal.la/main/salmon/user/23211" | |||||
assert user.topic == "https://social.heldscal.la/api/statuses/user_timeline/23211.atom" | |||||
assert user.uri == "https://social.heldscal.la/user/23211" | |||||
end | end | ||||
test "find_make_or_update_actor takes an author element and returns an updated user" do | test "find_make_or_update_actor takes an author element and returns an updated user" do | ||||
@@ -465,7 +463,7 @@ defmodule Pleroma.Web.OStatusTest do | |||||
user = | user = | ||||
insert(:user, %{ | insert(:user, %{ | ||||
ap_id: "https://social.heldscal.la/user/23211", | ap_id: "https://social.heldscal.la/user/23211", | ||||
info: %{ap_enabled: true}, | |||||
ap_enabled: true, | |||||
local: false | local: false | ||||
}) | }) | ||||
@@ -484,7 +482,7 @@ defmodule Pleroma.Web.OStatusTest do | |||||
user = | user = | ||||
insert(:user, %{ | insert(:user, %{ | ||||
ap_id: "https://social.heldscal.la/user/23211", | ap_id: "https://social.heldscal.la/user/23211", | ||||
info: %{ap_enabled: true}, | |||||
ap_enabled: true, | |||||
local: false | local: false | ||||
}) | }) | ||||
@@ -6,7 +6,6 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do | |||||
use Pleroma.Web.ConnCase | use Pleroma.Web.ConnCase | ||||
alias Pleroma.Config | alias Pleroma.Config | ||||
alias Pleroma.Repo | |||||
alias Pleroma.Tests.ObanHelpers | alias Pleroma.Tests.ObanHelpers | ||||
alias Pleroma.User | alias Pleroma.User | ||||
alias Pleroma.Web.CommonAPI | alias Pleroma.Web.CommonAPI | ||||
@@ -20,10 +19,10 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do | |||||
setup do | setup do | ||||
{:ok, user} = | {:ok, user} = | ||||
insert(:user) | insert(:user) | ||||
|> User.change_info(&User.Info.confirmation_changeset(&1, need_confirmation: true)) | |||||
|> Repo.update() | |||||
|> User.confirmation_changeset(need_confirmation: true) | |||||
|> User.update_and_set_cache() | |||||
assert user.info.confirmation_pending | |||||
assert user.confirmation_pending | |||||
[user: user] | [user: user] | ||||
end | end | ||||
@@ -105,7 +104,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do | |||||
|> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => @image}) | |> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => @image}) | ||||
user = refresh_record(user) | user = refresh_record(user) | ||||
assert user.info.banner["type"] == "Image" | |||||
assert user.banner["type"] == "Image" | |||||
assert %{"url" => _} = json_response(conn, 200) | assert %{"url" => _} = json_response(conn, 200) | ||||
end | end | ||||
@@ -119,7 +118,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do | |||||
|> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => ""}) | |> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => ""}) | ||||
user = refresh_record(user) | user = refresh_record(user) | ||||
assert user.info.banner == %{} | |||||
assert user.banner == %{} | |||||
assert %{"url" => nil} = json_response(conn, 200) | assert %{"url" => nil} = json_response(conn, 200) | ||||
end | end | ||||
@@ -135,7 +134,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do | |||||
|> patch("/api/v1/pleroma/accounts/update_background", %{"img" => @image}) | |> patch("/api/v1/pleroma/accounts/update_background", %{"img" => @image}) | ||||
user = refresh_record(user) | user = refresh_record(user) | ||||
assert user.info.background["type"] == "Image" | |||||
assert user.background["type"] == "Image" | |||||
assert %{"url" => _} = json_response(conn, 200) | assert %{"url" => _} = json_response(conn, 200) | ||||
end | end | ||||
@@ -148,14 +147,14 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do | |||||
|> patch("/api/v1/pleroma/accounts/update_background", %{"img" => ""}) | |> patch("/api/v1/pleroma/accounts/update_background", %{"img" => ""}) | ||||
user = refresh_record(user) | user = refresh_record(user) | ||||
assert user.info.background == %{} | |||||
assert user.background == %{} | |||||
assert %{"url" => nil} = json_response(conn, 200) | assert %{"url" => nil} = json_response(conn, 200) | ||||
end | end | ||||
end | end | ||||
describe "getting favorites timeline of specified user" do | describe "getting favorites timeline of specified user" do | ||||
setup do | setup do | ||||
[current_user, user] = insert_pair(:user, %{info: %{hide_favorites: false}}) | |||||
[current_user, user] = insert_pair(:user, hide_favorites: false) | |||||
[current_user: current_user, user: user] | [current_user: current_user, user: user] | ||||
end | end | ||||
@@ -319,7 +318,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do | |||||
conn: conn, | conn: conn, | ||||
current_user: current_user | current_user: current_user | ||||
} do | } do | ||||
user = insert(:user, %{info: %{hide_favorites: true}}) | |||||
user = insert(:user, hide_favorites: true) | |||||
activity = insert(:note_activity) | activity = insert(:note_activity) | ||||
CommonAPI.favorite(activity.id, user) | CommonAPI.favorite(activity.id, user) | ||||
@@ -341,7 +340,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do | |||||
|> assign(:user, current_user) | |> assign(:user, current_user) | ||||
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites") | |> get("/api/v1/pleroma/accounts/#{user.id}/favourites") | ||||
assert user.info.hide_favorites | |||||
assert user.hide_favorites | |||||
assert json_response(conn, 403) == %{"error" => "Can't get favorites"} | assert json_response(conn, 403) == %{"error" => "Can't get favorites"} | ||||
end | end | ||||
end | end | ||||
@@ -38,7 +38,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do | |||||
end | end | ||||
test "listing remote packs" do | test "listing remote packs" do | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = build_conn() |> assign(:user, admin) | conn = build_conn() |> assign(:user, admin) | ||||
resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200) | resp = conn |> get(emoji_api_path(conn, :list_packs)) |> json_response(200) | ||||
@@ -121,7 +121,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do | |||||
text(File.read!("#{@emoji_dir_path}/test_pack_nonshared/nonshared.zip")) | text(File.read!("#{@emoji_dir_path}/test_pack_nonshared/nonshared.zip")) | ||||
end) | end) | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = build_conn() |> assign(:user, admin) | conn = build_conn() |> assign(:user, admin) | ||||
@@ -206,7 +206,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do | |||||
end) | end) | ||||
{:ok, | {:ok, | ||||
admin: insert(:user, info: %{is_admin: true}), | |||||
admin: insert(:user, is_admin: true), | |||||
pack_file: pack_file, | pack_file: pack_file, | ||||
new_data: %{ | new_data: %{ | ||||
"license" => "Test license changed", | "license" => "Test license changed", | ||||
@@ -303,7 +303,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do | |||||
File.rm_rf!("#{@emoji_dir_path}/test_pack/dir_2") | File.rm_rf!("#{@emoji_dir_path}/test_pack/dir_2") | ||||
end) | end) | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = build_conn() | conn = build_conn() | ||||
@@ -391,7 +391,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do | |||||
File.rm_rf!("#{@emoji_dir_path}/test_created") | File.rm_rf!("#{@emoji_dir_path}/test_created") | ||||
end) | end) | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
conn = build_conn() |> assign(:user, admin) | conn = build_conn() |> assign(:user, admin) | ||||
@@ -431,7 +431,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do | |||||
refute Map.has_key?(resp, "test_pack_for_import") | refute Map.has_key?(resp, "test_pack_for_import") | ||||
admin = insert(:user, info: %{is_admin: true}) | |||||
admin = insert(:user, is_admin: true) | |||||
assert conn | assert conn | ||||
|> assign(:user, admin) | |> assign(:user, admin) | ||||
@@ -71,9 +71,7 @@ defmodule Pleroma.Web.Salmon.SalmonTest do | |||||
[:passthrough], | [:passthrough], | ||||
[] do | [] do | ||||
user_data = %{ | user_data = %{ | ||||
info: %{ | |||||
salmon: "http://test-example.org/salmon" | |||||
}, | |||||
salmon: "http://test-example.org/salmon", | |||||
local: false | local: false | ||||
} | } | ||||
@@ -213,7 +213,7 @@ defmodule Pleroma.Web.StreamerTest do | |||||
test "it sends message if recipients invalid and thread containment is enabled but user's thread containment is disabled" do | test "it sends message if recipients invalid and thread containment is enabled but user's thread containment is disabled" do | ||||
Pleroma.Config.put([:instance, :skip_thread_containment], false) | Pleroma.Config.put([:instance, :skip_thread_containment], false) | ||||
author = insert(:user) | author = insert(:user) | ||||
user = insert(:user, following: [author.ap_id], info: %{skip_thread_containment: true}) | |||||
user = insert(:user, following: [author.ap_id], skip_thread_containment: true) | |||||
activity = | activity = | ||||
insert(:note_activity, | insert(:note_activity, | ||||
@@ -59,7 +59,7 @@ defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do | |||||
end | end | ||||
test "it sets password_reset_pending to false", %{conn: conn} do | test "it sets password_reset_pending to false", %{conn: conn} do | ||||
user = insert(:user, info: %{password_reset_pending: true}) | |||||
user = insert(:user, password_reset_pending: true) | |||||
{:ok, token} = PasswordResetToken.create_token(user) | {:ok, token} = PasswordResetToken.create_token(user) | ||||
{:ok, _access_token} = Token.create_token(insert(:oauth_app), user, %{}) | {:ok, _access_token} = Token.create_token(insert(:oauth_app), user, %{}) | ||||
@@ -75,7 +75,7 @@ defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do | |||||
|> post("/api/pleroma/password_reset", %{data: params}) | |> post("/api/pleroma/password_reset", %{data: params}) | ||||
|> html_response(:ok) | |> html_response(:ok) | ||||
assert User.get_by_id(user.id).info.password_reset_pending == false | |||||
assert User.get_by_id(user.id).password_reset_pending == false | |||||
end | end | ||||
end | end | ||||
end | end |
@@ -71,7 +71,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do | |||||
{:ok, user} = TwitterAPI.register_user(data) | {:ok, user} = TwitterAPI.register_user(data) | ||||
ObanHelpers.perform_all() | ObanHelpers.perform_all() | ||||
assert user.info.confirmation_pending | |||||
assert user.confirmation_pending | |||||
email = Pleroma.Emails.UserEmail.account_confirmation_email(user) | email = Pleroma.Emails.UserEmail.account_confirmation_email(user) | ||||
@@ -164,7 +164,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do | |||||
"follows" => true, | "follows" => true, | ||||
"non_follows" => true, | "non_follows" => true, | ||||
"non_followers" => true | "non_followers" => true | ||||
} == user.info.notification_settings | |||||
} == user.notification_settings | |||||
end | end | ||||
end | end | ||||
@@ -370,7 +370,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do | |||||
end | end | ||||
test "returns error when user is deactivated", %{conn: conn} do | test "returns error when user is deactivated", %{conn: conn} do | ||||
user = insert(:user, info: %{deactivated: true}) | |||||
user = insert(:user, deactivated: true) | |||||
user2 = insert(:user) | user2 = insert(:user) | ||||
response = | response = | ||||
@@ -568,7 +568,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do | |||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
assert user.info.deactivated == true | |||||
assert user.deactivated == true | |||||
end | end | ||||
test "it returns returns when password invalid", %{conn: conn} do | test "it returns returns when password invalid", %{conn: conn} do | ||||
@@ -583,7 +583,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do | |||||
assert response == %{"error" => "Invalid password."} | assert response == %{"error" => "Invalid password."} | ||||
user = User.get_cached_by_id(user.id) | user = User.get_cached_by_id(user.id) | ||||
refute user.info.deactivated | |||||
refute user.deactivated | |||||
end | end | ||||
end | end | ||||
@@ -109,7 +109,7 @@ defmodule Pleroma.Web.WebsubTest do | |||||
test "initiate a subscription for a given user and topic" do | test "initiate a subscription for a given user and topic" do | ||||
subscriber = insert(:user) | subscriber = insert(:user) | ||||
user = insert(:user, %{info: %Pleroma.User.Info{topic: "some_topic", hub: "some_hub"}}) | |||||
user = insert(:user, topic: "some_topic", hub: "some_hub") | |||||
{:ok, websub} = Websub.subscribe(subscriber, user, &accepting_verifier/1) | {:ok, websub} = Websub.subscribe(subscriber, user, &accepting_verifier/1) | ||||
assert websub.subscribers == [subscriber.ap_id] | assert websub.subscribers == [subscriber.ap_id] | ||||