Merge branch 'develop' into issue/1934-welcome-email
This commit is contained in:
commit
67ab9a7928
47 changed files with 579 additions and 174 deletions
|
@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- **Breaking:** Elixir >=1.9 is now required (was >= 1.8)
|
- **Breaking:** Elixir >=1.9 is now required (was >= 1.8)
|
||||||
|
- **Breaking:** Configuration: `:auto_linker, :opts` moved to `:pleroma, Pleroma.Formatter`. Old config namespace is deprecated.
|
||||||
- In Conversations, return only direct messages as `last_status`
|
- In Conversations, return only direct messages as `last_status`
|
||||||
- Using the `only_media` filter on timelines will now exclude reblog media
|
- Using the `only_media` filter on timelines will now exclude reblog media
|
||||||
- MFR policy to set global expiration for all local Create activities
|
- MFR policy to set global expiration for all local Create activities
|
||||||
|
@ -95,6 +96,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Admin API: fix `GET /api/pleroma/admin/users/:nickname/credentials` returning 404 when getting the credentials of a remote user while `:instance, :limit_to_local_content` is set to `:unauthenticated`
|
- Admin API: fix `GET /api/pleroma/admin/users/:nickname/credentials` returning 404 when getting the credentials of a remote user while `:instance, :limit_to_local_content` is set to `:unauthenticated`
|
||||||
- Fix CSP policy generation to include remote Captcha services
|
- Fix CSP policy generation to include remote Captcha services
|
||||||
- Fix edge case where MediaProxy truncates media, usually caused when Caddy is serving content for the other Federated instance.
|
- Fix edge case where MediaProxy truncates media, usually caused when Caddy is serving content for the other Federated instance.
|
||||||
|
- Emoji Packs could not be listed when instance was set to `public: false`
|
||||||
|
|
||||||
## [Unreleased (patch)]
|
## [Unreleased (patch)]
|
||||||
|
|
||||||
|
|
|
@ -539,16 +539,14 @@
|
||||||
federator_outgoing: 5
|
federator_outgoing: 5
|
||||||
]
|
]
|
||||||
|
|
||||||
config :auto_linker,
|
config :pleroma, Pleroma.Formatter,
|
||||||
opts: [
|
class: false,
|
||||||
extra: true,
|
rel: "ugc",
|
||||||
# TODO: Set to :no_scheme when it works properly
|
new_window: false,
|
||||||
validate_tld: true,
|
truncate: false,
|
||||||
class: false,
|
strip_prefix: false,
|
||||||
strip_prefix: false,
|
extra: true,
|
||||||
new_window: false,
|
validate_tld: :no_scheme
|
||||||
rel: "ugc"
|
|
||||||
]
|
|
||||||
|
|
||||||
config :pleroma, :ldap,
|
config :pleroma, :ldap,
|
||||||
enabled: System.get_env("LDAP_ENABLED") == "true",
|
enabled: System.get_env("LDAP_ENABLED") == "true",
|
||||||
|
|
|
@ -2277,11 +2277,12 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
group: :auto_linker,
|
group: :pleroma,
|
||||||
key: :opts,
|
key: Pleroma.Formatter,
|
||||||
label: "Auto Linker",
|
label: "Auto Linker",
|
||||||
type: :group,
|
type: :group,
|
||||||
description: "Configuration for the auto_linker library",
|
description:
|
||||||
|
"Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs.",
|
||||||
children: [
|
children: [
|
||||||
%{
|
%{
|
||||||
key: :class,
|
key: :class,
|
||||||
|
@ -2298,24 +2299,31 @@
|
||||||
%{
|
%{
|
||||||
key: :new_window,
|
key: :new_window,
|
||||||
type: :boolean,
|
type: :boolean,
|
||||||
description: "Link URLs will open in new window/tab"
|
description: "Link URLs will open in a new window/tab."
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
key: :truncate,
|
key: :truncate,
|
||||||
type: [:integer, false],
|
type: [:integer, false],
|
||||||
description:
|
description:
|
||||||
"Set to a number to truncate URLs longer then the number. Truncated URLs will end in `..`",
|
"Set to a number to truncate URLs longer than the number. Truncated URLs will end in `...`",
|
||||||
suggestions: [15, false]
|
suggestions: [15, false]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
key: :strip_prefix,
|
key: :strip_prefix,
|
||||||
type: :boolean,
|
type: :boolean,
|
||||||
description: "Strip the scheme prefix"
|
description: "Strip the scheme prefix."
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
key: :extra,
|
key: :extra,
|
||||||
type: :boolean,
|
type: :boolean,
|
||||||
description: "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
|
description: "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
key: :validate_tld,
|
||||||
|
type: [:atom, :boolean],
|
||||||
|
description:
|
||||||
|
"Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't)",
|
||||||
|
suggestions: [:no_scheme, true]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
|
@ -962,30 +962,29 @@ Configure OAuth 2 provider capabilities:
|
||||||
### :uri_schemes
|
### :uri_schemes
|
||||||
* `valid_schemes`: List of the scheme part that is considered valid to be an URL.
|
* `valid_schemes`: List of the scheme part that is considered valid to be an URL.
|
||||||
|
|
||||||
### :auto_linker
|
### Pleroma.Formatter
|
||||||
|
|
||||||
Configuration for the `auto_linker` library:
|
Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs.
|
||||||
|
|
||||||
* `class: "auto-linker"` - specify the class to be added to the generated link. false to clear.
|
* `class` - specify the class to be added to the generated link (default: `false`)
|
||||||
* `rel: "noopener noreferrer"` - override the rel attribute. false to clear.
|
* `rel` - specify the rel attribute (default: `ugc`)
|
||||||
* `new_window: true` - set to false to remove `target='_blank'` attribute.
|
* `new_window` - adds `target="_blank"` attribute (default: `false`)
|
||||||
* `scheme: false` - Set to true to link urls with schema `http://google.com`.
|
* `truncate` - Set to a number to truncate URLs longer then the number. Truncated URLs will end in `...` (default: `false`)
|
||||||
* `truncate: false` - Set to a number to truncate urls longer then the number. Truncated urls will end in `..`.
|
* `strip_prefix` - Strip the scheme prefix (default: `false`)
|
||||||
* `strip_prefix: true` - Strip the scheme prefix.
|
* `extra` - link URLs with rarely used schemes (magnet, ipfs, irc, etc.) (default: `true`)
|
||||||
* `extra: false` - link urls with rarely used schemes (magnet, ipfs, irc, etc.).
|
* `validate_tld` - Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for urls without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't) (default: `:no_scheme`)
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
config :auto_linker,
|
config :pleroma, Pleroma.Formatter,
|
||||||
opts: [
|
class: false,
|
||||||
scheme: true,
|
rel: "ugc",
|
||||||
extra: true,
|
new_window: false,
|
||||||
class: false,
|
truncate: false,
|
||||||
strip_prefix: false,
|
strip_prefix: false,
|
||||||
new_window: false,
|
extra: true,
|
||||||
rel: "ugc"
|
validate_tld: :no_scheme
|
||||||
]
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Custom Runtime Modules (`:modules`)
|
## Custom Runtime Modules (`:modules`)
|
||||||
|
|
|
@ -16,6 +16,7 @@ defmodule VerifyError, do: defexception([:message])
|
||||||
@spec verify!() :: :ok | VerifyError.t()
|
@spec verify!() :: :ok | VerifyError.t()
|
||||||
def verify! do
|
def verify! do
|
||||||
:ok
|
:ok
|
||||||
|
|> check_confirmation_accounts!
|
||||||
|> check_migrations_applied!()
|
|> check_migrations_applied!()
|
||||||
|> check_welcome_message_config!()
|
|> check_welcome_message_config!()
|
||||||
|> check_rum!()
|
|> check_rum!()
|
||||||
|
@ -41,6 +42,24 @@ defp check_welcome_message_config!(:ok) do
|
||||||
|
|
||||||
defp check_welcome_message_config!(result), do: result
|
defp check_welcome_message_config!(result), do: result
|
||||||
|
|
||||||
|
# Checks account confirmation email
|
||||||
|
#
|
||||||
|
def check_confirmation_accounts!(:ok) do
|
||||||
|
if Pleroma.Config.get([:instance, :account_activation_required]) &&
|
||||||
|
not Pleroma.Config.get([Pleroma.Emails.Mailer, :enabled]) do
|
||||||
|
Logger.error(
|
||||||
|
"Account activation enabled, but no Mailer settings enabled.\nPlease set config :pleroma, :instance, account_activation_required: false\nOtherwise setup and enable Mailer."
|
||||||
|
)
|
||||||
|
|
||||||
|
{:error,
|
||||||
|
"Account activation enabled, but Mailer is disabled. Cannot send confirmation emails."}
|
||||||
|
else
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_confirmation_accounts!(result), do: result
|
||||||
|
|
||||||
# Checks for pending migrations.
|
# Checks for pending migrations.
|
||||||
#
|
#
|
||||||
def check_migrations_applied!(:ok) do
|
def check_migrations_applied!(:ok) do
|
||||||
|
|
|
@ -156,7 +156,6 @@ defp only_full_update?(%ConfigDB{group: group, key: key}) do
|
||||||
{:quack, :meta},
|
{:quack, :meta},
|
||||||
{:mime, :types},
|
{:mime, :types},
|
||||||
{:cors_plug, [:max_age, :methods, :expose, :headers]},
|
{:cors_plug, [:max_age, :methods, :expose, :headers]},
|
||||||
{:auto_linker, :opts},
|
|
||||||
{:swarm, :node_blacklist},
|
{:swarm, :node_blacklist},
|
||||||
{:logger, :backends}
|
{:logger, :backends}
|
||||||
]
|
]
|
||||||
|
|
|
@ -10,11 +10,15 @@ defmodule Pleroma.Formatter do
|
||||||
@link_regex ~r"((?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~%:/?#[\]@!\$&'\(\)\*\+,;=.]+)|[0-9a-z+\-\.]+:[0-9a-z$-_.+!*'(),]+"ui
|
@link_regex ~r"((?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~%:/?#[\]@!\$&'\(\)\*\+,;=.]+)|[0-9a-z+\-\.]+:[0-9a-z$-_.+!*'(),]+"ui
|
||||||
@markdown_characters_regex ~r/(`|\*|_|{|}|[|]|\(|\)|#|\+|-|\.|!)/
|
@markdown_characters_regex ~r/(`|\*|_|{|}|[|]|\(|\)|#|\+|-|\.|!)/
|
||||||
|
|
||||||
@auto_linker_config hashtag: true,
|
defp linkify_opts do
|
||||||
hashtag_handler: &Pleroma.Formatter.hashtag_handler/4,
|
Pleroma.Config.get(Pleroma.Formatter) ++
|
||||||
mention: true,
|
[
|
||||||
mention_handler: &Pleroma.Formatter.mention_handler/4,
|
hashtag: true,
|
||||||
scheme: true
|
hashtag_handler: &Pleroma.Formatter.hashtag_handler/4,
|
||||||
|
mention: true,
|
||||||
|
mention_handler: &Pleroma.Formatter.mention_handler/4
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
def escape_mention_handler("@" <> nickname = mention, buffer, _, _) do
|
def escape_mention_handler("@" <> nickname = mention, buffer, _, _) do
|
||||||
case User.get_cached_by_nickname(nickname) do
|
case User.get_cached_by_nickname(nickname) do
|
||||||
|
@ -80,19 +84,19 @@ def hashtag_handler("#" <> tag = tag_text, _buffer, _opts, acc) do
|
||||||
@spec linkify(String.t(), keyword()) ::
|
@spec linkify(String.t(), keyword()) ::
|
||||||
{String.t(), [{String.t(), User.t()}], [{String.t(), String.t()}]}
|
{String.t(), [{String.t(), User.t()}], [{String.t(), String.t()}]}
|
||||||
def linkify(text, options \\ []) do
|
def linkify(text, options \\ []) do
|
||||||
options = options ++ @auto_linker_config
|
options = linkify_opts() ++ options
|
||||||
|
|
||||||
if options[:safe_mention] && Regex.named_captures(@safe_mention_regex, text) do
|
if options[:safe_mention] && Regex.named_captures(@safe_mention_regex, text) do
|
||||||
%{"mentions" => mentions, "rest" => rest} = Regex.named_captures(@safe_mention_regex, text)
|
%{"mentions" => mentions, "rest" => rest} = Regex.named_captures(@safe_mention_regex, text)
|
||||||
acc = %{mentions: MapSet.new(), tags: MapSet.new()}
|
acc = %{mentions: MapSet.new(), tags: MapSet.new()}
|
||||||
|
|
||||||
{text_mentions, %{mentions: mentions}} = AutoLinker.link_map(mentions, acc, options)
|
{text_mentions, %{mentions: mentions}} = Linkify.link_map(mentions, acc, options)
|
||||||
{text_rest, %{tags: tags}} = AutoLinker.link_map(rest, acc, options)
|
{text_rest, %{tags: tags}} = Linkify.link_map(rest, acc, options)
|
||||||
|
|
||||||
{text_mentions <> text_rest, MapSet.to_list(mentions), MapSet.to_list(tags)}
|
{text_mentions <> text_rest, MapSet.to_list(mentions), MapSet.to_list(tags)}
|
||||||
else
|
else
|
||||||
acc = %{mentions: MapSet.new(), tags: MapSet.new()}
|
acc = %{mentions: MapSet.new(), tags: MapSet.new()}
|
||||||
{text, %{mentions: mentions, tags: tags}} = AutoLinker.link_map(text, acc, options)
|
{text, %{mentions: mentions, tags: tags}} = Linkify.link_map(text, acc, options)
|
||||||
|
|
||||||
{text, MapSet.to_list(mentions), MapSet.to_list(tags)}
|
{text, MapSet.to_list(mentions), MapSet.to_list(tags)}
|
||||||
end
|
end
|
||||||
|
@ -111,9 +115,9 @@ def mentions_escape(text, options \\ []) do
|
||||||
|
|
||||||
if options[:safe_mention] && Regex.named_captures(@safe_mention_regex, text) do
|
if options[:safe_mention] && Regex.named_captures(@safe_mention_regex, text) do
|
||||||
%{"mentions" => mentions, "rest" => rest} = Regex.named_captures(@safe_mention_regex, text)
|
%{"mentions" => mentions, "rest" => rest} = Regex.named_captures(@safe_mention_regex, text)
|
||||||
AutoLinker.link(mentions, options) <> AutoLinker.link(rest, options)
|
Linkify.link(mentions, options) <> Linkify.link(rest, options)
|
||||||
else
|
else
|
||||||
AutoLinker.link(text, options)
|
Linkify.link(text, options)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -96,16 +96,18 @@ def response("") do
|
||||||
|
|
||||||
def response("/main/public") do
|
def response("/main/public") do
|
||||||
posts =
|
posts =
|
||||||
ActivityPub.fetch_public_activities(%{"type" => ["Create"], "local_only" => true})
|
%{type: ["Create"], local_only: true}
|
||||||
|> render_activities
|
|> ActivityPub.fetch_public_activities()
|
||||||
|
|> render_activities()
|
||||||
|
|
||||||
info("Welcome to the Public Timeline!") <> posts <> ".\r\n"
|
info("Welcome to the Public Timeline!") <> posts <> ".\r\n"
|
||||||
end
|
end
|
||||||
|
|
||||||
def response("/main/all") do
|
def response("/main/all") do
|
||||||
posts =
|
posts =
|
||||||
ActivityPub.fetch_public_activities(%{"type" => ["Create"]})
|
%{type: ["Create"]}
|
||||||
|> render_activities
|
|> ActivityPub.fetch_public_activities()
|
||||||
|
|> render_activities()
|
||||||
|
|
||||||
info("Welcome to the Federated Timeline!") <> posts <> ".\r\n"
|
info("Welcome to the Federated Timeline!") <> posts <> ".\r\n"
|
||||||
end
|
end
|
||||||
|
@ -130,13 +132,14 @@ def response("/notices/" <> id) do
|
||||||
def response("/users/" <> nickname) do
|
def response("/users/" <> nickname) do
|
||||||
with %User{} = user <- User.get_cached_by_nickname(nickname) do
|
with %User{} = user <- User.get_cached_by_nickname(nickname) do
|
||||||
params = %{
|
params = %{
|
||||||
"type" => ["Create"],
|
type: ["Create"],
|
||||||
"actor_id" => user.ap_id
|
actor_id: user.ap_id
|
||||||
}
|
}
|
||||||
|
|
||||||
activities =
|
activities =
|
||||||
ActivityPub.fetch_public_activities(params)
|
params
|
||||||
|> render_activities
|
|> ActivityPub.fetch_public_activities()
|
||||||
|
|> render_activities()
|
||||||
|
|
||||||
info("Posts by #{user.nickname}") <> activities <> ".\r\n"
|
info("Posts by #{user.nickname}") <> activities <> ".\r\n"
|
||||||
else
|
else
|
||||||
|
|
|
@ -124,6 +124,10 @@ def fetch_object_from_id!(id, options \\ []) do
|
||||||
{:error, "Object has been deleted"} ->
|
{:error, "Object has been deleted"} ->
|
||||||
nil
|
nil
|
||||||
|
|
||||||
|
{:reject, reason} ->
|
||||||
|
Logger.info("Rejected #{id} while fetching: #{inspect(reason)}")
|
||||||
|
nil
|
||||||
|
|
||||||
e ->
|
e ->
|
||||||
Logger.error("Error while fetching #{id}: #{inspect(e)}")
|
Logger.error("Error while fetching #{id}: #{inspect(e)}")
|
||||||
nil
|
nil
|
||||||
|
|
|
@ -740,21 +740,25 @@ def send_welcome_email(%User{email: email} = user) when is_binary(email) do
|
||||||
|
|
||||||
def send_welcome_email(_), do: {:ok, :noop}
|
def send_welcome_email(_), do: {:ok, :noop}
|
||||||
|
|
||||||
def try_send_confirmation_email(%User{} = user) do
|
@spec try_send_confirmation_email(User.t()) :: {:ok, :enqueued | :noop}
|
||||||
if user.confirmation_pending &&
|
def try_send_confirmation_email(%User{confirmation_pending: true} = user) do
|
||||||
Config.get([:instance, :account_activation_required]) do
|
if Config.get([:instance, :account_activation_required]) do
|
||||||
user
|
send_confirmation_email(user)
|
||||||
|> Pleroma.Emails.UserEmail.account_confirmation_email()
|
|
||||||
|> Pleroma.Emails.Mailer.deliver_async()
|
|
||||||
|
|
||||||
{:ok, :enqueued}
|
{:ok, :enqueued}
|
||||||
else
|
else
|
||||||
{:ok, :noop}
|
{:ok, :noop}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def try_send_confirmation_email(users) do
|
def try_send_confirmation_email(_), do: {:ok, :noop}
|
||||||
Enum.each(users, &try_send_confirmation_email/1)
|
|
||||||
|
@spec send_confirmation_email(Uset.t()) :: User.t()
|
||||||
|
def send_confirmation_email(%User{} = user) do
|
||||||
|
user
|
||||||
|
|> Pleroma.Emails.UserEmail.account_confirmation_email()
|
||||||
|
|> Pleroma.Emails.Mailer.deliver_async()
|
||||||
|
|
||||||
|
user
|
||||||
end
|
end
|
||||||
|
|
||||||
def needs_update?(%User{local: true}), do: false
|
def needs_update?(%User{local: true}), do: false
|
||||||
|
|
|
@ -1370,6 +1370,10 @@ def fetch_and_prepare_user_from_ap_id(ap_id) do
|
||||||
Logger.debug("Could not decode user at fetch #{ap_id}, #{inspect(e)}")
|
Logger.debug("Could not decode user at fetch #{ap_id}, #{inspect(e)}")
|
||||||
{:error, e}
|
{:error, e}
|
||||||
|
|
||||||
|
{:error, {:reject, reason} = e} ->
|
||||||
|
Logger.info("Rejected user #{ap_id}: #{inspect(reason)}")
|
||||||
|
{:error, e}
|
||||||
|
|
||||||
{:error, e} ->
|
{:error, e} ->
|
||||||
Logger.error("Could not decode user at fetch #{ap_id}, #{inspect(e)}")
|
Logger.error("Could not decode user at fetch #{ap_id}, #{inspect(e)}")
|
||||||
{:error, e}
|
{:error, e}
|
||||||
|
|
|
@ -178,7 +178,7 @@ def fix_in_reply_to(%{"inReplyTo" => in_reply_to} = object, options)
|
||||||
|> Map.drop(["conversation"])
|
|> Map.drop(["conversation"])
|
||||||
else
|
else
|
||||||
e ->
|
e ->
|
||||||
Logger.error("Couldn't fetch #{inspect(in_reply_to_id)}, error: #{inspect(e)}")
|
Logger.warn("Couldn't fetch #{inspect(in_reply_to_id)}, error: #{inspect(e)}")
|
||||||
object
|
object
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
|
|
@ -719,15 +719,18 @@ defp build_flag_object(act) when is_map(act) or is_binary(act) do
|
||||||
|
|
||||||
case Activity.get_by_ap_id_with_object(id) do
|
case Activity.get_by_ap_id_with_object(id) do
|
||||||
%Activity{} = activity ->
|
%Activity{} = activity ->
|
||||||
|
activity_actor = User.get_by_ap_id(activity.object.data["actor"])
|
||||||
|
|
||||||
%{
|
%{
|
||||||
"type" => "Note",
|
"type" => "Note",
|
||||||
"id" => activity.data["id"],
|
"id" => activity.data["id"],
|
||||||
"content" => activity.object.data["content"],
|
"content" => activity.object.data["content"],
|
||||||
"published" => activity.object.data["published"],
|
"published" => activity.object.data["published"],
|
||||||
"actor" =>
|
"actor" =>
|
||||||
AccountView.render("show.json", %{
|
AccountView.render(
|
||||||
user: User.get_by_ap_id(activity.object.data["actor"])
|
"show.json",
|
||||||
})
|
%{user: activity_actor, skip_visibility_check: true}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
|
|
|
@ -345,7 +345,11 @@ def list_users(conn, params) do
|
||||||
with {:ok, users, count} <- Search.user(Map.merge(search_params, filters)) do
|
with {:ok, users, count} <- Search.user(Map.merge(search_params, filters)) do
|
||||||
json(
|
json(
|
||||||
conn,
|
conn,
|
||||||
AccountView.render("index.json", users: users, count: count, page_size: page_size)
|
AccountView.render("index.json",
|
||||||
|
users: users,
|
||||||
|
count: count,
|
||||||
|
page_size: page_size
|
||||||
|
)
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -616,29 +620,24 @@ def reload_emoji(conn, _params) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def confirm_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do
|
def confirm_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do
|
||||||
users = nicknames |> Enum.map(&User.get_cached_by_nickname/1)
|
users = Enum.map(nicknames, &User.get_cached_by_nickname/1)
|
||||||
|
|
||||||
User.toggle_confirmation(users)
|
User.toggle_confirmation(users)
|
||||||
|
|
||||||
ModerationLog.insert_log(%{
|
ModerationLog.insert_log(%{actor: admin, subject: users, action: "confirm_email"})
|
||||||
actor: admin,
|
|
||||||
subject: users,
|
|
||||||
action: "confirm_email"
|
|
||||||
})
|
|
||||||
|
|
||||||
json(conn, "")
|
json(conn, "")
|
||||||
end
|
end
|
||||||
|
|
||||||
def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do
|
def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do
|
||||||
users = nicknames |> Enum.map(&User.get_cached_by_nickname/1)
|
users =
|
||||||
|
Enum.map(nicknames, fn nickname ->
|
||||||
|
nickname
|
||||||
|
|> User.get_cached_by_nickname()
|
||||||
|
|> User.send_confirmation_email()
|
||||||
|
end)
|
||||||
|
|
||||||
User.try_send_confirmation_email(users)
|
ModerationLog.insert_log(%{actor: admin, subject: users, action: "resend_confirmation_email"})
|
||||||
|
|
||||||
ModerationLog.insert_log(%{
|
|
||||||
actor: admin,
|
|
||||||
subject: users,
|
|
||||||
action: "resend_confirmation_email"
|
|
||||||
})
|
|
||||||
|
|
||||||
json(conn, "")
|
json(conn, "")
|
||||||
end
|
end
|
||||||
|
|
|
@ -105,7 +105,7 @@ def render("create-error.json", %{changeset: %Ecto.Changeset{changes: changes, e
|
||||||
end
|
end
|
||||||
|
|
||||||
def merge_account_views(%User{} = user) do
|
def merge_account_views(%User{} = user) do
|
||||||
MastodonAPI.AccountView.render("show.json", %{user: user})
|
MastodonAPI.AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
|> Map.merge(AdminAPI.AccountView.render("show.json", %{user: user}))
|
|> Map.merge(AdminAPI.AccountView.render("show.json", %{user: user}))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,10 @@
|
||||||
|
|
||||||
defmodule Pleroma.Web.ChatChannel do
|
defmodule Pleroma.Web.ChatChannel do
|
||||||
use Phoenix.Channel
|
use Phoenix.Channel
|
||||||
|
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ChatChannel.ChatChannelState
|
alias Pleroma.Web.ChatChannel.ChatChannelState
|
||||||
|
alias Pleroma.Web.MastodonAPI.AccountView
|
||||||
|
|
||||||
def join("chat:public", _message, socket) do
|
def join("chat:public", _message, socket) do
|
||||||
send(self(), :after_join)
|
send(self(), :after_join)
|
||||||
|
@ -22,9 +24,9 @@ def handle_in("new_msg", %{"text" => text}, %{assigns: %{user_name: user_name}}
|
||||||
|
|
||||||
if String.length(text) in 1..Pleroma.Config.get([:instance, :chat_limit]) do
|
if String.length(text) in 1..Pleroma.Config.get([:instance, :chat_limit]) do
|
||||||
author = User.get_cached_by_nickname(user_name)
|
author = User.get_cached_by_nickname(user_name)
|
||||||
author = Pleroma.Web.MastodonAPI.AccountView.render("show.json", user: author)
|
author_json = AccountView.render("show.json", user: author, skip_visibility_check: true)
|
||||||
|
|
||||||
message = ChatChannelState.add_message(%{text: text, author: author})
|
message = ChatChannelState.add_message(%{text: text, author: author_json})
|
||||||
|
|
||||||
broadcast!(socket, "new_msg", message)
|
broadcast!(socket, "new_msg", message)
|
||||||
end
|
end
|
||||||
|
|
|
@ -93,7 +93,6 @@ defp resource_search(_, "accounts", query, options) do
|
||||||
AccountView.render("index.json",
|
AccountView.render("index.json",
|
||||||
users: accounts,
|
users: accounts,
|
||||||
for: options[:for_user],
|
for: options[:for_user],
|
||||||
as: :user,
|
|
||||||
embed_relationships: options[:embed_relationships]
|
embed_relationships: options[:embed_relationships]
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
|
@ -27,21 +27,40 @@ def render("index.json", %{users: users} = opts) do
|
||||||
UserRelationship.view_relationships_option(reading_user, users)
|
UserRelationship.view_relationships_option(reading_user, users)
|
||||||
end
|
end
|
||||||
|
|
||||||
opts = Map.put(opts, :relationships, relationships_opt)
|
opts =
|
||||||
|
opts
|
||||||
|
|> Map.merge(%{relationships: relationships_opt, as: :user})
|
||||||
|
|> Map.delete(:users)
|
||||||
|
|
||||||
users
|
users
|
||||||
|> render_many(AccountView, "show.json", opts)
|
|> render_many(AccountView, "show.json", opts)
|
||||||
|> Enum.filter(&Enum.any?/1)
|
|> Enum.filter(&Enum.any?/1)
|
||||||
end
|
end
|
||||||
|
|
||||||
def render("show.json", %{user: user} = opts) do
|
@doc """
|
||||||
if User.visible_for(user, opts[:for]) == :visible do
|
Renders specified user account.
|
||||||
|
:skip_visibility_check option skips visibility check and renders any user (local or remote)
|
||||||
|
regardless of [:pleroma, :restrict_unauthenticated] setting.
|
||||||
|
:for option specifies the requester and can be a User record or nil.
|
||||||
|
Only use `user: user, for: user` when `user` is the actual requester of own profile.
|
||||||
|
"""
|
||||||
|
def render("show.json", %{user: _user, skip_visibility_check: true} = opts) do
|
||||||
|
do_render("show.json", opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
def render("show.json", %{user: user, for: for_user_or_nil} = opts) do
|
||||||
|
if User.visible_for(user, for_user_or_nil) == :visible do
|
||||||
do_render("show.json", opts)
|
do_render("show.json", opts)
|
||||||
else
|
else
|
||||||
%{}
|
%{}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def render("show.json", _) do
|
||||||
|
raise "In order to prevent account accessibility issues, " <>
|
||||||
|
":skip_visibility_check or :for option is required."
|
||||||
|
end
|
||||||
|
|
||||||
def render("mention.json", %{user: user}) do
|
def render("mention.json", %{user: user}) do
|
||||||
%{
|
%{
|
||||||
id: to_string(user.id),
|
id: to_string(user.id),
|
||||||
|
|
|
@ -38,7 +38,7 @@ def render("participation.json", %{participation: participation, for: user}) do
|
||||||
|
|
||||||
%{
|
%{
|
||||||
id: participation.id |> to_string(),
|
id: participation.id |> to_string(),
|
||||||
accounts: render(AccountView, "index.json", users: users, as: :user),
|
accounts: render(AccountView, "index.json", users: users, for: user),
|
||||||
unread: !participation.read,
|
unread: !participation.read,
|
||||||
last_status:
|
last_status:
|
||||||
render(StatusView, "show.json",
|
render(StatusView, "show.json",
|
||||||
|
|
|
@ -89,11 +89,11 @@ def post_chat_message(
|
||||||
cm_ref <- MessageReference.for_chat_and_object(chat, message) do
|
cm_ref <- MessageReference.for_chat_and_object(chat, message) do
|
||||||
conn
|
conn
|
||||||
|> put_view(MessageReferenceView)
|
|> put_view(MessageReferenceView)
|
||||||
|> render("show.json", for: user, chat_message_reference: cm_ref)
|
|> render("show.json", chat_message_reference: cm_ref)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def mark_message_as_read(%{assigns: %{user: %{id: user_id} = user}} = conn, %{
|
def mark_message_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{
|
||||||
id: chat_id,
|
id: chat_id,
|
||||||
message_id: message_id
|
message_id: message_id
|
||||||
}) do
|
}) do
|
||||||
|
@ -104,12 +104,15 @@ def mark_message_as_read(%{assigns: %{user: %{id: user_id} = user}} = conn, %{
|
||||||
{:ok, cm_ref} <- MessageReference.mark_as_read(cm_ref) do
|
{:ok, cm_ref} <- MessageReference.mark_as_read(cm_ref) do
|
||||||
conn
|
conn
|
||||||
|> put_view(MessageReferenceView)
|
|> put_view(MessageReferenceView)
|
||||||
|> render("show.json", for: user, chat_message_reference: cm_ref)
|
|> render("show.json", chat_message_reference: cm_ref)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def mark_as_read(
|
def mark_as_read(
|
||||||
%{body_params: %{last_read_id: last_read_id}, assigns: %{user: %{id: user_id}}} = conn,
|
%{
|
||||||
|
body_params: %{last_read_id: last_read_id},
|
||||||
|
assigns: %{user: %{id: user_id}}
|
||||||
|
} = conn,
|
||||||
%{id: id}
|
%{id: id}
|
||||||
) do
|
) do
|
||||||
with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id),
|
with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id),
|
||||||
|
@ -121,7 +124,7 @@ def mark_as_read(
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{id: id} = params) do
|
def messages(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id} = params) do
|
||||||
with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id) do
|
with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id) do
|
||||||
cm_refs =
|
cm_refs =
|
||||||
chat
|
chat
|
||||||
|
@ -130,7 +133,7 @@ def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{id: id} = para
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|> put_view(MessageReferenceView)
|
|> put_view(MessageReferenceView)
|
||||||
|> render("index.json", for: user, chat_message_references: cm_refs)
|
|> render("index.json", chat_message_references: cm_refs)
|
||||||
else
|
else
|
||||||
_ ->
|
_ ->
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -21,8 +21,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
@skip_plugs [Pleroma.Plugs.OAuthScopesPlug, Pleroma.Plugs.ExpectPublicOrAuthenticatedCheckPlug]
|
@skip_plugs [Pleroma.Plugs.OAuthScopesPlug, Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug]
|
||||||
plug(:skip_plug, @skip_plugs when action in [:archive, :show, :list])
|
plug(:skip_plug, @skip_plugs when action in [:index, :show, :archive])
|
||||||
|
|
||||||
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaEmojiPackOperation
|
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaEmojiPackOperation
|
||||||
|
|
||||||
|
|
|
@ -15,10 +15,11 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do
|
||||||
def render("show.json", %{chat: %Chat{} = chat} = opts) do
|
def render("show.json", %{chat: %Chat{} = chat} = opts) do
|
||||||
recipient = User.get_cached_by_ap_id(chat.recipient)
|
recipient = User.get_cached_by_ap_id(chat.recipient)
|
||||||
last_message = opts[:last_message] || MessageReference.last_message_for_chat(chat)
|
last_message = opts[:last_message] || MessageReference.last_message_for_chat(chat)
|
||||||
|
account_view_opts = account_view_opts(opts, recipient)
|
||||||
|
|
||||||
%{
|
%{
|
||||||
id: chat.id |> to_string(),
|
id: chat.id |> to_string(),
|
||||||
account: AccountView.render("show.json", Map.put(opts, :user, recipient)),
|
account: AccountView.render("show.json", account_view_opts),
|
||||||
unread: MessageReference.unread_count_for_chat(chat),
|
unread: MessageReference.unread_count_for_chat(chat),
|
||||||
last_message:
|
last_message:
|
||||||
last_message &&
|
last_message &&
|
||||||
|
@ -27,7 +28,17 @@ def render("show.json", %{chat: %Chat{} = chat} = opts) do
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def render("index.json", %{chats: chats}) do
|
def render("index.json", %{chats: chats} = opts) do
|
||||||
render_many(chats, __MODULE__, "show.json")
|
render_many(chats, __MODULE__, "show.json", Map.delete(opts, :chats))
|
||||||
|
end
|
||||||
|
|
||||||
|
defp account_view_opts(opts, recipient) do
|
||||||
|
account_view_opts = Map.put(opts, :user, recipient)
|
||||||
|
|
||||||
|
if Map.has_key?(account_view_opts, :for) do
|
||||||
|
account_view_opts
|
||||||
|
else
|
||||||
|
Map.put(account_view_opts, :skip_visibility_check, true)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,7 +17,7 @@ def render("show.json", %{emoji_reaction: [emoji, user_ap_ids], user: user}) do
|
||||||
%{
|
%{
|
||||||
name: emoji,
|
name: emoji,
|
||||||
count: length(users),
|
count: length(users),
|
||||||
accounts: render(AccountView, "index.json", users: users, for: user, as: :user),
|
accounts: render(AccountView, "index.json", users: users, for: user),
|
||||||
me: !!(user && user.ap_id in user_ap_ids)
|
me: !!(user && user.ap_id in user_ap_ids)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,10 +11,10 @@ defmodule Pleroma.Web.RichMedia.Helpers do
|
||||||
|
|
||||||
@spec validate_page_url(URI.t() | binary()) :: :ok | :error
|
@spec validate_page_url(URI.t() | binary()) :: :ok | :error
|
||||||
defp validate_page_url(page_url) when is_binary(page_url) do
|
defp validate_page_url(page_url) when is_binary(page_url) do
|
||||||
validate_tld = Application.get_env(:auto_linker, :opts)[:validate_tld]
|
validate_tld = Pleroma.Config.get([Pleroma.Formatter, :validate_tld])
|
||||||
|
|
||||||
page_url
|
page_url
|
||||||
|> AutoLinker.Parser.url?(scheme: true, validate_tld: validate_tld)
|
|> Linkify.Parser.url?(validate_tld: validate_tld)
|
||||||
|> parse_uri(page_url)
|
|> parse_uri(page_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
11
mix.exs
11
mix.exs
|
@ -151,12 +151,13 @@ defp deps do
|
||||||
{:credo, "~> 1.1.0", only: [:dev, :test], runtime: false},
|
{:credo, "~> 1.1.0", only: [:dev, :test], runtime: false},
|
||||||
{:mock, "~> 0.3.3", only: :test},
|
{:mock, "~> 0.3.3", only: :test},
|
||||||
{:crypt,
|
{:crypt,
|
||||||
git: "https://github.com/msantos/crypt", ref: "f63a705f92c26955977ee62a313012e309a4d77a"},
|
git: "https://github.com/msantos/crypt.git",
|
||||||
|
ref: "f63a705f92c26955977ee62a313012e309a4d77a"},
|
||||||
{:cors_plug, "~> 1.5"},
|
{:cors_plug, "~> 1.5"},
|
||||||
{:ex_doc, "~> 0.21", only: :dev, runtime: false},
|
{:ex_doc, "~> 0.21", only: :dev, runtime: false},
|
||||||
{:web_push_encryption, "~> 0.2.1"},
|
{:web_push_encryption, "~> 0.2.1"},
|
||||||
{:swoosh,
|
{:swoosh,
|
||||||
git: "https://github.com/swoosh/swoosh",
|
git: "https://github.com/swoosh/swoosh.git",
|
||||||
ref: "c96e0ca8a00d8f211ec1f042a4626b09f249caa5",
|
ref: "c96e0ca8a00d8f211ec1f042a4626b09f249caa5",
|
||||||
override: true},
|
override: true},
|
||||||
{:phoenix_swoosh, "~> 0.2"},
|
{:phoenix_swoosh, "~> 0.2"},
|
||||||
|
@ -166,9 +167,7 @@ defp deps do
|
||||||
{:floki, "~> 0.25"},
|
{:floki, "~> 0.25"},
|
||||||
{:timex, "~> 3.5"},
|
{:timex, "~> 3.5"},
|
||||||
{:ueberauth, "~> 0.4"},
|
{:ueberauth, "~> 0.4"},
|
||||||
{:auto_linker,
|
{:linkify, "~> 0.2.0"},
|
||||||
git: "https://git.pleroma.social/pleroma/auto_linker.git",
|
|
||||||
ref: "95e8188490e97505c56636c1379ffdf036c1fdde"},
|
|
||||||
{:http_signatures,
|
{:http_signatures,
|
||||||
git: "https://git.pleroma.social/pleroma/http_signatures.git",
|
git: "https://git.pleroma.social/pleroma/http_signatures.git",
|
||||||
ref: "293d77bb6f4a67ac8bde1428735c3b42f22cbb30"},
|
ref: "293d77bb6f4a67ac8bde1428735c3b42f22cbb30"},
|
||||||
|
@ -190,7 +189,7 @@ defp deps do
|
||||||
{:excoveralls, "~> 0.12.1", only: :test},
|
{:excoveralls, "~> 0.12.1", only: :test},
|
||||||
{:flake_id, "~> 0.1.0"},
|
{:flake_id, "~> 0.1.0"},
|
||||||
{:concurrent_limiter,
|
{:concurrent_limiter,
|
||||||
git: "https://git.pleroma.social/pleroma/elixir-libraries/concurrent_limiter",
|
git: "https://git.pleroma.social/pleroma/elixir-libraries/concurrent_limiter.git",
|
||||||
ref: "8eee96c6ba39b9286ec44c51c52d9f2758951365"},
|
ref: "8eee96c6ba39b9286ec44c51c52d9f2758951365"},
|
||||||
{:remote_ip,
|
{:remote_ip,
|
||||||
git: "https://git.pleroma.social/pleroma/remote_ip.git",
|
git: "https://git.pleroma.social/pleroma/remote_ip.git",
|
||||||
|
|
8
mix.lock
8
mix.lock
|
@ -1,6 +1,5 @@
|
||||||
%{
|
%{
|
||||||
"accept": {:hex, :accept, "0.3.5", "b33b127abca7cc948bbe6caa4c263369abf1347cfa9d8e699c6d214660f10cd1", [:rebar3], [], "hexpm", "11b18c220bcc2eab63b5470c038ef10eb6783bcb1fcdb11aa4137defa5ac1bb8"},
|
"accept": {:hex, :accept, "0.3.5", "b33b127abca7cc948bbe6caa4c263369abf1347cfa9d8e699c6d214660f10cd1", [:rebar3], [], "hexpm", "11b18c220bcc2eab63b5470c038ef10eb6783bcb1fcdb11aa4137defa5ac1bb8"},
|
||||||
"auto_linker": {:git, "https://git.pleroma.social/pleroma/auto_linker.git", "95e8188490e97505c56636c1379ffdf036c1fdde", [ref: "95e8188490e97505c56636c1379ffdf036c1fdde"]},
|
|
||||||
"base62": {:hex, :base62, "1.2.1", "4866763e08555a7b3917064e9eef9194c41667276c51b59de2bc42c6ea65f806", [:mix], [{:custom_base, "~> 0.2.1", [hex: :custom_base, repo: "hexpm", optional: false]}], "hexpm", "3b29948de2013d3f93aa898c884a9dff847e7aec75d9d6d8c1dc4c61c2716c42"},
|
"base62": {:hex, :base62, "1.2.1", "4866763e08555a7b3917064e9eef9194c41667276c51b59de2bc42c6ea65f806", [:mix], [{:custom_base, "~> 0.2.1", [hex: :custom_base, repo: "hexpm", optional: false]}], "hexpm", "3b29948de2013d3f93aa898c884a9dff847e7aec75d9d6d8c1dc4c61c2716c42"},
|
||||||
"base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"},
|
"base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"},
|
||||||
"bbcode": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/bbcode.git", "f2d267675e9a7e1ad1ea9beb4cc23382762b66c2", [ref: "v0.2.0"]},
|
"bbcode": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/bbcode.git", "f2d267675e9a7e1ad1ea9beb4cc23382762b66c2", [ref: "v0.2.0"]},
|
||||||
|
@ -15,14 +14,14 @@
|
||||||
"certifi": {:hex, :certifi, "2.5.2", "b7cfeae9d2ed395695dd8201c57a2d019c0c43ecaf8b8bcb9320b40d6662f340", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "3b3b5f36493004ac3455966991eaf6e768ce9884693d9968055aeeeb1e575040"},
|
"certifi": {:hex, :certifi, "2.5.2", "b7cfeae9d2ed395695dd8201c57a2d019c0c43ecaf8b8bcb9320b40d6662f340", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "3b3b5f36493004ac3455966991eaf6e768ce9884693d9968055aeeeb1e575040"},
|
||||||
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
|
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
|
||||||
"comeonin": {:hex, :comeonin, "5.3.1", "7fe612b739c78c9c1a75186ef2d322ce4d25032d119823269d0aa1e2f1e20025", [:mix], [], "hexpm", "d6222483060c17f0977fad1b7401ef0c5863c985a64352755f366aee3799c245"},
|
"comeonin": {:hex, :comeonin, "5.3.1", "7fe612b739c78c9c1a75186ef2d322ce4d25032d119823269d0aa1e2f1e20025", [:mix], [], "hexpm", "d6222483060c17f0977fad1b7401ef0c5863c985a64352755f366aee3799c245"},
|
||||||
"concurrent_limiter": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/concurrent_limiter", "8eee96c6ba39b9286ec44c51c52d9f2758951365", [ref: "8eee96c6ba39b9286ec44c51c52d9f2758951365"]},
|
"concurrent_limiter": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/concurrent_limiter.git", "8eee96c6ba39b9286ec44c51c52d9f2758951365", [ref: "8eee96c6ba39b9286ec44c51c52d9f2758951365"]},
|
||||||
"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"},
|
"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"},
|
||||||
"cors_plug": {:hex, :cors_plug, "1.5.2", "72df63c87e4f94112f458ce9d25800900cc88608c1078f0e4faddf20933eda6e", [:mix], [{:plug, "~> 1.3 or ~> 1.4 or ~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "9af027d20dc12dd0c4345a6b87247e0c62965871feea0bfecf9764648b02cc69"},
|
"cors_plug": {:hex, :cors_plug, "1.5.2", "72df63c87e4f94112f458ce9d25800900cc88608c1078f0e4faddf20933eda6e", [:mix], [{:plug, "~> 1.3 or ~> 1.4 or ~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "9af027d20dc12dd0c4345a6b87247e0c62965871feea0bfecf9764648b02cc69"},
|
||||||
"cowboy": {:hex, :cowboy, "2.7.0", "91ed100138a764355f43316b1d23d7ff6bdb0de4ea618cb5d8677c93a7a2f115", [:rebar3], [{:cowlib, "~> 2.8.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "04fd8c6a39edc6aaa9c26123009200fc61f92a3a94f3178c527b70b767c6e605"},
|
"cowboy": {:hex, :cowboy, "2.7.0", "91ed100138a764355f43316b1d23d7ff6bdb0de4ea618cb5d8677c93a7a2f115", [:rebar3], [{:cowlib, "~> 2.8.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "04fd8c6a39edc6aaa9c26123009200fc61f92a3a94f3178c527b70b767c6e605"},
|
||||||
"cowlib": {:hex, :cowlib, "2.8.0", "fd0ff1787db84ac415b8211573e9a30a3ebe71b5cbff7f720089972b2319c8a4", [:rebar3], [], "hexpm", "79f954a7021b302186a950a32869dbc185523d99d3e44ce430cd1f3289f41ed4"},
|
"cowlib": {:hex, :cowlib, "2.8.0", "fd0ff1787db84ac415b8211573e9a30a3ebe71b5cbff7f720089972b2319c8a4", [:rebar3], [], "hexpm", "79f954a7021b302186a950a32869dbc185523d99d3e44ce430cd1f3289f41ed4"},
|
||||||
"credo": {:hex, :credo, "1.1.5", "caec7a3cadd2e58609d7ee25b3931b129e739e070539ad1a0cd7efeeb47014f4", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "d0bbd3222607ccaaac5c0340f7f525c627ae4d7aee6c8c8c108922620c5b6446"},
|
"credo": {:hex, :credo, "1.1.5", "caec7a3cadd2e58609d7ee25b3931b129e739e070539ad1a0cd7efeeb47014f4", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "d0bbd3222607ccaaac5c0340f7f525c627ae4d7aee6c8c8c108922620c5b6446"},
|
||||||
"crontab": {:hex, :crontab, "1.1.8", "2ce0e74777dfcadb28a1debbea707e58b879e6aa0ffbf9c9bb540887bce43617", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm"},
|
"crontab": {:hex, :crontab, "1.1.8", "2ce0e74777dfcadb28a1debbea707e58b879e6aa0ffbf9c9bb540887bce43617", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm"},
|
||||||
"crypt": {:git, "https://github.com/msantos/crypt", "f63a705f92c26955977ee62a313012e309a4d77a", [ref: "f63a705f92c26955977ee62a313012e309a4d77a"]},
|
"crypt": {:git, "https://github.com/msantos/crypt.git", "f63a705f92c26955977ee62a313012e309a4d77a", [ref: "f63a705f92c26955977ee62a313012e309a4d77a"]},
|
||||||
"custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm", "8df019facc5ec9603e94f7270f1ac73ddf339f56ade76a721eaa57c1493ba463"},
|
"custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm", "8df019facc5ec9603e94f7270f1ac73ddf339f56ade76a721eaa57c1493ba463"},
|
||||||
"db_connection": {:hex, :db_connection, "2.2.2", "3bbca41b199e1598245b716248964926303b5d4609ff065125ce98bcd368939e", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "642af240d8a8affb93b4ba5a6fcd2bbcbdc327e1a524b825d383711536f8070c"},
|
"db_connection": {:hex, :db_connection, "2.2.2", "3bbca41b199e1598245b716248964926303b5d4609ff065125ce98bcd368939e", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "642af240d8a8affb93b4ba5a6fcd2bbcbdc327e1a524b825d383711536f8070c"},
|
||||||
"decimal": {:hex, :decimal, "1.8.1", "a4ef3f5f3428bdbc0d35374029ffcf4ede8533536fa79896dd450168d9acdf3c", [:mix], [], "hexpm", "3cb154b00225ac687f6cbd4acc4b7960027c757a5152b369923ead9ddbca7aec"},
|
"decimal": {:hex, :decimal, "1.8.1", "a4ef3f5f3428bdbc0d35374029ffcf4ede8533536fa79896dd450168d9acdf3c", [:mix], [], "hexpm", "3cb154b00225ac687f6cbd4acc4b7960027c757a5152b369923ead9ddbca7aec"},
|
||||||
|
@ -63,6 +62,7 @@
|
||||||
"jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"},
|
"jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"},
|
||||||
"jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
|
"jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
|
||||||
"libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"},
|
"libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"},
|
||||||
|
"linkify": {:hex, :linkify, "0.2.0", "2518bbbea21d2caa9d372424e1ad845b640c6630e2d016f1bd1f518f9ebcca28", [:mix], [], "hexpm", "b8ca8a68b79e30b7938d6c996085f3db14939f29538a59ca5101988bb7f917f6"},
|
||||||
"makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "a10c6eb62cca416019663129699769f0c2ccf39428b3bb3c0cb38c718a0c186d"},
|
"makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "a10c6eb62cca416019663129699769f0c2ccf39428b3bb3c0cb38c718a0c186d"},
|
||||||
"makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d4b316c7222a85bbaa2fd7c6e90e37e953257ad196dc229505137c5e505e9eff"},
|
"makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d4b316c7222a85bbaa2fd7c6e90e37e953257ad196dc229505137c5e505e9eff"},
|
||||||
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
|
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
|
||||||
|
@ -105,7 +105,7 @@
|
||||||
"sleeplocks": {:hex, :sleeplocks, "1.1.1", "3d462a0639a6ef36cc75d6038b7393ae537ab394641beb59830a1b8271faeed3", [:rebar3], [], "hexpm", "84ee37aeff4d0d92b290fff986d6a95ac5eedf9b383fadfd1d88e9b84a1c02e1"},
|
"sleeplocks": {:hex, :sleeplocks, "1.1.1", "3d462a0639a6ef36cc75d6038b7393ae537ab394641beb59830a1b8271faeed3", [:rebar3], [], "hexpm", "84ee37aeff4d0d92b290fff986d6a95ac5eedf9b383fadfd1d88e9b84a1c02e1"},
|
||||||
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
|
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
|
||||||
"sweet_xml": {:hex, :sweet_xml, "0.6.6", "fc3e91ec5dd7c787b6195757fbcf0abc670cee1e4172687b45183032221b66b8", [:mix], [], "hexpm", "2e1ec458f892ffa81f9f8386e3f35a1af6db7a7a37748a64478f13163a1f3573"},
|
"sweet_xml": {:hex, :sweet_xml, "0.6.6", "fc3e91ec5dd7c787b6195757fbcf0abc670cee1e4172687b45183032221b66b8", [:mix], [], "hexpm", "2e1ec458f892ffa81f9f8386e3f35a1af6db7a7a37748a64478f13163a1f3573"},
|
||||||
"swoosh": {:git, "https://github.com/swoosh/swoosh", "c96e0ca8a00d8f211ec1f042a4626b09f249caa5", [ref: "c96e0ca8a00d8f211ec1f042a4626b09f249caa5"]},
|
"swoosh": {:git, "https://github.com/swoosh/swoosh.git", "c96e0ca8a00d8f211ec1f042a4626b09f249caa5", [ref: "c96e0ca8a00d8f211ec1f042a4626b09f249caa5"]},
|
||||||
"syslog": {:hex, :syslog, "1.1.0", "6419a232bea84f07b56dc575225007ffe34d9fdc91abe6f1b2f254fd71d8efc2", [:rebar3], [], "hexpm", "4c6a41373c7e20587be33ef841d3de6f3beba08519809329ecc4d27b15b659e1"},
|
"syslog": {:hex, :syslog, "1.1.0", "6419a232bea84f07b56dc575225007ffe34d9fdc91abe6f1b2f254fd71d8efc2", [:rebar3], [], "hexpm", "4c6a41373c7e20587be33ef841d3de6f3beba08519809329ecc4d27b15b659e1"},
|
||||||
"telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"},
|
"telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"},
|
||||||
"tesla": {:git, "https://github.com/teamon/tesla.git", "af3707078b10793f6a534938e56b963aff82fe3c", [ref: "af3707078b10793f6a534938e56b963aff82fe3c"]},
|
"tesla": {:git, "https://github.com/teamon/tesla.git", "af3707078b10793f6a534938e56b963aff82fe3c", [ref: "af3707078b10793f6a534938e56b963aff82fe3c"]},
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.AutolinkerToLinkify do
|
||||||
|
use Ecto.Migration
|
||||||
|
alias Pleroma.ConfigDB
|
||||||
|
|
||||||
|
@autolinker_path %{group: :auto_linker, key: :opts}
|
||||||
|
@linkify_path %{group: :pleroma, key: Pleroma.Formatter}
|
||||||
|
|
||||||
|
@compat_opts [:class, :rel, :new_window, :truncate, :strip_prefix, :extra]
|
||||||
|
|
||||||
|
def change do
|
||||||
|
with {:ok, {old, new}} <- maybe_get_params() do
|
||||||
|
move_config(old, new)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp move_config(%{} = old, %{} = new) do
|
||||||
|
{:ok, _} = ConfigDB.update_or_create(new)
|
||||||
|
{:ok, _} = ConfigDB.delete(old)
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_get_params() do
|
||||||
|
with %ConfigDB{value: opts} <- ConfigDB.get_by_params(@autolinker_path),
|
||||||
|
opts <- transform_opts(opts),
|
||||||
|
%{} = linkify_params <- Map.put(@linkify_path, :value, opts) do
|
||||||
|
{:ok, {@autolinker_path, linkify_params}}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def transform_opts(opts) when is_list(opts) do
|
||||||
|
opts
|
||||||
|
|> Enum.into(%{})
|
||||||
|
|> Map.take(@compat_opts)
|
||||||
|
|> Map.to_list()
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,26 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.FixMalformedFormatterConfig do
|
||||||
|
use Ecto.Migration
|
||||||
|
alias Pleroma.ConfigDB
|
||||||
|
|
||||||
|
@config_path %{group: :pleroma, key: Pleroma.Formatter}
|
||||||
|
|
||||||
|
def change do
|
||||||
|
with %ConfigDB{value: %{} = opts} <- ConfigDB.get_by_params(@config_path),
|
||||||
|
fixed_opts <- Map.to_list(opts) do
|
||||||
|
fix_config(fixed_opts)
|
||||||
|
else
|
||||||
|
_ -> :skipped
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp fix_config(fixed_opts) when is_list(fixed_opts) do
|
||||||
|
{:ok, _} =
|
||||||
|
ConfigDB.update_or_create(%{
|
||||||
|
group: :pleroma,
|
||||||
|
key: Pleroma.Formatter,
|
||||||
|
value: fixed_opts
|
||||||
|
})
|
||||||
|
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
end
|
|
@ -23,6 +23,42 @@ test "raises if welcome email enabled but mail disabled" do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "check_confirmation_accounts!" do
|
||||||
|
setup_with_mocks([
|
||||||
|
{Pleroma.ApplicationRequirements, [:passthrough],
|
||||||
|
[
|
||||||
|
check_migrations_applied!: fn _ -> :ok end
|
||||||
|
]}
|
||||||
|
]) do
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
setup do: clear_config([:instance, :account_activation_required])
|
||||||
|
|
||||||
|
test "raises if account confirmation is required but mailer isn't enable" do
|
||||||
|
Pleroma.Config.put([:instance, :account_activation_required], true)
|
||||||
|
Pleroma.Config.put([Pleroma.Emails.Mailer, :enabled], false)
|
||||||
|
|
||||||
|
assert_raise Pleroma.ApplicationRequirements.VerifyError,
|
||||||
|
"Account activation enabled, but Mailer is disabled. Cannot send confirmation emails.",
|
||||||
|
fn ->
|
||||||
|
capture_log(&Pleroma.ApplicationRequirements.verify!/0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "doesn't do anything if account confirmation is disabled" do
|
||||||
|
Pleroma.Config.put([:instance, :account_activation_required], false)
|
||||||
|
Pleroma.Config.put([Pleroma.Emails.Mailer, :enabled], false)
|
||||||
|
assert Pleroma.ApplicationRequirements.verify!() == :ok
|
||||||
|
end
|
||||||
|
|
||||||
|
test "doesn't do anything if account confirmation is required and mailer is enabled" do
|
||||||
|
Pleroma.Config.put([:instance, :account_activation_required], true)
|
||||||
|
Pleroma.Config.put([Pleroma.Emails.Mailer, :enabled], true)
|
||||||
|
assert Pleroma.ApplicationRequirements.verify!() == :ok
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "check_rum!" do
|
describe "check_rum!" do
|
||||||
setup_with_mocks([
|
setup_with_mocks([
|
||||||
{Pleroma.ApplicationRequirements, [:passthrough],
|
{Pleroma.ApplicationRequirements, [:passthrough],
|
||||||
|
|
|
@ -10,6 +10,7 @@ defmodule Pleroma.FormatterTest do
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
|
||||||
setup_all do
|
setup_all do
|
||||||
|
clear_config(Pleroma.Formatter)
|
||||||
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
||||||
:ok
|
:ok
|
||||||
end
|
end
|
||||||
|
@ -255,6 +256,36 @@ test "it can parse mentions and return the relevant users" do
|
||||||
|
|
||||||
assert {_text, ^expected_mentions, []} = Formatter.linkify(text)
|
assert {_text, ^expected_mentions, []} = Formatter.linkify(text)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it parses URL containing local mention" do
|
||||||
|
_user = insert(:user, %{nickname: "lain"})
|
||||||
|
|
||||||
|
text = "https://example.com/@lain"
|
||||||
|
|
||||||
|
expected = ~S(<a href="https://example.com/@lain" rel="ugc">https://example.com/@lain</a>)
|
||||||
|
|
||||||
|
assert {^expected, [], []} = Formatter.linkify(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it correctly parses angry face D:< with mention" do
|
||||||
|
lain =
|
||||||
|
insert(:user, %{
|
||||||
|
nickname: "lain@lain.com",
|
||||||
|
ap_id: "https://lain.com/users/lain",
|
||||||
|
id: "9qrWmR0cKniB0YU0TA"
|
||||||
|
})
|
||||||
|
|
||||||
|
text = "@lain@lain.com D:<"
|
||||||
|
|
||||||
|
expected_text =
|
||||||
|
~S(<span class="h-card"><a class="u-url mention" data-user="9qrWmR0cKniB0YU0TA" href="https://lain.com/users/lain" rel="ugc">@<span>lain</span></a></span> D:<)
|
||||||
|
|
||||||
|
expected_mentions = [
|
||||||
|
{"@lain@lain.com", lain}
|
||||||
|
]
|
||||||
|
|
||||||
|
assert {^expected_text, ^expected_mentions, []} = Formatter.linkify(text)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe ".parse_tags" do
|
describe ".parse_tags" do
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.AutolinkerToLinkifyTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
import Pleroma.Factory
|
||||||
|
import Pleroma.Tests.Helpers
|
||||||
|
alias Pleroma.ConfigDB
|
||||||
|
|
||||||
|
setup do: clear_config(Pleroma.Formatter)
|
||||||
|
setup_all do: require_migration("20200716195806_autolinker_to_linkify")
|
||||||
|
|
||||||
|
test "change/0 converts auto_linker opts for Pleroma.Formatter", %{migration: migration} do
|
||||||
|
autolinker_opts = [
|
||||||
|
extra: true,
|
||||||
|
validate_tld: true,
|
||||||
|
class: false,
|
||||||
|
strip_prefix: false,
|
||||||
|
new_window: false,
|
||||||
|
rel: "testing"
|
||||||
|
]
|
||||||
|
|
||||||
|
insert(:config, group: :auto_linker, key: :opts, value: autolinker_opts)
|
||||||
|
|
||||||
|
migration.change()
|
||||||
|
|
||||||
|
assert nil == ConfigDB.get_by_params(%{group: :auto_linker, key: :opts})
|
||||||
|
|
||||||
|
%{value: new_opts} = ConfigDB.get_by_params(%{group: :pleroma, key: Pleroma.Formatter})
|
||||||
|
|
||||||
|
assert new_opts == [
|
||||||
|
class: false,
|
||||||
|
extra: true,
|
||||||
|
new_window: false,
|
||||||
|
rel: "testing",
|
||||||
|
strip_prefix: false
|
||||||
|
]
|
||||||
|
|
||||||
|
Pleroma.Config.put(Pleroma.Formatter, new_opts)
|
||||||
|
assert new_opts == Pleroma.Config.get(Pleroma.Formatter)
|
||||||
|
|
||||||
|
{text, _mentions, []} =
|
||||||
|
Pleroma.Formatter.linkify(
|
||||||
|
"https://www.businessinsider.com/walmart-will-close-stores-on-thanksgiving-ending-black-friday-tradition-2020-7\n\nOmg will COVID finally end Black Friday???"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert text ==
|
||||||
|
"<a href=\"https://www.businessinsider.com/walmart-will-close-stores-on-thanksgiving-ending-black-friday-tradition-2020-7\" rel=\"testing\">https://www.businessinsider.com/walmart-will-close-stores-on-thanksgiving-ending-black-friday-tradition-2020-7</a>\n\nOmg will COVID finally end Black Friday???"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "transform_opts/1 returns a list of compatible opts", %{migration: migration} do
|
||||||
|
old_opts = [
|
||||||
|
extra: true,
|
||||||
|
validate_tld: true,
|
||||||
|
class: false,
|
||||||
|
strip_prefix: false,
|
||||||
|
new_window: false,
|
||||||
|
rel: "qqq"
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_opts = [
|
||||||
|
class: false,
|
||||||
|
extra: true,
|
||||||
|
new_window: false,
|
||||||
|
rel: "qqq",
|
||||||
|
strip_prefix: false
|
||||||
|
]
|
||||||
|
|
||||||
|
assert migration.transform_opts(old_opts) == expected_opts
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,66 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.FixMalformedFormatterConfigTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
import Pleroma.Factory
|
||||||
|
import Pleroma.Tests.Helpers
|
||||||
|
alias Pleroma.ConfigDB
|
||||||
|
|
||||||
|
setup do: clear_config(Pleroma.Formatter)
|
||||||
|
setup_all do: require_migration("20200722185515_fix_malformed_formatter_config")
|
||||||
|
|
||||||
|
test "change/0 converts a map into a list", %{migration: migration} do
|
||||||
|
incorrect_opts = %{
|
||||||
|
class: false,
|
||||||
|
extra: true,
|
||||||
|
new_window: false,
|
||||||
|
rel: "F",
|
||||||
|
strip_prefix: false
|
||||||
|
}
|
||||||
|
|
||||||
|
insert(:config, group: :pleroma, key: Pleroma.Formatter, value: incorrect_opts)
|
||||||
|
|
||||||
|
assert :ok == migration.change()
|
||||||
|
|
||||||
|
%{value: new_opts} = ConfigDB.get_by_params(%{group: :pleroma, key: Pleroma.Formatter})
|
||||||
|
|
||||||
|
assert new_opts == [
|
||||||
|
class: false,
|
||||||
|
extra: true,
|
||||||
|
new_window: false,
|
||||||
|
rel: "F",
|
||||||
|
strip_prefix: false
|
||||||
|
]
|
||||||
|
|
||||||
|
Pleroma.Config.put(Pleroma.Formatter, new_opts)
|
||||||
|
assert new_opts == Pleroma.Config.get(Pleroma.Formatter)
|
||||||
|
|
||||||
|
{text, _mentions, []} =
|
||||||
|
Pleroma.Formatter.linkify(
|
||||||
|
"https://www.businessinsider.com/walmart-will-close-stores-on-thanksgiving-ending-black-friday-tradition-2020-7\n\nOmg will COVID finally end Black Friday???"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert text ==
|
||||||
|
"<a href=\"https://www.businessinsider.com/walmart-will-close-stores-on-thanksgiving-ending-black-friday-tradition-2020-7\" rel=\"F\">https://www.businessinsider.com/walmart-will-close-stores-on-thanksgiving-ending-black-friday-tradition-2020-7</a>\n\nOmg will COVID finally end Black Friday???"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "change/0 skips if Pleroma.Formatter config is already a list", %{migration: migration} do
|
||||||
|
opts = [
|
||||||
|
class: false,
|
||||||
|
extra: true,
|
||||||
|
new_window: false,
|
||||||
|
rel: "ugc",
|
||||||
|
strip_prefix: false
|
||||||
|
]
|
||||||
|
|
||||||
|
insert(:config, group: :pleroma, key: Pleroma.Formatter, value: opts)
|
||||||
|
|
||||||
|
assert :skipped == migration.change()
|
||||||
|
|
||||||
|
%{value: new_opts} = ConfigDB.get_by_params(%{group: :pleroma, key: Pleroma.Formatter})
|
||||||
|
|
||||||
|
assert new_opts == opts
|
||||||
|
end
|
||||||
|
|
||||||
|
test "change/0 skips if Pleroma.Formatter is empty", %{migration: migration} do
|
||||||
|
assert :skipped == migration.change()
|
||||||
|
end
|
||||||
|
end
|
|
@ -32,6 +32,11 @@ defmacro clear_config(config_path, temp_setting) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def require_migration(migration_name) do
|
||||||
|
[{module, _}] = Code.require_file("#{migration_name}.exs", "priv/repo/migrations")
|
||||||
|
{:ok, %{migration: module}}
|
||||||
|
end
|
||||||
|
|
||||||
defmacro __using__(_opts) do
|
defmacro __using__(_opts) do
|
||||||
quote do
|
quote do
|
||||||
import Pleroma.Tests.Helpers,
|
import Pleroma.Tests.Helpers,
|
||||||
|
|
|
@ -9,6 +9,8 @@ defmodule Pleroma.Upload.Filter.AnonymizeFilenameTest do
|
||||||
alias Pleroma.Upload
|
alias Pleroma.Upload
|
||||||
|
|
||||||
setup do
|
setup do
|
||||||
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
|
|
||||||
upload_file = %Upload{
|
upload_file = %Upload{
|
||||||
name: "an… image.jpg",
|
name: "an… image.jpg",
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpg",
|
||||||
|
|
|
@ -14,6 +14,7 @@ test "it returns path to local folder for files" do
|
||||||
|
|
||||||
describe "put_file/1" do
|
describe "put_file/1" do
|
||||||
test "put file to local folder" do
|
test "put file to local folder" do
|
||||||
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
file_path = "local_upload/files/image.jpg"
|
file_path = "local_upload/files/image.jpg"
|
||||||
|
|
||||||
file = %Pleroma.Upload{
|
file = %Pleroma.Upload{
|
||||||
|
@ -32,6 +33,7 @@ test "put file to local folder" do
|
||||||
|
|
||||||
describe "delete_file/1" do
|
describe "delete_file/1" do
|
||||||
test "deletes local file" do
|
test "deletes local file" do
|
||||||
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
file_path = "local_upload/files/image.jpg"
|
file_path = "local_upload/files/image.jpg"
|
||||||
|
|
||||||
file = %Pleroma.Upload{
|
file = %Pleroma.Upload{
|
||||||
|
|
|
@ -386,9 +386,10 @@ test "fetches correct profile for nickname beginning with number" do
|
||||||
password_confirmation: "test",
|
password_confirmation: "test",
|
||||||
email: "email@example.com"
|
email: "email@example.com"
|
||||||
}
|
}
|
||||||
setup do: clear_config([:instance, :autofollowed_nicknames])
|
|
||||||
|
|
||||||
|
setup do: clear_config([:instance, :autofollowed_nicknames])
|
||||||
setup do: clear_config([:welcome])
|
setup do: clear_config([:welcome])
|
||||||
|
setup do: clear_config([:instance, :account_activation_required])
|
||||||
|
|
||||||
test "it autofollows accounts that are set for it" do
|
test "it autofollows accounts that are set for it" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
@ -440,7 +441,14 @@ test "it sends a welcome message if it is set" do
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
setup do: clear_config([:instance, :account_activation_required])
|
test "it sends a confirm email" do
|
||||||
|
Pleroma.Config.put([:instance, :account_activation_required], true)
|
||||||
|
|
||||||
|
cng = User.register_changeset(%User{}, @full_user_data)
|
||||||
|
{:ok, registered_user} = User.register(cng)
|
||||||
|
ObanHelpers.perform_all()
|
||||||
|
assert_email_sent(Pleroma.Emails.UserEmail.account_confirmation_email(registered_user))
|
||||||
|
end
|
||||||
|
|
||||||
test "it requires an email, name, nickname and password, bio is optional when account_activation_required is enabled" do
|
test "it requires an email, name, nickname and password, bio is optional when account_activation_required is enabled" do
|
||||||
Pleroma.Config.put([:instance, :account_activation_required], true)
|
Pleroma.Config.put([:instance, :account_activation_required], true)
|
||||||
|
|
|
@ -1179,7 +1179,8 @@ test "it can create a Flag activity",
|
||||||
"id" => activity_ap_id,
|
"id" => activity_ap_id,
|
||||||
"content" => content,
|
"content" => content,
|
||||||
"published" => activity_with_object.object.data["published"],
|
"published" => activity_with_object.object.data["published"],
|
||||||
"actor" => AccountView.render("show.json", %{user: target_account})
|
"actor" =>
|
||||||
|
AccountView.render("show.json", %{user: target_account, skip_visibility_check: true})
|
||||||
}
|
}
|
||||||
|
|
||||||
assert %Activity{
|
assert %Activity{
|
||||||
|
|
|
@ -160,7 +160,7 @@ test "it does not crash if the object in inReplyTo can't be fetched" do
|
||||||
|
|
||||||
assert capture_log(fn ->
|
assert capture_log(fn ->
|
||||||
{:ok, _returned_activity} = Transmogrifier.handle_incoming(data)
|
{:ok, _returned_activity} = Transmogrifier.handle_incoming(data)
|
||||||
end) =~ "[error] Couldn't fetch \"https://404.site/whatever\", error: nil"
|
end) =~ "[warn] Couldn't fetch \"https://404.site/whatever\", error: nil"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it works for incoming notices" do
|
test "it works for incoming notices" do
|
||||||
|
@ -710,7 +710,7 @@ test "it accepts Flag activities" do
|
||||||
"id" => activity.data["id"],
|
"id" => activity.data["id"],
|
||||||
"content" => "test post",
|
"content" => "test post",
|
||||||
"published" => object.data["published"],
|
"published" => object.data["published"],
|
||||||
"actor" => AccountView.render("show.json", %{user: user})
|
"actor" => AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
}
|
}
|
||||||
|
|
||||||
message = %{
|
message = %{
|
||||||
|
|
|
@ -482,7 +482,8 @@ test "returns map with Flag object" do
|
||||||
"id" => activity_ap_id,
|
"id" => activity_ap_id,
|
||||||
"content" => content,
|
"content" => content,
|
||||||
"published" => activity.object.data["published"],
|
"published" => activity.object.data["published"],
|
||||||
"actor" => AccountView.render("show.json", %{user: target_account})
|
"actor" =>
|
||||||
|
AccountView.render("show.json", %{user: target_account, skip_visibility_check: true})
|
||||||
}
|
}
|
||||||
|
|
||||||
assert %{
|
assert %{
|
||||||
|
|
|
@ -9,6 +9,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
|
||||||
import ExUnit.CaptureLog
|
import ExUnit.CaptureLog
|
||||||
import Mock
|
import Mock
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
import Swoosh.TestAssertions
|
||||||
|
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.Config
|
alias Pleroma.Config
|
||||||
|
@ -1731,6 +1732,9 @@ test "it resend emails for two users", %{conn: conn, admin: admin} do
|
||||||
"@#{admin.nickname} re-sent confirmation email for users: @#{first_user.nickname}, @#{
|
"@#{admin.nickname} re-sent confirmation email for users: @#{first_user.nickname}, @#{
|
||||||
second_user.nickname
|
second_user.nickname
|
||||||
}"
|
}"
|
||||||
|
|
||||||
|
ObanHelpers.perform_all()
|
||||||
|
assert_email_sent(Pleroma.Emails.UserEmail.account_confirmation_email(first_user))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -4,11 +4,14 @@
|
||||||
|
|
||||||
defmodule Pleroma.Web.AdminAPI.ReportViewTest do
|
defmodule Pleroma.Web.AdminAPI.ReportViewTest do
|
||||||
use Pleroma.DataCase
|
use Pleroma.DataCase
|
||||||
|
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
alias Pleroma.Web.AdminAPI
|
||||||
alias Pleroma.Web.AdminAPI.Report
|
alias Pleroma.Web.AdminAPI.Report
|
||||||
alias Pleroma.Web.AdminAPI.ReportView
|
alias Pleroma.Web.AdminAPI.ReportView
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
alias Pleroma.Web.MastodonAPI.AccountView
|
alias Pleroma.Web.MastodonAPI
|
||||||
alias Pleroma.Web.MastodonAPI.StatusView
|
alias Pleroma.Web.MastodonAPI.StatusView
|
||||||
|
|
||||||
test "renders a report" do
|
test "renders a report" do
|
||||||
|
@ -21,13 +24,16 @@ test "renders a report" do
|
||||||
content: nil,
|
content: nil,
|
||||||
actor:
|
actor:
|
||||||
Map.merge(
|
Map.merge(
|
||||||
AccountView.render("show.json", %{user: user}),
|
MastodonAPI.AccountView.render("show.json", %{user: user, skip_visibility_check: true}),
|
||||||
Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: user})
|
AdminAPI.AccountView.render("show.json", %{user: user})
|
||||||
),
|
),
|
||||||
account:
|
account:
|
||||||
Map.merge(
|
Map.merge(
|
||||||
AccountView.render("show.json", %{user: other_user}),
|
MastodonAPI.AccountView.render("show.json", %{
|
||||||
Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: other_user})
|
user: other_user,
|
||||||
|
skip_visibility_check: true
|
||||||
|
}),
|
||||||
|
AdminAPI.AccountView.render("show.json", %{user: other_user})
|
||||||
),
|
),
|
||||||
statuses: [],
|
statuses: [],
|
||||||
notes: [],
|
notes: [],
|
||||||
|
@ -56,13 +62,16 @@ test "includes reported statuses" do
|
||||||
content: nil,
|
content: nil,
|
||||||
actor:
|
actor:
|
||||||
Map.merge(
|
Map.merge(
|
||||||
AccountView.render("show.json", %{user: user}),
|
MastodonAPI.AccountView.render("show.json", %{user: user, skip_visibility_check: true}),
|
||||||
Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: user})
|
AdminAPI.AccountView.render("show.json", %{user: user})
|
||||||
),
|
),
|
||||||
account:
|
account:
|
||||||
Map.merge(
|
Map.merge(
|
||||||
AccountView.render("show.json", %{user: other_user}),
|
MastodonAPI.AccountView.render("show.json", %{
|
||||||
Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: other_user})
|
user: other_user,
|
||||||
|
skip_visibility_check: true
|
||||||
|
}),
|
||||||
|
AdminAPI.AccountView.render("show.json", %{user: other_user})
|
||||||
),
|
),
|
||||||
statuses: [StatusView.render("show.json", %{activity: activity})],
|
statuses: [StatusView.render("show.json", %{activity: activity})],
|
||||||
state: "open",
|
state: "open",
|
||||||
|
|
|
@ -95,7 +95,7 @@ test "Represent a user account" do
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert expected == AccountView.render("show.json", %{user: user})
|
assert expected == AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
end
|
end
|
||||||
|
|
||||||
test "Favicon is nil when :instances_favicons is disabled" do
|
test "Favicon is nil when :instances_favicons is disabled" do
|
||||||
|
@ -108,11 +108,12 @@ test "Favicon is nil when :instances_favicons is disabled" do
|
||||||
favicon:
|
favicon:
|
||||||
"https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/favicon-16x16.png"
|
"https://shitposter.club/plugins/Qvitter/img/gnusocial-favicons/favicon-16x16.png"
|
||||||
}
|
}
|
||||||
} = AccountView.render("show.json", %{user: user})
|
} = AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
|
|
||||||
Config.put([:instances_favicons, :enabled], false)
|
Config.put([:instances_favicons, :enabled], false)
|
||||||
|
|
||||||
assert %{pleroma: %{favicon: nil}} = AccountView.render("show.json", %{user: user})
|
assert %{pleroma: %{favicon: nil}} =
|
||||||
|
AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
end
|
end
|
||||||
|
|
||||||
test "Represent the user account for the account owner" do
|
test "Represent the user account for the account owner" do
|
||||||
|
@ -189,7 +190,7 @@ test "Represent a Service(bot) account" do
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert expected == AccountView.render("show.json", %{user: user})
|
assert expected == AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
end
|
end
|
||||||
|
|
||||||
test "Represent a Funkwhale channel" do
|
test "Represent a Funkwhale channel" do
|
||||||
|
@ -198,7 +199,9 @@ test "Represent a Funkwhale channel" do
|
||||||
"https://channels.tests.funkwhale.audio/federation/actors/compositions"
|
"https://channels.tests.funkwhale.audio/federation/actors/compositions"
|
||||||
)
|
)
|
||||||
|
|
||||||
assert represented = AccountView.render("show.json", %{user: user})
|
assert represented =
|
||||||
|
AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
|
|
||||||
assert represented.acct == "compositions@channels.tests.funkwhale.audio"
|
assert represented.acct == "compositions@channels.tests.funkwhale.audio"
|
||||||
assert represented.url == "https://channels.tests.funkwhale.audio/channels/compositions"
|
assert represented.url == "https://channels.tests.funkwhale.audio/channels/compositions"
|
||||||
end
|
end
|
||||||
|
@ -223,6 +226,23 @@ test "Represent a smaller mention" do
|
||||||
assert expected == AccountView.render("mention.json", %{user: user})
|
assert expected == AccountView.render("mention.json", %{user: user})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "demands :for or :skip_visibility_check option for account rendering" do
|
||||||
|
clear_config([:restrict_unauthenticated, :profiles, :local], false)
|
||||||
|
|
||||||
|
user = insert(:user)
|
||||||
|
user_id = user.id
|
||||||
|
|
||||||
|
assert %{id: ^user_id} = AccountView.render("show.json", %{user: user, for: nil})
|
||||||
|
assert %{id: ^user_id} = AccountView.render("show.json", %{user: user, for: user})
|
||||||
|
|
||||||
|
assert %{id: ^user_id} =
|
||||||
|
AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
|
|
||||||
|
assert_raise RuntimeError, ~r/:skip_visibility_check or :for option is required/, fn ->
|
||||||
|
AccountView.render("show.json", %{user: user})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "relationship" do
|
describe "relationship" do
|
||||||
defp test_relationship_rendering(user, other_user, expected_result) do
|
defp test_relationship_rendering(user, other_user, expected_result) do
|
||||||
opts = %{user: user, target: other_user, relationships: nil}
|
opts = %{user: user, target: other_user, relationships: nil}
|
||||||
|
@ -336,7 +356,7 @@ test "returns the settings store if the requesting user is the represented user
|
||||||
|
|
||||||
assert result.pleroma.settings_store == %{:fe => "test"}
|
assert result.pleroma.settings_store == %{:fe => "test"}
|
||||||
|
|
||||||
result = AccountView.render("show.json", %{user: user, with_pleroma_settings: true})
|
result = AccountView.render("show.json", %{user: user, for: nil, with_pleroma_settings: true})
|
||||||
assert result.pleroma[:settings_store] == nil
|
assert result.pleroma[:settings_store] == nil
|
||||||
|
|
||||||
result = AccountView.render("show.json", %{user: user, for: user})
|
result = AccountView.render("show.json", %{user: user, for: user})
|
||||||
|
@ -345,13 +365,13 @@ test "returns the settings store if the requesting user is the represented user
|
||||||
|
|
||||||
test "doesn't sanitize display names" do
|
test "doesn't sanitize display names" do
|
||||||
user = insert(:user, name: "<marquee> username </marquee>")
|
user = insert(:user, name: "<marquee> username </marquee>")
|
||||||
result = AccountView.render("show.json", %{user: user})
|
result = AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
assert result.display_name == "<marquee> username </marquee>"
|
assert result.display_name == "<marquee> username </marquee>"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "never display nil user follow counts" do
|
test "never display nil user follow counts" do
|
||||||
user = insert(:user, following_count: 0, follower_count: 0)
|
user = insert(:user, following_count: 0, follower_count: 0)
|
||||||
result = AccountView.render("show.json", %{user: user})
|
result = AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
|
|
||||||
assert result.following_count == 0
|
assert result.following_count == 0
|
||||||
assert result.followers_count == 0
|
assert result.followers_count == 0
|
||||||
|
@ -375,7 +395,7 @@ test "shows when follows/followers stats are hidden and sets follow/follower cou
|
||||||
followers_count: 0,
|
followers_count: 0,
|
||||||
following_count: 0,
|
following_count: 0,
|
||||||
pleroma: %{hide_follows_count: true, hide_followers_count: true}
|
pleroma: %{hide_follows_count: true, hide_followers_count: true}
|
||||||
} = AccountView.render("show.json", %{user: user})
|
} = AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
end
|
end
|
||||||
|
|
||||||
test "shows when follows/followers are hidden" do
|
test "shows when follows/followers are hidden" do
|
||||||
|
@ -388,7 +408,7 @@ test "shows when follows/followers are hidden" do
|
||||||
followers_count: 1,
|
followers_count: 1,
|
||||||
following_count: 1,
|
following_count: 1,
|
||||||
pleroma: %{hide_follows: true, hide_followers: true}
|
pleroma: %{hide_follows: true, hide_followers: true}
|
||||||
} = AccountView.render("show.json", %{user: user})
|
} = AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
end
|
end
|
||||||
|
|
||||||
test "shows actual follower/following count to the account owner" do
|
test "shows actual follower/following count to the account owner" do
|
||||||
|
@ -531,7 +551,7 @@ test "uses mediaproxy urls when it's enabled" do
|
||||||
emoji: %{"joker_smile" => "https://evil.website/society.png"}
|
emoji: %{"joker_smile" => "https://evil.website/society.png"}
|
||||||
)
|
)
|
||||||
|
|
||||||
AccountView.render("show.json", %{user: user})
|
AccountView.render("show.json", %{user: user, skip_visibility_check: true})
|
||||||
|> Enum.all?(fn
|
|> Enum.all?(fn
|
||||||
{key, url} when key in [:avatar, :avatar_static, :header, :header_static] ->
|
{key, url} when key in [:avatar, :avatar_static, :header, :header_static] ->
|
||||||
String.starts_with?(url, Pleroma.Web.base_url())
|
String.starts_with?(url, Pleroma.Web.base_url())
|
||||||
|
|
|
@ -177,7 +177,7 @@ test "a note activity" do
|
||||||
id: to_string(note.id),
|
id: to_string(note.id),
|
||||||
uri: object_data["id"],
|
uri: object_data["id"],
|
||||||
url: Pleroma.Web.Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :notice, note),
|
url: Pleroma.Web.Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :notice, note),
|
||||||
account: AccountView.render("show.json", %{user: user}),
|
account: AccountView.render("show.json", %{user: user, skip_visibility_check: true}),
|
||||||
in_reply_to_id: nil,
|
in_reply_to_id: nil,
|
||||||
in_reply_to_account_id: nil,
|
in_reply_to_account_id: nil,
|
||||||
card: nil,
|
card: nil,
|
||||||
|
|
|
@ -332,5 +332,27 @@ test "it return a list of chats the current user is participating in, in descend
|
||||||
chat_1.id |> to_string()
|
chat_1.id |> to_string()
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it is not affected by :restrict_unauthenticated setting (issue #1973)", %{
|
||||||
|
conn: conn,
|
||||||
|
user: user
|
||||||
|
} do
|
||||||
|
clear_config([:restrict_unauthenticated, :profiles, :local], true)
|
||||||
|
clear_config([:restrict_unauthenticated, :profiles, :remote], true)
|
||||||
|
|
||||||
|
user2 = insert(:user)
|
||||||
|
user3 = insert(:user, local: false)
|
||||||
|
|
||||||
|
{:ok, _chat_12} = Chat.get_or_create(user.id, user2.ap_id)
|
||||||
|
{:ok, _chat_13} = Chat.get_or_create(user.id, user3.ap_id)
|
||||||
|
|
||||||
|
result =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/pleroma/chats")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
account_ids = Enum.map(result, &get_in(&1, ["account", "id"]))
|
||||||
|
assert Enum.sort(account_ids) == Enum.sort([user2.id, user3.id])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,6 +14,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do
|
||||||
)
|
)
|
||||||
setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false)
|
setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false)
|
||||||
|
|
||||||
|
setup do: clear_config([:instance, :public], true)
|
||||||
|
|
||||||
setup do
|
setup do
|
||||||
admin = insert(:user, is_admin: true)
|
admin = insert(:user, is_admin: true)
|
||||||
token = insert(:oauth_admin_token, user: admin)
|
token = insert(:oauth_admin_token, user: admin)
|
||||||
|
@ -27,6 +29,11 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do
|
||||||
{:ok, %{admin_conn: admin_conn}}
|
{:ok, %{admin_conn: admin_conn}}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "GET /api/pleroma/emoji/packs when :public: false", %{conn: conn} do
|
||||||
|
Config.put([:instance, :public], false)
|
||||||
|
conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200)
|
||||||
|
end
|
||||||
|
|
||||||
test "GET /api/pleroma/emoji/packs", %{conn: conn} do
|
test "GET /api/pleroma/emoji/packs", %{conn: conn} do
|
||||||
resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200)
|
resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,8 @@ test "it represents a chat" do
|
||||||
|
|
||||||
assert represented_chat == %{
|
assert represented_chat == %{
|
||||||
id: "#{chat.id}",
|
id: "#{chat.id}",
|
||||||
account: AccountView.render("show.json", user: recipient),
|
account:
|
||||||
|
AccountView.render("show.json", user: recipient, skip_visibility_check: true),
|
||||||
unread: 0,
|
unread: 0,
|
||||||
last_message: nil,
|
last_message: nil,
|
||||||
updated_at: Utils.to_masto_date(chat.updated_at)
|
updated_at: Utils.to_masto_date(chat.updated_at)
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
|
defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
|
||||||
use Pleroma.DataCase
|
use Pleroma.DataCase
|
||||||
|
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.Tests.ObanHelpers
|
alias Pleroma.Tests.ObanHelpers
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.UserInviteToken
|
alias Pleroma.UserInviteToken
|
||||||
alias Pleroma.Web.MastodonAPI.AccountView
|
|
||||||
alias Pleroma.Web.TwitterAPI.TwitterAPI
|
alias Pleroma.Web.TwitterAPI.TwitterAPI
|
||||||
|
|
||||||
setup_all do
|
setup_all do
|
||||||
|
@ -27,13 +27,10 @@ test "it registers a new user and returns the user." do
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
fetched_user = User.get_cached_by_nickname("lain")
|
assert user == User.get_cached_by_nickname("lain")
|
||||||
|
|
||||||
assert AccountView.render("show.json", %{user: user}) ==
|
|
||||||
AccountView.render("show.json", %{user: fetched_user})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it registers a new user with empty string in bio and returns the user." do
|
test "it registers a new user with empty string in bio and returns the user" do
|
||||||
data = %{
|
data = %{
|
||||||
:username => "lain",
|
:username => "lain",
|
||||||
:email => "lain@wired.jp",
|
:email => "lain@wired.jp",
|
||||||
|
@ -45,10 +42,7 @@ test "it registers a new user with empty string in bio and returns the user." do
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
fetched_user = User.get_cached_by_nickname("lain")
|
assert user == User.get_cached_by_nickname("lain")
|
||||||
|
|
||||||
assert AccountView.render("show.json", %{user: user}) ==
|
|
||||||
AccountView.render("show.json", %{user: fetched_user})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it sends confirmation email if :account_activation_required is specified in instance config" do
|
test "it sends confirmation email if :account_activation_required is specified in instance config" do
|
||||||
|
@ -134,13 +128,10 @@ test "returns user on success" do
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
fetched_user = User.get_cached_by_nickname("vinny")
|
assert user == User.get_cached_by_nickname("vinny")
|
||||||
|
|
||||||
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
||||||
|
|
||||||
assert invite.used == true
|
assert invite.used == true
|
||||||
|
|
||||||
assert AccountView.render("show.json", %{user: user}) ==
|
|
||||||
AccountView.render("show.json", %{user: fetched_user})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns error on invalid token" do
|
test "returns error on invalid token" do
|
||||||
|
@ -197,10 +188,8 @@ test "returns error on expired token" do
|
||||||
check_fn = fn invite ->
|
check_fn = fn invite ->
|
||||||
data = Map.put(data, :token, invite.token)
|
data = Map.put(data, :token, invite.token)
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
fetched_user = User.get_cached_by_nickname("vinny")
|
|
||||||
|
|
||||||
assert AccountView.render("show.json", %{user: user}) ==
|
assert user == User.get_cached_by_nickname("vinny")
|
||||||
AccountView.render("show.json", %{user: fetched_user})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
{:ok, data: data, check_fn: check_fn}
|
{:ok, data: data, check_fn: check_fn}
|
||||||
|
@ -260,14 +249,11 @@ test "returns user on success, after him registration fails" do
|
||||||
}
|
}
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
fetched_user = User.get_cached_by_nickname("vinny")
|
assert user == User.get_cached_by_nickname("vinny")
|
||||||
|
|
||||||
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
||||||
|
|
||||||
assert invite.used == true
|
assert invite.used == true
|
||||||
|
|
||||||
assert AccountView.render("show.json", %{user: user}) ==
|
|
||||||
AccountView.render("show.json", %{user: fetched_user})
|
|
||||||
|
|
||||||
data = %{
|
data = %{
|
||||||
:username => "GrimReaper",
|
:username => "GrimReaper",
|
||||||
:email => "death@reapers.afterlife",
|
:email => "death@reapers.afterlife",
|
||||||
|
@ -302,13 +288,10 @@ test "returns user on success" do
|
||||||
}
|
}
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
fetched_user = User.get_cached_by_nickname("vinny")
|
assert user == User.get_cached_by_nickname("vinny")
|
||||||
|
|
||||||
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
||||||
|
|
||||||
refute invite.used
|
refute invite.used
|
||||||
|
|
||||||
assert AccountView.render("show.json", %{user: user}) ==
|
|
||||||
AccountView.render("show.json", %{user: fetched_user})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "error after max uses" do
|
test "error after max uses" do
|
||||||
|
@ -327,13 +310,11 @@ test "error after max uses" do
|
||||||
}
|
}
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
fetched_user = User.get_cached_by_nickname("vinny")
|
assert user == User.get_cached_by_nickname("vinny")
|
||||||
|
|
||||||
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
||||||
assert invite.used == true
|
assert invite.used == true
|
||||||
|
|
||||||
assert AccountView.render("show.json", %{user: user}) ==
|
|
||||||
AccountView.render("show.json", %{user: fetched_user})
|
|
||||||
|
|
||||||
data = %{
|
data = %{
|
||||||
:username => "GrimReaper",
|
:username => "GrimReaper",
|
||||||
:email => "death@reapers.afterlife",
|
:email => "death@reapers.afterlife",
|
||||||
|
|
Loading…
Reference in a new issue